Отправить собственный шаблон электронной почты для другого продукта - woocommerce

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

Я обнаружил, что единственным решением является добавление проверки каждого файла шаблона для электронной почты в woocommerce/emails в папке темы. Есть ли лучший способ сделать это?

Есть ли какой-нибудь вариант в

add_action( 'woocommerce_email', 'woocommerce_email_function' );

OR

Можно ли добавить другой заголовок для заказа для определенного продукта?


person Shijin TR    schedule 18.07.2017    source источник
comment
Как вы знаете, есть 2 способа: 1) Использовать все доступные хуки. связанные с уведомлениями по электронной почте (некоторые из них находятся в самих шаблонах). 2) Переопределить шаблоны woocommerce через тему… Поскольку ваш вопрос не очень подробный ( мы не можем догадаться, что вы пытаетесь сделать) и вы не показываете свой собственный код, на самом деле невозможно ответить на этот вопрос…   -  person LoicTheAztec    schedule 18.07.2017
comment
@LoicTheAztec У меня есть разные продукты в моем магазине. Если заказ размещен, будут отправлены электронные письма с заказом с использованием шаблонов. Мне нужно использовать другой шаблон на основе идентификатора продукта.   -  person Shijin TR    schedule 18.07.2017
comment
Да, я понял это раньше, спасибо… Какой код и где… Можете ли вы предоставить код, который вы используете в этих переопределенных шаблонах? ... Спасибо   -  person LoicTheAztec    schedule 18.07.2017
comment
@LoicTheAztec Это еще не написано. Метод, который я планировал закодировать, состоит в том, чтобы проверить идентификатор заказа в файле шаблона, и если это заказ с идентификатором продукта, то вернуть html для шаблона   -  person Shijin TR    schedule 18.07.2017
comment
Хорошо, но ответ зависит от места, где вы хотите отобразить свой html-код (и для какого статуса заказа?). Поэтому, пожалуйста, можете ли вы добавить код, который хотите добавить, и точное место (при соблюдении условий)… таким образом, я бы быть в состоянии помочь…   -  person LoicTheAztec    schedule 18.07.2017
comment
Вы пробовали мое решение ниже?   -  person jjj    schedule 02.08.2017


Ответы (2)


У меня есть решение, например, для идентификатора продукта 999 вы хотите отобразить заголовок заголовка This is a very special title:

function change_email_title_header_depending_of_product_id( $email_heading, $order ) {
    global $woocommerce;
    $items = $order->get_items();

    // check products
    foreach ( $items as $item ) {
        $product_id = $item['product_id'];
        if ( $product_id == 999 ) {
            $email_heading = 'This is a very special title';
        }
        return $email_heading;
    }
}
add_filter( 'woocommerce_email_heading_customer_processing_order', 'change_email_title_header_depending_of_product_id', 10, 2 );
person jjj    schedule 19.07.2017

У меня было чертовски много времени, чтобы понять, как получить идентификатор заказа от 'woocommerce_email', и я не смог найти ответ на StackOverflow, поэтому я подумал, что могу поделиться тем, что сработало для меня.

Переопределение шаблонов — самый очевидный способ изменить содержимое электронной почты, но это испортило шаблоны электронной почты из других плагинов, таких как Smart Coupons.

Мне удалось программно удалить шаблон email_order_details.php из электронных писем, содержащих определенный продукт, например:

add_action( 'woocommerce_email', 'remove_woocommerce_email_order_details' );

// Using $object in function was key to remove_action below
function remove_woocommerce_email_order_details( $object ) {

    // Simple way to get the order ID
    $order_id = get_the_ID();

    $order = new WC_Order( $order_id );
    $items = $order->get_items();

    foreach ( $items as $item ) {

        // If product ID in order, remove order details
        $product_id = $item['product_id'];
        if ( $product_id == 1234 ) {
            remove_action( 'woocommerce_email_order_details', array( $object, 'order_details' ), 10, 4 );
        } 
    }

}

Теперь я снова добавил таблицу woocommerce_email_order_details со своими данными.

add_filter( 'woocommerce_email_order_details', 'add_custom_email_order_details' );

function add_custom_email_order_details() {

    // With these, you should be able access most elements in the 'woocommerce_email_order_details' table
    $order_id = get_the_ID();
    $order = new WC_Order( $order_id );
    $order_type = $order->order_type;
    $customer_id = $order->get_user_id();

    $items = $order->get_items();
    foreach ( $items as $item ) {
        $product_id = $item['product_id'];
    }

    if( $product_id == 1234 ) {
        echo "Order Type: " . $order_type;
        echo "Customer ID: " . $customer_id;
        echo "Product ID:" . $product_id;
    }

}

Надеюсь, это поможет кому-то другому!

person aleks1217    schedule 20.01.2019
comment
Оказывается, это решение работало только для электронных писем, запускаемых вручную со страницы «Редактировать заказ». Чтобы он корректно работал на новых ордерах, я перенес remove_action( 'woocommerce_email_order_details', array( $object, 'order_details' ), 10, 4 ); из функции remove_woocommerce_email_order_details в функцию add_custom_email_order_details, сразу после if( $product_id == 1234 ) - person aleks1217; 30.01.2019