当前位置: 首页 > 知识库问答 >
问题:

WooCommerce结账中的自定义新字段对连续订单不起作用

商飞翮
2023-03-14

我在使用一个定制的结帐字段时遇到了困难,该字段在第一次订购时可用,但在同一客户的连续订单中不会出现。

简而言之,我有一个自定义字段,它是一个卡号。在客户注册时,询问客户是否想要购买购物卡。如果客户标记该选项,则会将一个带有“y”的字段添加到user_meta表中。然后店主将通过电子邮件向客户发送卡号。

客户第一次下单时,在结账页面中会出现卡号自定义字段:客户必须添加商店获得的卡号。然后,订单与卡号一起出现(有效),卡号也保存在user_meta表中。

下面是我用于签出过程的代码:

/**
 * Add the field to the checkout
 */

add_action ('woocommerce_after_order_notes', 'checkout_w55_card_number' );

function checkout_w55_card_number( $checkout ) {

    //extracts the value of the w55_card_number field
    $user_id = get_current_user_id();
    $w55_card = '';
    if ($user_id)
    {
        //extracts the value of the w55_card_number field
    $w55_card = get_user_meta($user_id, 'w55_card_number', true);
    }
    //condition is the w55_card_number field is empty or not
    if ( !empty($w55_card) ) :  echo '<div id="checkout_w55_card_number"><h2>' . __('N. tessera W55') . '</h2><div style="padding:15px; background-color: #FCFCFC; border: 1px solid #efccb9"><p>' .$w55_card . '</p></div></div>'; 
    else :

          echo '<div id="checkout_w55_card_number"><h2>' . __('N. tessera W55') . '</h2>';

          woocommerce_form_field( 'w55_card_number', array(
              'type'          => 'text',
              'class'         => array('w55-card-number-class form-row-wide'),
              'label'         => __('Inserisci n. tessera W55'),
              'placeholder'   => __('Inserisci numero'),
              ), $checkout->get_value( 'w55_card_number' ));
          echo '</div>';
    endif;
}
/**
 * Update the order meta with field value
 */
add_action( 'woocommerce_checkout_update_order_meta', 'w55_card_number_update_order_meta' );

function w55_card_number_update_order_meta( $order_id ) {
    $user_id = get_current_user_id();
    $w55_card = '';
    if ($user_id)
    {
        //extracts the value of the w55_card_number field
    $w55_card = get_user_meta($user_id, 'w55_card_number', true);
    }   

    if ( !empty( $_POST['w55_card_number'] ) ) {
        update_post_meta( $order_id, 'w55_card_number', sanitize_text_field( $_POST['w55_card_number'] ) );
    }

}
/**
 * Update the user meta with W55 number if filled
 */
function w55_card_number_woocommerce_checkout_update_user_meta( $customer_id) {
    if (! empty( $_POST['w55_card_number'] ) ) {
        update_user_meta( $customer_id, 'w55_card_number', sanitize_text_field( $_POST['w55_card_number']));
    }
}
add_action( 'woocommerce_checkout_update_user_meta', 'w55_card_number_woocommerce_checkout_update_user_meta', 10, 2 );


/**
 * Display field value on the order edit page
 */
add_action( 'woocommerce_admin_order_data_after_billing_address', 'w55_card_number_checkout_field_display_admin_order_meta', 10, 1 );

function w55_card_number_checkout_field_display_admin_order_meta($order){
    echo '<p><strong>'.__('w55_card_number').':</strong> ' . get_post_meta( $order->id, 'w55_card_number', true ) . '</p>';
}

正如我之前所说的,对于第一个订单,一切都很好。然而,当同一个顾客回到网上商店购买其他东西时,就存在一个问题。在签出字段的某一点上,卡号出现了,但它不再保存在新订单中(post_meta table):简单地说,用字段值更新订单meta的代码不再起作用。因为它没有保存在那里,所以它不会出现在订单编辑页面以及订单电子邮件中。

