Repetidor ACF basado en la cantidad de productos que genera campos de pago en Woocommerce

7 minutos de lectura

avatar de usuario
Rinsad Ahmed

Estoy usando el complemento woocommerce-advanced-checkout-fields y agregué un campo repetidor a la sección de facturación de la siguiente manera

ingrese la descripción de la imagen aquí

Como puede ver en la imagen de arriba, el campo repetidor “Nombre/Correo electrónico” es aplicable al producto “Cinturón”.

Ahora, cuando voy a comprar el producto en la tienda y hago la cantidad 3 de la siguiente manera, el campo repetidor se muestra 3 veces y todo va bien.

ingrese la descripción de la imagen aquí

Ahora, cuando hago el pedido, la página de destino no muestra los valores que ingresé de la siguiente manera

ingrese la descripción de la imagen aquí

Además, los valores no se muestran en la sección de administración de pedidos de la siguiente manera.

ingrese la descripción de la imagen aquí

Creo que he elaborado claramente el problema. Necesito sus sugerencias para resolver este problema

  • Espero que sea un complemento premium y ¿por qué no puede ponerse en contacto con el soporte con respecto a este problema?

    – Subcontratar WordPress

    12 oct 2018 a las 18:48


  • Puedo ver este código en el complemento donde se almacenan estos campos repetidores personalizados WC()->cliente->set_meta_data WC()->cliente->set_meta_data( array( array( ‘id’ => $key, ‘key’ = > $clave, ‘valor’ => $valor ) ) ); Pero esos valores no se encuentran en la tabla post_meta

    – Rinsad Ahmed

    13 oct 2018 a las 17:52

  • WC()->cliente->set_meta_data almacenar valores en Usuario metadatos pero NO en correo metadatos… Así que esto no parece estar relacionado con su problema.

    – LoicTheAztec

    13 oct 2018 a las 18:51


  • Esto podría hacerse sin su complemento con solo un código personalizado… Pero, ¿qué pasa cuando hay varios artículos en el carrito (por ejemplo, artículo 1 (cantidad 2) + artículo 2 (cantidad 3)?

    – LoicTheAztec

    13 oct 2018 a las 19:05

  • ¿Podría verificar el HTML de detalles del producto desde el depurador de su navegador? ¿Para verificar si hay alguna entrada con un nombre correspondiente aquí? Tal vez esté escondido por algo. ¿Has editado la plantilla de woocommerce? ¿Es una plantilla comprada?

    – Mtxz

    13 oct 2018 a las 21:26

avatar de usuario
LoicTheAztec

Como no respondiste a ningún comentario desde que comenzaste la recompensa. Nadie puede manejar para resolver su problema sin saber cuáles son las configuraciones que está utilizando y cuáles son los metadatos de la publicación relacionados con la base de datos (las metaclaves registradas) para estos campos adicionales para un Pedido…

Para obtener un repetidor para campos de facturación de pago personalizados específicos en función de la cantidad de artículos de productos específicos sin ningún complemento:

1) Una configuración adicional del Producto (una casilla de verificación para activar esta característica):

// 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 );
}

ingrese la descripción de la imagen aquí

2) Agregue / guarde los campos adicionales repetidos al finalizar la compra (y marca el pedido):

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
        }
    }
}

ingrese la descripción de la imagen aquí

3) Muestre los datos adicionales relacionados con los campos de facturación en todas partes (pedidos de administrador, vistas de pedidos, correos electrónicos):

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

ingrese la descripción de la imagen aquí

4) Haz que los campos de facturación adicionales sean editables (Administración):

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;
}

ingrese la descripción de la imagen aquí

El código va en el archivo function.php de su tema secundario activo (o tema activo). Probado y funciona.

  • LoicTheAztec, eres un genio! Muchas gracias por esto. Solo tengo una pregunta de novato: ¿qué puedo cambiar para que el repetidor muestre una cantidad de campos menos 1? Porque los detalles de una persona ya están en los detalles de facturación, así que solo necesito los detalles de las otras personas, cuyo número = total_cart_items – 1.

    – Alex

    24 de octubre de 2018 a las 15:19

  • Hice un pequeño cambio: for( $i = 1, $j = 2; -> para tener solo el Nombre 2 y el Nombre 3. ¿Es correcto lo que hice?

    – Alex

    24 oct 2018 a las 15:23


  • @Alex Tu cambio es correcto… He realizado algunos cambios más probando si la cantidad de artículos relacionados es más de 1 para habilitar esto. Así que se actualizan los pasos 2, 3 y 4. También hubo un descuido en save_additional_billing_checkout_fields() función…

    – LoicTheAztec

    24/10/2018 a las 16:54

  • @FrankBailey Sí, lo sé, me odio a mí mismo:]

    – LoicTheAztec

    9 dic 2020 a las 15:50

¿Ha sido útil esta solución?