Как запустить какую-то функцию в другом месте, но не в файле function.php WordPress

#php #wordpress #plugins

#php #wordpress #Плагины

Вопрос:

Я пишу небольшой плагин.

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

У меня есть какая-то функция и фильтр:

     function filter_gateways($gateways){
    $payment_NAME = 'paypal'; // <-- some payment method
    $category_ID_1 = '6'; // <-- some category of products
    global $woocommerce;
    foreach ($woocommerce->cart->cart_contents as $key => $values ) {
        // Get the terms, i.e. category list using the ID of the product
        $terms = get_the_terms( $values['product_id'], 'product_cat' );
        // List of the products category for a match
        foreach ($terms as $term) {
            // $category_ID_1 is the ID of the category for which i want to remove the payment gateway
            if($term->term_id == $category_ID_1){
                unset($gateways[$payment_NAME]);
                break;
            }
            break;
        }
    }
    return $gateways;
}
add_filter('woocommerce_available_payment_gateways','filter_gateways');
  

Этот фильтр работает в файле functions.php по теме папки.

Но если я использую его в своих файлах плагинов — фильтр не работает.

Что я делаю не так?Как заставить это работать?

Для этого я передаю некоторые свои переменные в этот фильтр.

Ответ №1:

Ваша проблема заключается в выборе времени. Вероятно, ваш плагин загружается до того, как у Woocommerce появилась возможность настроить этот фильтр, поэтому он просто ничего не делает. Попробуйте обернуть вызов фильтра внутри действия, чтобы отложить его активацию. Я думаю after_setup_theme , это был бы хороший выбор, но вам может потребоваться использовать другой. Вы можете увидеть все доступные действия по умолчанию здесь https://codex.wordpress.org/Plugin_API/Action_Reference .

 add_action( 'after_setup_theme', 'do_filter_gateways' );

function do_filter_gateways()
{
    add_filter('woocommerce_available_payment_gateways','filter_gateways');
}