Rin*_*med 9 php mysql wordpress custom-fields woocommerce
我正在使用woocommerce-advanced-checkout-fields插件,并在计费部分添加了一个转发器字段,如下所示
如您在上图中所示,转发器字段"名称/电子邮件"适用于产品"腰带"
现在,当我从商店购买产品并按如下数量制作3时,转发器字段显示3次,并且一切都很好.
现在当我下订单时,登陆页面没有输入我输入的值,如下所示
此外,这些值未显示在"订单管理"部分中,如下所示.
我相信我已经清楚地阐述了这个问题.需要您的建议来解决此问题
因为自从你开始赏金以来你没有回答任何评论。如果不知道您使用的设置是什么,以及订单的此附加字段与数据库相关的后元数据(已注册的元键)是什么,没有人可以解决您的问题……
要根据特定产品的项目数量获取特定自定义结帐帐单字段的转发器,无需任何插件:
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 );
}
Run Code Online (Sandbox Code Playgroud)
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
}
}
}
Run Code Online (Sandbox Code Playgroud)
3) 随处显示附加的计费字段相关数据 (管理订单、订单视图、电子邮件):
// 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>';
}
}
Run Code Online (Sandbox Code Playgroud)
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;
}
Run Code Online (Sandbox Code Playgroud)
代码位于活动子主题(或活动主题)的 function.php 文件中。测试和工作。
| 归档时间: |
|
| 查看次数: |
650 次 |
| 最近记录: |