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?
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?
Odpowiedzi:
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.php
do do my_widget.php
motywu 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.
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' );
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
wp_list_categories()
który wyświetla kategorie na liście
wp_dropdown_categories()
która wyświetla kategorie na liście rozwijanej
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_args
i widget_categories_dropdown_args
odpowiednio ), 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_title
filtru, 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 );