Come modificare l'output predefinito dei widget in WordPress
Per ampliare la risposta di Mark, non ci sono molti filtri disponibili (in generale) nei widget predefiniti di WordPress (a parte forse widget_text
).
Ma aggiungere il proprio widget personalizzato è semplice: inserisci questo nel tuo 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");
}
Poi devi semplicemente copiare il widget delle categorie esistente da wp-includes/widgets/class-wp-widget-categories.php
a my_widget.php
nel tuo tema, e cambiare il nome della classe con lo stesso nome usato nella chiamata a register_widget()
sopra.
Quindi fai tutte le modifiche che vuoi! Suggerisco di cambiare anche il titolo così da distinguerlo dal widget predefinito delle categorie.

Puoi sovrascrivere i widget predefiniti di WordPress estendendoli. Il codice per il widget predefinito delle Categorie può essere trovato al seguente link: https://developer.wordpress.org/reference/classes/wp_widget_categories/widget/
e di seguito è riportato un esempio di codice su come puoi sovrascrivere l'output del widget.
Class My_Categories_Widget extends WP_Widget_Categories {
function widget( $args, $instance ) {
// il tuo codice qui per sovrascrivere l'output del widget
}
}
function my_categories_widget_register() {
unregister_widget( 'WP_Widget_Categories' );
register_widget( 'My_Categories_Widget' );
}
add_action( 'widgets_init', 'my_categories_widget_register' );

E il motivo per cui non l'ho offerto come opzione è che potresti volere il comportamento originale in qualche momento, e con la tua soluzione perderesti semplicemente la possibilità di ottenerlo.

Sì, se vuoi mantenere il widget predefinito così com'è, è meglio registrare un widget completamente nuovo. https://codex.wordpress.org/Function_Reference/register_widget

Non è necessario creare un nuovo widget completo per fare ciò che ti serve. Come ho capito dalla tua domanda, sei interessato solo a modificare il modo in cui le categorie vengono visualizzate sul front end. Ci sono due funzioni che mostrano le categorie sul front end:
wp_list_categories()
che mostra le categorie in un elencowp_dropdown_categories()
che mostra le categorie in un menu a discesa
Tutto dipende dall'opzione selezionata nel backend.
Ora, ciascuna di queste due funzioni ha un filtro specifico per il widget (widget_categories_args
e widget_categories_dropdown_args
rispettivamente) che puoi utilizzare per modificare gli argomenti che dovrebbero essere passati a queste funzioni. Puoi usarlo per alterare il comportamento dell'elenco/menu a discesa. Tuttavia, questo potrebbe non essere sufficiente per fare ciò che vuoi.
In alternativa, ogni funzione ha il proprio filtro per modificare completamente il modo in cui queste funzioni dovrebbero visualizzare il loro output.
Sono rispettivamente:
Possiamo utilizzare il filtro widget_title
per indirizzare specificamente solo il widget e non altre istanze di queste funzioni.
In breve, puoi provare quanto segue: (TOTALMENTE NON TESTATO)
add_filter( 'widget_title', function( $title, $instance, $id_base )
{
// Indirizza la base delle categorie
if( 'categories' === $id_base ) // Assicurati solo che la base sia corretta, non sono sicuro qui
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 )
{
// Esegui il filtro solo una volta
remove_filter( current_filter(), __FUNCTION__ );
// Ottieni tutte le categorie
$categories = get_categories( $args );
$output = '';
// Solo un esempio di HTML personalizzato
$output .= '<div class="some class">';
foreach ( $categories as $category ) {
// Solo un esempio di HTML personalizzato
$output .= '<div class="' . $category->term_id . '">';
// Puoi aggiungere qualsiasi altra informazione qui, come un link alla categoria
$output .= $category->name;
// eccetera, hai capito il concetto
$output .= '</div>';
}
$output .= '</div>';
return $output;
};
