Beschränken Sie die Anzahl der Widgets in den Seitenleisten

17

Kann ich die Anzahl der Widgets begrenzen, die der Benutzer in diesem bestimmten Widget-Bereich aufnehmen 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.

Jukov
quelle

Antworten:

10

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.

Eine vollständige und eine mehr als vollständige Seitenleiste

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
    }
}
Jan Fabry
quelle
wow +1 ... was fehlt bei der serverseitigen Funktion? Hab es nicht ausprobiert, aber interessiert.
Kaiser
Ich wollte etwas mehr von einer Serverseite, aber wenn ich daran denke, haben Sie vielleicht Recht. Dies muss von JS begrenzt werden. Ich werde versuchen, über eine robustere Lösung nachzudenken, die möglicherweise das
Löschen
Bei Limit number of Widgets in Sidebars ist eine Frage zu Ihrem Code aufgetreten - Fehler .
Charles Clarkson
4

Um Ihnen bei Ihrer Frage zu helfen, habe ich einen Vorschlag. Verwenden wir das first-footer-widget-areaGeschenk in der Standardvorlagendatei Twenty Ten sidebar-footer.phpals Beispiel.

Als gute 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 zulässiges 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.

Also ich hoffe ich habe bei deiner Frage geholfen.

Hans Zimermann
quelle
0

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

Kaiser
quelle
0

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 diesen Seitenleisten verwendet werden.

$total_widgets = count( $mysidebars['my-sidebar-id'] ); - gibt die Gesamtanzahl der Widgets in meiner-Seitenleisten-ID an

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

Todd
quelle