web-dev-qa-db-ja.com

非アクティブなウィジェットをすべて削除するにはどうすればいいですか?

非アクティブなウィジェットをすべてクリーンアップしたいです。私はこの答えで示唆されているスニペットに従ってみました すべての非アクティブなウィジェットを削除するスクリプト? .

$sidebars_widgets = get_option( 'sidebars_widgets' );
$sidebars_widgets['wp_inactive_widgets'] = array();
update_option( 'sidebars_widgets', $sidebars_widgets );

また、オプションテーブルから直接オプションsidebars_widgetsを削除してみました。

しかし、ページが更新された後、古い値はすべての非アクティブなウィジェットと共に復元されます。無効にしたウィジェットをすべて一度に削除するにはどうすればよいですか。前もって感謝します。

2
Nilambar

after_setup_themeアクションでそれをするべきです:

function remove_inactive_widgets() {
     $sidebars_widgets = get_option( 'sidebars_widgets' );
     $sidebars_widgets['wp_inactive_widgets'] = array();
     update_option( 'sidebars_widgets', $sidebars_widgets );
}
add_action( 'after_setup_theme', 'remove_inactive_widgets' );
1
Behzad

ウィジェットのカスタマイズはウィジェット自体に保存されます。そのため、sidebars_widgetsを削除するだけでなく、ウィジェット内のカスタムデータも削除する必要があります。

$sidebars_widgets = get_option('sidebars_widgets');
foreach ($sidebars_widgets as $key => $value) {
    foreach ($value as $widget_id) {
        $pieces = explode('-', $widget_id);
        $multi_number = array_pop($pieces);
        $id_base = implode('-', $pieces);
        $widget = get_option('widget_' . $id_base);

        //Here it deletes the widget customizations that are linked to an id
        unset($widget[$multi_number]);

        update_option('widget_' . $id_base, $widget);
    }

    //Here it erases all the page's widget. Set ampty array.
    $sidebars_widgets[$key] = array();
}
update_option('sidebars_widgets', $sidebars_widgets);
0
Sergio Cabral