Вопрос или проблема
Я разработал дочернюю тему для Genesis, которая добавляет Bootstrap поверх.
В ядре этой дочерней темы я изменил способ отображения категории в посте, поместив ее над заголовком.
Теперь я хотел бы снова удалить это действие, но, похоже, это не работает.
Это теория, ниже я напишу что-то более конкретное, с кодом.
ПРАКТИЧЕСКИ
У меня есть файл src/lib/post.php
, который добавляет действие shq_genestrap_post_meta_categories
:
function shq_genestrap_post_meta_categories() {
$filtered = apply_filters( 'shq_genestrap_post_meta_categories', '[post_categories]' );
if ( false == trim( $filtered ) ) {
return;
}
// Удалить метку и запятые
$filtered = str_replace([__( 'Filed Under: ', 'genesis' ), ', '], '', $filtered);
genesis_markup( [
'open' => '<p %s>',
'close' => '</p>',
'content' => genesis_strip_p_tags( $filtered ),
'context' => 'entry-meta-categories',
] );
}
add_filter( 'shq_genestrap_post_meta_categories', 'do_shortcode', 20 );
add_action( 'genesis_entry_header', 'shq_genestrap_post_meta_categories', 9 );
remove_action( 'genesis_after_post_content', 'genesis_post_meta' );
Как вы можете видеть, я добавляю свою пользовательскую функцию genesis_post_meta
, а затем удаляю действие Genesis genesis_post_meta
.
Теперь из файла src/functions.php
я хотел бы удалить действие shq_genestrap_post_meta_categories
, которое добавил ранее:
remove_action( 'genesis_entry_header', 'shq_genestrap_post_meta_categories', 9 );
Но это не работает.
ПОЧЕМУ Я ЭТО ДЕЛАЮ
Конечная цель – предоставить Bootstrap поверх Genesis, поэтому файлы в src/lib
не должны изменяться: таким образом, когда я обновляю основной репозиторий, можно обновить дочернюю тему.
Для дальнейшей настройки дочерней темы, наоборот, я хочу использовать файл src/functions.php
, который никогда не обновляется в репозитории.
Делая это, если когда-нибудь я обновлю файл src/lib/post.php
, достаточно скопировать файлы из основного репозитория в настроенную версию темы, и все другие настройки, сделанные через файл src/functions.php
, продолжат работать.
Но, как уже сказано, я не могу удалить действия, установленные файлами в src/lib
.
ЗАКЛЮЧЕНИЯ И ВОПРОС (СНОВА)
Я добавляю действие shq_genestrap_post_meta_categories
в src/lib/post.php
.
Затем я хотел бы удалить действие shq_genestrap_post_meta_categories
из файла src/functions.php
, но это не работает:
// src/function.php
remove_action( 'genesis_entry_header', 'shq_genestrap_post_meta_categories', 9 );
Как я могу удалить действие, добавленное в src/lib/post.php
, из файла src/functions.php
?
Спасибо Дэну, который прокомментировал с полезным постом, который я нашел в Google, но не прочитал с должным вниманием, решение таково:
function my_remove() {
remove_action( 'genesis_entry_header', 'shq_genestrap_post_meta_categories', 9 );
}
add_action('genesis_entry_header', 'my_remove', 8);
Использование приоритета 9
в add_action()
не работает: мне пришлось установить приоритет ниже того, который использовался для добавления действия, которое я собираюсь удалить.
Тем не менее, я не понимаю, почему более низкий приоритет работает: это кажется контр-интуитивным.
На этот счет я открыл другой вопрос: Я не понимаю, почему мне нужен более низкий приоритет для удаления действия с более высоким приоритетом, чтобы это работало
Любой, кто готов ответить, приветствуется!
Ответ или решение
Чтобы удалить действие, добавленное дочерней темой Genesis, необходимо правильно организовать процесс удаления действия с учетом приоритета, который вы указали при его добавлении. Ваша ситуация окружена множеством нюансов, поэтому давайте подробно разберем, как решить данную проблему.
Шаги для удаления действия дочерней темы Genesis
-
Понимание механизма работы приоритетов:
При добавлении действия в WordPress, каждое действие имеет приоритет (по умолчанию 10). Чем ниже число приоритета, тем раньше будет выполнено действие. Это ключевой момент, чтобы понять, почему для успешного удаления действия нужно использовать низкий приоритет. -
Пример с вашим кодом:
Вы добавили следующее действие в файлsrc/lib/post.php
:add_action( 'genesis_entry_header', 'shq_genestrap_post_meta_categories', 9 );
Здесь вы установили приоритет 9.
-
Удаление действия:
Чтобы корректно удалить действие из другого файла, напримерsrc/functions.php
, нужно создать новую функцию и добавить её с более низким приоритетом. Так вы сможете гарантировать, что ваше удаление произойдет до выполнения другого действия. Это выглядит так:function my_remove() { remove_action( 'genesis_entry_header', 'shq_genestrap_post_meta_categories', 9 ); } add_action('genesis_entry_header', 'my_remove', 8);
Почему работает низкий приоритет?
Механизм работы приоритетов иногда может показаться контринтуитивным. Низкий приоритет означает, что ваша функция будет выполнена раньше, чем функция, добавленная с более высоким приоритетом. Это дает вам возможность "заблокировать" выполнение действия до его фактического запуска. Поэтому, если вы хотите удалить действие, нужно делать это до того, как оно будет выполнено.
Заключение
Чтобы успевать управлять действиями вашей дочерней темы и избежать проблем при обновлениях, важно тестировать изменения и внимательно следить за приоритетом добавляемых и удаляемых действий. Регулярно проверяйте документацию по WordPress и Genesis, так как понимание логики работы может помочь вам избежать трудных ситуаций в будущем.
Успехов в разработке! Если у вас возникнут дополнительные вопросы, не стесняйтесь обращаться за помощью.