Woocommerce结帐中的自定义新字段不适用于连续订单

时间:2016-11-05 08:43:16

标签: wordpress woocommerce customization checkout

我在自定义结帐字段遇到困难时,该字段在第一个订单处理时有效,但不会出现在同一客户的连续订单中。

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

在客户的第一个订单中,在结账页面中会出现card_number自定义字段:客户必须添加商店获得的卡号。然后订单显示卡号(它有效),卡号也保存在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表)中没有更多保存:用几句话来说,用字段值更新订单元的代码不再起作用。由于它未保存在那里,因此不会出现在订单编辑页面以及订单电子邮件中。

我认为我在“update order meta”部分中编写的代码仅使用通过$ _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 个答案:

答案 0 :(得分:0)

我刚刚找到解决问题的方法。如果这对其他人有帮助,我在此解释我的所作所为。

实际上我的字段w55_card_number是一个简单的<p>标记,因此无法对其进行推断。我创建了一个<input>字段,一切正常

我替换了以下行

//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>';