web-dev-qa-db-fra.com

Remplacer la classe Widget dans les plugins avec un plugin personnalisé

Je suis en train de modifier un thème acheté pour un client qui a plusieurs plugins nécessaires à son fonctionnement. L'un des plugins requis, crée un widget qui affiche un type de publication et le client souhaite supprimer certains des champs affichés.

Facile à aller dans le plugin et éditer, problème résolu. Ce n'est bien sûr pas une bonne pratique. J'aimerais savoir s'il est possible de créer un plugin personnalisé capable de gérer certaines des fonctionnalités du plugin requis. On dirait que ce devrait être un type d'action raisonnable, mais un peu perdu pour les meilleures pratiques. Quelques questions.

Voici le début du cours qui doit être écrasé:

add_action('widgets_init', 'gdlr_lms_recent_course_widget');
if( !function_exists('gdlr_lms_recent_course_widget') ){
    function gdlr_lms_recent_course_widget() {
        register_widget( 'Goodlayers_Lms_Recent_Course' );
    }
}

if( !class_exists('Goodlayers_Lms_Recent_Course') ){
    class Goodlayers_Lms_Recent_Course extends WP_Widget{

        // Initialize the widget
        function __construct() {
            parent::WP_Widget(
                'gdlr-lms-recent-course-widget',
                __('Goodlayers Recent Course Widget','gdlr-lms'),
                array('description' => __('A widget that shows latest courses', 'gdlr-lms')));
        }

        // Output of the widget
        function widget( $args, $instance ) {
            global $gdlr_lms_option;

            $title = apply_filters( 'widget_title', $instance['title'] );
            $category = $instance['category'];
            $num_fetch = $instance['num_fetch'];

            // Opening of widget
            echo $args['before_widget'];

            // Open of title tag
            if( !empty($title) ){
                echo $args['before_title'] . $title . $args['after_title'];
            }

            // Widget Content
            $current_post = array(get_the_ID());
            $query_args = array('post_type' => 'course', 'suppress_filters' => false);
            $query_args['posts_per_page'] = $num_fetch;
            $query_args['orderby'] = 'post_date';
            $query_args['order'] = 'desc';
            $query_args['paged'] = 1;
            $query_args['course_category'] = $category;
            $query_args['ignore_sticky_posts'] = 1;
            $query_args['post__not_in'] = array(get_the_ID());
            $query = new WP_Query( $query_args );

            if($query->have_posts()){
                echo '<div class="gdlr-lms-course-widget">';
                while($query->have_posts()){ $query->the_post();
                    echo '<div class="recent-course-widget">';
                    gdlr_lms_print_course_thumbnail('thumbnail');

                    echo '<div class="recent-course-widget-content">';
                    echo '<div class="recent-course-widget-title"><a href="' . get_permalink() . '" >' . get_the_title() . '</a></div>';
                    echo '<div class="recent-course-widget-info blog-info">';
                echo '<span class="gdlr-head">' . __('Created on', 'gdlr-lms') . '</span> ';
                    echo get_the_time($gdlr_lms_option['date-format']);
                    echo '</div>';
                    echo '</div>';
                    echo '<div class="clear"></div>';
                    echo '</div>';
                }
                echo '<div class="clear"></div>';
                echo '</div>';
            }
            wp_reset_postdata();

            // Closing of widget
            echo $args['after_widget'];
        }

Quelques questions: je pensais que le if(!class_exists(... avait pour but de permettre à la classe d'être créée ailleurs, ce qui permettait la possibilité de passer outre, mais cela ne semble pas fonctionner. Devrais-je avoir des erreurs sur la classe ayant déjà été définie?

Est-ce la bonne méthode pour étendre cette classe avec la mienne et utiliser l'action remove sur l'instruction add_action, puis ajouter la mienne?

Je suis un ancien programmeur procédural et je commence tout juste à entrer dans mon premier ensemble de classes personnalisées. Si j'étends la classe, le constructeur appellera-t-il toujours le parent du parent ou dois-je ajouter parent::__construct à mon constructeur?

J'ai trouvé quelques exemples, mais ils sont plutôt anciens et n'expliquent pas tout. Je tiens à me faire une idée à ce sujet, car cette fonctionnalité serait exceptionnellement utile pour apporter des modifications aux sites clients lorsque ceux-ci ne souhaitent pas être entièrement personnalisés.

3
Robert Wilde

En fait, vous êtes sur le point de répondre à votre propre question. Votre plugin devrait commencer par vérifier si le plugin est actif (ce que vous pouvez aussi faire avec function_exists).

Vous pouvez en effet utiliser remove_action pour vous assurer que les fonctions et les classes ne sont pas activées. Cela ne signifie pas que ces fonctions deviennent indéfinies.

Alors oui, vous devrez étendre la classe si vous voulez la personnaliser. Si vous ne définissez pas de constructeur dans cette classe personnalisée, le constructeur du parent sera utilisé.

1
cjbj