Giới hạn số lượng vật dụng không hoạt động


10

Tôi đang cố gắng hạn chế số lượng widget từ thanh bên "wp_inactive_widgets" xuống tối đa 10, vì trang quản trị widget rất chậm:

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;
}

Điều này rõ ràng hoạt động, nhưng vấn đề là các tùy chọn cá thể widget vẫn còn trong cơ sở dữ liệu, bất kể thể hiện widget có tồn tại hay không bên trong một thanh bên ...

Có ai biết một cách để loại bỏ các tùy chọn widget quá không?


Tôi đã tìm ra một giải pháp:

Chỉnh sửa: trong một số trường hợp, dường như cũng loại bỏ các widget khỏi các sidebars khác, tôi không chắc điều gì gây ra điều này ...

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
Bạn có thể viết cái này là A và đánh dấu nó là chấp nhận không? Cảm ơn!
kaiser

Không bởi vì tôi phát hiện ra nó không hoạt động chính xác. Nó dường như đang xóa cài đặt khỏi các thanh bên khác
onetrickpony

Sau đó, bạn nên xóa "Tôi tìm thấy giải pháp" khỏi Q. Hả?
kaiser

1
Đã cập nhật Q. Tôi sẽ thử lại lần nữa khi tôi có thời gian
onetrickpony

Bạn đã cố gắng để bọc nó trong một if ( is_admin() && /* page does here */ )tuyên bố? Tôi đoán vấn đề là bạn đang loại bỏ toàn bộ các vật dụng đó trên mỗi yêu cầu ở mọi nơi. Ok: Chỉnh sửa. Sau khi suy nghĩ về vấn đề này, vấn đề của bạn có thể là bạn sử dụng update_optioncó thể truy cập được trên toàn cầu (không biết nội dung chính xác cho các vật dụng). Có lẽ bạn có thể cập nhật tùy chọn widget giới hạn tùy chỉnh và "cung cấp" khu vực widget không hoạt động với tùy chọn tùy chỉnh của bạn để tránh nhiễu.
kaiser

Câu trả lời:


3

Đã thử nghiệm theo 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);
}

Đoạn mã trên giới hạn thanh bên không hoạt động trong 10 tiện ích cuối cùng và chỉ có thanh bên không hoạt động. Nó cũng loại bỏ các tùy chọn cho các widget đã bị xóa.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.