Добавление действия в функцию, вызываемую функцией добавить фильтр


Я пытаюсь вызвать функцию 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";
     }
Author: Kristoffer M, 2017-03-01

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 и закрываемся запрос, этот обратный вызов никогда не срабатывает.

Как это связано с вашим вопросом?

Если "Мне звонят" повторяется, но ваше действие, похоже, не срабатывает, то есть только две возможные причины.

  1. Крючок уже сработал и больше не срабатывает по этому запросу
  2. Крючок вообще не срабатывает по этому запросу

Как я могу определить время срабатывания крючков

Следующее будет повторять каждый хук (действие и фильтр), который запускается во время запроса.

add_filter( 'all', function( $a ) { 
  echo $a . "\\n";
  return $a; 
}, 10, 1 );

Другим вариантом было бы использовать Монитор запросов Джона Блэкборна.

 3
Author: Nathan Johnson, 2017-03-01 17:13:53