Как применить фильтр только к новым электронным письмам (WordPress, WooCommerce) - PullRequest
0 голосов
/ 10 февраля 2020

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

**function filter_woocommerce_email_order_item_quantity( $qty_display, $item ) {
$product = wc_get_product( $item['product_id'] );
$product_id = $product->get_id();

if ( $product_id == 6960 ) {
    $qty_display = $qty_display * 2;
}

return $qty_display; 
}; 
add_filter( 'woocommerce_email_order_item_quantity', 'filter_woocommerce_email_order_item_quantity', 10, 2 );

Ответы [ 2 ]

2 голосов
/ 11 февраля 2020

Добро пожаловать в WPSE.
$item - это экземпляр WC_Order_Item, а не массив, поэтому невозможно получить product_id из объекта позиции заказа, подобного этому ($item['product_id']).
Я предлагаю используя стандартные методы WooCommerce, как показано ниже.

Обновление:

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

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

add_action( 'woocommerce_email_order_details', function( $order, $sent_to_admin )
{
    if ( $sent_to_admin && ! defined('TST_ADMIN_EMAIL') ) {
        define( 'TST_ADMIN_EMAIL', true );
    }
}, 9, 2 );

add_filter( 'woocommerce_email_order_item_quantity', 'tst_filter_woocommerce_email_order_item_quantity', 10, 2 );
function tst_filter_woocommerce_email_order_item_quantity( $qty_display, $item )
{
    if (
        defined('TST_ADMIN_EMAIL')
        && true === TST_ADMIN_EMAIL
        && 'line_item' === $item->get_type()
    ) {
        $product = $item->get_product();
        $product_id = $product->get_id();

        if ( $product_id == 6960 ) {
            $qty_display = $qty_display * 2;
        }
    }

    return $qty_display; 
}; 
0 голосов
/ 14 февраля 2020

Это противоречит некоторым вещам, которые я читал, но этот код работает для меня

add_action( 'woocommerce_email_order_details', 'add_order_instruction_email', 11, 4 );

function add_order_instruction_email( $order, $sent_to_admin, $plain_text, $email ) {

   remove_filter( 'woocommerce_email_order_item_quantity', 'filter_woocommerce_email_order_item_quantity', 10, 2 );

  }; 

function filter_woocommerce_email_order_item_quantity( $qty_display, $item ) {
    $product = wc_get_product( $item['product_id'] );
    $product_id = $product->get_id();

if ( $product_id == 6960 ) {
    $qty_display = $qty_display * 2;
}
    if ( $product_id == 6912 ) {
    $qty_display = $qty_display * 2;
}
    if ( $product_id == 6861 ) {
    $qty_display = $qty_display * 2;
}

return $qty_display; 
}; 
add_filter( 'woocommerce_email_order_item_quantity', 'filter_woocommerce_email_order_item_quantity', 10, 2 );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...