2016-12-04 4 views
2

Я хочу сделать простую модификацию в 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 

Что мне здесь не хватает?

ответ

5

Темы 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 раза один и тот же виджет, но это работает.

+0

Спасибо @ 2Fwebd за ваш ответ. Сейчас я столкнулся с задачей, описанной в этом посте. Ваш ответ помог мне. Я также хочу добавить, что если у вас нет темы «тема для детей», и вы используете ** дублирование ** своей темы, помимо переименования вашего класса виджета, вы должны дать уникальную 'id_base' вашего виджета для' parent :: __ construct() ', чтобы ваш виджет отображался в списке виджетов. – Edward

Смежные вопросы