gpt4 book ai didi

php - Woocommerce 中基于产品数量生成结帐字段的 ACF 转发器

转载 作者:可可西里 更新时间:2023-11-01 06:30:42 29 4
gpt4 key购买 nike

我正在使用 woocommerce-advanced-checkout-fields 插件并在计费部分添加了一个转发器字段,如下所示

enter image description here

如上图所示,中继器字段“姓名/电子邮件”适用于产品“腰带”

现在,当我去商店购买产品并将数量设为 3 时,转发器字段显示 3 次,一切都很好。

enter image description here

现在,当我下订单时,着陆页不包含我输入的值,如下所示

enter image description here

此外,这些值未显示在“订单管理”部分中,如下所示。

enter image description here

我相信我已经清楚地阐述了这个问题。需要您的建议来解决这个问题

最佳答案

因为您在开始赏金后没有回复任何评论。如果不知道您正在使用的设置是什么,以及与订单的此附加字段的数据库相关的后元数据(已注册的元键)是什么,没有人可以解决您的问题......

要根据特定产品的项目数量没有任何插件获取特定自定义结账账单字段的转发器:

1) 产品附加设置 (激活此功能的复选框):

// Display a custom setting option on product edit pages
add_action('woocommerce_product_options_general_product_data', 'add_product_repeater_checkbox_option');
function add_product_repeater_checkbox_option(){
echo '<div class="product_custom_field">';

// Custom Product Checkbox Field
woocommerce_wp_checkbox( array(
'id' => '_qty_repeater',
'label' => __('Qty repeater', 'woocommerce'),
'description' => __('Enable quantity repeater for additional "Name" and "Email" billing checkout fields', 'woocommerce'),
'desc_tip' => 'true'
));

echo '</div>';
}

// Save the custom setting option value from product edit pages
add_action( 'woocommerce_admin_process_product_object', 'save_product_repeater_checkbox_option', 100, 1 );
function save_product_repeater_checkbox_option( $product ) {
$qty_repeater = isset( $_POST['_qty_repeater'] ) ? 'yes' : 'no';
$product->update_meta_data( '_qty_repeater', $qty_repeater );
}

enter image description here

2) 在结帐时添加/保存重复的附加字段 (并标记订单):

add_filter('woocommerce_billing_fields', 'additional_billing_checkout_fields', 50, 1 );
function additional_billing_checkout_fields( $billing_fields ) {
foreach(WC()->cart->get_cart() as $cart_item ){
// Check if the "Quanty repeater option is set for the current item
if( $cart_item['data']->get_meta('_qty_repeater') === 'yes' && is_checkout() && $cart_item['quantity'] > 1 ) {

// Quantity repeater
for( $i = 1, $j = 2; $i < $cart_item['quantity']; $i++, $j++ ){

// Name fields
$billing_fields['billing_name_person'.$j] = array(
'type' => 'text',
'label' => __("Name", "woocommerce") . ' ' . $j,
'class' => array('form-row-first'),
'required' => true,
'clear' => false,
);

// Email fields
$billing_fields['billing_email_person'.$j] = array(
'type' => 'email',
'label' => __("Email", "woocommerce") . ' ' . $j,
'class' => array('form-row-last'),
'required' => true,
'clear' => true,
);
}
break; // Only for one item
}
}
return $billing_fields;
}

// Mark Order as having this additional fields data values
add_action('woocommerce_checkout_create_order', 'save_additional_billing_checkout_fields', 20, 2);
function save_additional_billing_checkout_fields( $order, $data ) {
foreach( $order->get_items() as $item ){
$product = $item->get_product();
// Mark the order as containing additional fields
if( $product->get_meta('_qty_repeater') === 'yes' && $item->get_quantity() > 1 ) {
$item->update_meta_data( '_qty_repeater', '1' );
break; // Stop the loop
}
}
}

enter image description here

3) 在任何地方显示额外的账单字段相关数据 (管理订单、订单 View 、电子邮件):

// Display additional billing fields values
add_action('woocommerce_order_details_after_order_table', 'display_additional_billing_fields_values' ); // Order received and view
add_action( 'woocommerce_email_after_order_table', 'display_additional_billing_fields_values' ); // Email notifications
add_action( 'woocommerce_admin_order_data_after_billing_address', 'display_additional_billing_fields_values' ); // Admin edit Order
function display_additional_billing_fields_values( $order ) {

if( $order->get_meta('_qty_repeater') ) {
// Only for email notifications
if( ! ( is_wc_endpoint_url() || is_checkout() || is_admin() ) ){
echo '<style>
table.customer-details {width: 100%; font-family: \'Helvetica Neue\', Helvetica, Roboto, Arial, sans-serif;
color: #737373; border: 1px solid #e4e4e4; margin-bottom:40px;}
table.customer-details td{text-align: left; border-top-width: 4px; color: #737373; border: 1px solid #e4e4e4;
padding: 12px; padding-bottom: 4px;}
</style>';
}
// Others
else {
echo '<style> table.customer-details, table.customer-details td { border: none; } </style>';
}

echo '<h2>' . __( 'Customer details', 'woocommerce' ) . '</h2>';
echo '<div><table class="customer-details" cellspacing="0">';

// Loop through order items
foreach( $order->get_items() as $item ){
$product = $item->get_product();
if( $product->get_meta('_qty_repeater') === 'yes' ) {
// Loop through item quantity
for( $i = 1, $j = 2; $i < $item->get_quantity(); $i++, $j++ ){
// Name
echo '<tr><td><strong>' . __("Name", "woocommerce") . ' ' . $j;
echo ': </strong>' . $order->get_meta('_billing_name_person'.$j) . '</td>';
// Email
echo '<td><strong>' . __("Email", "woocommerce") . ' ' . $j;
echo ': </strong>' . $order->get_meta('_billing_email_person'.$j) . '</td></tr>';
}
break;
}
}
echo '</table></div>';
}
}

enter image description here

4) 使额外的账单字段可编辑 (管理员):

add_filter( 'woocommerce_admin_billing_fields' , 'additional_admin_editable_billing_fields' );
function additional_admin_editable_billing_fields( $fields ) {
global $pagenow, $post;

if( $pagenow != 'post.php' ) return $fields;

$order = wc_get_order($post->ID);

if( $order->get_meta('_qty_repeater') ) {
// Loop through order items
foreach( $order->get_items() as $item ){
$product = $item->get_product();
if( $product->get_meta('_qty_repeater') === 'yes' ) {
// Loop through item quantity
for( $i = 1, $j = 2; $i < $item->get_quantity(); $i++, $j++ ){
$fields['name_person'.$j] = array(
'label' => __("Name", "woocommerce") . ' ' . $j,
'show' => false,
'wrapper_class' => 'first',
);
$fields['email_person'.$j] = array(
'label' => __("Email", "woocommerce") . ' ' . $j,
'show' => false,
'wrapper_class' => 'last',
);
}
break;
}
}
}
return $fields;
}

enter image description here

代码进入事件子主题(或事件主题)的 function.php 文件。经过测试并有效。

关于php - Woocommerce 中基于产品数量生成结帐字段的 ACF 转发器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52731705/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com