Передача пользовательских данных из товаров корзины в метаданные заказа в Woocommerce 3

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

Для HTML-формы я ссылаюсь на некоторый настраиваемый PHP-скрипт, который находится ниже и который обрабатывает данные POST из формы и программно создает корзину с этими данными. Спасибо @LoicTheAztec за помощь в этом.

Код файла script.php:

<?php

    require_once("../wp-load.php");

    $customer_name = $_POST["customer_name"];
    $customer_email = $_POST["customer_email"];
    $customer_sex = $_POST["customer_sex"];
    $customer_age = $_POST["customer_age"];
    $product_id = $_POST["product_id"];

$custom_data = array(); // Initializing

    if ( isset($_POST['customer_name']) && ! empty($_POST['customer_name']) )
        $custom_data['custom_data']['name']  =  $_POST['customer_name'];
    if ( isset($_POST['customer_email']) && ! empty($_POST['customer_email']) )
        $custom_data['custom_data']['email'] = $_POST['customer_email'];
    if ( isset($_POST['customer_sex']) && ! empty($_POST['customer_sex']) )
        $custom_data['custom_data']['sex']   = $_POST['customer_sex'];
    if ( isset($_POST['customer_age']) && ! empty($_POST['customer_age']) )
        $custom_data['custom_data']['age']   = $_POST['customer_age'];

    global $woocommerce;

    if (WC()->cart->add_to_cart( $product_id, '1', '0', array(), $custom_data )) {
        var_dump($product_id);
    } else {
        var_dump($customer_name);
    }

    header("Location: ./checkout");
?>

Как видите, мы программно создали элемент корзины, используя метод WC_Cartadd_to_cart(). Итак, все пользовательские данные сохраняются в корзину как пользовательские данные о товаре корзины.

И теперь мы также поместили блок кода в functions.php для печати этих данных на странице оформления заказа.

add_action( 'woocommerce_after_order_notes', 'my_custom_checkout_field' );

function my_custom_checkout_field( $checkout ) {

    //var_dump($checkout);
    global $woocommerce;

    echo '<div id = "my_custom_checkout_field"><h2>' . __('Child Info') . '</h2>';

    foreach ( $woocommerce->cart->get_cart() as $cart_item ) {
        if ( isset($cart_item['custom_data']) ) {

            $custom_data = $cart_item['custom_data'];

            echo("<div>Name: <strong>" . $custom_data['name'] . "</strong></div>");
            echo("<div>Email: <strong>" . $custom_data['email'] . "</strong></div>");
            echo("<div>Gender: <strong>" . $custom_data['sex'] . "</strong></div>");
            echo("<div>Age: <strong>" . $custom_data['age'] . "</strong></div>");

        }

    }

    echo '</div>';

}

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

Я надеюсь, что это описание все проясняет, и еще раз спасибо @LoicTheAztec за то, что помогли мне это сделать. Большое спасибо.

В вашем коде очень странно, что вам нужен global $woocommerce;, поскольку при использовании WC() он уже включен в него… Документы WC()

LoicTheAztec 06.08.2018 20:18
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать 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 и хотите разрабатывать...
1
1
2 411
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Обновление 2 - Два шага

1) Сохранение данных:

Мы сохраним эти персонализированные данные клиента как метаданные «Скрытого» заказа "пункт", а затем как метаданные заказа, так как это связано с подписками с уникальным элементом заказа:

// Utility function: array of custom customer key/label pairs
function custom_data_keys_labels(){
    return array(
        'name'  => __('Customer name'),     'email' => __('Customer email'),
        'sex'   => __('Customer gender'),   'age'   => __('Customer age'),
    );
}

// Add/save custom field value as custom HIDDEN order item meta data
add_action( 'woocommerce_checkout_create_order_line_item', 'custom_field_update_order_item_meta', 20, 4 );
function custom_field_update_order_item_meta( $item, $cart_item_key, $values, $order ) {
    if ( ! isset( $values['custom_data'] ) )
        return;

    $custom_data = $values['custom_data'];
    $meta_data   = array();
    $labels_keys = custom_data_keys_labels();

    foreach( $labels_keys as $key => $label ){
        if ( isset( $custom_data[$key] ) )
            $meta_data[$key] = $custom_data[$key];
    }

    if ( sizeof( $meta_data ) > 0 )
        $item->update_meta_data( __('_customer_data'), $meta_data );

    return $cart_item_data;
}

