Woocommerce, дочерняя тема

158
09 января 2020, 14:10

В дочерней теме пытаюсь переопределить хук, который используется в основной теме:
funcitons.php - основная тема

function thegem_woocommerce_template_loop_category_title($category) {
    echo '<div class="category-overlay">';
    echo '<h6 class="category-title">'.$category->name.'</h6>';
    echo '<div class="category-overlay-separator"></div>';
    echo '<div class="category-count">'.sprintf(esc_html(_n('%s item', '%s items', $category->count, 'thegem')), $category->count).'</div>';
    echo '</div>';
}
remove_action( 'woocommerce_shop_loop_subcategory_title', 'woocommerce_template_loop_category_title', 10 );
add_action( 'woocommerce_shop_loop_subcategory_title', 'thegem_woocommerce_template_loop_category_title', 10 );

functions.php - дочерняя тема

function thegem_woocommerce_template_loop_category_title1($category) {
    echo '<div class="category-overlay">';
    echo '<h6 class="category-title">'.$category->name.' test</h6>';
    echo '</div>';
}
remove_action( 'woocommerce_shop_loop_subcategory_title', 'thegem_woocommerce_template_loop_category_title', 10 );
add_action( 'woocommerce_shop_loop_subcategory_title', 'thegem_woocommerce_template_loop_category_title1', 10 );

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

Answer 1

Сначала подключается код плагинов, потом functions.php в дочерней теме, потом в основной - так устроен WordPress. На момент исполнения вашей строки

remove_action( 'woocommerce_shop_loop_subcategory_title', 'thegem_woocommerce_template_loop_category_title', 10 );

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

В то же время remove_action в дочерней теме срабатывает, потому что исполняется после подключения плагина WooCommerce, который и объявляет свою функцию для хука.

Ваш код в дочерней теме должен выглядеть так:

function thegem_woocommerce_template_loop_category_title1( $category ) {
    remove_action( 'woocommerce_shop_loop_subcategory_title', 'thegem_woocommerce_template_loop_category_title', 10 );
    echo '<div class="category-overlay">';
    echo '<h6 class="category-title">' . $category->name . ' test</h6>';
    echo '</div>';
}
add_action( 'woocommerce_shop_loop_subcategory_title', 'thegem_woocommerce_template_loop_category_title1', 0 );

Обратите внимание на приоритет 0 в add_action (может быть любым меньше 10). Вы запускаете свою функцию ...title1 по событию woocommerce_shop_loop_subcategory_title раньше функции из родительской темы, и прямо внутри своей функции отменяете родительскую.

READ ALSO
Как объединить массивы PHP

Как объединить массивы PHP

Есть массивы такого вида:

121
Создать уникальные значения

Создать уникальные значения

Есть цифры от 1 до 73Нужно из этого набора выбрать только 5 случайных, но чтобы они не повторялись

142
Laravel при переназначении имени сломал приложение

Laravel при переназначении имени сломал приложение

Суть в том, что нужно было изменить имя приложения использовал команду php artisan app:name "DKP Online" - да, косякнул, случайно вставил пробел, теперь имею...

96
Установка composer пакета без Composer

Установка composer пакета без Composer

Хочу установить библиотеку https://githubcom/VKCOM/vk-php-sdk Но возможности установить её через composer нет, т

128