【问题标题】:How to override a widget in a child theme in WordPress?如何覆盖 WordPress 子主题中的小部件?
【发布时间】:2016-12-04 17:23:22
【问题描述】:

我想对位于我父主题中的 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

我在这里错过了什么?

【问题讨论】:

    标签: php wordpress widget overriding


    【解决方案1】:

    WordPress 子主题不能以这种方式工作。您可以通过在子主题中使用相同路径覆盖的唯一文件是“基本”文件:index.php、page.php、style.css...主要是模板文件。

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

    1. 重新声明函数/类
    2. 复制函数/类

    但这取决于您的主题是如何构建的,以及它是否已准备好“子主题”。让我们看看您的小部件问题。

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

    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
        ...
    

    这意味着,您可以复制/粘贴您的文件,这样就可以正常工作,您的小部件将覆盖父小部件,并且不会抛出任何错误,因为父小部件不会被执行。这就是“准备好儿童主题”的主题。注意函数也是一样的(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 {
    

    在文件的某处(大部分时间在末尾)查找register_widget( 并编辑类名:

    register_widget( 'Widget_Name2' );
    

    这不是最方便的方法,因为您将拥有 2 次相同的小部件,但这确实有效。

    【讨论】:

    • 感谢@2Fwebd 的回答。我现在正面临着这篇文章中描述的任务。你的回答帮助了我。我还想补充一点,如果您没有“准备好子主题”主题并且您使用 复制 您的主题,除了重命名您的小部件类之外,您应该将您的小部件的唯一 id_base 指定为 @987654331 @ 使您的小部件出现在小部件列表中。
    【解决方案2】:

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

    WordPress 子主题不能以这种方式工作。您可以在子主题中使用相同路径覆盖的唯一文件是“基本”文件:index.php、page.php、style.css...主要是模板文件。

    当涉及覆盖子主题中的函数或类时。你有几种方法来处理它:

    1. 重新声明函数/类
    2. 复制函数/类

    但这取决于您的主题是如何构建的,以及它是否已准备好“子主题”。让我们看看您的小部件问题。

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

    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
        ...
    

    这意味着,您可以复制/粘贴您的文件,这样就可以正常工作,您的小部件将覆盖父小部件,并且不会抛出任何错误,因为父小部件不会被执行。这就是“准备好儿童主题”的主题。注意函数也是一样的(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 次相同的小部件,但确实有效。

    希望对某人有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-01-02
      • 2015-04-03
      • 2021-10-19
      • 1970-01-01
      • 2012-06-01
      • 1970-01-01
      • 2020-07-28
      相关资源
      最近更新 更多