Как изменить стандартный вывод виджета в WordPress?

15 июн. 2016 г., 09:23:27
Просмотры: 18K
Голосов: 19

Я не хочу просто стилизовать стандартный виджет с помощью CSS. Мне нужно вывести содержимое виджета 'Категории' с собственной HTML структурой.

Есть ли доступные фильтры или хуки для этого?

2
Комментарии

Напишите свой собственный виджет, который делает то, что вам нужно. Начните с копирования кода виджета категорий и внесите изменения.

Mark Kaplun Mark Kaplun
15 июн. 2016 г. 09:40:38

Спасибо, я обычно использую этот трюк для модификации виджетов. Мне кажется, это самый простой способ.

Eh Jewel Eh Jewel
26 февр. 2018 г. 14:56:55
Все ответы на вопрос 3
0
16

Дополняя ответ Марка, стоит отметить, что в стандартных виджетах WordPress доступно не так много фильтров (за исключением, пожалуй, widget_text).

Однако создать собственный пользовательский виджет довольно просто — добавьте этот код в ваш functions.php:

require_once("my_widget.php");
add_action("widgets_init", "my_custom_widgets_init");

function my_custom_widgets_init(){
  register_widget("My_Custom_Widget_Class");
}

Затем вам нужно скопировать существующий виджет категорий из wp-includes/widgets/class-wp-widget-categories.php в файл my_widget.php вашей темы и изменить имя класса на то же, что используется в вызове register_widget() выше.

После этого вы можете вносить любые изменения! Рекомендую также изменить заголовок, чтобы отличать его от стандартного виджета категорий.

15 июн. 2016 г. 11:23:38
2
12

Вы можете переопределить стандартные виджеты WordPress, расширив их. Код стандартного виджета "Категории" доступен по следующей ссылке: https://developer.wordpress.org/reference/classes/wp_widget_categories/widget/

Ниже приведен пример кода, как можно переопределить вывод виджета.

Class My_Categories_Widget extends WP_Widget_Categories {
    function widget( $args, $instance ) {
        // ваш код для переопределения вывода виджета
    }
}

function my_categories_widget_register() {
    unregister_widget( 'WP_Widget_Categories' );
    register_widget( 'My_Categories_Widget' );
}
add_action( 'widgets_init', 'my_categories_widget_register' );
15 июн. 2016 г. 11:35:50
Комментарии

Причина, по которой я не предлагал это как вариант, в том, что вам может понадобиться оригинальное поведение в какой-то момент, а с вашим решением вы просто теряете возможность его получить.

Mark Kaplun Mark Kaplun
15 июн. 2016 г. 12:26:05

Да, если вы хотите оставить виджет по умолчанию как есть, лучше зарегистрировать полностью новый виджет. https://codex.wordpress.org/Function_Reference/register_widget

Boris Kuzmanov Boris Kuzmanov
15 июн. 2016 г. 12:37:17
0

Вам не нужно создавать совершенно новый виджет для того, что вы хотите сделать. Как я понял из вашего вопроса, вас интересует только изменение способа отображения категорий на фронтенде. Есть две функции, которые отвечают за отображение категорий:

Это зависит от того, какой вариант был выбран в админке.

Каждая из этих двух функций имеет свой собственный фильтр для виджетов (widget_categories_args и widget_categories_dropdown_args соответственно), который можно использовать для изменения аргументов, передаваемых в эти функции. Это может помочь изменить поведение списка или выпадающего меню. Однако этого может быть недостаточно для ваших целей.

Кроме того, каждая функция имеет свой собственный фильтр, позволяющий полностью изменить способ вывода результатов.

Эти фильтры:

Мы можем использовать фильтр widget_title, чтобы воздействовать именно на виджет, а не на другие вызовы этих функций.

Короче говоря, вы можете попробовать следующее: (ПОЛНОСТЬЮ НЕ ПРОВЕРЕНО)

add_filter( 'widget_title', function( $title, $instance, $id_base )
{
    // Нацеливаемся на базовый идентификатор категорий
    if( 'categories' === $id_base ) // Убедитесь, что базовый идентификатор правильный, я не уверен здесь
        add_filter( 'wp_list_categories', 'wpse_229772_categories', 11, 2 );
        //add_filter( 'wp_dropdown_cats', 'wpse_229772_categories', 11, 2 );
    return $title;
}, 10, 3 );

function wpse_229772_categories( $output, $args )
{
    // Фильтр срабатывает только один раз
    remove_filter( current_filter(), __FUNCTION__ );

    // Получаем все категории
    $categories = get_categories( $args );

    $output = '';
    // Пример пользовательского HTML
    $output .= '<div class="some class">';
    foreach ( $categories as $category ) {
        // Еще один пример пользовательского HTML
        $output .= '<div class="' . $category->term_id . '">';
        // Здесь можно добавить любую другую информацию, например ссылку на категорию
        $output .= $category->name;
        // и так далее, вы поняли идею
        $output .= '</div>';
    }
    $output .= '</div>';

    return $output;
};
    
15 июн. 2016 г. 14:36:18