¿Cómo agregar íconos a las etiquetas de pago usando Hooks?

15 minutos de lectura

avatar de usuario de gemita
gemita

¿Cómo puedo agregar un ícono al lado de la página de pago de WooCommerce? Input etiqueta, que cuando se toca muestra un Tooltip con texto?

Cómo editar el pago inputs con hooks en WooCommerce?

Quiero agregar un ícono dentro de los detalles de facturación, en la entrada del campo de teléfono, que es billing_phoneen el pago de WooCommerce, de modo que cuando lo toquemos o pasemos el mouse sobre él, el Tooltip mostrará un texto.

no encuentro la forma de modificar cada uno inputhe visto que puedo añadir elementos antes del apartado Facturación con el Hook woocommerce_before_checkout_billing_form y después del apartado de Facturación con el siguiente Hook woocommerce_after_checkout_billing_form

EDITO LA PREGUNTA

Con la ayuda de @Mtxz logré hacer pruebas y gracias a una de sus funciones logré agregar el ícono al finalizar la compra.

add_filter( 'woocommerce_form_field', 'add_code_to_checkout_phone_field', 10, 4 );

function add_code_to_checkout_phone_field( $field, $key, $args, $value ) {
    if ( $key === 'billing_phone' ) {
        $content="<strong>
        <div class="colocandolo">
        <div class="tooltip top">
         <img src="https://i.postimg.cc/ryJxTmp6/marron-Interro.png" width="20px"/>
          <span class="tiptext">
           Esto es un texto
            </span>
          </div>
        </div>
    </strong>";
$field = preg_replace('/<\/p>/', $content . '</p>', $field);
    }

    return $field;
}

el problema es que el icono se muestra en la parte superior de la "Billing Details" formulario, debajo del título. Puedes verlo en la siguiente imagen:

ingrese la descripción de la imagen aquí

Que necesito cambiar en la funcion @Mtxz para que se muestre el icono al lado del “Teléfono” label?

He probado este ejemplo para guiarme en la creación del function para lograr lo que busco, pero no funciona ¿Puedo agregar íconos al formulario de Pago? labels desde el Hooks?

¿Por qué no funciona la función que creé? He buscado, pero no puedo encontrar el enlace correcto para agregar el icono que muestra una información sobre herramientas junto a las etiquetas de entrada. Si esto no se puede hacer usando Hooksy no hay un complemento que lo haga, tal vez se pueda hacer editando una plantilla de WooCommerce, me imagino que sí.

¿Cuál es la plantilla que se debe personalizar?

Puede ver lo que estoy buscando en cualquier página de administración de WooCommerce, por ejemplo, en wp-admin => settings => General. Todos los campos tienen un icono que es un signo de interrogación y muestra información en un Tooltip cuando tocamos el icono.

También he añadido una captura de pantalla.
https://ibb.co/5Y2k2PL

ingrese la descripción de la imagen aquí

Creé una pequeña demostración con html y css, pero no sé cómo puedo implementar esto en WooCommerce

.colocandolo{
  align-items: center;
  display: flex;
  flex-flow: column nowrap;
  height: 100vh;
  justify-content: center;
}

.tooltip {
  position: relative;
  display: inline-block;
  /* border-bottom: 1px dotted rgb(175, 76, 6); */
}
.tooltip .tiptext {
  visibility: hidden;
  width: 120px;
  background-color: rgb(93, 69, 4);
  color: #fff;
  text-align: center;
  border-radius: 3px;
  padding: 6px 0;
  position: absolute;
  z-index: 1;
  box-shadow: 0 5px 10px rgb(93, 69, 4);
}
.tooltip .tiptext::after {
  content: "";
  position: absolute;
  border-width: 5px;
  border-style: solid;
}
.tooltip:hover .tiptext {
  visibility: visible;
}

.tooltip.top .tiptext{
  margin-left: -60px;
  bottom: 150%;
  left: 50%;
}

.tooltip.top .tiptext::after{
  margin-left: -5px;
  top: 100%;
  left: 50%;
  border-color: rgb(93, 69, 4) transparent transparent transparent;
}
<div class="colocandolo"> 
    <div class="tooltip top">
     <img src="https://i.postimg.cc/ryJxTmp6/marron-Interro.png" width="20px"/>
      <span class="tiptext">
  This is the text that we should display
        </span>
      </div>
