Como posso modificar a saída do widget padrão do WordPress?

11

Eu não quero estilizar o widget padrão apenas com CSS. Desejo exibir o conteúdo do widget 'Categorias' padrão com minha própria estrutura HTML.

Existe algum filtro ou gancho disponível para isso?

    
por Eh Jewel 15.06.2016 / 08:23

3 respostas

10

Para expandir a resposta de Mark, não há muito (geralmente) disponível na forma de filtros nos widgets padrão do WordPress (exceto talvez widget_text ).

Mas é fácil adicionar seu próprio widget personalizado - coloque isso em 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");
}

Você simplesmente deseja copiar o widget de categorias existentes de wp-includes/widgets/class-wp-widget-categories.php para my_widget.php em seu tema e alterar o nome da classe para o mesmo nome usado na chamada para register_widget() acima.

Depois faça as alterações que quiser! Sugiro alterar o título também para que você possa diferenciá-lo do widget de categorias padrão.

    
por Tim Malone 15.06.2016 / 10:23
8

Você pode substituir os widgets padrão do WordPress estendendo-os. O código para o widget Categorias padrão pode ser encontrado no seguinte link: enlace

e abaixo está um código de exemplo, como você pode substituir a saída do 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' );
    
por Boris Kuzmanov 15.06.2016 / 10:35
7

Você não precisa criar um novo widget completo para fazer o que precisa fazer. Enquanto leio sua pergunta, você está apenas interessado em mudar a forma como as categorias são exibidas no front end. Existem duas funções que exibem as categorias no front end

Tudo depende de qual opção foi selecionada no backend

Agora, cada uma dessas duas funções tem um filtro específico de widget ( widget_categories_args e widget_categories_dropdown_args respectivamente ) que você pode usar para alterar os argumentos que devem ser passados para essas funções. Você pode usar isso para alterar o comportamento da lista / lista suspensa. No entanto, isso pode não ser suficiente para fazer o que você deseja.

Como alternativa, cada função possui seu próprio filtro para alterar completamente a maneira como essas funções devem exibir sua saída.

Eles são respectivamente

Podemos usar o filtro widget_title para segmentar especificamente apenas o widget e não outras instâncias dessas funções.

Em resumo, você pode tentar o seguinte: ( TOTALMENTE NÃO ATUALIZADO )

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 );
    
por Pieter Goosen 15.06.2016 / 13:36