Обновлено:
Я создаю сайт 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>';
}
, но это хакерское решение и нене решить основную проблему, заключающуюся в том, почему информация не отображается на странице получения заказа или непосредственно в позициях строки заказа в электронном письме.