Добавление пользовательских данных в позиции заказа Woocommerce - PullRequest
0 голосов
/ 21 мая 2018

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

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

Текущий код выглядит следующим образом:

<?php
function wcpc_save_custom_product_field( $cart_item_data, $product_id ) {
    if( isset( $_REQUEST['wcpc_custom_product'] ) ) {
        $cart_item_data[ 'wcpc_custom_product' ] = $_REQUEST['wcpc_custom_product'];
        $cart_item_data[ 'wcpc_custom_price' ] = $_REQUEST['wcpc_custom_price'];
        /* below statement make sure every add to cart action as unique line item */
        $cart_item_data['unique_key'] = md5( microtime().rand() );
    }
    return $cart_item_data;
}
add_action( 'woocommerce_add_cart_item_data', 'wcpc_save_custom_product_field', 10, 2 );

function render_meta_on_cart_and_checkout( $cart_data, $cart_item = null ) {
    $custom_items = array();
    /* Woo 2.4.2 updates */
    if( !empty( $cart_data ) ) {
        $custom_items = $cart_data;
    }
    if( isset( $cart_item['wcpc_custom_product'] ) &&  $cart_item['wcpc_custom_product'] != '' ) {
        $custom_items[] = array( "name" => 'Custom', "value" => $cart_item['wcpc_custom_product'] );
    }
    return $custom_items;
}
add_filter( 'woocommerce_get_item_data', 'render_meta_on_cart_and_checkout', 10, 2 );

add_action( 'woocommerce_before_calculate_totals', 'add_custom_price' );

function add_custom_price( $cart_object ) {

//  This is necessary for WC 3.0+
    if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return;

    foreach ( $cart_object->get_cart() as $key => $value ) {
        if(isset($value['wcpc_custom_price'])) {
            $value['data']->set_price( $value['wcpc_custom_price'] );
        }
    }

}
?>

Я попытался изменить фрагмент кода, который я нашел в Интернете, и добавить его к приведенному выше коду.Однако, когда я реализую это, корзина ломается совсем:

function wcpc_order_item_product( $cart_item, $order_item ){

    if( isset( $order_item['wcpc_custom_product'] ) ){
        $cart_item_meta['wcpc_custom_product'] = $order_item['wcpc_custom_product'];
    }

    return $cart_item;

}
add_filter( 'woocommerce_order_item_product', 'wcpc_order_item_product', 10, 2 );

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

Ответы [ 2 ]

0 голосов
/ 21 мая 2018

Крюк woocommerce_add_order_item_meta скоро будет объявлен устаревшим.Начиная с Woocommerce 3, лучший хук доступен.Попробуйте это:

add_action( 'woocommerce_checkout_create_order_line_item', 'custom_checkout_create_order_line_item', 20, 4 );
function custom_checkout_create_order_line_item( $item, $cart_item_key, $values, $order ) {
    if( ! isset( $values['wcpc_custom_product'] ) ) return;

    if( ! empty( $values['wcpc_custom_product'] ) )
        $item->update_meta_data( 'Custom label', $values['wcpc_custom_product'] );

}

enter image description here

Вам придется заменить ' Пользовательская метка ' на метку, которую вы хотите отобразитьсо значением…

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

См. эту связанную ветку, которая даст вам все объяснения:
Woocommerce: какой хук использовать вместо устаревшего "woocommerce_add_order_item_meta"

0 голосов
/ 21 мая 2018

Вы можете использовать wc_add_order_item_meta () для сохранения пользовательского мета в порядке и бэкенде

, например: *

add_action('woocommerce_add_order_item_meta','add_values_to_order_item_meta',1,2);
if(!function_exists('add_values_to_order_item_meta'))
{
  function add_values_to_order_item_meta($item_id, $values)
  {
        global $woocommerce,$wpdb;
        $user_custom_values = $values['user_custom_data_value'];
        if(!empty($user_custom_values))
        {
            wc_add_order_item_meta($item_id,'user_custom_data',$user_custom_values);  
        }
  }
}

Из отредактированного кода.

add_action('woocommerce_add_order_item_meta','add_values_to_order_item_meta',1,2);
if(!function_exists('add_values_to_order_item_meta')) 
{ 
    function add_values_to_order_item_meta($item_id, $values) 
        { 
            global $woocommerce,$wpdb;
            $user_custom_values = $values['wcpc_custom_product'];
            if(!empty($user_custom_values)) {
            wc_add_order_item_meta($item_id,'wcpc_custom_product',$user_custom_values); }
        } 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...