边栏中的小部件数量限制


17

如果我使用自定义的小部件区域(例如页脚),其中小部件的斑点数量有限(根据设计),是否可以限制用户可以在该特定小部件区域中包含的小部件数量?解决方案是在后端还是在前端都没有关系。谢谢。

Answers:


10

我用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
    }
}

哇+1 ...服务器端功能缺少什么?没有尝试,但是有兴趣。
kaiser

我希望在服务器端更多一些,但是当我想到它时,也许您是对的。这需要由JS限制。我将尝试考虑一个更健壮的解决方案,也许不允许通过JS完全丢弃小部件
Jukov

在侧边栏的小部件数量限制中有一个关于您的代码的问题-bug
查尔斯·克拉克森

5

为了帮助您解决问题,我有个建议。让我们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 }; ?>
...

如果达到了该区域中的小部件允许的限制,则将显示一条消息警告该限制,否则将显示小部件。

因此,希望我对您的问题有所帮助。


0

问问Q.简要看一下并没有发现太多,但这是一个猜测:print_r( $GLOBALS['wp_registered_sidebars'] );or print_r( $GLOBALS['sidebars'] );or print_r( $GLOBALS['sidebars_widgets'] );...


0

您可以执行以下操作以确定小部件的数量。

功能:

$mysidebars = wp_get_sidebars_widgets() -将为您提供侧栏和该侧栏上使用的小部件的列表。

$total_widgets = count( $mysidebars['my-sidebar-id'] ); -将为您提供my-sidebar-id中的小部件总数

希望这能解决您的疑虑。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.