จำกัด จำนวนวิดเจ็ตในแถบด้านข้าง


17

หากฉันใช้พื้นที่ที่กำหนดเองที่กำหนดเอง (ตัวอย่างเช่นส่วนท้าย) ที่มีจำนวน จำกัด เฉพาะจุดสำหรับวิดเจ็ต (ตามการออกแบบ) ฉันสามารถ จำกัด จำนวนของเครื่องมือที่ผู้ใช้อาจรวมไว้ในพื้นที่ที่กำหนดได้อย่างไร ไม่สำคัญว่าโซลูชันจะอยู่ที่ส่วนหลังหรือส่วนหน้า ขอขอบคุณ.

คำตอบ:


10

ฉันแก้ไขมันใน Javascript หากคุณต้องการป้องกันอย่างสมบูรณ์คุณควรทำในฝั่งเซิร์ฟเวอร์เพราะคุณสามารถแก้ไขวิดเจ็ตได้โดยปิดการใช้งาน Javascript (ลองเลย!)

แถบด้านข้างที่แตกต่างกันจะถูกตรวจสอบเมื่อคุณวางวิดเจ็ตไปยังพวกเขาหรือออกไปจากพวกเขา หากเต็มแล้วสีพื้นหลังจะเปลี่ยนไปและคุณจะไม่สามารถวางรายการต่างๆ หากในการเริ่มต้นแถบด้านข้างนั้นเต็มแล้วมากกว่า (เนื่องจากคุณทำให้ข้อ จำกัด แน่น) สีพื้นหลังจะเปลี่ยนเป็นสีแดง คุณยังสามารถลากวิดเจ็ตออกจากวิดเจ็ตเต็มเพื่อทำให้ว่างเปล่าอีกครั้ง

เต็มหนึ่งและมากกว่าแถบข้างเต็ม

โปรดทดสอบโค้ดนี้เพื่อค้นหาวิธีเพิ่มหรือลบวิดเจ็ตที่ฉันพลาดไป "วิเศษ" ในรหัส jQuery มาจากอาที่ตอบคำถามกองมากเกินผมโพสต์เกี่ยวกับเรื่องนี้

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 ว้าว ... เกิดอะไรขึ้นกับฟังก์ชันฝั่งเซิร์ฟเวอร์ ไม่ได้ลอง แต่ขัดจังหวะ
ไกเซอร์

ฉันต้องการอะไรมากกว่าฝั่งเซิร์ฟเวอร์ แต่เมื่อฉันคิดว่าบางทีคุณอาจจะถูก สิ่งนี้จะต้องถูก จำกัด โดย JS ฉันจะพยายามคิดหาวิธีแก้ปัญหาที่มีประสิทธิภาพมากขึ้นอาจจะไม่อนุญาตให้หยดวิดเจ็ตพร้อมกันผ่านทาง JS
Jukov

มีคำถามเกี่ยวกับรหัสของคุณในเป็นจำนวน จำกัด ของเครื่องมือในแถบด้านข้าง - ข้อผิดพลาด
Charles Clarkson

5

เพื่อช่วยให้คุณมีคำถามของคุณฉันมีข้อเสนอแนะ ลองใช้first-footer-widget-areaการนำเสนอใน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.