¿Cómo puedo modificar la salida del widget predeterminado de WordPress?

11

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

¿Hay algún filtro o gancho disponible para hacer eso?

    
pregunta Eh Jewel 15.06.2016 - 08:23

3 respuestas

10

Para ampliar la respuesta de Mark, no hay mucho (generalmente) disponible en forma de filtros en los widgets de WordPress predeterminados (excepto quizás widget_text ).

Pero agregar su propio widget personalizado es fácil: ponga esto en su 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 desea copiar el widget de categorías existentes de wp-includes/widgets/class-wp-widget-categories.php a my_widget.php en su tema, y cambiar el nombre de la clase al mismo nombre que el utilizado en la llamada a register_widget() anterior.

¡Entonces haz los cambios que quieras! Sugiero cambiar el título también para que pueda distinguirlo del widget de categorías predeterminado.

    
respondido por el Tim Malone 15.06.2016 - 10:23
8

Puedes anular los widgets predeterminados de WordPress extendiéndolos. El código para el widget de categorías predeterminado se puede encontrar en el siguiente enlace: enlace

y debajo hay un código de ejemplo de cómo puedes anular la salida del widget.

Class My_Categories_Widget extends WP_Widget_Categories {
    function widget( $args, $instance ) {
        // your code here for overriding the output of the widget
    }
}

function my_categories_widget_register() {
    unregister_widget( 'WP_Widget_Categories' );
    register_widget( 'My_Categories_Widget' );
}
add_action( 'widgets_init', 'my_categories_widget_register' );
    
respondido por el Boris Kuzmanov 15.06.2016 - 10:35
7

No es necesario crear un nuevo widget completo para hacer lo que necesita hacer. Mientras leo su pregunta, solo le interesa cambiar la forma en que se muestran las categorías en la parte delantera. Hay dos funciones que muestran las categorías en la parte frontal

Todo esto depende de qué opción se seleccionó en el backend

Ahora, cada una de estas dos funciones tiene un filtro específico de widget ( widget_categories_args y widget_categories_dropdown_args respectivamente ) que puede usar para alterar los argumentos que deben pasarse a estas funciones. Puede usar esto para alterar el comportamiento de la lista / desplegable. Sin embargo, esto puede no ser suficiente para hacer lo que quiere.

Alternativamente, cada función tiene su propio filtro para alterar completamente la forma en que estas funciones deben mostrar su salida.

Ellos son respectivamente

Podemos usar el filtro widget_title para apuntar específicamente solo al widget y no a otras instancias de estas funciones.

En resumen, puedes intentar lo siguiente: ( TOTALMENTE SIN PRUEBAS )

add_filter( 'widget_title', function( $title, $instance, $id_base )
{
    // Target the categories base
    if( 'categories' === $id_base ) // Just make sure the base is correct, I'm not sure here
        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 )
{
    // Only run the filter once
    remove_filter( current_filter(), __FUNCTION__ );

    // Get all the categories
    $categories = get_categories( $args );

    $output = '';
    // Just an example of custom html
    $output .= '<div class="some class">';
    foreach ( $categories as $category ) {
        // Just an example of custom html
        $output .= '<div class="' . echo $category->term_id . '">';
        // You can add any other info here, like a link to the category
        $output .= $category->name;
        // etc ect, you get the drift
        $output .= '</div>';
    }
    $output .= '</div>';

    return $output;
}, 11, 2 );
    
respondido por el Pieter Goosen 15.06.2016 - 13:36

Lea otras preguntas en las etiquetas