Добавление пользовательских данных в элементы заказа Woocommerce

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

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

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

<?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 );

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
4
0
8 694
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете использовать 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); }
        } 
}

Спасибо за ответ. Нужно ли мне редактировать этот код, чтобы сделать его совместимым с моим плагином? Я попытался выполнить быстрое копирование / вставку. Корзина все еще работает, но пользовательские данные не отображаются на странице заказов.

Tostino 21.05.2018 12:32

вы должны отредактировать это в соответствии с вашими потребностями, это всего лишь пример.

Vaibhav Kumar 21.05.2018 12:34

справочная ссылка stackoverflow.com/questions/45363969/…

Vaibhav Kumar 21.05.2018 12:46

Благодарность! Хорошо, поэтому я изменил код на: 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']; если (! пусто ($ user_custom_values)) {wc_add_order_item_meta ($ item_id, 'wcpc_custom_product', $ user_‌ custom_values); }}}

Tostino 21.05.2018 13:16

Это работает, но когда клиент достигает страницы сведений о заказе, отображается следующее: Общий тест продукта × 1 wcpc_custom_product: Ширина: 50, Длина: 50, Кронштейны:, 0,00 £

Tostino 21.05.2018 13:18

Вы умеете скрывать: wcpc_custom_product

Tostino 21.05.2018 13:19

попробуйте спрятаться от css

Vaibhav Kumar 21.05.2018 13:24
Ответ принят как подходящий

Хук 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'] );

}

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

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

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

Привет, Лоик, большое спасибо за твой ответ. Ваши сообщения очень помогали мне в прошлом! К сожалению, когда я копирую / вставляю приведенный выше код, тележка полностью ломается. Есть ли у вас какие-либо мысли относительно того, где я ошибаюсь?

Tostino 21.05.2018 15:22

Привет, Лоик, пожалуйста, не обращай внимания на последний пост! Теперь он работает. Я обновил Woocommerce. Однако возникла другая проблема, теперь я использую последнюю версию, и мои категории дублируются, как можно увидеть здесь: aurello.co.uk/product-category/splashbacks Знаете ли вы, как я могу скрыть / удалить один набор категорий, чтобы отображалась только одна?

Tostino 21.05.2018 15:36

это только на передней панели сайта - никаких проблем с дублированием на задней панели

Tostino 21.05.2018 16:05

Другие вопросы по теме