Answers:
我用Java语言解决了这个问题。如果要完全阻止它,也应该在服务器端进行操作,因为您可以在禁用Javascript的情况下编辑小部件(尝试一下!)。
当您将小部件放到小工具栏中或从小工具上移开时,将检查不同的边栏。如果它们已满,则背景颜色会更改,并且您不能再在其上放置项目。如果在启动时侧边栏已满(因为您加紧了限制),则背景色变为红色。您仍然可以将小部件拖离完整的小部件以使其再次清空。
请测试此代码,以找到添加或删除我错过的小部件的方法。jQuery代码中的“魔术”来自Aman,他回答了我对此发布的Stack Overflow问题。
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加载它们:
$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'] ) );
}
}
尝试进行服务器端检查(可能尚未完成):
$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
}
}
为了帮助您解决问题,我有个建议。让我们first-footer-widget-area
在默认的二十一模板中使用礼物sidebar-footer.php
文件中使用它作为示例。
为了安全起见,请先进行备份,以免造成麻烦。
用于显示第一个页脚小部件的原始二十一模板代码是:
<?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; ?>
让我们进行更改,添加一些带有条件的代码以限制该区域允许的小部件数量。
<?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; ?>
此修改后的代码的作用是:
$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: <strong>'.$limit_allowed.'</trong>';
} else { ?>
<?php dynamic_sidebar( 'first-footer-widget-area' ); ?>
<?php }; ?>
...
如果达到了该区域中的小部件允许的限制,则将显示一条消息警告该限制,否则将显示小部件。
因此,希望我对您的问题有所帮助。