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

Pau*_*nez 6 php wordpress overriding widget

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

wp-content\themes\sailing\inc\widgets\gallery\tpl\base.php
Run Code Online (Sandbox Code Playgroud)

所以我在我的子主题中创建了相同的文件夹结构,并在此文件中进行了我需要的修改.我还复制/粘贴了声明这个小部件所需的所有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
Run Code Online (Sandbox Code Playgroud)

我在这里错过了什么?

2Fw*_*ebd 8

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

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

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

但这取决于你的主题是如何构建的,以及它是否准备好了"儿童主题".让我们来看看你的小部件问题.

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

class Widget_Name extends WP_Widget {
...
CODE OF THE WIDGET
...
Run Code Online (Sandbox Code Playgroud)

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

理想的情况是你没有先看到上面的行,但是:

if(!class_exists('Widget_Name')) {
    class Widget_Name extends WP_Widget {
    ...
    CODE OF THE WIDGET
    ...
Run Code Online (Sandbox Code Playgroud)

这意味着,您可以只复制/过去您的文件,并且它将正常工作,您的窗口小部件将覆盖父窗口小部件,并且不会抛出任何错误,因为不会执行父窗口小部件.这就是"儿童主题准备"主题.请注意,它与functions(if(!function_exists('function_name'))相同.

不要忘记child-theme/functions.php文件中调用您的文件,因为默认情况下不会调用它.

喜欢:

require_once('path/to/your/widget_class.php');
Run Code Online (Sandbox Code Playgroud)

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

只需重命名:

class Widget_Name2 extends WP_Widget {
Run Code Online (Sandbox Code Playgroud)

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

register_widget( 'Widget_Name2' );
Run Code Online (Sandbox Code Playgroud)

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


Jon*_*ney 6

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

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

在子主题中覆盖函数或类时。您有几种处理方法:

  1. 重新声明功能/类
  2. 复制功能/类

但这取决于主题的构建方式以及是否准备好“子主题”。让我们来看看您的小部件问题。

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

class Widget_Name extends WP_Widget {
...
CODE OF THE WIDGET
...
Run Code Online (Sandbox Code Playgroud)

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

理想的情况是您首先没有看到以上几行,但:

if(!class_exists('Widget_Name')) {
    class Widget_Name extends WP_Widget {
    ...
    CODE OF THE WIDGET
    ...
Run Code Online (Sandbox Code Playgroud)

这意味着,您只需复制/粘贴文件即可,并且可以正常工作,您的小部件将覆盖父小部件,并且不会执行任何错误,因为不会执行父小部件。那就是“准备好儿童主题”主题。请注意,函数(if(!function_exists('function_name'))相同。

不要忘记从child-theme / functions.php文件中调用文件,因为默认情况下不会调用它。

喜欢:

require_once('path/to/your/widget_class.php');
Run Code Online (Sandbox Code Playgroud)

换句话说,如果您没有class_exists调用,则只需复制文件,然后使用require_once进行调用。您在定义两次相同类时会看到错误。PHP不会让这种情况发生,致命错误。

只需重命名:

class Widget_Name2 extends WP_Widget {
Run Code Online (Sandbox Code Playgroud)

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

parent::__construct( 'new_uniq_id', 'name of your widget', ...)
Run Code Online (Sandbox Code Playgroud)

在文件的某个位置(大部分时间在末尾),查找register_widget(并编辑类名称:

register_widget( 'Widget_Name2' );
Run Code Online (Sandbox Code Playgroud)

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

希望它可以帮助某人。