Llamar a un método desde functions.php con un clic de un botón

He estado trabajando en un proyecto donde tendré que llamar a un método (que acepta user id como entrada) con un clic de un botón de envío (botón Aceptar).

He estado intentando todas las formas, pero el verdadero desafío al que me enfrento es cómo obtener la identificación del usuario en la interfaz y pasarlo al método.

Mi método actualiza el meta de usuario de ese usuario en particular.

Código HTML:

<div> <div class="modalconent"> <h3 align=center>GDPR</h3> <p>This is a GDPR Pop Up</p><br><br><br> <form> <input name="accept" type="checkbox" value="Gdpr" required/>I accept the GDPR <input type="submit" value="Accept"> </form> </div> </div> <script> window.onload = function () { document.getElementById("accept-button").onclick = function () { document.getElementById("modal").style.display = "none" }; }; </script> 

En la actualidad, mi botón Aceptar cuando se hace clic solo muestra ninguno. Quiero llamar al método junto con display: none;

Mi código PHP:

function updateHasReadFlag($user) { // I added support for using this function either with user ID or user object if ( $user && is_int( $user ) ) { $user_id = $user; } else if ( ! empty( $user->ID ) ) { $user_id = $user->ID; } else { return; } return update_user_meta( $user_id, "META_KEY", true ); } 

El código de formulario generado:

<form method="post" action="<?php echo esc_url( home_url() ); ?>"> <input name="accept" type="checkbox" value="Gdpr" required=""> I accept the GDPR <input type="submit" value="Accept"> <!--?php wp_nonce_field( "accept-gdpr", "accept_gdpr_nonce" ); ?--> </form> 

No entiendo por qué se comenta el campo nonce. Esto es exactamente lo que se generó el código, no he editado nada en el código.

Comentarios

  • ¿Está intentando actualizar los metadatos sin volver a cargar la página actual? ¿Qué tal simplemente enviar el formulario a la misma página y actualizar los metadatos al cargar la página?
  • Sí, estoy intentando actualizar los metadatos. ¿Puede proporcionarme alguna solución de lo que está hablando? Sería genial.

Respuesta

Podrías usar AJAX si no quieres volver a cargar el actual page — es decir, al hacer clic en el botón «Aceptar», realice una solicitud AJAX para actualizar los metadatos del usuario, todo sin salir de la página actual.

Sin embargo, la solución Lo que propongo es no usar AJAX; en su lugar, simplemente enviamos el formulario (establecemos su action valor de atributo) a la página de inicio y luego usamos el template_redirect para actualizar los metadatos (y redirigir a la página anterior o de referencia).

Los pasos

  1. Cambie la etiqueta form a :

    <form method="post" action="<?php echo esc_url( home_url() ); ?>"> 

    y agregue este campo nonce :

    <?php wp_nonce_field( "accept-gdpr", "accept_gdpr_nonce" ); ?> 

    por lo que su form ahora se ve así:

    <form method="post" action="<?php echo esc_url( home_url() ); ?>"> <input name="accept" type="checkbox" value="Gdpr" required /> I accept the GDPR <input type="submit" value="Accept" /> <?php wp_nonce_field( "accept-gdpr", "accept_gdpr_nonce" ); ?> </form> 
  2. Agregue esto al archivo functions.php del tema:

    function accept_gdpr() { // Check if the user is authenticated. if ( ! is_user_logged_in() ) { return; } // Check if we have all necessary data. if ( empty( $_POST["accept_gdpr_nonce"] ) || empty( $_POST["accept"] ) || "Gdpr" !== $_POST["accept"] ) { return; } // Verify the nonce. if ( ! wp_verify_nonce( $_POST["accept_gdpr_nonce"], "accept-gdpr" ) ) { return; } // Update the meta. update_user_meta( get_current_user_id(), "META_KEY", "1" ); // Redirect back to the previous page. wp_safe_redirect( wp_get_referer() ); exit; } add_action( "template_redirect", "accept_gdpr" ); 

    Notas:

    1. El Gdpr como en "Gdpr" !== $_POST["accept"] es el mismo que en <input name="accept" type="checkbox" value="Gdpr" required /> anterior.

    2. Asegúrese de reemplazar META_KEY con la meta clave real.

    3. Creo que la aceptación del RGPD tiene como objetivo el registro ged-in usuarios solamente, por eso «usé is_user_logged_in() y get_current_user_id() en el código / función anterior.

ACTUALIZAR

wp_safe_redirect() no funcionó para el OP, así que usó wp_redirect().

Respuesta

Deberá utilizar wp_localize_script () también disponible aquí .
Breve historia: es la forma de WordPress de llamar a PHP en JS
Así que podrías hacer algo como lo siguiente.
PRIMERO crea una carpeta js en la raíz de tu tema, al mismo nivel que style.css, si no tienes una Sin embargo, en esta carpeta js cree un archivo call-php.js. Puedes nombrarlo como quieras, lo importante es que tiene que ser un .js archivo
en tu functions.php después de su function updateHasReadFlag($user) agregar:

/** * Hooking in JS code. */ function call_php_in_js() { wp_enqueue_script( "call-php-in-js", get_template_directory_uri() . "/js/call-php.js", array( "jquery" ), filemtime( get_theme_file_path( "/js/call-php.js" ) ), true ); $php_to_js = array( "my_php_function" => updateHasReadFlag( $user ), ); wp_localize_script( "call-php-in-js", "object_name", $php_to_js ); } add_action( "wp_enqueue_scripts", "call_php_in_js" ); 

SEGUNDO , en el archivo call-php.js agregue:

( function( $ ) { $( "#accept-button" ).click( function( e ) { e.preventDefault(); $( "#modal" ).hide(); object_name.my_php_function; }); } )( jQuery ); 

Espero que esto resuelva su problema.
No lo hice » T pruébalo pero debería funcionar.
Avísame después de probarlo.

Comentarios

  • gracias por la respuesta. Te lo agradezco . Pero de alguna manera esto no funciona. Mi function updateHasReadFlag($user) no está siendo llamado. O puede ser que se esté llamando pero el update_user_meta( $user_id, 'META_KEY', true ); de alguna manera no funcionando. ¿Puedes investigarlo? También eliminé <script> </script> de mi código html.
  • Preguntando solo para confirmar m, My function updateHasReadFlag($user) acepta la ID de usuario o el Objeto de usuario como parámetro, por lo que puede actualizar esos metadatos de usuario en particular. ¿Estamos enviando esto como un parámetro cuando llamamos a function updateHasReadFlag($user)
  • podría reemplazar object_name.my_php_function; por console.log(object_name.my_php_function); y dime qué ves en la consola.Solo para saber, ¿#modal se oculta cuando hace clic en #accept-button con mi respuesta?
  • Está registrado como " null " en la consola para call-php.js
  • es el #modal ¿te escondes cuando haces clic en #accept-button usando mi respuesta?

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *