Вопрос или проблема
Есть установка темы родитель/дочерний. В родительской теме есть фильтр, который я хочу удалить. Как мне удалить эти фильтры в функциях дочерней темы?
/** --------- */
/** COMMENTS */
/** --------- */
/** FORMAT COMMENT REPLY FIELD */
add_filter('comment_form_field_comment', function () {
\XPress::registry()->loadJS('themehouse/xpress/comment.js');
return '<div data-xf-init="xpress-comment-form">' . \XPress::getEditorInstance('comment_content', 'comment') . '</div>';
}, 8);
/** READ XF FROALA EDITOR CONTENT ON SAVE */
add_filter('preprocess_comment', function ($data) {
$data['comment_content'] = \XPress::getEditorContent('comment_content') ?: $data['comment_content'];
if (empty($data['comment_content']) || $data['comment_content'] === 'x') {
wp_die(\XPress::xlink()->phrase('xpress_empty_comment_error'), \XPress::xlink()->phrase('xpress_empty_comment'));
}
return $data;
}, 99, 1);
Например, используя код, как этот, в функциях нашей дочерней темы:
function remove_language_attributes() {
remove_filter('language_attributes', 'add_opengraph_doctype');
}
add_filter('init', 'remove_language_attributes');
В файле functions.php дочерней темы
<?php
remove_filter('comment_form_field_comment',99,1); ?>
Эти фильтры были добавлены с использованием анонимных функций, поэтому вы не можете просто remove_filter('filter_name', 'function_name')
, потому что function_name
фактически не существует.
Вы можете переопределить анонимную функцию, используя другую анонимную функцию и задав ей тот же приоритет. Например:
remove_filter( 'comment_form_field_comment', function(){}, 8 );
Больше информации можно найти здесь: Удаление акций/фильтров, добавленных с помощью анонимных функций
.
Ответ или решение
В современной разработке на WordPress часто встречается потребность гибкой настройки темы, так как многие стандартные функции могут быть недостаточны или не соответствовать специфическим требованиям проекта. В вашей ситуации вы имеете дело с дочерней темой, где необходимо удалить фильтры, добавленные в родительской теме, что часто бывает непростой задачей, учитывая использование анонимных функций в родительском коде.
Анализируя ситуацию, представим более детализированное руководство по удалению этих фильтров:
-
Понимание контекста: В данном случае родительская тема использует фильтры
comment_form_field_comment
иpreprocess_comment
, для выполнения некоторых функций в рамках работы с комментариями. Они включают регистрация JavaScript и обработку содержимого комментариев перед сохранением. Все это сделано с помощью анонимных функций с определенными приоритетами:8
и99
соответственно. -
Осознание проблемы: Анонимные функции часто вызывают сложности в их удалении, поскольку WordPress требует указания точно соответствующего обработчика (функции) и приоритета для работы
remove_filter
. -
Подход к решению:
- Важно, чтобы дочерняя тема переопределяла анонимные функции, используя функции с аналогичным приоритетом.
- Используйте аналогичный синтаксис для удаления фильтра, но примените пустую анонимную функцию, чтобы перекрыть функцию родительской темы.
-
Реализация решения: В файле
functions.php
дочерней темы используйте следующий подход:
<?php
// Переопределение фильтров родительской темы
add_action('init', function() {
// Переопределяем фильтр для комментариев
add_filter('comment_form_field_comment', function () {
return ''; // Возвращаем пустую строку, чтобы перезаписать логику родительской темы
}, 8);
// Обнуляем логику валидации комментариев
add_filter('preprocess_comment', function ($data) {
return $data; // Оставляем данные без изменений
}, 99);
});
?>
-
Внимание к деталям: Следите за тем, чтобы приоритеты были точно такими же, как в родительской теме. Это гарантирует, что ваши собственные фильтры будут применены своевременно, обеспечивая нужное поведение.
-
Тестирование и оптимизация: После внесения изменений протестируйте работу вашего сайта, чтобы удостовериться, что новые фильтры правильно устраняют нежелательные эффекты и не приводят к непредвиденным последствиям.
Таким образом, следуя вышеописанным шагам, вы сможете успешно удалить или переопределить ненужные фильтры из родительской темы в своей дочерней теме, обеспечивая соответствие вашего сайта специфическим проектным требованиям.