如何在WordPress中覆盖子主题中的窗口小部件?

时间:2016-12-04 17:23:22

标签: php wordpress widget override

我想在我的父主题中的PHP文件中进行简单的修改:

wp-content\themes\sailing\inc\widgets\gallery\tpl\base.php

所以我在我的子主题中创建了相同的文件夹结构,并在此文件中进行了我需要的修改。我还复制/粘贴了声明这个小部件所需的所有PHP文件。

wp-content\themes\sailing\inc\widgets\widgets.php  
wp-content\themes\sailing\inc\widgets\gallery\gallery.php

wp-content\themes\sailing-child\inc\widgets\widgets.php  
wp-content\themes\sailing-child\inc\widgets\gallery\gallery.php

我在这里缺少什么?

1 个答案:

答案 0 :(得分:6)

所以,由于@ 2Fwebd的答案有点不完整(如评论中所标注),这里有一个更完整的答案(只是为了让它比答案及其评论更清晰。)我建议编辑他的答案,但虽然它不被接受,但这是一个更完整的答案:

WordPress子主题不是这样的。您可以在子主题中使用相同路径覆盖的唯一文件是" basic" files:index.php,page.php,style.css ...主要是模板文件。

涉及覆盖子主题中的函数或类。您有几种方法可以处理它:

  1. 重新声明函数/类
  2. 复制函数/类
  3. 但这取决于你的主题是如何构建的,以及它是否是儿童主题"准备。让我们看一下您的小部件问题。

    如果您在父主题中打开小部件声明文件,您会看到类似的内容:

    class Widget_Name extends WP_Widget {
    ...
    CODE OF THE WIDGET
    ...
    

    请参阅:https://codex.wordpress.org/Widgets_API

    理想的情况是,您首先看不到上述行,但是:

    if(!class_exists('Widget_Name')) {
        class Widget_Name extends WP_Widget {
        ...
        CODE OF THE WIDGET
        ...
    

    这意味着,你可以复制/过去你的文件并且工作得很好,你的小部件将覆盖父小部件,并且不会抛出任何错误,因为父小部件不会被执行。这就是“儿童主题准备好了”#34;主题。请注意,它与函数(if(!function_exists('function_name'))相同。

    请勿忘记从您的child-theme / functions.php文件中调用您的文件,因为默认情况下不会调用该文件。

    像:

    require_once('path/to/your/widget_class.php');
    

    其他方式,如果您没有class_exists,则调用只是复制文件,请使用require_once调用它。当您定义同一类的2倍时,您应该会看到错误。 PHP不会让这种情况发生,致命的错误。

    重命名:

    class Widget_Name2 extends WP_Widget {
    

    然后,将parent::_construct中的id_base更改为唯一ID(如下所示:

    parent::__construct( 'new_uniq_id', 'name of your widget', ...)
    

    在你的文件的某个地方(大部分时间),查找register_widget(并编辑类名:

    register_widget( 'Widget_Name2' );
    

    这不是最方便的方式,因为你有2倍相同的小部件,但确实有效。

    希望它有所帮助。