Begrenzen Sie die Anzahl der Widgets in Sidebars

Wenn ich einen benutzerdefinierten Widget-Bereich (z. B. Fußzeile) verwende, wo es nur eine begrenzte Anzahl von Punkten für Widgets gibt (von Entwurf), kann ich die Anzahl der Widgets begrenzen, die der Benutzer in diesem bestimmten Widget-Bereich enthalten kann? Es spielt keine Rolle, ob sich die Lösung im Backend oder im Frontend befindet. Vielen Dank.

Solutions Collecting From Web of "Begrenzen Sie die Anzahl der Widgets in Sidebars"

Ich habe das in Javascript getriggers. Wenn du es komplett verhindern willst, solltest du es auch serverseitig machen, weil du die Widgets mit deaktiviertem Javascript bearbeiten kannst (probiere es aus!).

Die verschiedenen Seitenleisten werden überprüft, wenn Sie Widgets auf sie oder von ihnen entfernen. Wenn sie voll werden, ändert sich die Hintergrundfarbe und du kannst keine Gegenstände mehr darauf fallen lassen. 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 den vollständigen Widgets wegziehen, um sie wieder leer zu machen.

Eine volle und eine mehr als volle Sidebar

Testen Sie diesen Code, um Wege zum Hinzufügen oder Entfernen von Widgets zu finden, die ich vermisst habe. Die “Magie” im jQuery-Code kommt von Aman , der eine Stack-Overflow-Frage beantwortet hat , die ich dazu 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'] ) ); } } 

Ein 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 } } 

Um dir bei deiner Frage zu helfen, habe ich einen Vorschlag. Lassen Sie uns den first-footer-widget-area , der in der Standard-Twenty-Ten-Vorlage sidebar-footer.php ist, als Beispiel verwenden.

Als eine gute Übung und sicher, sichern Sie sie zuerst, um Kopfschmerzen zu vermeiden.

Der ursprüngliche Twenty-Ten-Vorlagencode zum Präsentieren des ersten Fußzeilen-Widgets lautet:

 < ?php if ( is_active_sidebar( 'first-footer-widget-area' ) ) : ?> 
    < ?php dynamic_sidebar( 'first-footer-widget-area' ); ?>
< ?php endif; ?>

Lassen Sie uns das ändern und fügen Sie Code mit Bedingungen hinzu, um die Anzahl der erlaubten Widgets in diesem Bereich zu begrenzen.

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

Was macht dieser modifizierte Code?

 $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 eine zulässige Grenze fest (von Ihnen festgelegt).

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

Wenn das Limit für Widgets in diesem Bereich erreicht wurde, wird eine Warnung angezeigt, dass das Widget sonst nicht mehr angezeigt wird.

Also ich hoffe ich habe mit deiner Frage geholfen.

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

Sie können unter Sachen tun, um die Anzahl der Widgets zu bestimmen.

function:

$mysidebars = wp_get_sidebars_widgets() – gibt Ihnen die Liste der Seitenleisten und Widgets, die für diese Seitenleisten verwendet werden.

$total_widgets = count( $mysidebars['my-sidebar-id'] ); – gibt Ihnen die Anzahl der gesamten Widgets in meiner Sidebar-ID

Ich hoffe, das wird deine Zweifel lösen.