如何使用插件重写主题函数(在类中)

时间:2015-01-04 作者:Tom

我正在开发一个网站,它使用了一个非常复杂的主题(基本上是一堆附加在Wordpress上的其他软件),事实上非常复杂,以至于儿童主题无法与之配合。

我想通过使用功能插件覆盖主题中的函数(类内)。当我从插件中引用该类时,会收到以下错误消息:

致命错误:在[修订]\\wp内容\\插件\\函数中找不到类“OptimizePress\\u Default\\u Asset”。php在线17

class Foo extends OptimizePress_Default_Asset {
   function recent_posts($atts){

        // Decode encoded chars
        $atts = op_urldecode($atts);

        extract(shortcode_atts(array(
            \'style\' => \'\',
            \'posts_num\' => \'\'
        ), $atts));

        //Get recent posts
        $recent_posts = wp_get_recent_posts(array(
            \'numberposts\' => $posts_num,
            \'post_status\' => \'publish\'
        ));
        $recent_html = \'\';
        foreach( $recent_posts as $recent ){
            $img_src = wp_get_attachment_image_src(get_post_thumbnail_id($recent[\'ID\']), \'single-post-thumbnail\');
            $img_src = $img_src[0];
            if ( is_front_page() ) {
                $date = "";
            }
            else {
                $date = \'<span>\'.date(OP_DATE_POSTS, strtotime($recent[\'post_date\'])).\'</span>\';
            }   
            $recent_html .= \'<li><div class="thumb"><img src="\'.$img_src.\'" class="scale-with-grid" /></div><div class="content"><a href="\'.get_permalink($recent["ID"]).\'">\'.$recent["post_title"].\'</a>\'.$date.\'</div></li>\';

        }

        return \'
            <ul class="recent-posts-style-\'.$style.\'">
                \'.$recent_html.\'
            </ul>
        \';
    }
}
是否可以从插件中引用主题中的类?如果是,如何做到这一点?这是主题设置后必须参考的内容吗?

提前谢谢你

1 个回复
SO网友:gmazzap

你必须知道孩子的主题functions.php 已加载before 父主题functions.php.

这意味着在儿童主题中functions.php 父主题类还不可用,因此会出现致命错误。

如果类位于父主题中functions.php 您可以使用\'after_setup_theme\' 定义父主题类时要等待的挂钩:

add_action(\'after_setup_theme\', function() {
  // assuming class-foo.php is the file that contains your Foo class
  require_once get_stylesheet_directory() . \'/class-foo.php\';
});
然而,上面的代码可能不起作用,因为它假设父主题类在父主题functions.php 但如果使用不同的钩子加载该类,则必须等待该钩子被激发,而不是\'after_setup_theme\'.

例如,如果父主题包含以下内容:

add_action(\'init\', function() {
  // assuming class-optimizepress-default-asset.php is the file that contain the class
  require_once get_template_directory() . \'/class-optimizepress-default-asset.php\';
});
你需要等一下\'init\' 在加载类之前激发钩子。在这种情况下,您可以使用相同的\'init\' 具有较低优先级的挂钩:

add_action(\'init\', function() {
  require_once get_stylesheet_directory() . \'/class-foo.php\';
}, 99); // default priority is 10, higher number means lower priority
总之,没有适用于所有类和所有主题的代码,您必须查看父主题代码,以了解要使用哪个挂钩才能确保父主题类可用。

结束

相关推荐

在加载plugins_后,get_plugins()不工作

知道为什么下面的代码function my_plugin_load() { get_plugins(); } add_action( \'plugins_loaded\', \'my_plugin_load\' ); 抛出此错误?Fatal error: 不应调用未定义的函数get\\u plugins()get_plugins() 定义在plugins_loaded 胡克开火了?如果不是,那么什么才是合适的钩子呢?(这个钩子应该启动插件的引导/加载过程)