</div>

ingrese la descripción de la imagen aquí

  • “Quiero hacer esto sin usar un complemento” – todavía vas a tener que escribir algo de código. Debe ir y familiarizarse con la funcionalidad de enlace/filtro de WP. woocommerce.com/document/…

    – CBroe

    28 de febrero a las 9:20

  • Gracias por tu contribución. Intentaré hacer algo. Vine aquí porque pensé que sugeriste ideas debido a la gran cantidad de talento que pasa por este lugar.

    – gemita

    28 de febrero a las 10:08

Avatar de usuario de Alijvhr
Alijvhr

intenta usar este código en tu tema functions.php para colocar el icon:

add_filter( 'woocommerce_form_field', 'add_code_to_checkout_phone_field', 99, 4 );

function add_code_to_checkout_phone_field( $field, $key, $args, $value ) {
    if ( $key == 'billing_phone' ) {
        $content="<span class="tooltip top" style="display:inline-block">
         <img src="https://i.postimg.cc/ryJxTmp6/marron-Interro.png" width="20px"/>
          <span class="tiptext">
           Esto es un texto
            </span>
          </span>";
        $field = preg_replace('/<\/label>/ism',  "$content</label>", $field);
    }

    return $field;
}

No arreglé tu CSS si fue útil. Estaría feliz de ayudarte con CSS también.

  • ¡Estoy seguro de que estás haciendo algo mal! y tampoco se encuentra la imagen. muestra la imagen y te ayudo!

    – Alijvhr

    hace 12 horas

  • revisa la imagen de nuevo ibb.co/y0X3z95

    – gemita

    hace 12 horas

  • intenta algo… pon un exit() o var_dump() en esta función y ver si se ejecuta! ¡Creo que la función no se está ejecutando! si el código en su pregunta funciona, ¡esto también debería funcionar! ¡Lo estoy probando en un wordpress ahora mismo!

    – Alijvhr

    hace 12 horas

  • @gemita, ¡la imagen muestra que el código ni siquiera se ejecutó!

    – Alijvhr

    hace 12 horas

  • @gemita mi resultado es este! ibb.co/3Bm0LFv debe haber un lapso agregado.

    – Alijvhr

    hace 11 horas


Avatar de usuario de Mtxz
Mtxz

Veo dos formas de manejar esto:

  1. Usando Clase CSS y JS

Agregaría una clase personalizada a la entrada deseada. JS se usaría para activar la información sobre herramientas y recuperar texto de un atributo HTML personalizado. Es posible que esta solución no sea compatible con su CSS solo + información sobre herramientas de marcado HTML personalizado.

add_filter( 'woocommerce_checkout_fields', 'customize_checkout_fields' );

function customize_checkout_fields( $fields ) {
    $fields[ 'billing' ][ 'billing_phone' ][ 'class' ][]           = 'custom-class';
    $fields[ 'billing' ][ 'billing_phone' ][ 'custom_attributes' ] = [
        'data-text' => 'custom text'
    ];

    return $fields;
}
  1. Editar salida HTML de Woocommerce

La entrada de facturación de Woocommerce no se puede anular usando un archivo de plantilla. Se generan a partir de la woocommerce_form_field() método, que se llama para cada entrada en $checkout->get_checkout_fields( 'billing' ) (form-billing.php).

Mirando a la woocommerce_form_field() código, puedo ver un woocommerce_form_field gancho que nos permite editar la salida HTML de entrada final.

add_filter( 'woocommerce_form_field', 'add_code_to_checkout_phone_field', 10, 4 );

function add_code_to_checkout_phone_field( $field, $key, $args, $value ) {
    if ( $key === 'billing_phone' ) {
        $content="<strong>Additional content</strong>";
        $field = preg_replace('/<\/p>/', $content . '</p>', $field);
    }

    return $field;
}

