php WooCommerce(HPOS)添加我的自定义字段后,没有在结账时下新订单

niwlg2el  于 2023-11-16  发布在  PHP
关注(0)|答案(2)|浏览(95)

在我的WooCommerce插件中,我使用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()作为建议here,我仍然失败

z8dt9xmd

z8dt9xmd1#

最后我找到了一个解决方案。我按照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);
        }
    }
}

字符串

kninwzqo

kninwzqo2#

主要的错误是你忘记了函数中的钩子参数$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);
        }
    }
}


代码放在你的子主题的functions.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);

备注:

  • 当使用woocommerce_checkout_create_order钩子时,函数不需要$order->save();,因为它包含在钩子之后。
  • 最好使用add_meta_data()方法而不是update_meta_data(),因为您正在添加元数据 (而不是更新它)

相关问题