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.
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
}
}
Um Ihnen bei Ihrer Frage zu helfen, habe ich einen Vorschlag. Verwenden wir das
first-footer-widget-area
Geschenk in der Standardvorlagendatei Twenty Tensidebar-footer.php
als 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:
Lassen Sie uns etwas Code mit Bedingungen hinzufügen, um die Anzahl der in diesem Bereich zulässigen Widgets zu begrenzen.
Was dieser geänderte Code bewirkt:
Zählen Sie die Anzahl der Widgets in dieser Seitenleiste und legen Sie ein zulässiges Limit fest (das von Ihnen festgelegt wurde).
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.
quelle
Interessant Q. Ich habe bei einem kurzen Blick nicht viel herausgefunden, aber hier ist eine Vermutung:
print_r( $GLOBALS['wp_registered_sidebars'] );
oderprint_r( $GLOBALS['sidebars'] );
oderprint_r( $GLOBALS['sidebars_widgets'] );
...quelle
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 anIch hoffe, dass dies Ihre Zweifel lösen wird.
quelle