Este código editará el billing_phone Salida HTML y agregue contenido antes del </p> (así que al final, pero EN el contenedor de “nivel superior” de entrada). Puede agregar su información sobre herramientas aquí y manejar el posicionamiento con algo como position: relative en el contenedor principal y el posicionamiento absoluto en la información sobre herramientas.

Puede volcar el valor “$field” para verificar su HTML de entrada y adaptar la parte de expresiones regulares.

Nota: primero traté de envolver todo $field HTML en una costumbre <div>. Pero terminó rompiendo mi cuadrícula de formulario (que puede ser específica de mi implementación en mi entorno de prueba). Así que usé una expresión regular para inyectar el código HTML personalizado en el contenedor de entrada.

Ver:

  • La cuestión es que los atributos personalizados solo le permiten agregar atributos HTML a la entrada. Su información sobre herramientas personalizada tiene un marcado HTML personalizado: por lo que debe agregar el HTML de información sobre herramientas personalizado al contenedor de entrada para mostrarlo encima. A partir de esto, elegiría la opción 2. Agregue el código de la opción 2 a su archivo de tema function.php. Vea si el texto “Contenido adicional” se muestra junto a la entrada billing_phone en la página de pago de Woo. Si es así: puede agregar su HTML de información sobre herramientas aquí. Si no: descargue la variable “$ contenido” dentro de la declaración “si” para verificar cómo actualizar la expresión regular.

    – Mtxz

    3 mar a las 15:00


  • Como dije, una vez que tenga la salida del contenido de información sobre herramientas EN el contenedor de entrada: puede usar CSS para colocar su información sobre herramientas. Colocar position: relative al contenedor de entrada. Entonces establece position: absolute en la información sobre herramientas . Entonces debería poder colocar su información sobre herramientas donde desee en el contenedor de entrada. También puede usar el índice z para hacer que la información sobre herramientas esté “sobre” la entrada.

    – Mtxz

    5 de marzo a las 10:56

  • Ah, lo siento: ¿la información sobre herramientas no se muestra en el contenedor de entrada? ¿Ha intentado descargar la variable $content para asegurarse de que preg_replace coincida con su contenido HTML?

    – Mtxz

    5 de marzo a las 10:58

  • Primer paso: ¿puedes var_dump la variable “$content” dentro de “if ($key === ‘billing_phone’)” por favor

    – Mtxz

    6 de marzo a las 18:02

  • ok, vemos que tu entrada está envuelta en una etiqueta . Así que edite preg_replace a esto: “preg_replace(‘//’, $content . ‘‘, $field);” y prueba por favor

    – Mtxz

    hace 2 días

Modifiqué (agregando una clase CSS a la etiqueta y reemplazando el contenido de la etiqueta con un ícono HTML y una información sobre herramientas) su función de la siguiente manera:

 add_filter( 'woocommerce_form_field', 'add_code_to_checkout_phone_field', 10, 4 );

function add_code_to_checkout_phone_field( $field, $key, $args, $value ) {
    if ( $key === 'billing_phone' ) {
        $args['label_class'] .= ' checkout-tooltip'; // add CSS class to label

        $content="<img src="https://i.postimg.cc/ryJxTmp6/marron-Interro.png" width="20px" class="tooltip-icon"/>
            <span class="tooltip-text">Esto es un texto</span>";

        // add the icon and tooltip to the label
        $field = str_replace( '<label', '<label data-tooltip="' . esc_attr__( 'Phone tooltip', 'your-text' ) . '"', $field );
        $field = str_replace( '<label', '<label class="checkout-tooltip-label"', $field );
        $field = str_replace( '</label>', $content . '</label>', $field );
        $field = str_replace( '<input', '<input aria-describedby="billing_phone_tooltip"', $field );
    }

    return $field;
}

He probado lo anterior en una tienda de woocommerce y funciona como se esperaba.
ingrese la descripción de la imagen aquí

Usó CSS ​​para ocultarlo de forma predeterminada y mostrarlo al pasar el mouse.

  • Gracias por tu apoyo @AmanHirani. He agregado su función a mi sitio, pero no funciona. El icono no se muestra y el texto se muestra directamente. Ver la captura de pantalla para ti. Como puedes ver, con tu función en el inspector, ni siquiera se muestra el icono. Estoy usando un css, quizás usas otro y por eso no se muestra el icono y se muestra el texto directamente en la entrada. Mi css es diferente al tuyo, tal vez este sea el problema. ¿Cómo puedo corregirlo? Puede ver mis estilos en el ejemplo que estoy usando y que he agregado a la pregunta. Gracias

    – gemita

    hace 2 días

  • Idealmente, tanto el icono como el texto deberían aparecer sobre el bloque de entrada del teléfono. Sospecho que podría ser un problema con el código HTML utilizado para mostrar el icono (ya que se muestra el texto). En su lugar, utilice el carácter HTML Unicode como se muestra a continuación: $content = ‘ Esto es un texto‘;

    – Aman Hirani

    hace 2 días


  • Aquí está la captura de pantalla actualizada (ibb.co/gwLkPK6) con css básico para mostrar texto al pasar el mouse.

    – Aman Hirani

    hace 2 días


  • Gracias de nuevo. He hecho todos los cambios que me has sugerido, he probado este código en una web que está limpia, sin mas funciones en el archivo function.php, he añadido el css que me muestras en la captura de pantalla, pero solo la pregunta ” ?” y el texto “esto es un texto” dentro de la entrada, sin que la pregunta tenga ninguna funcionalidad. Creo que buscaré otra alternativa. Lamento el tiempo que has dedicado a ayudarme, y te estoy muy agradecido.

    – gemita

    ayer

Avatar de usuario de Stefan
stefano

ok, puede hacer esto agregando el siguiente código en su functions.php

function add_phone_icon_tooltip( $field, $key, $args, $value ) {
    if ( $key === 'billing_phone' && is_checkout() ) {
        $icon = '<i class="fas fa-info-circle" data-toggle="tooltip" title="'. esc_attr__( 'Custom tooltip text goes here', 'textdomain' ) . '">X</i>';
        $field = str_replace( '</label>', ' ' . $icon . '</label>', $field );
    }
    return $field;
}
add_filter( 'woocommerce_form_field', 'add_phone_icon_tooltip', 10, 4 );

Este código supone que tiene un paquete de iconos de FontAwesome y mostrará el icono junto a su número de teléfono. Si pasas el cursor sobre él, aparecerá un texto personalizado. como aquí.

Debería ver un icono o una “X”. Si tiene una fuente impresionante, elimine la x y solo tendrá el ícono.

Disfrutar.

avatar de usuario de plata
plata

Simplemente puede lograr esto con puro jQuery y CSS

add_action('wp_footer', function() {
    if ( is_checkout() ) { ?>
<style>
    #billing_phone_field .woocommerce-input-wrapper {
        position: relative;
    }
    #billing_phone_field .woocommerce-input-wrapper .tooltip .icon, #billing_phone_field .woocommerce-input-wrapper .tooltip .title {
        position: absolute;
        right: 5px;
        top: 0;
    }
    #billing_phone_field .woocommerce-input-wrapper .tooltip .icon {
        width: 20px;
        height: 20px;
    }
    #billing_phone_field .woocommerce-input-wrapper .tooltip .title {
        top: 20px;
        background: #333;
        color: #fff;
        font-size: 12px;
        padding: 0 10px;
        border-radius: 5px;
        display: none;
    }
    /* #billing_phone_field .woocommerce-input-wrapper .tooltip .icon:hover + .title {
        display: block;
    } */
