निष्क्रिय विगेट्स की संख्या को सीमित करें


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:15

नहीं, क्योंकि मुझे पता चला कि यह सही ढंग से काम नहीं कर रहा है। ऐसा लगता है कि अन्य साइडबार से सेटिंग हटा रहा है
onetrickpony

तो फिर आपको Q. Hm से "मुझे एक हल मिल गया" निकालना चाहिए?
केसर

1
अपडेट किया गया। मेरे पास एक और कोशिश करने जा रहा हूं जब मेरे पास समय होगा
onetrickpony

क्या आपने इसे एक 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 विजेट और केवल निष्क्रिय साइडबार तक सीमित करता है। यह हटाए गए विजेट के विकल्पों को भी हटा देता है।

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