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
Đã 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
—
kaiser
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_option
có 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.