</style>
<script>
    (function($) {

        const title="This is the text that we should display"
        const toolTip = '<div class="tooltip"><svg class="icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><title>'+title+'</title><path d="M15.07,11.25L14.17,12.17C13.45,12.89 13,13.5 13,15H11V14.5C11,13.39 11.45,12.39 12.17,11.67L13.41,10.41C13.78,10.05 14,9.55 14,9C14,7.89 13.1,7 12,7A2,2 0 0,0 10,9H8A4,4 0 0,1 12,5A4,4 0 0,1 16,9C16,9.88 15.64,10.67 15.07,11.25M13,19H11V17H13M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12C22,6.47 17.5,2 12,2Z" /></svg><span class="title">'+title+'</span></div>'

        $('#billing_phone_field').find('.woocommerce-input-wrapper').append(toolTip) 

    })(jQuery)

</script>
<?php
    }
});

el título SVG predeterminado se mostrará al pasar el mouse, puede eliminarlo si lo desea y usar el lapso .title en cambio

  • Gracias por su interés, prefiero evitar el uso de javascript. Gracias

    – gemita

    hace 12 horas

  • Aun así, su código solo muestra el ícono, no ejecuta la información sobre herramientas

    – gemita

    hace 12 horas

  • @gemita, woocommerce no funcionará correctamente sin javascript, no tiene sentido evitarlo cuando jQuery está integrado en el núcleo de wordpress. de todos modos, puede ver que comenté el CSS del evento de desplazamiento para mostrar el lapso .title a favor de SVG title mostrando al pasar el mouse

    – plata

    Hace 6 horas


