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
-
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>
-
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:
-
El
Gdpr
como en"Gdpr" !== $_POST["accept"]
es el mismo que en<input name="accept" type="checkbox" value="Gdpr" required />
anterior. -
Asegúrese de reemplazar
META_KEY
con la meta clave real. -
Creo que la aceptación del RGPD tiene como objetivo el registro ged-in usuarios solamente, por eso «usé
is_user_logged_in()
yget_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 elupdate_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 afunction updateHasReadFlag($user)
- podría reemplazar
object_name.my_php_function;
porconsole.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?