จำกัด จำนวนวิดเจ็ตที่ไม่แอ็คทีฟ


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
คุณสามารถเขียนสิ่งนี้เป็น A และทำเครื่องหมายว่าเป็นที่ยอมรับได้ไหม ขอบคุณ!
ไกเซอร์

ไม่เพราะฉันพบว่ามันทำงานไม่ถูกต้อง ดูเหมือนว่าจะลบการตั้งค่าจากแถบด้านข้างอื่น ๆ
onetrickpony

จากนั้นคุณควรลบ "ฉันพบวิธีแก้ปัญหา" ออกจาก Q. Hm หรือไม่
ไกเซอร์

1
Updated Q. ฉันจะให้มันลองอีกเมื่อฉันมีเวลา
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 วิดเจ็ตล่าสุดและเฉพาะแถบด้านข้างที่ไม่ได้ใช้งาน นอกจากนี้ยังลบตัวเลือกสำหรับวิดเจ็ตที่ถูกลบไปแล้ว

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.