@ligisayan

Есть ли способ удалить функцию с хука wordpress?

Всем привет! Есть тема storefront установленная на сайт wordpress и ее дочерняя тема. Хочу из шапки убрать поиск, который прописан в родительской do_action( 'storefront_header' );
Есть код в header.php
<?php
			/**
			 * Functions hooked into storefront_header action
			 *
			 * @hooked storefront_product_search                   - 40
			 */
			do_action( 'storefront_header' ); ?>

И вот так функция вызывается storefront-woocommerce-template-functions.php
if ( ! function_exists( 'storefront_product_search' ) ) {
	/**
	 * Display Product Search
	 *
	 * @since  1.0.0
	 * @uses  storefront_is_woocommerce_activated() check if WooCommerce is activated
	 * @return void
	 */
	function storefront_product_search() {
		if ( storefront_is_woocommerce_activated() ) { ?>
			<div class="site-search">
				<?php the_widget( 'WC_Widget_Product_Search', 'title=' ); ?>
			</div>
		<?php
		}
	}
}

В дочерней functions.php я прописываю
function storefront_product_search() {} //работает, но это по сути костыль
remove_action( 'storefront_header', 'storefront_product_search', 40 ); //не работает

Можно ли решить вопрос без костылей?
  • Вопрос задан
  • 1650 просмотров
Решения вопроса 1
@ligisayan Автор вопроса
Решение найдено! Нужно удалять хук через подключение хука инициализации init
add_action( 'init', 'jk_remove_storefront_header_search' );
function jk_remove_storefront_header_search() {
remove_action( 'storefront_header', 'storefront_product_search', 40 );
}


Вот, кстати, интересная статья по этому вопросу
remove_action или remove_filter не работает в дочерней теме WordPress, если пытаться удалить хуки родительской темы
В родительской теме определен ряд хуков, которые мешают мне и хочется их удалить в дочерней теме.
Логично предположить что нужно просто вставить remove_action или remove_filter в function.php дочерней темы.
Но не тут то было!
Это не работает.
Как оказывается, function.php дочерней темы грузится перед тем же файлом родительской темы. И если использовать обычную схему, то получится что попытка удаления хука произойдет перед его добавлением. Что как мы знаем по кодексу оказывается безрезультатным.
Таким образом нам нужно добиться ситуации, когда удаление хука произойдет после его определения.
Как это сделать?
Все очень просто Нужно удаление хука зацепить на более поздний хук, который выполнится после определения хука родительской темы. О как
Но все просто. Самый элементарный хук init вполне нам подойдет.
И делаем так:
add_action('init','removeOldFunction');
function removeOldFunction(){
remove_action( 'template_redirect', 'alienship_nice_search_redirect' );
}

Этим кодом мы удалим хук alienship_nice_search_redirect, который определен в родительской теме, при помощи function.php дочерней.
Проверено
Все хорошо, пока дело не касается сайдбара. Там хук инициализации виджетов работает еще позднее чем init, потому нужно вешаться на хук after_setup_theme.
Ну и в других случаях. Удаляя тот или иной хук не забудьте проверить его порядок загрузки и убедиться что он грузится позднее, чем тот который вы удаляете.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
AxianLTD
@AxianLTD
Вы правильно делаете remove_action удаляет ранее поставленный хук. Однако:
Important: To remove a hook, the $function_to_remove and $priority arguments must match when the hook was added. This goes for both filters and actions. No warning will be given on removal failure.

См. https://codex.wordpress.org/Function_Reference/rem...
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы