사이드 바에서 위젯 수 제한


17

위젯에 대해 제한된 수의 스팟 만있는 (디자인에 따라) 사용자 정의 위젯 화 된 영역 (예 : 바닥 글)을 사용하는 경우 사용자가 해당 위젯 화 된 영역에 포함 할 수있는 위젯 수를 제한 할 수 있습니까? 솔루션이 백엔드인지 프런트 엔드인지는 중요하지 않습니다. 감사합니다.

답변:


10

나는 이것을 자바 스크립트로 해결했다. 완전히 막으려면 자바 스크립트가 비활성화 된 상태에서 위젯을 편집 할 수 있으므로 서버 측에서도 수행해야합니다 (시도해보십시오!).

다른 사이드 바는 위젯을 놓거나 멀리 떨어 뜨릴 때 확인됩니다. 색상이 가득 차면 배경색이 변경되어 더 이상 항목을 놓을 수 없습니다. 시작시 사이드 바가 이미 가득 차면 (제한을 강화했기 때문에) 배경색이 빨간색이됩니다. 여전히 전체 위젯에서 위젯을 끌어서 다시 비울 수 있습니다.

하나의 전체 및 하나 이상의 전체 사이드 바

내가 놓친 위젯을 추가하거나 제거하는 방법을 찾으려면이 코드를 테스트하십시오. jQuery 코드의 "매직"은 Aman 에서 왔으며, Aman내가 게시 한 Stack Overflow 질문에 답변했습니다 .

자바 스크립트 :

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 ... 서버 측 기능에 무엇이 없는가? 시도하지 않았지만 조사되었습니다.
카이저

더 많은 서버 측을 원했지만 생각할 때 당신이 옳을 수도 있습니다. 이것은 JS에 의해 제한되어야합니다. 더 강력한 솔루션을 생각하고 JS를 통해 위젯을 모두 허용하지
않을 수 있습니다.

사이드 바-버그의 위젯 수 제한 에서 코드에 대한 질문이 있습니다 .
Charles Clarkson

5

귀하의 질문에 도움을 드리기 위해 제안합니다. 예제와 같이 first-footer-widget-area기본 Twenty Ten 템플릿 sidebar-footer.php파일 에서 현재를 사용합시다 .

좋은 습관과 안전을 위해 먼저 두통을 피하기 위해 백업하십시오.

첫 번째 바닥 글 위젯을 표시하기위한 원본 Twenty Ten 템플릿 코드는 다음과 같습니다.

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

Interessting Q. 간단한 모양에서 많이 알아,하지만 여기에 추측하지 않았나요 : print_r( $GLOBALS['wp_registered_sidebars'] );print_r( $GLOBALS['sidebars'] );또는 print_r( $GLOBALS['sidebars_widgets'] );...


0

위젯 수를 결정하기 위해 아래 작업을 수행 할 수 있습니다.

함수:

$mysidebars = wp_get_sidebars_widgets() -해당 사이드 바에 사용 된 사이드 바 및 위젯 목록을 제공합니다.

$total_widgets = count( $mysidebars['my-sidebar-id'] ); -my-sidebar-id의 총 위젯 수를 제공합니다.

이것이 귀하의 의심을 해결할 수 있기를 바랍니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.