it-swarm.com.de

Beschränken Sie die Anzahl der Widgets in den Seitenleisten

Kann ich die Anzahl der Widgets begrenzen, die der Benutzer in diesem bestimmten Widget-Bereich einbeziehen darf, wenn ich einen benutzerdefinierten Widget-Bereich (z. B. Fußzeile) verwende, in dem nur eine begrenzte Anzahl von Punkten für Widgets vorhanden ist? Es spielt keine Rolle, ob sich die Lösung im Backend oder im Frontend befindet. Vielen Dank.

16
Jukov

Ich habe das in Javascript gelöst. Wenn Sie dies vollständig verhindern möchten, sollten Sie dies auch serverseitig tun, da Sie die Widgets mit deaktiviertem Javascript bearbeiten können (probieren Sie es aus!).

Die verschiedenen Seitenleisten werden überprüft, wenn Sie Widgets auf sie ziehen oder von ihnen entfernen. Wenn sie voll sind, ändert sich die Hintergrundfarbe und Sie können keine Objekte mehr darauf ablegen. Wenn die Seitenleiste beim Start bereits mehr als voll ist (weil Sie die Einschränkung verschärft haben), wird die Hintergrundfarbe rot. Sie können Widgets immer noch von vollständigen Widgets wegziehen, um sie wieder leer zu machen.

One full and one more than full sidebar

Testen Sie diesen Code, um Möglichkeiten zum Hinzufügen oder Entfernen von Widgets zu finden, die ich verpasst habe. Die "Magie" im jQuery-Code kommt von Aman , der eine Stapelüberlauf-Frage beantwortet hat, die ich darüber gepostet habe .

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, um sie zu laden:

$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'] ) );
    }
}

Versuch einer serverseitigen Überprüfung (wahrscheinlich noch nicht abgeschlossen):

$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
    }
}
10
Jan Fabry

um Ihnen bei Ihrer Frage zu helfen, habe ich einen Vorschlag. Verwenden wir den first-footer-widget-area, der in der sidebar-footer.php-Standardvorlagendatei von Twenty Ten enthalten ist, als Beispiel.

Als bewährte und sichere Methode sollten Sie zunächst ein Backup erstellen, um Kopfschmerzen zu vermeiden.

Der ursprüngliche Twenty Ten-Vorlagencode für die Darstellung des Widgets für die erste Fußzeile lautet:

<?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; ?>

Lassen Sie uns etwas Code mit Bedingungen hinzufügen, um die Anzahl der in diesem Bereich zulässigen Widgets zu begrenzen.

<?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; ?>

Was dieser geänderte Code bewirkt:

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

zählen Sie die Anzahl der Widgets in dieser Seitenleiste und legen Sie ein erlaubtes Limit fest (das von Ihnen festgelegt wurde).

...
<?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 }; ?>
...

Wenn das für Widgets in diesem Bereich zulässige Limit erreicht wurde, wird eine Warnmeldung angezeigt, die darauf hinweist, dass das Widget nicht angezeigt wird.

Ich hoffe, ich habe bei Ihrer Frage geholfen.

4
Hans Zimermann

Sie können die folgenden Schritte ausführen, um die Anzahl der Widgets zu bestimmen.

Funktion:

$mysidebars = wp_get_sidebars_widgets() - Zeigt eine Liste der Seitenleisten und Widgets an, die in dieser Seitenleiste verwendet werden.

$total_widgets = count( $mysidebars['my-sidebar-id'] ); - gibt die Anzahl aller Widgets in der my-sidebar-id an

Ich hoffe, dass dies Ihre Zweifel lösen wird.

0
Todd

Interessant Q. Ich habe bei einem kurzen Blick nicht viel herausgefunden, aber hier ist eine Vermutung: print_r( $GLOBALS['wp_registered_sidebars'] ); oder print_r( $GLOBALS['sidebars'] ); oder print_r( $GLOBALS['sidebars_widgets'] ); ...

0
kaiser