Cómo modificar la salida predeterminada de widgets en WordPress
Para ampliar la respuesta de Mark, generalmente no hay muchos filtros disponibles en los widgets predeterminados de WordPress (excepto quizás para widget_text
).
Pero agregar tu propio widget personalizado es fácil: coloca esto en tu 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");
}
Luego simplemente copia el widget de categorías existente desde wp-includes/widgets/class-wp-widget-categories.php
a my_widget.php
en tu tema, y cambia el nombre de la clase al mismo nombre usado en la llamada a register_widget()
anterior.
¡Luego haz los cambios que desees! Sugiero cambiar también el título para que puedas distinguirlo del widget predeterminado de Categorías.

Puedes sobrescribir los widgets predeterminados de WordPress extendiéndolos. El código del widget predeterminado de Categorías se puede encontrar en el siguiente enlace: https://developer.wordpress.org/reference/classes/wp_widget_categories/widget/
Y a continuación se muestra un código de ejemplo de cómo puedes sobrescribir la salida del widget.
Class My_Categories_Widget extends WP_Widget_Categories {
function widget( $args, $instance ) {
// tu código aquí para sobrescribir la salida del widget
}
}
function my_categories_widget_register() {
unregister_widget( 'WP_Widget_Categories' );
register_widget( 'My_Categories_Widget' );
}
add_action( 'widgets_init', 'my_categories_widget_register' );

Y la razón por la que no lo ofrecí como una opción es que podrías querer el comportamiento original en algún momento, y con tu solución simplemente pierdes la capacidad de obtenerlo.

Sí, si quieres mantener el widget predeterminado tal como está, es mejor registrar un widget completamente nuevo. https://codex.wordpress.org/Function_Reference/register_widget

No necesitas crear un widget completamente nuevo para hacer lo que necesitas. Según entiendo tu pregunta, solo estás interesado en cambiar cómo se muestran las categorías en el frontend. Hay dos funciones que muestran las categorías en el frontend:
wp_list_categories()
que muestra las categorías en una listawp_dropdown_categories()
que muestra las categorías en una lista desplegable
Esto depende de qué opción se seleccionó en el backend.
Cada una de estas dos funciones tiene un filtro específico para widgets (widget_categories_args
y widget_categories_dropdown_args
respectivamente) que puedes usar para modificar los argumentos que se pasan a estas funciones. Puedes usarlos para alterar el comportamiento de la lista/desplegable. Sin embargo, esto puede no ser suficiente para lo que necesitas.
Alternativamente, cada función tiene su propio filtro para alterar completamente la forma en que estas funciones muestran su salida.
Estos son respectivamente:
Podemos usar el filtro widget_title
para dirigirnos específicamente al widget y no a otras instancias de estas funciones.
En resumen, puedes probar lo siguiente: (TOTALMENTE NO PROBADO)
add_filter( 'widget_title', function( $title, $instance, $id_base )
{
// Apuntar a la base de categorías
if( 'categories' === $id_base ) // Solo asegúrate de que la base sea correcta, no estoy seguro aquí
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 )
{
// Solo ejecutar el filtro una vez
remove_filter( current_filter(), __FUNCTION__ );
// Obtener todas las categorías
$categories = get_categories( $args );
$output = '';
// Solo un ejemplo de HTML personalizado
$output .= '<div class="some class">';
foreach ( $categories as $category ) {
// Solo un ejemplo de HTML personalizado
$output .= '<div class="' . $category->term_id . '">';
// Puedes añadir cualquier otra información aquí, como un enlace a la categoría
$output .= $category->name;
// etc, etc, ya entiendes la idea
$output .= '</div>';
}
$output .= '</div>';
return $output;
};
