提问人:Davide Iandoli 提问时间:11/15/2023 最后编辑:LoicTheAztecDavide Iandoli 更新时间:11/15/2023 访问量:86
WooCommerce (HPOS) 添加自定义字段后未在结帐中下新订单
WooCommerce (HPOS) not placing new order in checkout after adding my custom fields
问:
在我的 WooCommerce 插件中,我使用 hook 来处理我添加的自定义结帐字段。woocommerce_checkout_update_order_meta
首先,我添加操作:add_action('woocommerce_checkout_update_order_meta', __NAMESPACE__ . '\my_update_order_meta');
在函数下方:
`function my_update_order_meta()
{
$order = new \WC_Order();
$billing_fields = ['billing_fiscalcode', 'billing_vatcode'];
foreach ($billing_fields as $field) {
if (!empty(sanitize_text_field($_POST[$field]))) {
$order->update_meta_data($field, sanitize_text_field($_POST[$field]));
}
}
}`
当我尝试在我的商店下订单时,我收到结账错误。稍微深入研究一下我得到的代码,我没有下订单,因为它的 id 是 0。对解决方案有任何想法吗?
我尝试按照此处的建议使用 wc_create_order(),但我仍然失败了
答:
0赞
LoicTheAztec
11/15/2023
#1
主要错误是你忘记了函数中的钩子参数 $order_id
,然后你应该替换:
$order = new \WC_Order();
跟:
$order = wc_get_order( $order_id );
要使它起作用,在最后,在最后一个右括号之前,您需要添加:
$order->save():
但是,从 WooCommerce 3 开始,请改用钩子,如下所示:woocommerce_checkout_create_order
add_action('woocommerce_checkout_create_order', 'add_custom_order_metadata', 10, 2);
function add_custom_order_metadata( $order, $data ) {
foreach (['billing_fiscalcode', 'billing_vatcode'] as $field) {
if ( isset($_POST[$field]) && !empty($_POST[$field]) ) {
$order->add_meta_data($field, sanitize_text_field($_POST[$field]), true);
}
}
}
代码位于子主题的函数.php文件中(或插件中)。它应该起作用。
对于插件,您应该需要替换:
add_action('woocommerce_checkout_create_order', 'add_custom_order_metadata', 10, 2);
跟:
add_action('woocommerce_checkout_create_order', [$this, 'add_custom_order_metadata'], 10, 2);
笔记:
- 使用 hook 时,该函数不需要,因为它包含在 hook 之后。
woocommerce_checkout_create_order
$order->save();
- 使用方法比添加元数据(不更新它)更好。
add_meta_data()
update_meta_data()
评论
0赞
Davide Iandoli
11/15/2023
即使我将 $order_id 作为参数传递,我也无法下订单。在 WooCommerce 日志中,我看到这条消息(英文翻译是我的,ndr):2023-11-15T09:55:32+00:00 错误保存订单 ID(无 ID)时出错。我得到了相同的结果,以及woocommerce_checkout_update_order_meta
woocommerce_checkout_create_order
0赞
LoicTheAztec
11/15/2023
@DavideIandoli 所以代码的实现没有以正确的方式完成......在您的插件中,您应该尝试使用:在构造函数中...add_action('woocommerce_checkout_create_order', [$this, 'add_custom_order_metadata'], 10, 2);
0赞
Davide Iandoli
11/15/2023
我正在使用函数式 PHP,但我没有构造函数。我希望order_id在出现新订单时是自动增量,但在表wc_orders我在任何数据库列中都没有看到“自动增量”属性。我尝试将表中的“id”列设置为自动增量wc_orders但我遇到了同样的问题
1赞
LoicTheAztec
11/15/2023
我没有这个问题,两个代码都适用于 HPOS......无法猜测您面临的未定义(或)问题是什么......on table,在我的情况下是(设置为 PRIMARY KEY)。$order_id
$order
wc_orders
id
bigint(20) UNSIGNED NOT NULL
0赞
Davide Iandoli
11/15/2023
我的订单数据是这样的:parent_id是 0,没有 idWC_Order::__set_state(array( 'status_transition' => false, 'data' => array ( 'parent_id' => 0, 'status' => '', 'currency' => '', 'version' => '', 'prices_include_tax' => false, 'date_created' => NULL, 'date_modified' => NULL, 'discount_total' => 0, 'discount_tax' => 0, 'shipping_total' => 0, 'shipping_tax' => 0, 'cart_tax' => 0, 'total' => 0, 'total_tax' => 0, 'customer_id' => 0, [...]
0赞
Davide Iandoli
11/15/2023
#2
我终于找到了解决方案。我按照 LoicTheAztec 的建议使用(感谢您的帮助!),然后我编辑了这样的功能:woocommerce_checkout_create_order
function add_custom_order_metadata( $order, $data ) {
/** my new code starts here below **/
$args = array(
'orderby' => 'date',
'order' => 'DESC',
'return' => 'ids'
);
$order_ids = wc_get_orders($args);
$new_order_id = empty($order_ids) ? 1 : max($order_ids) + 1;
$order->set_id($new_order_id);
/** my new code ends here **/
foreach (['billing_fiscalcode', 'billing_vatcode'] as $field) {
if ( isset($_POST[$field]) && !empty($_POST[$field]) ) {
$order->add_meta_data($field, sanitize_text_field($_POST[$field]), true);
}
}
}
评论