Comment puis-je modifier la sortie du widget WordPress par défaut?

17

Je ne veux pas styliser le widget par défaut avec seulement CSS. Je souhaite afficher le contenu du widget «Catégories» par défaut avec ma propre structure HTML.

Existe-t-il un filtre ou un crochet pour le faire?

Eh bijou
la source
2
Écrivez votre propre widget qui fait ce que vous voulez. Commencez par copier le code du widget de catégories et effectuez des modifications.
Mark Kaplun
Merci, j'ai l'habitude de suivre cette astuce pour faire mes modifications de widget. C'est la méthode la plus simple qui me semble.
Eh Jewel

Réponses:

13

Pour développer la réponse de Mark, il n'y a pas (généralement) beaucoup de filtres disponibles dans les widgets WordPress par défaut (sauf peut-être widget_text).

Mais ajouter votre propre widget personnalisé est facile - mettez-le dans votre 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");
}

Ensuite, vous souhaitez simplement copier le widget des catégories existantes de wp-includes/widgets/class-wp-widget-categories.phpà my_widget.phpdans votre thème et changer le nom de la classe pour le même nom que celui utilisé dans l'appel à register_widget()ci-dessus.

Apportez ensuite les modifications que vous souhaitez! Je suggère également de changer le titre afin que vous puissiez le distinguer du widget Catégories par défaut.

Tim Malone
la source
10

Vous pouvez remplacer les widgets WordPress par défaut en les étendant. Le code du widget Catégories par défaut se trouve sur le lien suivant: https://developer.wordpress.org/reference/classes/wp_widget_categories/widget/

et ci-dessous est un exemple de code sur la façon dont vous pouvez remplacer la sortie du 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' );
Boris Kuzmanov
la source
1
Et la raison pour laquelle je n'ai pas proposé cela en option est que vous pourriez vouloir le comportement d'origine à un moment donné, et avec votre solution, vous perdez simplement la capacité de l'obtenir.
Mark Kaplun
Oui, si vous souhaitez avoir le widget par défaut tel quel, il est préférable d'enregistrer un widget totalement nouveau. codex.wordpress.org/Function_Reference/register_widget
Boris Kuzmanov
8

Vous n'avez pas besoin de créer un nouveau widget complet pour faire ce que vous devez faire. En lisant votre question, vous souhaitez simplement modifier la façon dont les catégories sont affichées sur le front-end. Il y a deux fonctions qui affichent les catégories sur le front-end

Tout dépend de l'option sélectionnée dans le backend

Maintenant, chacune de ces deux fonctions possède un filtre spécifique au widget ( widget_categories_argset widget_categories_dropdown_argsrespectivement ) que vous pouvez utiliser pour modifier les arguments qui doivent être passés à ces fonctions. Vous pouvez l'utiliser pour modifier le comportement de la liste / liste déroulante. Cependant, cela peut ne pas être suffisant pour faire ce que vous voulez.

Alternativement, chaque fonction a son propre filtre pour modifier complètement la façon dont ces fonctions doivent afficher leur sortie.

Ils sont respectivement

Nous pouvons utiliser le widget_titlefiltre pour cibler spécifiquement le widget uniquement et non les autres instances de ces fonctions.

En bref, vous pouvez essayer ce qui suit: ( TOTALEMENT NON VÉRIFIÉ )

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 );
Pieter Goosen
la source