Cómo modificar la salida predeterminada de widgets en WordPress

15 jun 2016, 09:23:27
Vistas: 18K
Votos: 19

No quiero aplicar estilos al widget predeterminado solo con CSS. Quiero mostrar el contenido del widget 'Categorías' con mi propia estructura HTML.

¿Existe algún filtro o hook disponible para hacer esto?

2
Comentarios

Escribe tu propio widget que haga lo que necesitas. Comienza copiando el código del widget de categorías y realiza modificaciones.

Mark Kaplun Mark Kaplun
15 jun 2016 09:40:38

Gracias, suelo seguir este truco para hacer mis modificaciones de widgets. Me parece el método más sencillo.

Eh Jewel Eh Jewel
26 feb 2018 14:56:55
Todas las respuestas a la pregunta 3
0
16

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.

15 jun 2016 11:23:38
2
12

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' );
15 jun 2016 11:35:50
Comentarios

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.

Mark Kaplun Mark Kaplun
15 jun 2016 12:26:05

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

Boris Kuzmanov Boris Kuzmanov
15 jun 2016 12:37:17
0

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:

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;
};
15 jun 2016 14:36:18