PHP файлы дочерней темы не переопределяют PHP файлы родительской темы

7 апр. 2016 г., 01:30:01
Просмотры: 26.9K
Голосов: 12

У меня есть PHP файл, расположенный по пути:

.../wp-content/themes/kallyas-child/pagebuilder/elements/TH_TeamBox/TH_TeamBox.php

Я пытаюсь использовать этот файл, чтобы переопределить родительский файл TH_TeamBox.php, который находится здесь:

.../wp-content/themes/kallyas/pagebuilder/elements/TH_TeamBox/TH_TeamBox.php

Моя дочерняя тема активна, и я создал структуру каталогов в дочерней теме, идентичную родительской теме. Я полагал, что если я сделаю это, то смогу редактировать PHP файлы в дочерней теме по своему усмотрению, не теряя изменений при обновлении родительской темы.

Я занимаюсь разработкой уже некоторое время, но, как видите, я относительно новичок в WordPress. Буду признателен за любые разъяснения, почему PHP файл дочерней темы не переопределяет PHP файл родительской темы. Я готов предоставить любую дополнительную информацию, которая может потребоваться для помощи, спасибо! : )

3
Комментарии

Сложно сказать без знания содержимого файла. Мое предположение — этот файл является или обернут в PHP-класс. Если это так, вы можете попробовать расширить класс. Если это не сработает, можно поэкспериментировать с add_action, remove_action и приоритетами, но многое зависит от того, как это организовано в родительской теме.

Luis Sanz Luis Sanz
7 апр. 2016 г. 01:47:14

Не могу представить, как расширение класса может сработать. Если класс C (дочерний) расширяет P (родительский), то объект типа C будет содержать все из P, но P не будет содержать ничего из C, и тема по умолчанию будет использовать P, даже если дочерняя тема активна. Я изучу хуки действий. Спасибо, что ответили в моей теме, я это ценю.

domdambrogia domdambrogia
19 апр. 2016 г. 18:41:05

Это может быть проблема с правами доступа к файлам. Убедитесь, что все права на файлы установлены так, чтобы серверный процесс мог их читать.

Flimm Flimm
3 дек. 2024 г. 12:08:15
Все ответы на вопрос 4
2
18

Дочерние темы позволяют переопределять шаблоны, а не произвольные PHP-файлы.

В WordPress тема состоит из набора PHP-файлов, которые используются как шаблоны. Список этих файлов можно найти в Иерархии шаблонов.

Эти конкретные файлы шаблонов могут быть заменены новыми, но если родительская тема не предоставляет специальных средств для переопределения других файлов, то файлы, просто подключаемые родительской темой в качестве вспомогательной структуры или библиотек для кода страницы (например, для конструктора страниц), не могут быть переопределены таким образом.

7 апр. 2016 г. 01:34:35
Комментарии

Не то, что я хотел услышать, но спасибо за информацию. Ценю это.

domdambrogia domdambrogia
19 апр. 2016 г. 18:34:09

Здесь упомянуты несколько полезных функций, которые помогают переопределить файл родительской темы. (Всё равно потребуется небольшое изменение в файле родительской темы. Насколько я знаю, этого невозможно избежать на 100%.) Посмотрите на эти функции: locate_template(), get_theme_file_path().

Viktor Borítás Viktor Borítás
13 окт. 2020 г. 20:41:42
1

Решение заключается в переносе необходимых изменений в файл functions.php вашей дочерней темы.

Если это функция, обычно она будет содержать условный оператор, проверяющий, объявлена ли она уже. В этом случае вы можете скопировать функцию в functions.php с тем же именем и внести необходимые изменения — она будет иметь приоритет над остальными файлами темы. Если функция объявлена без условного оператора, тогда вам нужно изменить её имя в functions.php, найти файл шаблона, из которого она вызывается, скопировать его в дочернюю тему и изменить вызов функции в нём.

Если это виджет, скопируйте всё объявление класса в functions.php, измените его имя и внесите другие правки. Убедитесь, что вы также регистрируете новый виджет, и он станет доступен в области виджетов под новым именем с внесёнными изменениями.

1 апр. 2018 г. 15:58:30
Комментарии

Спасибо за ваш вклад. В момент вопроса я искал не способ перезаписать функцию, а именно перезаписать файл. Кроме того, правильный ответ уже предоставил Otto. Если только нет специальной функции шаблона, которую можно отфильтровать (например, wc_get_template в WooCommerce), перезаписать можно только основные файлы шаблонов (header.php, footer.php, page.php и т.д.).

domdambrogia domdambrogia
1 апр. 2018 г. 21:17:05
0

У меня есть решение, которое может быть лучше, чем просто вносить изменения в файлы родительской темы, что, конечно, нежелательно по причинам, упомянутым Otto.

Если вы добавите эти две строки PHP в начало любого файла, который хотите модифицировать в структуре директорий дочерней темы:

<?php
    $filepath = str_replace(get_option('template'), get_option('stylesheet'), __FILE__);
    if (file_exists($filepath)) {include($filepath); return;}
?>

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

Это может показаться слишком хлопотным, но что это дает - позволяет хранить ваши измененные файлы вместе в структуре дочерней темы, и они не будут перезаписаны при обновлениях темы. Просто нужно будет снова добавлять эти строки в начало любого родительского файла, который вы хотите продолжать переопределять.

Это также означает, что вы можете удалить модифицированную копию файла функций в дочерней теме без поломки сайта (например, для тестирования с обновленным файлом темы) - так как в этом случае будет использоваться оригинальный файл, если модифицированная копия не найдена.

(CEM Исправление опечатки: заменил первый вызов get_options на get_option.)

7 апр. 2016 г. 10:51:14
1

Я использовал другой подход: в файле functions.php дочерней темы я переопределил целевой файл родительской темы, который хотел изменить.

require(get_parent_theme_file_path() . "-child/include/header-content.php");
30 мая 2023 г. 19:30:34
Комментарии

Похоже, не работает, если файл header-content.php содержит строку вида class Thing extends Thing_Base {

Jay Jay
3 авг. 2024 г. 07:41:40