it-roy-ru.com

Включить файлы в дочерние темы, объявить в functions.php

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

mybasetheme> включает в себя> SF-контент-дисплей> SF-пост-layouts.php

Поэтому я скопировал точно такую ​​же структуру файла в мою дочернюю тему и скопировал файл поверх:

mychildtheme> включает в себя> SF-контент-дисплей> SF-пост-layouts.php

Но это все еще по умолчанию в базовой версии темы?

Поскольку он находится в include , я подумал, а не связано ли это с файлом functions.php, вызывающим его. Поэтому я создал новый файл functions.php в своей дочерней теме следующим образом:

<?php

// Functions specific to child-theme

require_once( get_stylesheet_directory() . '/includes/sf-content-display/sf-post-formats.php' );

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

>include(SF_INCLUDES_PATH . '/sf-content-display/sf-post-formats.php');

Итак, я получаю эту ошибку:

Невозможно повторно объявить sf_get_post_media () (ранее объявленное в /Applications/MAMP/htdocs/syyco/wp-content/themes/flexform-child/includes/sf-content-display/sf-post-formats.php:15) в/Applications/MAMP/htdocs/syyco/wp-content/themes/flexform/includes/sf-content-display/sf-post-format.php в строке 36

Так что мне делать? Я не могу заставить дочернюю тему включать мой новый файл, не редактируя базовую тему, что разрушает смысл наличия дочерней темы вообще

1
Francesca

Когда дело доходит до иерархии шаблонов, WordPress действительно заглядывает в каталог дочерней темы перед загрузкой из основной темы.

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

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

Если функции обернуты в if ( ! function_exists( ..., то автор разрешил переопределение, и вы можете просто написать свою собственную версию функции в functions.php вашей дочерней темы.

В противном случае ищите любые do_action( ... ) или apply_filters( ... ) вокруг кода, который вы хотите изменить - это ваш последний порт вызова для переопределения поведения по умолчанию в вашей дочерней теме (проверьте кодекс на хуках ).

Если ничего из вышеперечисленного не было реализовано первоначальным автором, у вас есть один из двух вариантов - отредактировать оригинальную тему или связаться с автором и сделать запрос на реализацию API для дочерних тем.

1
TheDeadMedic

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

Быстрый пример:

В моей теме у меня есть файл comments-functions.php. В этот файл я добавляю все функции, относящиеся к разделу комментариев моей темы.

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

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

При создании дочерней темы вам не нужно придерживаться этой файловой структуры, вы можете просто добавить/удалить/изменить функции в functions.php вашей дочерней темы. Если вы действительно просто создаете дочернюю тему с одной функцией, просто создайте файл functions.php и добавьте туда свою функцию

Functions.php дочерней темы загружается перед родительской, поэтому все функции, заключенные в условный тег if(!function_exists('function_name')), можно просто скопировать и изменить в дочерней теме. Эта измененная функция сохраняет имя родительской функции. Родительская функция будет игнорироваться, когда предполагается ее загрузка. ЭтоONLYвремя, когда функция может быть повторно объявлена, то есть две функции имеют одно и то же имя.

Если родительская функция не упакована, у вас есть следующие варианты

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

  • Если функция привязана к определенному действию или фильтру, вам нужно удалить эту функцию, как только она будет зарегистрирована. Смотрите Удаление действий и фильтров . Теперь вы можете зарегистрировать новую функцию и привязать ее к той же ловушке, к которой была привязана родительская тема. Просто помните, что здесь очень важен приоритет, выполнение неправильного порядка не удастся.

1
Pieter Goosen

Просто измените только функцию, которую вы хотите редактировать. Смотрите этот пост

1) Скопируйте (полностью) функцию, которую вы хотите переопределить из родительской темы.

2) Вставьте его в functions.php в корне папки вашей дочерней темы. Если functions.php не существует, создайте его.

3) Переименуйте функцию из parent_theme_function в child_theme_function.

4) Деактивировать родительскую функцию.

5) Активируйте дочернюю функцию.

0
Shail