Отображать использованные купоны + специальное сообщение в электронных письмах заказа WooCommerce

Я пытаюсь отобразить использованные купоны в электронных письмах с заказами WooCommerce + добавить конкретные сообщения на основе использованных купонов.

Отображение купонов работает на основе

Добавить примененный код купона в шаблоне электронной почты для нового заказа администратора — WooCommerce


Я пытаюсь расширить его, проверяя, содержит ли строка $coupon_codes определенные слова/конкретные купоны, в данном случае "grouppurchase", а затем отображая сообщение.

Он должен быть для $coupon_codes, так как он может (и будет) использоваться с несколькими купонами.

Мне удалось заставить его работать со следующим кодом

Как проверить, содержит ли строка определенное слово?

Проблема в том, что (strpos) выводит сообщение всякий раз, когда используется ЛЮБОЙ купон, не важно, что написано в купоне, и я не могу понять, почему

Я следую логике strpos, стоящей за этим ответом

// Display used Coupons on Emails and Add GroupPurchase Warning
add_action( 'woocommerce_email_after_order_table', 'display_applied_coupons', 10, 4 );
function display_applied_coupons( $order, $sent_to_admin, $plain_text, $email ) {

    // Only for admins and when there at least 1 coupon in the order
    if ( ! $sent_to_admin && count($order->get_items('coupon') ) == 0 ) return;

    foreach( $order->get_items('coupon') as $coupon ){
        $coupon_codes[] = $coupon->get_code();
    }

    // For one coupon
    if( count($coupon_codes) == 1 ){
        $coupon_code = reset($coupon_codes);
        echo '<p>'.__( 'Used Coupon: ').$coupon_code.'<p>';
    }

    // For multiple coupons
    else {
        $coupon_codes = implode( ', ', $coupon_codes);
        echo '<p>'.__( 'Used Coupons: ').$coupon_codes.'<p>';
    }

    if (strpos($coupon_codes, 'groupurchase') !== false) {
        echo '<p>' . 'With this coupon you are participating in a group purchase' . '<p>' ;
    }

}

person Jaime Matos    schedule 31.05.2020    source источник


Ответы (1)


Попробуйте так

// The email function hooked that display the text
function display_applied_coupons( $order, $sent_to_admin, $plain_text, $email ) {

    // Only for admins and when there at least 1 coupon in the order
    if ( ! $sent_to_admin && count($order->get_items('coupon') ) == 0 ) return;

    foreach( $order->get_items('coupon') as $coupon ){
        $coupon_codes[] = $coupon->get_code();
    }

    // For one coupon
    if( count( $coupon_codes ) == 1 ){
        $coupon_code = reset( $coupon_codes );

        // Set variable output
        $output = '<p>' . __( 'Coupon Used: ', 'woocommerce' ) . $coupon_code . '</p>';

        // Extra
        if ( strpos( $coupon_code, 'groupurchase') !== false ) {
            // Append to
            $output .= '<p>' . __('With this coupon you are participating in a group purchase', 'woocommerce') . '</p>';
        }

        // Echo output
        echo $output;
    } else { // For multiple coupons
        // Loop
        foreach ( $coupon_codes as $coupon_code ) {
            // Set variable output
            $output = '<p>' . __( 'Coupon Used: ', 'woocommerce' ) . $coupon_code . '</p>';

            // Extra
            if ( strpos( $coupon_code, 'groupurchase') !== false ) {
                // Append to
                $output .= '<p>' . __('With this coupon you are participating in a group purchase', 'woocommerce') . '</p>';
            }

            // Echo output
            echo $output;       
        }
    }
}
add_action( 'woocommerce_email_order_details', 'display_applied_coupons', 10, 4 );
person 7uc1f3r    schedule 31.05.2020
comment
Это работает 7uc1f3r! Большое тебе спасибо. Я пытался изучить основные различия, чтобы понять, могу ли я понять, почему strpos не работал раньше. Было ли основным отличием, которое заставило его работать, тот факт, что вы устанавливаете переменную в качестве вывода вместо прямого эха, как я делает? Или были еще поправки? Кроме того, что делает «woocommerce» в этом случае? Заранее большое спасибо еще раз всем за помощь и советы, я вам очень благодарна!!! - person Jaime Matos; 01.06.2020
comment
Потому что в вашем коде str_pos используется как для одного купона, так и для нескольких. Когда применяется 1 купон, результатом будет array, а не string. См. этот пример - person 7uc1f3r; 01.06.2020
comment
Конечно! Это имеет смысл! Большое спасибо за простое объяснение, я действительно ценю это - person Jaime Matos; 01.06.2020