Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

261
Vistas
Woocommerce: la segunda casilla de T&C no impide el pago cuando no se marca

Tengo una casilla de verificación especial que debo colocar solo si el cliente compra uno de dos productos específicos. El código a continuación busca estos product_ids y, si los encuentra, muestra el cuadro de términos y condiciones adicionales junto a la casilla de verificación de los términos y condiciones habituales. Mientras esta parte funciona, el pago aún se completa incluso si la casilla no está marcada, por lo que supongo que el problema está dentro de la función aym_not_approved_amb_terms() , pero parece que no puedo averiguar cuál es ese problema.

 add_action( 'woocommerce_after_checkout_form', 'aym_add_ambassador_terms_box' ); function aym_add_ambassador_terms_box() { // set product IDs: $product_ids = array( 17558, 17563 ); $bool = false; foreach ( WC()->cart->get_cart() as $cart_item_key => $cart_item ) { $item = $cart_item['data']; if ( in_array( $item->id, $product_ids ) ) $bool = true; } // If product IDs detected if ($bool) // add ambassador terms checkbox add_action('woocommerce_review_order_after_order_total', 'aym_add_checkout_tickbox' ); function aym_add_checkout_tickbox() { echo '<script>console.log("checkbox")</script>'; echo '<p class="form-row-wide terms">'; echo '<input type="checkbox" class="input-checkbox" name="amb-terms-check" id="amb-terms-check" />'; echo '<label for="amb-terms-check" class="checkbox">I accept Ambassador terms and Conditions</label>'; echo '</p>'; } // Show notice if customer does not tick add_action('woocommerce_checkout_process', 'aym_not_approved_amb_terms'); function aym_not_approved_amb_terms() { if ( ! $_POST['amb-terms-check'] ) wc_add_notice( __( 'Please agree to the Ambassador Terms and Conditions' ), 'error' ); } }

Comportamiento esperado: si la casilla no se marca, la página se desplaza hacia arriba hasta el área del mensaje de error y muestra el mensaje "Acepte los Términos y condiciones de Ambassador". ¿Tal vez no estoy usando el gancho correcto para la función aym_not_approved_amb_terms ...?

over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

Debido a que su validación está dentro de un condicional que solo se carga una vez que se carga el formulario, su devolución de llamada de validación no existe cuando el formulario se está validando.

Entonces, lo que vamos a hacer es desenvolver las llamadas add_action() desde dentro de la verificación condicional y colocar la verificación condicional dentro de las devoluciones de llamada. Ahora, esto significa que tenemos que revisar el carrito dos veces, y creo que debe haber una forma más eficiente de hacerlo, pero pensé en agregar una bandera en el carrito cuando se agrega el artículo, sin embargo, el carrito clasifica magia __get() El método ahora evitará que $cart->my_flag devuelva valores útiles. Entonces, revisaremos el carrito dos veces por ahora.

Dado que revisaremos el carrito dos veces, extrapolé su condicional a una función que podemos reutilizar.

 function aym_is_item_in_cart() { $matching_product_ids = array( 17558, 17563 ); $bool = false; foreach ( WC()->cart->get_cart() as $cart_item_key => $cart_item ) { if ( in_array( $cart_item['product_id'], $matching_product_ids ) ) { $bool = true; } } return $bool; }

Luego agregamos la casilla de verificación. En WooCommerce 3.0, encontré un problema en el que el campo se repetía al agregarlo al gancho woocommerce_review_order_after_order_total , así que lo agregué a woocommerce_checkout_after_customer_details . observe cómo siempre agrego la devolución de llamada a este enlace, pero la casilla de verificación está dentro de un condicional. También tenga en cuenta que estoy usando la función de ayuda incorporada woocommerce_form_field() para crear el campo de formulario en lugar de agregarlo a través de javascript.

 // add ambassador terms checkbox add_action( 'woocommerce_checkout_order_review', 'aym_maybe_add_ambassador_terms_box', 5 ); function aym_maybe_add_ambassador_terms_box() { // If product IDs detected if ( aym_is_item_in_cart() ) { $checkout = WC()->checkout(); $field = array( 'type' => 'checkbox', 'label' => __( 'I accept Ambassador terms and Conditions', 'your-plugin' ), 'required' => true, 'class' => array( 'form-row-wide', 'terms'), 'validate' => array( 'terms' ), ); woocommerce_form_field( 'amb-terms-check', $field, $checkout->get_value( 'amb-terms-check' ) ); } }

Por último, alguna validación. Necesitamos verificar si necesitamos la casilla de verificación y luego verificar si está marcada; de lo contrario, esto bloqueará los pagos que no tienen los productos desencadenantes en el pago.

 add_action( 'woocommerce_before_checkout_process', 'aym_not_approved_amb_terms' ); function aym_not_approved_amb_terms() { if ( aym_is_item_in_cart() && ! isset( $_POST['amb-terms-check'] ) ) { wc_add_notice( __( 'Please agree to the Ambassador Terms and Conditions' ), 'error' ); } }
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda