Jeg har jobbet med et prosjekt der jeg må ringe en metode (som godtar bruker id som en inngang) fra et klikk på en send-knapp (Godta-knappen).
Jeg har prøvd alle måter, men den virkelige utfordringen jeg står overfor er hvordan jeg får bruker-IDen i frontenden og gi den til metoden.
Metoden min oppdaterer brukerens meta for den aktuelle brukeren.
Html-kode:
<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>
For øyeblikket viser ikke min Godta-knapp når du klikker på den. Jeg vil ringe metoden sammen med skjerm: ingen;
Min PHP-kode:
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 ); }
Formkoden som genereres:
<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>
Jeg forstår ikke hvorfor ikke-felt er kommentert. Dette er nøyaktig hva koden ble generert, jeg har ikke redigert noe i koden.
Kommentarer
- Prøver du å oppdatere metadataene uten å laste inn på nytt den nåværende siden? Hva med å bare sende inn skjemaet til den samme siden og oppdatere metadataene for sideinnlasting?
- Ja, jeg prøver å oppdatere metadata. Kan du gi meg en løsning på det du snakker om. Det ville være flott.
Svar
Du kan bruke AJAX hvis du ikke vil laste inn gjeldende side — dvs. når du klikker på «Godta» -knappen, gjør du en AJAX-forespørsel om å oppdatere brukerens metadata, alt uten å forlate den nåværende siden.
Løsningen Jeg foreslår at ikke bruker AJAX; i stedet sender vi bare skjemaet (angi action
attributtverdi) til hjemmesiden, og deretter bruker vi template_redirect
kroken for å oppdatere metadataene (og viderekoble tilbake til forrige eller henvisende side).
Trinnene
-
Endre
form
-koden til :<form method="post" action="<?php echo esc_url( home_url() ); ?>">
og legg til dette nonce -feltet:
<?php wp_nonce_field( "accept-gdpr", "accept_gdpr_nonce" ); ?>
så
form
ser nå ut:<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>
-
Legg dette til temaet
functions.php
fil: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" );
Merknader:
-
Gdpr
som i"Gdpr" !== $_POST["accept"]
er det samme som i<input name="accept" type="checkbox" value="Gdpr" required />
ovenfor. -
Sørg for å erstatte
META_KEY
med selve metanøkkelen. -
Jeg mener at GDPR-aksept er rettet mot logg bare innlagte brukere, slik at «det er grunnen til at jeg brukte
is_user_logged_in()
ogget_current_user_id()
i ovennevnte kode / funksjon.
-
OPPDATERING
wp_safe_redirect()
fungerte ikke for OP, så han brukte wp_redirect()
.
Svar
Du må bruke wp_localize_script () er også tilgjengelig her .
Novelle: det er WordPress-måten å kalle PHP
i JS
Så du kan gjøre noe sånt som følgende.
FIRST opprett en js
-mappe i roten til temaet ditt, samme nivå som style.css, hvis du ikke har en ennå, i denne js
-mappen oppretter du en fil call-php.js
. Du kan navngi det hva du vil, det viktige er at det må være en .js
-fil
I functions.php etter din 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 , i filen call-php.js
:
( function( $ ) { $( "#accept-button" ).click( function( e ) { e.preventDefault(); $( "#modal" ).hide(); object_name.my_php_function; }); } )( jQuery );
Håper dette løser problemet ditt.
Det gjorde jeg ikke » t test det, men det skal fungere.
Gi meg beskjed etter å ha testet det.
Kommentarer
- takk for svaret. Jeg setter pris på det Men på en eller annen måte fungerer ikke dette. Min
function updateHasReadFlag($user)
blir ikke ringt. Eller det kan være at det blir ringt, menupdate_user_meta( $user_id, 'META_KEY', true );
er på en eller annen måte fungerer. Kan du se nærmere på det. Jeg har også fjernet<script>
</script>
fra html-koden min. - Ber deg bare for å bekrefte m, Mitt
function updateHasReadFlag($user)
godtar brukerID eller brukerobjekt som parameter, slik at det kan oppdatere de spesifikke brukermetadataene. Sender vi dette som en parameter når vi ringer tilfunction updateHasReadFlag($user)
- kan du erstatte
object_name.my_php_function;
medconsole.log(object_name.my_php_function);
og fortell meg hva du ser i konsollen.Bare for å vite, blir#modal
skjul når du klikker på#accept-button
ved å bruke svaret mitt? - Det er logget som " null " i konsollen for call-php.js
- er
#modal
blir skjul når du klikker på#accept-button
ved hjelp av svaret mitt?