Nombre limite de widgets dans les barres latérales

15

Si j'utilise une zone personnalisée widgetisée (par exemple, le pied de page) où le nombre de spots pour les widgets est limité (de par leur conception), puis-je limiter le nombre de widgets que l'utilisateur peut inclure dans cette zone spécifique widgetized? Peu importe si la solution est à l’arrière-plan ou au début. Merci.

    
posée Jukov 13.06.2011 - 21:51

4 réponses

10

Je l'ai résolu en Javascript. Si vous voulez l’empêcher complètement, vous devriez aussi le faire côté serveur, car vous pouvez éditer les widgets avec Javascript désactivé (essayez-le!).

Les différentes barres latérales sont vérifiées lorsque vous leur déposez ou non des widgets. S'ils deviennent pleins, la couleur d'arrière-plan change et vous ne pouvez plus y déposer d'éléments. Si, au démarrage, la barre latérale est déjà plus que saturée (car vous avez renforcé la restriction), la couleur d'arrière-plan devient rouge. Vous pouvez toujours éloigner les widgets des widgets complets pour les vider à nouveau.

Veuilleztestercecodeafindetrouverdesmoyensd'ajouteroudesupprimerdeswidgetsquej'aimanqués.La"magie" dans le code jQuery provient de Aman , qui a répondu à une question sur le dépassement de capacité que j'ai posté à ce sujet .

Javascript:

jQuery( function( $ ) {
    var sidebarLimits = {
        'sidebar-1': 2,
        'sidebar-2': 2,
    };
    var realSidebars = $( '#widgets-right div.widgets-sortables' );
    var availableWidgets = $( '#widget-list' ).children( '.widget' );

    var checkLength = function( sidebar, delta ) {
        var sidebarId = sidebar.id;
        if ( undefined === sidebarLimits[sidebarId] ) {
            return;
        }

        // This is a limited sidebar
        // Find out how many widgets it already has
        var widgets = $( sidebar ).sortable( 'toArray' );
        $( sidebar ).toggleClass( 'sidebar-full', sidebarLimits[sidebarId] <= widgets.length + (delta || 0) );
        $( sidebar ).toggleClass( 'sidebar-morethanfull', sidebarLimits[sidebarId] < widgets.length + (delta || 0) );

        var notFullSidebars = $( 'div.widgets-sortables' ).not( '.sidebar-full' );
        availableWidgets.draggable( 'option', 'connectToSortable', notFullSidebars );
        realSidebars.sortable( 'option', 'connectWith', notFullSidebars );
    }

    // Check existing sidebars on startup
    realSidebars.map( function() {
        checkLength( this );
    } );

    // Update when dragging to this (sort-receive)
    // and away to another sortable (sort-remove)
    realSidebars.bind( 'sortreceive sortremove', function( event, ui ) {
        checkLength( this );
    } );

    // Update when dragging back to the "Available widgets" stack
    realSidebars.bind( 'sortstop', function( event, ui ) {
        if ( ui.item.hasClass( 'deleting' ) ) {
            checkLength( this, -1 );
        }
    } );

    // Update when the "Delete" link is clicked
    $( 'a.widget-control-remove' ).live( 'click', function() {
        checkLength( $( this ).closest( 'div.widgets-sortables' )[0], -1 );
    } );
} );

CSS:

.sidebar-full
{
    background-color: #cfe1ef !important;
}

.sidebar-morethanfull
{
    background-color: #c43 !important;
}

PHP pour les charger:

$wpse19907_file = $plugin;
add_action( 'admin_enqueue_scripts', 'wpse19907_admin_enqueue_scripts' );
function wpse19907_admin_enqueue_scripts( $hook_suffix )
{
    if ( 'widgets.php' == $hook_suffix ) {
        wp_enqueue_script( 'wpse-19907', plugins_url( 'wpse-19907.js', $GLOBALS['wpse19907_file'] ), array(), false, true );
        wp_enqueue_style( 'wpse-19907', plugins_url( 'wpse-19907.css', $GLOBALS['wpse19907_file'] ) );
    }
}

Tentative de vérification côté serveur (probablement pas encore terminée):

$wpse19907_sidebars_max_widgets = array(
    'sidebar-1' => 2,
);