// Add/save custom fields values as custom order meta data
add_action( 'woocommerce_checkout_create_order', 'my_custom_checkout_field_update_order_meta', 20, 2 );
function my_custom_checkout_field_update_order_meta( $order, $data ) {

    $order_items = $order->get_items(); // Order itesm
    $item        = reset($order_items); // Keep only the first order item

    $item_data   = $item->get_meta( '_customer_data' ); // Get custom customer data

    if ( is_array($item_data) && sizeof($item_data) > 0 ){
        foreach( $item_data as $key => $value ) {
            if ( isset( $item_data[$key] ) )
                $order->update_meta_data( '_customer_' . $key, $value );
        }
        // Mark as data saved
        $order->update_meta_data( '_customer_data_set', true );
    }
}

Код находится в файле function.php вашей активной дочерней темы (или активной темы). Проверено и работает.


2) Отображение сохраненных пользовательских данных:

В приведенном ниже коде также используется наша служебная функция custom_data_keys_labels()

// Order pages (frontend and admin) display
add_filter( 'woocommerce_order_details_after_order_table' , 'display_admin_order_meta_cutom_data', 20, 1 ); // Front
add_action( 'woocommerce_admin_order_data_after_billing_address', 'display_admin_order_meta_cutom_data', 20, 1 ); // Admin
function display_admin_order_meta_cutom_data( $order ){
    $labels_keys = custom_data_keys_labels();
    if ( $order->get_meta( '_customer_data_set' ) ){
        if ( is_admin() ){ // Admin
            echo '<p>';
            foreach( $labels_keys as $key => $label ){
                if ( $order->get_meta( '_customer_' . $key ) )
                    echo '<strong>' . $label . ':</strong> ' . $order->get_meta( '_customer_' . $key ) . '<br>';
            }
            echo '</p>';
        }
        else { // Front end: order view and Order received (thankyou)
            echo '<table class = "woocommerce-table"><tbody>';
            foreach( $labels_keys as $key => $label ){
                if ( $order->get_meta( '_customer_' . $key ) )
                    echo '<tr><th>' . $label . ':</th><td>' . $order->get_meta( '_customer_' . $key ) . '</td></tr>';
            }
            echo '</tbody></table>';
        }
    }
}

// Email notifications display
add_filter( 'woocommerce_email_order_meta_fields' , 'display_email_cutom_data', 20, 3 );
function display_email_cutom_data ( $fields, $sent_to_admin, $order ) {
    $labels_keys = custom_data_keys_labels();
    if ( $order->get_meta( '_customer_data_set' ) ){
        foreach( $labels_keys as $key => $label ){
            $fields['customer_' . $key] = array(
                'label' => $label,
                'value' => $order->get_meta( '_customer_' . $key ),
            );
        }
    }
    return $fields;
}

Код находится в файле function.php вашей активной дочерней темы (или активной темы). Проверено и работает.


@PareshThakor Обновлено… вы можете проверить сейчас.

LoicTheAztec 07.08.2018 11:20

@PareshThakor, пользовательские данные отображаются в бэкэнде под информацией о клиенте для выставления счетов, см. Этот снимок экрана: cbleu.net/so-backend-orders.png… Я использую ловушку woocommerce_admin_order_data_after_billing_address в моем коде ответа… Поскольку вы используете его для подписок, может это и есть проблема. Если удастся почистить немного старые устаревшие комментарии, будет приятно выше (спасибо).

LoicTheAztec 07.08.2018 16:48

Привет, @LoicTheAztec! У нас есть простое руководство по созданию веб-сайта с подпиской, такого как sneakertub.com? У нас есть статические страницы, настраиваемая форма, данные формы, отправленные по заказу, и в моей учетной записи пользователь сможет увидеть эти данные формы, а также детали заказа?

Paresh Thakor 23.09.2019 13:13

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