Добавление действия в функцию, вызываемую функцией добавить фильтр
Я пытаюсь вызвать функцию woocommerce_custom_surcharge. Мне нужно вызвать его в фильтре для woocommerce_checkout_fields, так как мне нужны $поля['выставление счетов']['forhandler_kode'] в моем операторе IF, и я не знаю, как использовать его вне фильтра. Кроме того, я попробовал add_action вне функции, и там он отлично работает.
Вызывается мое эхо, что означает, что оператор if возвращает значение true, так что проблема не в этом. По какой-то причине add_action не работает в моей функции
add_filter( 'woocommerce_checkout_fields' , 'call_my_add_action' );
function call_my_add_action($fields) {
if ($fields['billing']['forhandler_kode']) {
add_action( 'woocommerce_cart_calculate_fees','woocommerce_custom_surcharge' );
echo "I am being called";
}
return $fields;
}
function woocommerce_custom_surcharge() {
global $woocommerce;
if ( is_admin() && ! defined( 'DOING_AJAX' ) ) {
return;
}
$percentage = -0.1;
$surcharge = ( $woocommerce->cart->cart_contents_total + $woocommerce->cart->shipping_total ) * $percentage;
$woocommerce->cart->add_fee( 'Forhandlerkode Rabat', $surcharge, true, '' );
}
Мой вопрос НЕ касается конкретно woocommerce, так как его решение может помочь в более общем понимании действий и фильтров. Заранее благодарю вас за любую помощь, которую вы можете оказать!
ИЗМЕНИТЬ:
Возможно, несколько банальное решение этой проблемы (в итоге я сделал что-то совершенно другое, так что у меня больше нет проблемы, но кто-то может найти это, так что вот):
Если вы НУЖНО снова запустить хук, не меняя его при вызове или с помощью jQuery, вы можете просто использовать do_action
С помощью моего кода выше я снова запустил крючок, вот так:
if ($fields['billing']['forhandler_kode']) {
add_action( 'woocommerce_cart_calculate_fees','woocommerce_custom_surcharge' );
do_action('woocommerce_cart_calculate_fees');
echo "I am being called";
}
ОДНАКО, ПОЖАЛУЙСТА, ОБРАТИТЕ ВНИМАНИЕ
Это работает, но, как указал Отто, это глупый способ сделать это. Лучшим решением будет просто вызвать функцию следующим образом:
if ($fields['billing']['forhandler_kode']) {
woocommerce_custom_surcharge();
echo "I am being called";
}
1 answers
Ответ, когда речь идет о крючках, всегда либо: время, приоритет, либо и то, и другое.
Рассмотрим следующий код:
add_action( 'shutdown', 'wpse_258451_shutdown' );
function wpse_258451_shutdown() {
add_action( 'init', 'wpse_258451_init' );
}
function wpse_258451_init() {
wp_die( 'I will never be called.' );
}
Должно быть очевидно, что функция wpse_258451_init()
никогда не будет вызвана. Это связано с тем, что init
запускается только один раз на запрос страницы, и это очень близко к началу запроса. Кроме того, shutdown
запускается только один раз на запрос страницы, и это очень близко к концу запроса.
Что именно происходит в нашем коде? WordPress переходит к первому add_action()
и добавляет обратный вызов в тег крючка выключения. WordPress запускает все виды крючков, прежде чем, наконец, добраться до конца запроса и запустить shutdown
. При приоритете 10, по умолчанию, WordPress попытается вызвать обратный вызов, который является функцией wpse_258451_shutdown()
.
Внутри функции wpse_258451_shutdown()
мы добавляем еще одно действие. На этот раз в init
с обратным вызовом wpse_258451_init()
. Это добавляется к глобальному $wp_filter
просто отлично. Однако, поскольку мы уже прошли init
и закрываемся запрос, этот обратный вызов никогда не срабатывает.
Как это связано с вашим вопросом?
Если "Мне звонят" повторяется, но ваше действие, похоже, не срабатывает, то есть только две возможные причины.
- Крючок уже сработал и больше не срабатывает по этому запросу
- Крючок вообще не срабатывает по этому запросу
Как я могу определить время срабатывания крючков
Следующее будет повторять каждый хук (действие и фильтр), который запускается во время запроса.
add_filter( 'all', function( $a ) {
echo $a . "\\n";
return $a;
}, 10, 1 );
Другим вариантом было бы использовать Монитор запросов Джона Блэкборна.