साइडबार में विजेट की संख्या सीमित करें


17

यदि मैं एक कस्टम विजेट क्षेत्र (उदाहरण के लिए पाद लेख) का उपयोग करता हूं, जहां विजेट्स (डिजाइन के अनुसार) के लिए केवल सीमित संख्या में स्पॉट हैं, तो क्या मैं उस विशिष्ट विजेट वाले क्षेत्र में शामिल किए जा सकने वाले विजेटों की संख्या को सीमित कर सकता हूं? इससे कोई फर्क नहीं पड़ता कि समाधान बैकएंड या फ्रंट एंड पर है। धन्यवाद।

जवाबों:


10

मैंने इसे जावास्क्रिप्ट में हल किया। यदि आप इसे पूरी तरह से रोकना चाहते हैं, तो आपको इसे सर्वर-साइड भी करना चाहिए, क्योंकि आप विजेट्स को जावास्क्रिप्ट अक्षम के साथ संपादित कर सकते हैं (इसे आज़माएं!)।

जब आप उन्हें या उनसे दूर विगेट्स छोड़ते हैं तो अलग-अलग साइडबार की जाँच की जाती है। यदि वे पूर्ण हो जाते हैं, तो पृष्ठभूमि का रंग बदल जाता है और आप उन पर आइटम नहीं छोड़ सकते। यदि, स्टार्टअप पर, साइडबार पहले से ही पूर्ण से अधिक है (क्योंकि आपने प्रतिबंध को कड़ा कर दिया है), पृष्ठभूमि का रंग लाल हो जाता है। आप अभी भी उन्हें फिर से खाली करने के लिए विगेट्स को पूर्ण विगेट्स से दूर खींच सकते हैं।

एक पूर्ण और एक पूर्ण साइडबार से अधिक है

कृपया इस कोड का परीक्षण करें, जो विगेट्स जोड़ने या हटाने के तरीकों को खोजने के लिए मैंने याद किया। JQuery कोड में "मैजिक" अमन की ओर से आता है , जिसने इसके बारे में पोस्ट किए गए एक स्टैक ओवरफ्लो सवाल का जवाब दिया

जावास्क्रिप्ट:

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 );
    } );
} );

सीएसएस:

.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 ... सर्वर साइड फ़ंक्शन के साथ क्या गायब है? यह कोशिश नहीं की, लेकिन interessted।
कैसर

मैं सर्वर साइड के बारे में कुछ और चाहता था, लेकिन जब मुझे लगता है कि, तो आप सही हैं। इसे JS द्वारा सीमित करने की आवश्यकता है। मैं एक और अधिक मजबूत समाधान के बारे में सोचने की कोशिश करूँगा, शायद जेएस के माध्यम से विगेट्स की बूंदों को पूरी तरह से
खारिज कर दिया

साइडबार में बग की सीमा संख्या में आपके कोड के बारे में एक प्रश्न है - बग
चार्ल्स क्लार्कसन

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

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'] ); - आपको माय-साइडबार-आईडी में कुल विगेट्स की गिनती देगा

मुझे उम्मीद है कि यह आपकी शंकाओं का समाधान करेगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.