Jak mogę zmodyfikować domyślne wyjście widgetu WordPress?


17

Nie chcę stylizować domyślnego widżetu tylko za pomocą CSS. Chcę wyświetlić domyślną treść widgetu „Kategorie” z własną strukturą HTML.

Czy jest do tego jakiś filtr lub haczyk?


2
Napisz własny widżet, który robi to, co chcesz. Zacznij od skopiowania kodu widżetu kategorii i dokonaj modyfikacji.
Mark Kaplun,

Dzięki, zwykle wykonuję tę sztuczkę, aby modyfikować widżety. Wydaje mi się, że jest to łatwiejsza metoda.
Eh Jewel

Odpowiedzi:


13

Aby rozwinąć odpowiedź Marka, w domyślnych widżetach WordPress nie ma wiele (ogólnie) dostępnych filtrów widget_text.

Ale dodanie własnego niestandardowego widgetu jest łatwe - umieść to w 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");
}

Następnie po prostu chcesz skopiować istniejący widżet kategorii z wp-includes/widgets/class-wp-widget-categories.phpdo do my_widget.phpmotywu i zmienić nazwę klasy na taką samą, jak nazwa użyta w wywołaniu register_widget()powyżej.

Następnie dokonaj dowolnych zmian! Sugeruję również zmianę tytułu, aby można go było odróżnić od domyślnego widżetu kategorii.


10

Możesz zastąpić domyślne widżety WordPress, rozszerzając je. Kod domyślnego widgetu kategorii można znaleźć pod następującym linkiem: https://developer.wordpress.org/reference/classes/wp_widget_categories/widget/

a poniżej znajduje się przykładowy kod, w jaki sposób można przesłonić dane wyjściowe widżetu.

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' );

1
A powodem, dla którego nie zaoferowałem tego jako opcji, jest to, że w pewnym momencie możesz chcieć oryginalnego zachowania, a dzięki swojemu rozwiązaniu po prostu tracisz możliwość jego uzyskania.
Mark Kaplun,

Tak, jeśli chcesz mieć domyślny widżet, lepiej zarejestrować zupełnie nowy widżet. codex.wordpress.org/Function_Reference/register_widget
Boris Kuzmanov

8

Nie musisz tworzyć kompletnego nowego widżetu, aby robić to, co musisz zrobić. Gdy czytam twoje pytanie, jesteś zainteresowany zmianą sposobu wyświetlania kategorii na interfejsie. Istnieją dwie funkcje, które wyświetlają kategorie na interfejsie

Wszystko zależy od tego, która opcja została wybrana w wewnętrznej bazie danych

Teraz każda z tych dwóch funkcji ma filtr specyficzny dla widżetu ( widget_categories_argsi widget_categories_dropdown_argsodpowiednio ), którego można użyć do zmiany argumentów, które należy przekazać do tych funkcji. Możesz użyć tego do zmiany zachowania listy / menu rozwijanego. Jednak może to nie wystarczyć do robienia tego, co chcesz.

Alternatywnie, każda funkcja ma swój własny filtr, aby całkowicie zmienić sposób wyświetlania tych danych wyjściowych przez te funkcje.

Są odpowiednio

Możemy użyć widget_titlefiltru, aby kierować konkretnie tylko na widżet, a nie inne wystąpienia tych funkcji.

Krótko mówiąc, możesz spróbować wykonać następujące czynności: ( CAŁKOWICIE NIEBADANE )

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 );
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.