Ho lavorato a un progetto in cui dovrò chiamare un metodo (che accetta lutente id come input) da un clic di un pulsante di invio (pulsante Accetta).
Ho provato tutti i modi, ma la vera sfida che sto affrontando è come ottenere lID utente nel front-end e passalo al metodo.
Il mio metodo aggiorna il meta utente di quel particolare utente.
Codice 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>
Al momento, il mio pulsante Accetta quando si fa clic mostra solo nessuno. Voglio chiamare il metodo insieme a display: none;
Il mio codice 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 ); }
Il codice del modulo generato:
<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>
Non capisco perché il campo nonce sia commentato. Questo è esattamente ciò che il codice è stato generato, non ho modificato nulla nel codice.
Commenti
- Stai tentando di aggiornare i metadati senza ricaricare la pagina corrente? Che ne dici di inviare semplicemente il modulo alla stessa pagina e aggiornare i metadati al caricamento della pagina?
- Sì, sto cercando di aggiornare i metadati. Puoi fornirmi qualche soluzione di ciò di cui stai parlando. Sarebbe fantastico.
Rispondi
Potresti usare AJAX se non vuoi ricaricare la corrente page — ovvero, facendo clic sul pulsante “Accetta”, effettua una richiesta AJAX per aggiornare i metadati dellutente, il tutto senza lasciare la pagina corrente.
Tuttavia, la soluzione Sto proponendo non di usare AJAX; invece, inviamo semplicemente il modulo (imposta il suo valore di attributo action
) alla home page e quindi usiamo lhook template_redirect
per aggiornare i metadati (e reindirizza alla pagina precedente o di riferimento).
I passaggi
-
Modifica il tag
form
in :<form method="post" action="<?php echo esc_url( home_url() ); ?>">
e aggiungi questo campo nonce :
<?php wp_nonce_field( "accept-gdpr", "accept_gdpr_nonce" ); ?>
quindi il tuo
form
ora avrà il seguente aspetto:<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>
-
Aggiungilo al file
functions.php
: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" );
Note:
-
Gdpr
come in"Gdpr" !== $_POST["accept"]
è uguale a<input name="accept" type="checkbox" value="Gdpr" required />
sopra. -
Assicurati di sostituire
META_KEY
con la meta chiave effettiva. -
Ritengo che laccettazione del GDPR sia finalizzata al log Solo per utenti ged-in, quindi è per questo che ho utilizzato
is_user_logged_in()
eget_current_user_id()
nel codice / funzione sopra.
-
UPDATE
wp_safe_redirect()
non ha funzionato per lOP, quindi ha usato wp_redirect()
.
Risposta
Dovrai utilizzare wp_localize_script () disponibile anche qui .
Breve storia: è il modo in cui WordPress chiama PHP
in JS
Quindi potresti fare qualcosa di simile.
FIRST crea una cartella js
nella radice del tema, allo stesso livello di style.css, se non ne hai una tuttavia, in questa cartella js
crea un file call-php.js
. Puoi nominarlo come vuoi, la cosa importante è che deve essere un .js
file
Nel tuo functions.php dopo il tuo function updateHasReadFlag($user)
aggiungi:
/** * 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" );
SECOND , nel file call-php.js
aggiungi:
( function( $ ) { $( "#accept-button" ).click( function( e ) { e.preventDefault(); $( "#modal" ).hide(); object_name.my_php_function; }); } )( jQuery );
Spero che questo risolva il tuo problema.
Non lho fatto ” t provalo ma dovrebbe funzionare.
Fammi sapere dopo averlo testato.
Commenti
- grazie per la risposta. Lo apprezzo . Ma in qualche modo non funziona. Il mio
function updateHasReadFlag($user)
non viene chiamato. O potrebbe essere stato chiamato maupdate_user_meta( $user_id, 'META_KEY', true );
in qualche modo non lo è funzionante. Puoi esaminarlo. Ho anche rimosso<script>
</script>
dal mio codice html. - Chiederti solo per confermare m, My
function updateHasReadFlag($user)
accetta userID o user Object come parametro, quindi può aggiornare quel particolare metadati utente. Stiamo inviando questo come parametro quando si chiamafunction updateHasReadFlag($user)
- potresti sostituire
object_name.my_php_function;
conconsole.log(object_name.my_php_function);
e dimmi cosa vedi nella console.Solo per sapere,#modal
si nasconde quando fai clic su#accept-button
usando la mia risposta? - Viene registrato come " null " nella console per call-php.js
- è
#modal
mi nascondi quando fai clic su#accept-button
utilizzando la mia risposta?