সাইডবারগুলিতে উইজেটের সংখ্যা সীমিত করুন


17

যদি আমি একটি কাস্টম উইজেটাইজড অঞ্চল (উদাহরণস্বরূপ পাদচরণ) ব্যবহার করি যেখানে উইজেটগুলির জন্য কেবলমাত্র সীমিত সংখ্যক দাগ রয়েছে (ডিজাইন অনুসারে), সেই নির্দিষ্ট উইজেটাইজড অঞ্চলে ব্যবহারকারীর অন্তর্ভুক্ত থাকা উইজেটের সংখ্যাটি কি আমি সীমাবদ্ধ রাখতে পারি? সমাধান ব্যাকএন্ডে বা সামনের প্রান্তে রয়েছে তা বিবেচ্য নয়। ধন্যবাদ.

উত্তর:


10

আমি জাভাস্ক্রিপ্ট এ সমাধান। আপনি যদি এটি পুরোপুরি প্রতিরোধ করতে চান তবে আপনার এটি সার্ভার-সাইডও করা উচিত, কারণ আপনি জাভাস্ক্রিপ্ট অক্ষম করে উইজেটগুলি সম্পাদনা করতে পারেন (এটি চেষ্টা করে দেখুন!)।

আপনি যখন উইজেটগুলি তাদের কাছে ছেড়ে যান বা সেগুলি থেকে দূরে রাখেন তখন বিভিন্ন সাইডবারগুলি পরীক্ষা করা হয়। যদি সেগুলি পূর্ণ হয়ে যায়, পটভূমির রঙ পরিবর্তন হয় এবং আপনি এগুলিতে আর আইটেমগুলি ফেলে দিতে পারবেন না। যদি, প্রারম্ভকালে, সাইডবারটি ইতিমধ্যে পূর্ণের চেয়ে বেশি থাকে (কারণ আপনি সীমাবদ্ধতা আরও কঠোর করেছেন), ব্যাকগ্রাউন্ডের রঙ লাল হয়ে যায়। আপনি এখনও উইজেটগুলি পুরো উইজেটগুলি থেকে আবার খালি করতে টেনে আনতে পারেন।

একটি পূর্ণ এবং পুরো সাইডবারের চেয়ে আরও একটি

আমি মিস করা উইজেটগুলি যুক্ত করতে বা সরানোর উপায়গুলি খুঁজতে দয়া করে এই কোডটি পরীক্ষা করুন। 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 );
    } );
} );

সিএসএস:

.sidebar-full
{
    background-color: #cfe1ef !important;
}

.sidebar-morethanfull
{
    background-color: #c43 !important;
}

এগুলি লোড করার জন্য পিএইচপি:

$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 ... সার্ভার সাইড ফাংশনটি কী হারিয়েছে? এটি চেষ্টা করে দেখেনি, তবে ইন্টারেস্টেড।
কায়সার

আমি সার্ভারের দিক থেকে আরও কিছু চাইছিলাম, কিন্তু যখন আমি এটির কথা চিন্তা করি তখন আপনি ঠিক বলেছিলেন। এটি জেএস দ্বারা সীমাবদ্ধ করা প্রয়োজন। আমি আরও শক্তিশালী সমাধানের কথা চিন্তা করার চেষ্টা করব, সম্ভবত জেএস এর মাধ্যমে একত্রে উইজেটগুলি অস্বীকার করব
ফেলা যাবেন না

সাইডবারে বাগের সীমিত সংখ্যায় আপনার কোড সম্পর্কে একটি প্রশ্ন রয়েছে - বাগ
চার্লস ক্লার্কসন

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

ইন্টারেস্টিং প্রশ্নে সংক্ষিপ্ত বর্ণনায় তেমন কিছু খুঁজে পাওয়া যায়নি, তবে এখানে একটি অনুমান: 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'] ); - আপনাকে আমার সাইডবার-আইডিতে মোট উইজেটের সংখ্যা দেবে

আমি আশা করি এটি আপনার সন্দেহগুলির সমাধান করবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.