Показать пользовательские данные в электронных письмах, детали заказа woocommerce - PullRequest
0 голосов
/ 08 декабря 2018

Обновлено:

Я создаю сайт WooCommerce, где пользователь выбирает ряд вариантов из раскрывающихся списков на странице отдельного продукта, которые затем отображаются на странице корзины, и, благодаряпомощь, которую я получил здесь, в кассе.Выбранные параметры также влияют на цену продукта.Я начинаю с двух вариантов продукта: «Печать» и «Оригинал» (на сайте продаются старинные карты).

Все работает до тех пор, пока все элементы заказа отображаются правильно, но после размещения заказадетали не отображаются на экране «заказ получен» в разделе «детали заказа», а также не отображаются в электронном письме с подтверждением клиента.

Чтобы придать некоторый фон, различные варианты выбираются с помощью jQuery и добавляютсяк скрытым полям в следующем примере:

$( ":root" ).find("#mapchest-custom-fields").append("<input type='hidden' 
name='test' value='wibble'>");

... и затем к этим скрытым полям добавляются подробности в корзину следующим образом:

add_filter('woocommerce_add_cart_item_data','add_custom_field_data', 20,3);

function add_custom_field_data($cart_item_data, $product_id, $variation_id)
{

    if(isset($_REQUEST['test']) && ! empty( 'test' )) { // not
        $mc_test = sanitize_text_field($_POST['test']);
        $cart_item_data['custom_data']['test'] = array(
            'label' => 'Test',
            'value' => $mc_test
        );
    }

    if(isset($_REQUEST['original_map_vendor_details']) && ! empty( 
    'original_map_vendor_details' )) {
        $mc_original_map_size = 
        sanitize_text_field($_REQUEST['original_map_vendor_details']);
        $cart_item_data['custom_data']['original_map_vendor_details'] = 
        array(
            'label' => 'Vendor',
            'value' => $mc_original_map_size
        );
    }

    // process above repeated for other fields

    return $cart_item_data;
}

Подробностиотображаются в корзине и оформлении заказа с использованием следующей функции:

add_filter('woocommerce_get_item_data','wdm_add_item_meta',10,2);

function wdm_add_item_meta($cart_data, $cart_item)
{

    $custom_items = array();

    if( !empty( $cart_data ) )
    $custom_items = $cart_data;

    if( isset( $cart_item['custom_data'] ) ) {
        foreach( $cart_item['custom_data'] as $key => $custom_data ){
        if( $key != 'key' ){
            $custom_items[] = array(
                'name' => $custom_data['label'],
                'value' => $custom_data['value'],
            );
        }
        }
    }

    return $custom_items;
}

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

Я попытался добавить, используя woocommerce_checkout_create_order_line_itemзацепите по этим линиям:

add_action( 'woocommerce_checkout_create_order_line_item', 
'add_custom_order_line_item_meta', 20,4 );

function add_custom_order_line_item_meta($item, $cart_item_key, $values, 
$order)
{
    if( array_key_exists('test', $values['custom_data']) ){
        $item->update_meta_data( 'Test', $values['custom_data']['test'] );
    }
}

... но пока я вижу данные, если я var_dump отправляю их в электронном письме следующим образом:

add_action('woocommerce_email_customer_details', 
'add_custom_checkout_field_to_emails_notifications', 25, 4 );

function add_custom_checkout_field_to_emails_notifications( $order, 
$sent_to_admin, $plain_text, $email ) {
    var_dump($order);
}

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

Есть ли какие-либо подсказки относительно того, что я здесь делаю неправильно?

Заранее спасибо.

пс.Теперь мне удалось отобразить поля в электронном письме с подтверждением (по моде), используя следующие функции:

add_action( 'woocommerce_checkout_create_order_line_item', 
'add_custom_order_line_item_meta', 20,4 );

function add_custom_order_line_item_meta($item, $cart_item_key, $values, 
$order)
{

    if ( isset( $values['custom_data'] ) ) {
        $item->update_meta_data( __('The Custom Data', 'woocommerce'), 
        $values['custom_data'] );          
   }
}

и

add_action('woocommerce_email_customer_details', 
'add_custom_checkout_field_to_emails_notifications', 25, 4 );

function add_custom_checkout_field_to_emails_notifications( $order, 
$sent_to_admin, $plain_text, $email ) {
// var_dump($order);
  foreach( $order->get_items() as $item_id => $item ){

    $custom_data = $item->get_meta( 'The Custom Data' );

    foreach( $custom_data as $key => $value ){

      foreach( $value as $key1 => $value1 ){
        $output = '';
        $output .= '<span class="text">' . $value1  . '</span>';
        echo $output;
      }
      echo "<br>";
    }

    echo "<br><br>";
    // var_dump($custom_data );

  }
  '</strong> <span class="text">' . $order->get_data() . '</span></div>';
}

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

1 Ответ

0 голосов
/ 09 декабря 2018

Хорошо, я решил это.Я выкладываю ответ здесь для тех, у кого есть такая же проблема.В основном, мой процесс пропустил этап.Для достижения вышеуказанного вы должны сделать следующее:

  1. Определите значение, которое вы хотите передать в качестве метаданных.В моем собственном случае я использовал скрытое поле, но оно также может быть установлено с помощью ввода текста, раскрывающегося списка или другого поля ввода.В моем случае я использовал jquery, чтобы добавить это в пустой div с идентификатором 'mapchest-custom-fields', который я подключил к процессу перед кнопкой корзины.Он также может быть установлен со статическим значением.

    <?php
    function define_container_div() {
    ?>  
    <div id="mapchest-custom-fields"></div>
    <?php
    } 
    
    add_action( 'woocommerce_before_add_to_cart_button', 'define_container_div', 20 );
    ?>
    

    ... jQuery-код для добавления значения.Значение также может быть динамическим:

    $( ":root" ).find("#mapchest-custom-fields").append("<input type='hidden' name='test' value='wibble'>");
    
  2. Далее вы добавляете значение к данным вашей корзины:

    function add_values_to_cart_item_data( $cart_item_data, $product_id, $variation_id ) 
    {
        if(isset($_POST['test']) && ! empty( 'test' )) {
            $test = filter_input( INPUT_POST, 'test' );
            $cart_item_data['test'] = $test;
        }
    
        return $cart_item_data;
    }
    
    add_filter( 'woocommerce_add_cart_item_data', 'add_values_to_cart_item_data', 10, 3);
    
  3. Далее,Вы отображаете значение в вашей корзине:

    function display_data_in_cart( $item_data, $cart_item ) {
    
        $item_data[] = array(
            'key'     => __( 'Test', 'mapchest' ),
            'value'   => wc_clean( $cart_item['test'] ),
        );
    
        return $item_data;
    }
    
    add_filter( 'woocommerce_get_item_data', 'display_data_in_cart', 10, 2 );
    
  4. И, наконец, вы добавляете данные к элементам вашего заказа:

    function add_data_to_order_items( $item, $cart_item_key, $values, $order ) {
    
        $item->add_meta_data( __( 'Test', 'mapchest' ), $values['test'] );
    }
    
    add_action( 'woocommerce_checkout_create_order_line_item', 'add_data_to_order_items', 10, 4 );
    

Вышеуказанный процесс работает для меня.Он отображает пользовательские данные в корзине и в кассе и сохраняет их на странице «Заказ получен», заархивированных заказов и подтверждения по электронной почте (другие электронные письма еще не проверялись).

Спасибо https://iconicwp.com/blog/add-custom-cart-item-data-woocommerce/ за объяснение этого процесса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...