Получить список всех виджетов, зарегистрированных в админке WordPress

13 окт. 2013 г., 12:34:17
Просмотры: 13.9K
Голосов: 7

Я пытаюсь отключить несколько стандартных виджетов в своей теме через файл 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()?

0
Все ответы на вопрос 1
3
16

Виджеты хранятся в публичной переменной $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);
13 окт. 2013 г. 14:13:52
Комментарии

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

Derk Jan Speelman Derk Jan Speelman
15 июн. 2017 г. 15:46:07

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

Anastis Anastis
25 янв. 2018 г. 16:38:19

Это возвращает все виджеты, даже из деактивированных тем. Есть ли способ возвращать только доступные виджеты из текущей активной темы?? Пожалуйста, помогите

karlosuccess karlosuccess
2 июл. 2023 г. 09:43:47