আমি জাভাস্ক্রিপ্ট এ সমাধান। আপনি যদি এটি পুরোপুরি প্রতিরোধ করতে চান তবে আপনার এটি সার্ভার-সাইডও করা উচিত, কারণ আপনি জাভাস্ক্রিপ্ট অক্ষম করে উইজেটগুলি সম্পাদনা করতে পারেন (এটি চেষ্টা করে দেখুন!)।
আপনি যখন উইজেটগুলি তাদের কাছে ছেড়ে যান বা সেগুলি থেকে দূরে রাখেন তখন বিভিন্ন সাইডবারগুলি পরীক্ষা করা হয়। যদি সেগুলি পূর্ণ হয়ে যায়, পটভূমির রঙ পরিবর্তন হয় এবং আপনি এগুলিতে আর আইটেমগুলি ফেলে দিতে পারবেন না। যদি, প্রারম্ভকালে, সাইডবারটি ইতিমধ্যে পূর্ণের চেয়ে বেশি থাকে (কারণ আপনি সীমাবদ্ধতা আরও কঠোর করেছেন), ব্যাকগ্রাউন্ডের রঙ লাল হয়ে যায়। আপনি এখনও উইজেটগুলি পুরো উইজেটগুলি থেকে আবার খালি করতে টেনে আনতে পারেন।
আমি মিস করা উইজেটগুলি যুক্ত করতে বা সরানোর উপায়গুলি খুঁজতে দয়া করে এই কোডটি পরীক্ষা করুন। 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
}
}