Как изменить стандартный вывод виджета в WordPress?
Дополняя ответ Марка, стоит отметить, что в стандартных виджетах 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()
выше.
После этого вы можете вносить любые изменения! Рекомендую также изменить заголовок, чтобы отличать его от стандартного виджета категорий.

Вы можете переопределить стандартные виджеты 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' );

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

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

Вам не нужно создавать совершенно новый виджет для того, что вы хотите сделать. Как я понял из вашего вопроса, вас интересует только изменение способа отображения категорий на фронтенде. Есть две функции, которые отвечают за отображение категорий:
wp_list_categories()
— отображает категории в виде спискаwp_dropdown_categories()
— отображает категории в выпадающем списке
Это зависит от того, какой вариант был выбран в админке.
Каждая из этих двух функций имеет свой собственный фильтр для виджетов (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;
};