add_action( 'sidebar_admin_setup', 'wpse19907_sidebar_admin_setup' );
function wpse19907_sidebar_admin_setup()
{
    if ( ! isset( $_POST['action'] ) || 'save-widget' != $_POST['action'] || empty( $_POST['add_new'] ) ) {
        return;
    }

    // We're adding a new widget to a sidebar
    global $wpse19907_sidebars_max_widgets;
    $sidebar_id = $_POST['sidebar'];

    if ( ! array_key_exists( $sidebar_id, $wpse19907_sidebars_max_widgets ) ) {
        return;
    }

    $sidebar = wp_get_sidebars_widgets();
    $sidebar = isset( $sidebars[$sidebar_id] ) ? $sidebars[$sidebar_id] : array();

    if ( count( $sidebar ) <= $wpse19907_sidebars_max_widgets[$sidebar_id] ) {
        die( 'mx' ); // Length must be shorter than 2, and unique
    }
}
    
réponse donnée Jan Fabry 18.07.2011 - 22:09
4

pour vous aider avec votre question, j'ai une suggestion. Utilisons le first-footer-widget-area présent dans le fichier de modèle par défaut Twenty Ten sidebar-footer.php comme exemple.

Comme bonne pratique et sécurisée, commencez par la sauvegarder pour éviter les maux de tête.

Le code de modèle Twenty Ten d'origine pour la présentation du premier widget de pied de page est le suivant:

<?php if ( is_active_sidebar( 'first-footer-widget-area' ) ) : ?>
       <div id="first" class="widget-area">
        <ul class="xoxo">
            <?php dynamic_sidebar( 'first-footer-widget-area' ); ?>
        </ul>
       </div><!-- #first .widget-area -->
<?php endif; ?>

Modifions en ajoutant du code avec des conditions pour limiter le nombre de widgets autorisés dans cette zone.

<?php if ( is_active_sidebar( 'first-footer-widget-area' ) ) : ?>
    <div id="first" class="widget-area">
    <?php
           $mysidebars = wp_get_sidebars_widgets();
           $total_widgets = count( $mysidebars['first-footer-widget-area'] );
           $limit_allowed=2;
    ?>
        <ul class="xoxo">
            <?php  if ($total_widgets > $limit_allowed) {
                echo 'Your '.$total_widgets.' added widgets goes over the allowed limit: <strong>'.$limit_allowed.'</trong>';
                } else { ?>
            <?php dynamic_sidebar( 'first-footer-widget-area' ); ?>
          <?php }; ?>
        </ul>

        </div><!-- #first .widget-area -->
<?php endif; ?>

À quoi sert ce code modifié:

$mysidebars = wp_get_sidebars_widgets();
$total_widgets = count( $mysidebars['first-footer-widget-area'] );
$limit_allowed=2;

compte le nombre de widgets dans cette barre latérale et fixe une limite autorisée (fixée par vous).

...
<?php  if ($total_widgets > $limit_allowed) {
            echo 'Your '.$total_widgets.' added widgets goes over the allowed limit: <strong>'.$limit_allowed.'</trong>';
       } else { ?>
            <?php dynamic_sidebar( 'first-footer-widget-area' ); ?>
<?php }; ?>
...

Si la limite autorisée pour les widgets dans cette zone a été atteinte, un message apparaîtra pour vous en avertir, sinon le widget sera affiché.

J'espère donc avoir aidé votre question.

    
réponse donnée Hans Zimermann 03.07.2011 - 22:40
0

Intéressant Q. Vous n'avez pas trouvé grand chose à la recherche, mais voici une hypothèse: print_r( $GLOBALS['wp_registered_sidebars'] ); ou print_r( $GLOBALS['sidebars'] ); ou print_r( $GLOBALS['sidebars_widgets'] ); ...

    
réponse donnée kaiser 14.06.2011 - 00:28
0

Vous pouvez faire ce qui suit pour déterminer le nombre de widgets.

Fonction:

$mysidebars = wp_get_sidebars_widgets() - vous donnera la liste des barres latérales et des widgets utilisés dans cette barre latérale.

$total_widgets = count( $mysidebars['my-sidebar-id'] ); - vous indiquera le nombre total de widgets dans my-sidebar-id

J'espère que cela résoudra vos doutes.

    
réponse donnée Todd 30.06.2011 - 08:40

Lire d'autres questions sur les étiquettes