Изменение адреса электронной почты для заказа WooCommerce / удаление отложенного заказа: # из метаданных продукта

Я настроил текст отложенного заказа на моем сайте woocommerce и также хотел бы добавить тот же текст в электронные письма с подтверждением заказа.

Например, у меня есть корзина и касса, которые отображают «В наличии» или «Сделано на заказ» в мета (вариант) для каждого продукта.

Чтобы получить результат, я добавил следующий код в файл шаблона cart.php и аналогичный код в файл шаблона review-order.php, чтобы он отображался на странице оформления заказа:

// Backorder notification.
if ( $_product->backorders_require_notification() && $_product->is_on_backorder( $cart_item['quantity'] ) ) {
    echo wp_kses_post( apply_filters( 'woocommerce_cart_item_backorder_notification', '<p class="cart_stock_notification made-to-order">' . esc_html__( 'Made-To-Order', 'woocommerce' ) . '</p>', $product_id ) );
}
else if ( !$_product->backorders_require_notification() && !$_product->is_on_backorder( $cart_item['quantity'] ) ) {
    echo wp_kses_post( apply_filters( 'woocommerce_cart_item_backorder_notification', '<p class="cart_stock_notification made-to-order">' . esc_html__( 'Made-To-Order', 'woocommerce' ) . '</p>', $product_id ) );
}
else {
    echo wp_kses_post( apply_filters( 'woocommerce_cart_item_backorder_notification', '<p class="cart_stock_notification in-stock">' . esc_html__( 'In Stock', 'woocommerce' ) . '</p>', $product_id ) );
}

Теперь я хочу, чтобы то же самое отображалось в моих электронных письмах с подтверждением заказа. Я особенно хочу, чтобы это было в электронных письмах клиентов, но электронные письма администратора тоже подходят.

Прямо сейчас любой обратно заказанный продукт отображается в мета-мете продукта как «Backordered: #», чтобы обозначить количество продуктов с обратным заказом.

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

Я знаю, что отложенная мета применяется из функции set_backorder_meta в class-wc-order-item-product.php, но я не хочу редактировать файл класса, так как он будет перезаписан обновлениями.

Я также не хочу просто менять текст, мне нужно изменить логику. Если я могу отключить set_backorder_meta от применения к электронным письмам, я думаю, что смогу подключиться к woocommerce_order_item_meta_end или просто отредактировать файл шаблона email-order-items.php (меня устраивает любой вариант).

Моя проблема в том, что я не могу проверить, есть ли элемент «backorders_require_notification» и / или «is_on_backorder».

Есть ли способ отключить мета-метаданные по умолчанию в подтверждении по электронной почте и добавить пользовательскую мета-мету, которая проверяет, находится ли продукт в отложенном заказе (и требует ли уведомление о невыполнении заказа), а затем отображать пользовательский текст?


person rockeypjb    schedule 08.06.2020    source источник


Ответы (1)


В шаблоне email-order-items.php в строке 60 - 65. Используется функция wc_display_item_meta().

Если мы посмотрим дальше, то увидим, что эта функция находится в wc-template-functions.php

https://github.com/woocommerce/woocommerce/blob/master/includes/wc-template-functions.php#L3202-L3244

Таким образом, мы можем перезаписать вывод с помощью хука woocommerce_display_item_meta и с помощью параметров получить необходимую информацию о продукте.

function filter_woocommerce_display_item_meta ( $html, $item, $args ) { 
    // Get product
    $product = $item->get_product();

    // Html
    if ( $product->backorders_require_notification() && $product->is_on_backorder( $item['quantity'] ) ) {
        $html = '<ul class="wc-item-meta"><li><strong class="wc-item-meta-label" style="float: left; margin-right: .25em; clear: both">Made-To-Order</strong></li></ul>';       
    } else if ( !$product->backorders_require_notification() && !$product->is_on_backorder( $item['quantity'] ) ) {
        $html = '<ul class="wc-item-meta"><li><strong class="wc-item-meta-label" style="float: left; margin-right: .25em; clear: both">Made-To-Order</strong></li></ul>';
    } else {
        $html = '<ul class="wc-item-meta"><li><strong class="wc-item-meta-label" style="float: left; margin-right: .25em; clear: both">In stock</strong></li></ul>';
    }

    return $html;
}
add_filter( 'woocommerce_display_item_meta', 'filter_woocommerce_display_item_meta', 10, 3 );

Подсказка:, чтобы вывод был более динамичным, вы можете переписать вывод с помощью аргументов (вы можете увидеть, как это делается в wc-template-functions.php)

person 7uc1f3r    schedule 08.06.2020
comment
выход рабочий! Проблема в том, что он удаляет все метаданные и заменяет их новым $ html (как и следовало ожидать). Я хотел бы по-прежнему отображать метаданные продукта по умолчанию, но в конце добавить настраиваемую метаданные для невыполненного заказа. Кажется, мне действительно нужно вызвать аргументы, содержащие эти метаданные, и я просмотрел wc-template-functions.php, но не могу заставить его работать. - person rockeypjb; 08.06.2020
comment
Я думал, что намерение состояло в том, чтобы изменить это на все, в любом случае есть «else», которое всегда будет отображаться, если 2 других условия не выполняются. Итак, нужно добавить желаемые условия с помощью elseif. Если ни одно условие не выполнено (без else), будет показано значение по умолчанию. - person 7uc1f3r; 08.06.2020
comment
также $html = 'abc', а затем $html = 'def' даст результат 'def'. Если вы используете $html ='abc', а затем $html .= 'def' даст результат 'abcdef'. Таким образом, . = вместо = будет добавляться вместо перезаписи - person 7uc1f3r; 08.06.2020
comment
Блестяще! Большое спасибо. Я просто перешел на $ html. = '‹Ul class = wc-item-meta› для каждого оператора if / else, и он отлично работает. - person rockeypjb; 08.06.2020