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


10

আমি "wp_inactive_widgets" সাইডবার থেকে উইজেট সংখ্যা সর্বোচ্চ 10 এ সীমাবদ্ধ করার চেষ্টা করছি, কারণ উইজেটগুলির প্রশাসক পৃষ্ঠাটি অবিশ্বাস্যভাবে ধীর:

add_filter('pre_update_option_sidebars_widgets', 'cleanup_inactive_widgets', 10, 2);

function cleanup_inactive_widgets($new, $old){
  if(!empty($new['wp_inactive_widgets']) && count($new['wp_inactive_widgets']) > 10)
    $new['wp_inactive_widgets'] = array_slice($new['wp_inactive_widgets'], -10, 10);

  return $new;
}

এটি স্পষ্টতই কাজ করে, তবে সমস্যাটি হ'ল উইজেট উদাহরণ বিকল্পগুলি ডাটাবেসে এখনও রয়ে যায়, যদি উইজেট উদাহরণটি সাইডবারের ভিতরে না থাকে বা না থাকে ...

কেউ কি উইজেটের বিকল্পগুলি অপসারণের কোনও উপায় জানেন?


আমি একটি সমাধান খুঁজে পেয়েছি:

সম্পাদনা করুন: নির্দিষ্ট পরিস্থিতিতে এটি অন্যান্য সাইডবারগুলি থেকেও উইজেটগুলি সরিয়ে ফেলবে বলে মনে হচ্ছে, কী কারণে এটি ঘটছে তা আমি নিশ্চিত নই ...

if(!empty($new['wp_inactive_widgets']) && count($new['wp_inactive_widgets']) > 10){

  // find out which widget instances to remove
  $removed_widgets = array_slice($new['wp_inactive_widgets'], 0, -10);

  // remove instance options
  foreach($removed_widgets as $widget_id)
    if(isset($GLOBALS['wp_registered_widgets'][$widget_id])){

      $instance = $GLOBALS['wp_registered_widgets'][$widget_id]['callback'][0]->number;
      $option_name = $GLOBALS['wp_registered_widgets'][$widget_id]['callback'][0]->option_name;

      $options = get_option($option_name);   // get options of all instances
      unset($options[$instance]);            // remove this instance's options
      update_option($option_name, $options);
    }

  // keep only the last 10 records from the inactive widgets area
  $new['wp_inactive_widgets'] = array_slice($new['wp_inactive_widgets'], -10, 10);

}
return $new;

1
আপনি কি এটি এ হিসাবে লিখতে পারেন এবং এটি গ্রহণযোগ্য হিসাবে চিহ্নিত করতে পারেন? ধন্যবাদ!
কায়সার

না কারণ আমি খুঁজে পেয়েছি এটি সঠিকভাবে কাজ করছে না। এটি অন্য
সাইডবারগুলি

তারপরে আপনার কিউএম থেকে "আমি একটি সমাধান খুঁজে পেয়েছি" সরিয়ে ফেলা উচিত?
কায়সার

1

আপনি কি কোনও if ( is_admin() && /* page does here */ )বিবৃতিতে এটি মোড়ানোর চেষ্টা করেছেন? আমার অনুমানটি হ'ল আপনি বিশ্বব্যাপী প্রতিটি অনুরোধে এই উইজেটগুলি সরিয়ে ফেলছেন। ঠিক আছে: সম্পাদনা করুন। এটি সম্পর্কে কিছু চিন্তা করার পরে, আপনার সমস্যা হতে পারে আপনি update_optionবিশ্বব্যাপী অ্যাক্সেসযোগ্য যা ব্যবহার করেন (উইজেটগুলির জন্য সঠিক অভ্যন্তরগুলি জানেন না)। হতে পারে আপনি একটি কাস্টম সীমিত উইজেট বিকল্প আপডেট করতে পারেন এবং হস্তক্ষেপ পেতে আপনার কাস্টম বিকল্পের সাথে নিষ্ক্রিয় উইজেট অঞ্চলকে "ফিড" করতে পারেন।
কায়সার

উত্তর:


3

V3.2.1 এর অধীনে পরীক্ষিত:

$sidebars = wp_get_sidebars_widgets();
if(count($sidebars['wp_inactive_widgets']) > 10){
    $new_inactive = array_slice($sidebars['wp_inactive_widgets'],-10,10);

    // remove the dead widget options
    $dead_inactive = array_slice($sidebars['wp_inactive_widgets'],0,count($sidebars['wp_inactive_widgets'])-10);
    foreach($dead_inactive as $dead){
        $pos = strpos($dead,'-');
        $widget_name = substr($dead,0,$pos);
        $widget_number = substr($dead,$pos+1);
        $option = get_option('widget_'.$widget_name);
        unset($option[$widget_number]);
        update_option('widget_'.$widget_name,$option);
    }

    // save our new widget setup
    $sidebars['wp_inactive_widgets'] = $new_inactive;
    wp_set_sidebars_widgets($sidebars);
}

উপরের কোডটি নিষ্ক্রিয় সাইডবারকে শেষ 10 টি উইজেট এবং কেবল নিষ্ক্রিয় সাইডবারে সীমাবদ্ধ করে। এটি মুছে ফেলা উইজেটগুলির বিকল্পগুলিও সরিয়ে দেয়।

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