Am lucrat la un proiect în care va trebui să apelez la o metodă (care acceptă utilizator id ca intrare) dintr-un clic al unui buton de trimitere (butonul Acceptare).
Am încercat toate modalitățile, dar adevărata provocare cu care mă confrunt este cum să obțin ID-ul utilizatorului în front-end și transmiteți-o metodei.
Metoda mea actualizează meta utilizatorului respectivului utilizator.
Cod 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>
În prezent, butonul Acceptare atunci când faceți clic nu afișează niciunul. Vreau să apelez metoda împreună cu display: none;
Codul meu 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 ); }
Codul formularului generat:
<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>
Nu înțeleg de ce este comentat câmpul nonce. Exact acest lucru a fost generat de cod, nu am editat nimic în cod.
Comentarii
- Încercați să actualizați metadatele fără a reîncărca pagina curentă? Ce zici de simpla trimitere a formularului la aceeași pagină și actualizarea metadatelor la încărcarea paginii?
- Da Încerc să actualizez metadatele. Îmi puteți oferi o soluție la ceea ce vorbiți. Ar fi grozav.
Răspuns
Ați putea folosi AJAX dacă nu doriți să reîncărcați actualul pagina — adică la clic pe butonul „Acceptă”, faceți o cerere AJAX pentru actualizarea metadatelor utilizatorului, toate fără a părăsi pagina curentă.
Propun că nu folosesc AJAX; în schimb, trimitem pur și simplu formularul (setăm valoarea atributului action
) la pagina principală și apoi folosim cârligul template_redirect
pentru a actualiza metadatele (și redirecționați înapoi la pagina anterioară sau de referință).
Pașii
-
Schimbați eticheta
form
la :<form method="post" action="<?php echo esc_url( home_url() ); ?>">
și adăugați acest câmp nonce :
<?php wp_nonce_field( "accept-gdpr", "accept_gdpr_nonce" ); ?>
astfel încât
form
acum să arate ca:<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>
-
Adăugați acest lucru la tema
functions.php
fișier: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
ca în"Gdpr" !== $_POST["accept"]
este același lucru ca în<input name="accept" type="checkbox" value="Gdpr" required />
de mai sus. -
Asigurați-vă că înlocuiți
META_KEY
cu cheia meta reală. -
Cred că acceptarea GDPR are ca scop logarea numai pentru utilizatorii ged-in, așa că „de ce am folosit
is_user_logged_in()
șiget_current_user_id()
în codul / funcția de mai sus.
-
UPDATE
wp_safe_redirect()
nu a funcționat pentru OP, așa că a folosit wp_redirect()
.
Răspuns
Va trebui să utilizați wp_localize_script () disponibil de asemenea aici .
Nuvelă: este modul WordPress de a apela PHP
în JS
Deci, puteți face ceva de genul următor.
FIRST creați un folder js
la rădăcina temei dvs., același nivel cu style.css, dacă nu aveți unul totuși, atunci în acest folder js
creați un fișier call-php.js
. Îl poți numi oricând dorești, important este că trebuie să fie un fișier .js
În functions.php după function updateHasReadFlag($user)
add:
/** * 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 , în fișierul call-php.js
adăugați:
( function( $ ) { $( "#accept-button" ).click( function( e ) { e.preventDefault(); $( "#modal" ).hide(); object_name.my_php_function; }); } )( jQuery );
Sper că acest lucru vă va rezolva problema.
Nu am făcut-o ” Testați-l, dar ar trebui să funcționeze.
Anunțați-mă după testare.
Comentarii
- Vă mulțumim pentru răspuns. Apreciez . Dar cumva acest lucru nu funcționează.
function updateHasReadFlag($user)
nu este apelat. Sau poate că este apelat, darupdate_user_meta( $user_id, 'META_KEY', true );
nu este cumva funcționează. Poți să te uiți la el. De asemenea, am eliminat<script>
</script>
din codul meu html. - Vă întreb doar pentru a confirma m,
function updateHasReadFlag($user)
acceptă ID-ul utilizatorului sau Obiectul utilizatorului ca parametru, astfel încât să poată actualiza respectivele meta date ale utilizatorului. Trimitem acest lucru ca parametru atunci când apelămfunction updateHasReadFlag($user)
- puteți înlocui
object_name.my_php_function;
cuconsole.log(object_name.my_php_function);
și spune-mi ce vezi în consolă.Doar să știu,#modal
se ascunde atunci când faceți clic pe#accept-button
folosind răspunsul meu? - Este înregistrat ca " null " în consola pentru call-php.js
- este
#modal
te ascunzi când dai clic pe#accept-button
folosind răspunsul meu?