因此,由于@2Fwebd 的答案有点不完整(如评论中所标记),这里有一个更完整的答案(只是为了比答案及其评论更清楚。)我建议对他的答案进行编辑,但是虽然不被接受,但这里有一个更完整的答案:
WordPress 子主题不能以这种方式工作。您可以在子主题中使用相同路径覆盖的唯一文件是“基本”文件:index.php、page.php、style.css...主要是模板文件。
当涉及覆盖子主题中的函数或类时。你有几种方法来处理它:
-
重新声明函数/类
-
复制函数/类
但这取决于您的主题是如何构建的,以及它是否已准备好“子主题”。让我们看看您的小部件问题。
如果您在父主题中打开小部件声明文件,您会看到如下内容:
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 次相同的小部件,但确实有效。
希望对某人有所帮助。