Получить список всех виджетов, зарегистрированных в админке WordPress
Я пытаюсь отключить несколько стандартных виджетов в своей теме через файл functions.php
.
Для этого я написал небольшую функцию, которая отлично работает:
function my_widget_ctrl() {
unregister_widget('WP_Widget_Pages');
unregister_widget('WP_Widget_Calendar');
unregister_widget('WP_Widget_Archives');
unregister_widget('WP_Widget_Links');
unregister_widget('WP_Widget_Meta');
unregister_widget('WP_Widget_Text');
unregister_widget('WP_Widget_Recent_Posts');
unregister_widget('WP_Widget_Recent_Comments');
unregister_widget('WP_Widget_RSS');
unregister_widget('WP_Widget_Tag_Cloud');
}
add_action('widgets_init', 'my_widget_ctrl', 11);
Теперь я хочу отключить некоторые другие виджеты, которые могут быть установлены/активированы другими плагинами. Но я не знаю, как получить список всех имен классов виджетов, чтобы можно было их отключить с помощью функции unregister_widget()
?

Виджеты хранятся в публичной переменной $widgets
класса WP_Widget_Factory
. Доступ к этому классу можно получить через глобальную переменную $wp_widget_factory
.
Чтобы получить все зарегистрированные виджеты, перечислите их ключи:
add_action( 'wp_footer', function()
{
if ( empty ( $GLOBALS['wp_widget_factory'] ) )
return;
$widgets = array_keys( $GLOBALS['wp_widget_factory']->widgets );
print '<pre>$widgets = ' . esc_html( var_export( $widgets, TRUE ) ) . '</pre>';
});
Чтобы удалить все виджеты, можно либо отменить регистрацию каждого виджета отдельно с помощью unregister_widget()
(предпочтительный способ), либо очистить массив за один раз:
add_action( 'widgets_init', function()
{
if ( empty ( $GLOBALS['wp_widget_factory'] ) )
return;
$GLOBALS['wp_widget_factory']->widgets = array();
}, 20);

Однако, хотя это возвращает виджеты из плагинов, похоже, что это не возвращает пользовательские зарегистрированные виджеты

@DerkJanSpeelman вероятно, это происходит потому, что они регистрируются позже, но, надеюсь, в том же действии widget_init
. Попробуйте изменить приоритет с 20 на 100 или даже 1000 и посмотрите, что получится. Хорошие плагины/темы/код всегда должны регистрировать свои виджеты во время widget_init
.
