Sas*_*cha 1 php wordpress orders woocommerce hook-woocommerce
在WooCommerce 3.0出现之前,我的代码就像一种魅力,可以将购物车中的自定义值保存到结账时的订单中。但从那以后,我无法为订单创建自定义元数据。
环境: Wordpress 4.9.4 & WooCommerce 3.3.3
add_action('woocommerce_checkout_update_order_meta', 'custom_meta_to_order', 20, 1);add_action('woocommerce_checkout_create_order', 'custom_meta_to_order', 20, 1);第 1 个钩子是我尝试最多的一个,第 2 个钩子只是本主题中提到的一些字面变化的实验。
以下函数代码与钩子编号 1 相关:
if (!function_exists('custom_meta_to_order')) {
function custom_meta_to_order($order_id, $values) {
$order = wc_get_order( $order_id );
$order->update_meta_data('_TESTKEYstart', 'Hello');
if (isset($values['myValue'])) {
$myValue = $values['myValue'];
if (!empty($myValue)) $order->update_meta_data('_myKey', $myValue);
}
$order->update_meta_data('_TESTKEYend', 'Bye');
$order->save();
}
}
Run Code Online (Sandbox Code Playgroud)
我还检查了 mySQL 表中table wp_woocommerce_order_itemmeta是否至少会创建两个_TESTKEY* -meta - entrys(因为它们没有条件)。
更新:您的代码中有一些错误......
$values不存在)$_POST['myValue']改用。$order_id 为了 woocommerce_checkout_update_order_meta$order 为了 woocommerce_checkout_create_order下面我已替换$_POST['myValue']为$_POST['billing_country']因为您没有提供此自定义结帐字段的代码...
所以这里有两种方式:
1)对我来说,最好的办法,为解释在这里:
if ( ! function_exists('custom_meta_to_order') ) {
add_action( 'woocommerce_checkout_create_order', 'custom_meta_to_order', 20, 1 );
function custom_meta_to_order( $order ) {
$order->update_meta_data('_TESTKEYstart', 'Hello');
if (isset($_POST['billing_country'])) {
$myValue = $_POST['billing_country'];
if (!empty($myValue)) $order->update_meta_data('_my_key', $myValue);
}
$order->update_meta_data('_TESTKEYend', 'Bye');
}
}
Run Code Online (Sandbox Code Playgroud)
代码位于您的活动子主题(或主题)的 function.php 文件中。测试和工作。
2)另一种方式:
if ( ! function_exists('custom_meta_to_order') ) {
add_action('woocommerce_checkout_update_order_meta', 'custom_meta_to_order', 20, 1);
function custom_meta_to_order( $order_id ) {
// get an instance of the WC_Order object
$order = wc_get_order( $order_id );
$order->update_meta_data('_TESTKEYstart', 'Hello');
if (isset($_POST['billing_country'])) {
$myValue = $_POST['billing_country'];
if (!empty($myValue)) $order->update_meta_data('_my_key', $myValue);
}
$order->update_meta_data('_TESTKEYend', 'Bye');
// Save the order data and meta data
$order->save();
}
}
Run Code Online (Sandbox Code Playgroud)
代码位于您的活动子主题(或主题)的 function.php 文件中。测试和工作。
证据:
并且(在wp_postmeta此订单 ID 的数据库表中):
在 WooCommerce 版本 3.3+ 中测试
您也可以使用旧方式(有效):
if ( ! function_exists('custom_meta_to_order') ) {
add_action('woocommerce_checkout_update_order_meta', 'custom_meta_to_order', 20, 1);
function custom_meta_to_order( $order_id ) {
update_post_meta( $order_id, '_TESTKEYstart', 'Hello' );
if ( isset( $_POST['billing_country'] ) ) {
$myValue = $_POST['billing_country'];
if (!empty($myValue))
update_post_meta( $order_id, '_my_key', $myValue);
}
update_post_meta( $order_id, '_TESTKEYend', 'Bye');
}
}
Run Code Online (Sandbox Code Playgroud)
代码位于您的活动子主题(或主题)的 function.php 文件中。测试和工作。
| 归档时间: |
|
| 查看次数: |
5644 次 |
| 最近记录: |