Поскольку вы не ответили ни на один комментарий, так как вы начали щедрость.Никто не может решить вашу проблему, не зная, какие настройки вы используете, и каковы связанные с базой данных метаданные (зарегистрированные мета-ключи) для этих дополнительных полей для Заказа ...
Чтобы получить ретранслятордля отдельных полей выставления счетов на заказ, основанных на количестве товара определенного продукта (ов) без какого-либо плагина :
1) A Дополнительная настройка продукта (aфлажок, чтобы активировать эту функцию) :
// 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 );
}
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
}
}
}
3) Показать дополнительные поля Billing, связанные данныевезде (заказы администратора, просмотры заказов, электронные письма) :
// 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>';
}
}
4)Сделать дополнительные поля оплаты доступными для редактирования (Admin) :
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;
}
Код идет в шуткуФайл ction.php вашей активной дочерней темы (или активной темы).Проверено и работает.