用自定义插件覆盖插件中的Widget类

时间:2015-03-19 作者:Robert Wilde

我目前正在为一个客户机修改一个购买的主题,该客户机需要几个插件才能正常工作。所需的插件之一,创建一个显示帖子类型的小部件,客户端希望删除一些显示的字段。

很容易进入插件和编辑,问题解决了。当然,这不是好的做法。我想知道,如果一个如何创建一个自定义插件,可以超过所需插件的一些功能。看起来这应该是一种合理的行动,但在最佳实践方面有点迷失。几个问题。

以下是需要覆盖的类的开头:

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\'];
        }
几个问题:我相信if(!class_exists(... 允许在其他地方创建类,允许重写,但这似乎不起作用。我应该得到关于已经定义的类的错误吗?

是使用my own扩展此类并对add_action 语句,然后添加我自己的?

我以前是一名程序编程人员,刚刚进入我的第一组自定义类。如果我扩展这个类,构造函数还会调用父类的父类吗,还是需要添加parent::__construct 进入我的构造函数?

我找到了几个这样的例子,但它们都很老了,不能完全解释一切。我想了解一下这一点,因为当客户端站点不想完全定制时,在对其进行修改时,此功能将非常有用。

1 个回复
SO网友:cjbj

事实上,你已经接近回答自己的问题了。您的插件必须首先检查plugin is active (您也可以使用function_exists).

您确实可以使用remove_action 确保函数和类未激活。这并不意味着这些函数没有定义。

所以是的,你需要extend the class 如果要自定义它。如果未在该自定义类中定义构造函数,则将使用父类的构造函数。

结束

相关推荐

JQuery Plugins in Wordpress

我已经能够在某种程度上拼凑出应该如何做到这一点,但我真的很难做到这一点。我想使用Table Sorter插件(http://tablesorter.com) 在自定义页面模板中显示数据,但我不确定它是否正确。我已经钩住了“wp\\u enqueue\\u scripts”,并使用此函数将表分类器JS文件排入队列。我相信这是正确的,但是我还需要在JQuery Ready()函数中放置一行,但是我不确定如何从自定义页面模板中执行此操作。有人能解释一下吗?<?php /* Templat