web-dev-qa-db-fra.com

Extension de la classe WP_Widget_Text

J'essaie de modifier la sortie du widget de texte WordPress par défaut. Etant donné que le widget est écrit en OOP, j'espérais que cela pourrait être une simple affaire d'étendre la classe et d'écraser une méthode - mais cela ne s'avère pas si simple.

La chose difficile est que je ne veux pas créer un nouveau widget qui est essentiellement une copie du widget de texte avec un nouveau nom - j'ai vraiment vouloir modifier la sortie du widget de texte actuel.

J'ai écrit un petit plugin pour cela, contenant deux fichiers: le fichier du plugin principal et la classe actuelle. Dans le fichier de plugin principal, je fais simplement:

add_action('widgets_init', 'include_my_class');
function include_my_class() {
    include("custom_class.php");
}

Si je ne le fais pas de cette façon, j'obtiens une erreur fatale, à savoir que le cours que j'essaie d'étendre n'existe pas. Néanmoins, je ne suis bien sûr pas sûr que ce soit la bonne façon de le faire.

Ma classe personnalisée ressemble à ceci:

class CustomTextWidget extends WP_Widget
{

    public function __construct() {
        parent::__construct();
    }

    public function widget( $args, $instance ) {

        /** This filter is documented in wp-includes/default-widgets.php */
        $title = apply_filters( 'widget_title', empty( $instance['title'] ) ? '' : $instance['title'], $instance, $this->id_base );

        /**
         * Filter the content of the Text widget.
         *
         * @since 2.3.0
         *
         * @param string    $widget_text The widget content.
         * @param WP_Widget $instance    WP_Widget instance.
         */
        $text = apply_filters( 'widget_text', empty( $instance['text'] ) ? '' : $instance['text'], $instance );
        echo $args['before_widget'];
        if ( ! empty( $title ) ) {
            echo $args['before_title'] . $title . $args['after_title'];
        } ?>
            // lots and lots of custom markup here…
            <div class="my-custom-textwidget"><?php echo !empty( $instance['filter'] ) ? wpautop( $text ) : $text; ?></div>
        <?php
        echo $args['after_widget'];
    }
}

Malheureusement, ma classe ne fait rien, le widget WordPress principal est toujours utilisé. Mais je ne peux pas me tromper complètement non plus puisqu'il n'y a pas d'erreur, mais où est-ce que je me trompe? Existe-t-il un moyen d'éviter d'introduire un nouveau widget?

1
Sven

Pensez-y, pourquoi WordPress ferait-il quelque chose simplement parce que vous avez défini une classe supplémentaire?

Ce n'est pas de la magie (ni magie magique ni magie à code). Le widget texte n'apparaît pas simplement parce que la classe existe . Lorsque WordPress charge, il exécute wp_widgets_init() , qui exécute register_widget('WP_Widget_Text').

Donc, techniquement, vous ne pouvez pas lui dire d’utiliser une classe différente. Ce que vous pouvez faire, c'est annuler l'inscription de la classe native et enregistrer la vôtre. Tant que votre classe affiche le même nom et les mêmes paramètres, il sera pratiquement impossible de les distinguer du widget natif.

1
Rarst