Cum pot modifica output-ul implicit al widget-urilor în WordPress?
Pentru a dezvolta răspunsul lui Mark, nu prea există multe filtre disponibile (în general) în widget-urile implicite din WordPress (cu excepția poate a widget_text
).
Dar adăugarea propriului widget personalizat este ușoară - puneți asta în 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");
}
Apoi pur și simplu trebuie să copiați widget-ul existent pentru categorii din wp-includes/widgets/class-wp-widget-categories.php
în my_widget.php
din tema dumneavoastră și să schimbați numele clasei la același nume folosit în apelul către register_widget()
de mai sus.
Apoi faceți orice modificări doriți! Vă sugerez să schimbați și titlul pentru a-l distinge de widget-ul implicit pentru Categorii.

Puteți suprascrie widget-urile implicite din WordPress prin extinderea acestora. Codul pentru widget-ul implicit de Categorii poate fi găsit la următorul link: https://developer.wordpress.org/reference/classes/wp_widget_categories/widget/
și mai jos este un exemplu de cod care arată cum puteți suprascrie afișarea widget-ului.
Class My_Categories_Widget extends WP_Widget_Categories {
function widget( $args, $instance ) {
// codul tău aici pentru suprascrierea afișării widget-ului
}
}
function my_categories_widget_register() {
unregister_widget( 'WP_Widget_Categories' );
register_widget( 'My_Categories_Widget' );
}
add_action( 'widgets_init', 'my_categories_widget_register' );

Și motivul pentru care nu am oferit asta ca opțiune este că poate doriți comportamentul original la un moment dat, iar cu soluția dumneavoastră pur și simplu pierdeți capacitatea de a-l obține.

Da, dacă doriți să păstrați widget-ul implicit așa cum este, este mai bine să înregistrați un widget complet nou. https://codex.wordpress.org/Function_Reference/register_widget

Nu este nevoie să creezi un widget complet nou pentru a face ceea ce dorești. După cum am înțeles din întrebarea ta, ești interesat doar să schimbi modul în care categoriile sunt afișate în partea frontală. Există două funcții care afișează categoriile în partea frontală:
wp_list_categories()
- afișează categoriile într-o listăwp_dropdown_categories()
- afișează categoriile într-o listă derulantă
Aceasta depinde de opțiunea selectată în backend.
Fiecare dintre aceste două funcții are un filtru specific pentru widget-uri (widget_categories_args
și respectiv widget_categories_dropdown_args
), pe care le poți folosi pentru a modifica argumentele care trebuie transmise acestor funcții. Poți folosi acest lucru pentru a altera comportamentul listei/listei derulante. Cu toate acestea, acest lucru poate să nu fie suficient pentru a face ceea ce dorești.
Alternativ, fiecare funcție are propriul filtru pentru a schimba complet modul în care aceste funcții ar trebui să afișeze rezultatul.
Acestea sunt:
Putem folosi filtrul widget_title
pentru a ținti specific widget-ul și nu alte instanțe ale acestor funcții.
Pe scurt, poți încerca următoarele: (NICIOERI TESTAT)
add_filter( 'widget_title', function( $title, $instance, $id_base )
{
// Țintim baza categoriilor
if( 'categories' === $id_base ) // Asigură-te că baza este corectă, nu sunt sigur aici
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 )
{
// Rulează filtrul doar o dată
remove_filter( current_filter(), __FUNCTION__ );
// Obține toate categoriile
$categories = get_categories( $args );
$output = '';
// Doar un exemplu de HTML personalizat
$output .= '<div class="some class">';
foreach ( $categories as $category ) {
// Doar un exemplu de HTML personalizat
$output .= '<div class="' . $category->term_id . '">';
// Poți adăuga orice altă informație aici, cum ar fi un link către categorie
$output .= $category->name;
// etc etc, înțelegi ideea
$output .= '</div>';
}
$output .= '</div>';
return $output;
};