avatar de usuario de unity-student
unidad-estudiante

Si no encontró una solución con php funciones, puedes hacerlo con csssolo que en lugar de un ícono, agregamos el signo de interrogación: "?"al lado de "Phone" Label.

p.form-row:has(>label[for="billing_phone"]) {
  position:relative;
 
 }
 
 p.form-row:has(>label[for="billing_phone"]):after{
  width: 22px;
  height: 22px;
  top: 1px;
  left: 79px;
  border-radius: 50%;
  background-color: #927124;
  content: "?";
  color: #F1EAD6;
  display: block;
  position: absolute;
  display: grid;
  justify-content: center;
  align-items: center;
  font-weight: 900;
 }
 
 
 p.form-row:has(>label[for="billing_phone"]):before{
   display: block;
   content: "This is the text that we should display";
   visibility: collapse;
   width: 120px;
   background-color: rgb(93, 69, 4);
   color: #fff;
   text-align: center;
   border-radius: 3px;
   padding: 10px;
   font-size:0.9em;
   position: absolute;
   z-index: 9990;
   left: 99px;
   top: -13px;
   box-shadow: 0 5px 10px rgb(93, 69, 4);
 }
 
 p.form-row:has(label[for="billing_phone"]):hover:before{
   visibility: visible;
 }
 p.form-row:has(label[for="billing_phone"]:hover, span:hover):before{
   visibility: collapse;
 }

O puede agregar dentro del input, con tu propio ejemplo, y el icono, donde más te guste. Lo he visto de las dos formas.

Espero que sea útil

label[for="billing_phone"] + span {
  position:relative;
 }
 
 label[for="billing_phone"] + span > input.input-text {
  padding-right:34px;
 }
 
 label[for="billing_phone"] + span:before{
   width: 24px;
   height: 24px;
   top: -7px;
   right: 8px;
   
   content: "";
    display: block;
   background: url("ttps://i.postimg.cc/ryJxTmp6/marron-Interro.png") no-repeat 0 0;
   background-size: 100%;
   position:absolute;
 }
 
 
 label[for="billing_phone"] + span:after{
   display: block;
   content: " El número de teléfono lo necesitamos por si tuviéramos problemas con el pedido";
   visibility: hidden;
   width: 120px;
   background-color: rgb(93, 69, 4);
   color: #fff;
   text-align: center;
   border-radius: 3px;
   padding: 10px;
   font-size:0.9em;
   position: absolute;
   z-index: 9990;
   right:2px;
   top:8px;
   box-shadow: 0 5px 10px rgb(93, 69, 4);
 }
 
 label[for="billing_phone"] + span:hover:has(>input:not(:hover)):after{
    visibility: visible;
 }

  • Gracias por su interés, prefiero evitar el uso de javascript. Gracias

    – gemita

    hace 12 horas

  • Aun así, su código solo muestra el ícono, no ejecuta la información sobre herramientas

    – gemita

    hace 12 horas

  • @gemita, woocommerce no funcionará correctamente sin javascript, no tiene sentido evitarlo cuando jQuery está integrado en el núcleo de wordpress. de todos modos, puede ver que comenté el CSS del evento de desplazamiento para mostrar el lapso .title a favor de SVG title mostrando al pasar el mouse

    – plata

    Hace 6 horas


¿Ha sido útil esta solución?