我假设我在“updateordermeta”部分中编写的代码只接受通过$\u POST到达的值。因此,我尝试添加以下条件,该条件应该从user_id元表中获取值,但仍然不起作用。

/**
 * Update the order meta with field value
 */
add_action( 'woocommerce_checkout_update_order_meta', 'w55_card_number_update_order_meta' );

function w55_card_number_update_order_meta( $order_id ) {
    $user_id = get_current_user_id();
    $w55_card = '';
    if ($user_id)
    {
        //extracts the value of the w55_card_number field
    $w55_card = get_user_meta($user_id, 'w55_card_number', true);
    }   

    if ( !empty( $_POST['w55_card_number'] ) ) {
        update_post_meta( $order_id, 'w55_card_number', sanitize_text_field( $_POST['w55_card_number'] ) );
    }
    elseif ( !empty ($card_number) )
    {
        update_post_meta( $order_id, 'w55_card_number', $card_number, false );
    }
}

有什么建议吗?非常感谢你!!

共有1个答案

高朝明
2023-03-14

我刚刚找到了解决问题的办法。如果这可能对其他人有所帮助,我在此解释我所做的。

实际上我的w55_card_number是一个简单的

我用下面这行代替

//condition is the w55_card_number field is empty or not
    if ( !empty($w55_card) ) :  echo '<div id="checkout_w55_card_number"><h2>' . __('N. tessera W55') . '</h2><div style="padding:15px; background-color: #FCFCFC; border: 1px solid #efccb9"><p>' .$w55_card . '</p></div></div>';

用这条线

//condition is the w55_card_number field is empty or not
    if ( !empty($w55_card) ) :  

    echo '<div id="checkout_w55_card_number"><h2>' . __('N. tessera W55') . '</h2><div style="padding:15px; background-color: #FCFCFC; border: 1px solid #efccb9"><input type="text" class= "input-w55_card_number" name="w55_card_number" id = "w55_card_number" value=" ' .$w55_card . ' " readonly/></div></div>'; 

 类似资料:
  • WooCommerce自定义结账字段的插件有Custom Checkout Fields for WooCommerce等,如果你想要更多的自由,就用代码来解决吧。本文介绍一种用代码来自定义WooCommerce结账字段的方法。 WooCommerce自定义结账字段代码 代码单独保存一个文件引入,或直接放到子主题的functions.php中,第二种方式请将 defined('WPINC') or

  • 我正在为一个自定义的woocommerce结帐表单的多选字段而挣扎。 我通过函数创建了自定义multislect字段: 请注意,woocommerce函数无法创建自定义多选字段,因此这里有一个简单的选择字段。 我决定使用jQuery以这种方式添加多个缺失的属性: 现在我有了multiselect字段,它看起来像: 问题是,顺序元值没有正确更新,它每次只显示一个值,而不是一个数组的值,如果人选择一个

  • 您好,我有一个关于woocommerce中自定义结账字段的问题。我在结帐表单中创建了一个自定义字段,一切都很顺利。该字段包含客户卡号。我还设法将字段值(第一次输入时)保存在wp usermeta中,这样它就不会只与订单一起出现,而是与客户详细信息一起保存。 现在我想做以下几点。一旦注册客户返回商店,进入结帐表单,新字段(如果不是empyt)将自动显示,而不是每次都要求客户插入他们的卡号。 我添加到

  • 我正试图在结帐时将定制费用计入订单总额。我在woocommerce中添加了一个复选框 包含一个自定义js文件,可用于处理事件 和一个php费用处理函数 由于某些原因,$_POST['state']的值没有被添加,当我给出一个硬编码值时,函数会工作,我尝试了很多选项,但无法让它工作。 我看过类似的帖子,但没有一个有答案。

  • 简言之: 我想在“daypart”上显示一个新字段。这是一个具有3个选项的下拉字段 其他信息: 我需要将daypart保存在core签出字段中,因为商店会同步到另一个不同步订单元数据的配送服务。 这是代码: