Как удалить продукты-ссылки после названия продукта с помощью remove_action

Я пытаюсь удалить навигацию между продуктами, которые появляются сразу после названия продукта на моих страницах продуктов.

Навигация установлен в файле woocommerce.php моей темы:

 /** * Class for all WooCommerce template modification * * @version 1.0 */ class MrBara_WooCommerce { ... /** * Hooks to WooCommerce actions, filters * * @since 1.0 * @return void */ function hooks() { ... // Add prev/next product if ( in_array( mrbara_theme_option( 'product_page_layout' ), array( '1', '2', '8', '9', '12' ) ) ) { add_action( 'woocommerce_single_product_summary', array( $this, 'products_links' ), 0 ); } ... /** * Display products link * * @since 1.0 */ function products_links() { if ( function_exists( 'is_product' ) && ! is_product() ) { return; } $prev_link = '<span class="ion-ios-arrow-back"></span>'; $next_link = '<span class="ion-ios-arrow-forward"></span>'; ... ?> <div class="products-links"> <?php previous_post_link( '<div class="nav-previous">%link</div>', $prev_link ); next_post_link( '<div class="nav-next">%link</div>', $next_link ); ?> </div> <?php } } 

Я только начинаю понимать, как работает WordPress, и за то, что я изучил до сих пор, я думаю, что мне нужно удалить действие products_links .

Тест 1

Итак, в моих functions.php в моей дочерней теме я написал это:

 // Remove previous and next link in the product title add_action('woocommerce_single_product_summary', 'remove_products_links'); function remove_products_links() { remove_action('products_links', 'woocommerce_single_product_summary' ); } 

Я добавил функцию «удалить» в woocommerce_single_product_summary поскольку действие, добавляющее ссылки на продукты, связано с ним.

Но это не работает.

Поэтому я углубился в документацию

Но это не сработало.

Итак, углубляясь в документацию WordPress, я прочел следующее:

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

Итак, это мое дело! Мое действие добавлено классом MrBara_WooCommerce в методе hooks() и метод действия products_links() не является статическим, поэтому мне также нужно вызвать класс.

Тест 2

 add_action('woocommerce_single_product_summary', 'remove_products_links'); function remove_products_links() { remove_action('products_links', ['MrBara_WooCommerce', 'woocommerce_single_product_summary'] ); } 

И это не сработало.

Я также пытался играть с приоритетами, установив мои remove_products_links в 9 , 11 , 10 и в 0 (чтобы соответствовать приоритету исходного добавленного действия), но ничего из этого не получилось.

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

Можете ли вы помочь мне лучше понять, почему мой remove_action не работает?

ОБНОВИТЬ

Продолжая чтение, я обнаружил, что файл functions.php моей дочерней темы загружен ПЕРЕД файлами родительской темы ( https://wordpress.stackexchange.com/a/170665/57145 ).

У меня было представление об этой печати всей переменной $wp_filter используя файл functions.php дочерней темы.

Итак, при печати, я видел действие remove_products_links которое я зарегистрировал, но не видел действия products_links которое я пытаюсь удалить.

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

Теперь, я думаю, что я не могу удалить действие, так как при регистрации действия удаления действие, которое я хочу удалить, не существует.

Возникает вопрос: как удалить действие из родительской темы с помощью дочерней темы?

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

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

поэтому: remove_action('products_links, array('MrBara_WooCommerce', 'woocommerce_single_product_summary, 0) 10 является приоритетом по умолчанию, и, хотя мы можем предположить, что ваш приоритет должен быть выше, чем add_action поэтому он вызывается для его удаления после его включения, WP codex отмечает это:

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

А также

Вы не сможете успешно удалить действие до его добавления.

Вы также не можете удалить действие после его запуска.

Таким образом, одна проблема, которая возникает у вас, может заключаться в том, что, подключив add_action с приоритетом по умолчанию (10), чтобы вызвать функцию, которая выполняет действие remove action с приоритетом 0, делает это после выполнения действия с нулевым приоритетом.

Ребенок против родителя

Поскольку дочерняя тема functions.php работает перед родителем, вам нужно подключить ее после настройки темы. [wp_loaded] 1 , [after_setup_theme] 1 , а init – возможные варианты.

пример, используя наш предыдущий назад и вперед:

 function remove_products_links() { global $mrbara; remove_action('product_links', array($mrbara, 'woocommerce_single_product_summary') ); } add_action('after_setup_theme', 'remove_products_links'); 

оригинальный ответ

Второй аргумент должен быть таким массивом:

 remove_action('products_links', array('MrBara_WooCommerce', 'woocommerce_single_product_summary' ) ); 

Чтобы получить доступ к нему из глобальной переменной, содержащей класс, например:

 global $mrbara; $mrbara = new MrBara_WooCommerce(); function remove_product_links() { global $mrbara; remove_action('product_links', array($mrbara, 'woocommerce_single_product_summary') ); } add_action('woocommerce_single_product_summary', 'remove_products_links');