Giới hạn số lượng Widget trong Sidebars


17

Nếu tôi sử dụng một khu vực được tùy chỉnh tùy chỉnh (ví dụ chân trang) trong đó chỉ có một số điểm giới hạn cho các tiện ích (theo thiết kế), tôi có thể giới hạn số lượng tiện ích mà người dùng có thể bao gồm trong khu vực được tiện ích cụ thể đó không? Không có vấn đề gì nếu giải pháp nằm ở phần cuối hoặc phần đầu. Cảm ơn bạn.

Câu trả lời:


10

Tôi đã giải quyết điều này trong Javascript. Nếu bạn muốn ngăn chặn hoàn toàn, bạn cũng nên thực hiện phía máy chủ, bởi vì bạn có thể chỉnh sửa các tiện ích với Javascript bị vô hiệu hóa (hãy thử!).

Các thanh bên khác nhau được kiểm tra khi bạn thả các vật dụng vào chúng hoặc cách xa chúng. Nếu chúng trở nên đầy, màu nền sẽ thay đổi và bạn không còn có thể thả các mục trên chúng nữa. Nếu, khi khởi động, thanh bên đã quá đầy (vì bạn đã thắt chặt hạn chế), màu nền sẽ chuyển sang màu đỏ. Bạn vẫn có thể kéo các widget ra khỏi các widget đầy đủ để làm cho chúng trống trở lại.

Một đầy đủ và một nhiều hơn thanh bên đầy đủ

Vui lòng kiểm tra mã này, để tìm cách thêm hoặc xóa các tiện ích mà tôi đã bỏ lỡ. "Phép thuật" trong mã jQuery xuất phát từ Aman , người đã trả lời câu hỏi Stack Overflow mà tôi đã đăng về nó .

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 để tải chúng:

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

Một nỗ lực kiểm tra phía máy chủ (có thể chưa hoàn thành):

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

wow +1 ... thiếu gì với chức năng phía máy chủ? Không thử nó, nhưng xen kẽ.
kaiser

Tôi muốn một cái gì đó nhiều hơn về phía máy chủ, nhưng khi tôi nghĩ về nó, có lẽ bạn đã đúng. điều này cần được giới hạn bởi JS. Tôi sẽ cố gắng nghĩ ra một giải pháp mạnh mẽ hơn, có thể không cho phép các giọt vật dụng hoàn toàn thông qua JS
Jukov

Có một câu hỏi về mã của bạn tại Giới hạn số lượng Widget trong Sidebars - lỗi .
Charles Clarkson

4

để giúp bạn với câu hỏi của bạn, tôi có một gợi ý. Hãy sử dụng first-footer-widget-areahiện tại trong sidebar-footer.phptệp mẫu Twenty Ten mặc định như một ví dụ.

Là một thực hành tốt và an toàn, trước hết hãy sao lưu nó để tránh đau đầu.

Mã mẫu Twenty Ten ban đầu để trình bày tiện ích chân trang đầu tiên là:

<?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; ?>

Hãy thay đổi, thêm một số mã với các điều kiện để hạn chế số lượng vật dụng được phép trong khu vực đó.

<?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; ?>

Mã sửa đổi này làm gì:

$mysidebars = wp_get_sidebars_widgets();
$total_widgets = count( $mysidebars['first-footer-widget-area'] );
$limit_allowed=2;

đếm số lượng vật dụng trong thanh bên đó và thiết lập một số giới hạn cho phép (do bạn giải quyết).

...
<?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 }; ?>
...

Nếu đạt đến giới hạn cho phép đối với các vật dụng trong khu vực đó thì nó sẽ hiển thị cảnh báo thông báo giới hạn khác, tiện ích sẽ được hiển thị.

Vì vậy, tôi hy vọng tôi đã giúp với câu hỏi của bạn.


0

Interessting Q. Không tìm hiểu nhiều ở một cái nhìn ngắn gọn, nhưng đây là một đoán: print_r( $GLOBALS['wp_registered_sidebars'] );hoặc print_r( $GLOBALS['sidebars'] );hoặc print_r( $GLOBALS['sidebars_widgets'] );...


0

Bạn có thể làm những thứ dưới đây để xác định số lượng vật dụng.

Chức năng:

$mysidebars = wp_get_sidebars_widgets() - sẽ cung cấp cho bạn danh sách các sidebars và widget được sử dụng trên sidebars đó.

$total_widgets = count( $mysidebars['my-sidebar-id'] ); - sẽ cung cấp cho bạn tổng số vật dụng trong my-sidebar-id

Tôi hy vọng điều này sẽ giải quyết nghi ngờ của bạn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.