如何在WordPress中的子主题中重写一个小部件?

问题描述:

我想在这里设在我父主题PHP文件的简单修改:如何在WordPress中的子主题中重写一个小部件?

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 

我在这里错过了什么?

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

说到在子主题中覆盖函数或类。你已经几种方法来处理它:

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

但是它取决于你的主题是如何建立和如果这是“小孩主题”准备就绪。让我们看看你的小部件问题。

如果你的父母主题中打开你的widget声明文件,你会看到类似这样的:

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调用它。你应该看到一个错误,因为你定义了两次同一个类。 PHP不会让这种情况发生,致命的错误。

只需重命名:

class Widget_Name2 extends WP_Widget { 

而且地方(大部分在结束的时间)的文件,寻找register_widget(和编辑类名:

register_widget('Widget_Name2'); 

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

+0

谢谢@ 2Fwebd的答案。我现在面临的任务,在这篇文章中描述。你的回答帮助了我。我还想补充一点,如果你没有“儿童主题就绪”主题,并且除了重命名你的构件类,你还应该使用**重复**你的主题,你应该为你的构件提供唯一的'id_base'到'parent :: __构造()'使你的widget出现在widget列表中。 – Edward