在Woocommerce 3中将购物车项目中的自定义数据传递到Order meta

Paresh Thakor

我已经实现了一个自定义HTML表单,并要求我的客户传递一些数据以成功下订单。没有这些细节,我的订单就不重要了。

对于HTML表单,我引用了下面的一些自定义PHP脚本,该脚本处理来自Form的POST数据并以编程方式使用这些数据创建Cart。感谢@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_Cart add_to_cart()方法以编程方式创建了购物车项目因此,所有自定义数据都将作为自定义购物车项目数据保存到购物

现在,我们还放置了一个代码块functions.php以在Checkout页面上打印这些数据。

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使我能够执行此操作。非常感谢你。

LoicTheAztec

更新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文件中。经过测试和工作。


本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

显示WooCommerce中购物车项目中特定的最大自定义字段值

WooCommerce购物车-动态价格变量传递到自定义价格挂钩

在Woocommerce购物车和结帐项目中显示自定义字段的值

在WooCommerce订单中添加到购物车自定义字段数据

根据Woocommerce中的自定义购物车数据更改购物车价格

在Woocommerce中将购物车项目的价格替换为自定义字段值

根据Woocommerce中购物车项目的数量添加自定义结帐字段

更新有关Woocommerce中数量变化的购物车项目自定义数据

在Woocommerce中将具有自定义数据的产品添加为单独的购物车项目

从Woocommerce 3中的隐藏输入字段自定义价格中设置购物车项目价格

在Woocommerce中通过带有自定义元数据的Get请求将商品添加到购物车

Woocommerce中针对自定义购物车项目数据值的强制免费送货方法

WooCommerce中的自定义条件购物车项目价格

在Woocommerce 3中使用购物车项目自定义数据更新订单元

Woocommerce 3中按产品类别的自定义购物车项目计数

Woocommerce中的渐进式购物车项目自定义运输成本

无法从woocommerce中的订单的购物车页面到结帐页面获取自定义字段数据

woocommerce_add_order_item_meta问题

在Woocommerce 3中自定义添加到购物车消息

在Woocommerce购物车,结帐和订单上显示并保存添加的自定义购物车项目数据

在WooCommerce中显示自定义计算的购物车项目价格

根据Woocommerce中的自定义购物车数据定制购物车小计

将多个自定义数据数组添加到WooCommerce自定义Ajax上的购物车项目中添加到购物车

在WooCommerce中将自定义产品文本字段作为购物车项目数据传递

在WooCommerce订单和电子邮件中添加和显示自定义购物车项目数据

使用 Woocommerce 3 中的 GET 方法将来自 url 的自定义数据添加到购物车

Woocommerce 中的自定义删除购物车项目功能

Woocommerce:从插件中获取一些自定义购物车项目数据值

Woocommerce order_review 购物车项目更新的自定义模板