Woocommerce 结帐中的自定义新字段不适用于连续订单
Custom new field in Woocommerce checkout does not work for consecutive orders
我在使用自定义结帐字段时遇到了困难,该字段在第一个订单中添加时有效,但不会出现在同一客户的连续订单中。
简而言之,我有一个自定义字段,它是一个卡号。在客户注册时,系统会询问客户是否想要一张购物卡。如果客户标记该选项,则 "y" 字段将添加到 user_meta table。然后店主会通过电子邮件将卡号发送给客户。
在客户下的第一个订单中,在结帐页面中出现了一个 card_number 自定义字段:客户必须添加商店获得的卡号。然后出现带有卡号的订单(有效),卡号也保存在 user_meta table 中。
以下是我用于结帐程序的代码:
/**
* 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):简而言之,用字段值更新订单元的代码没有不再工作了。由于它没有保存在那里,因此它不会出现在订单编辑页面以及订单电子邮件中。
我想我在 "update order meta" 部分中编写的代码只接受通过 $_POST 到达的值。因此,我尝试添加以下条件,它应该从 user_id 元 table 中获取值,但它仍然不起作用。
/**
* 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 );
}
}
有什么建议吗?非常感谢!!
我刚刚找到了问题的解决方案。如果这可能对其他人有帮助,我特此解释一下我所做的。
实际上我的字段 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>';
我在使用自定义结帐字段时遇到了困难,该字段在第一个订单中添加时有效,但不会出现在同一客户的连续订单中。
简而言之,我有一个自定义字段,它是一个卡号。在客户注册时,系统会询问客户是否想要一张购物卡。如果客户标记该选项,则 "y" 字段将添加到 user_meta table。然后店主会通过电子邮件将卡号发送给客户。
在客户下的第一个订单中,在结帐页面中出现了一个 card_number 自定义字段:客户必须添加商店获得的卡号。然后出现带有卡号的订单(有效),卡号也保存在 user_meta table 中。
以下是我用于结帐程序的代码:
/**
* 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):简而言之,用字段值更新订单元的代码没有不再工作了。由于它没有保存在那里,因此它不会出现在订单编辑页面以及订单电子邮件中。
我想我在 "update order meta" 部分中编写的代码只接受通过 $_POST 到达的值。因此,我尝试添加以下条件,它应该从 user_id 元 table 中获取值,但它仍然不起作用。
/**
* 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 );
}
}
有什么建议吗?非常感谢!!
我刚刚找到了问题的解决方案。如果这可能对其他人有帮助,我特此解释一下我所做的。
实际上我的字段 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>';