Nano Hash - криптовалюты, майнинг, программирование

Как переопределить виджет в дочерней теме WordPress?

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

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


Ответы:


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' );

Это не самый удобный способ, так как у вас будет два одинаковых виджета, но это работает.

04.12.2016
  • Спасибо @2Fwebd за ваш ответ. Сейчас передо мной стоит задача, описанная в этом посте. Ваш ответ помог мне. Я также хочу добавить, что в случае, если у вас нет темы, готовой к дочерней теме, и вы используете дублирование своей темы, помимо переименования класса виджета, вы должны предоставить уникальный id_base вашего виджета parent::__construct(), чтобы ваш виджет отображался в списке виджетов. 11.07.2017

  • 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 {
    

    Затем измените свою id_base в parent::_construct на уникальный идентификатор (например:

    parent::__construct( 'new_uniq_id', 'name of your widget', ...)
    

    И где-нибудь (чаще всего в конце) вашего файла найдите register_widget( и отредактируйте имя класса:

    register_widget( 'Widget_Name2' );
    

    Это не самый удобный способ, так как у вас будет два одинаковых виджета, но это работает.

    Надеюсь, это поможет кому-то.

    12.03.2018
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..