Ik heb aan een project gewerkt waarbij ik een methode moet aanroepen (die gebruikers accepteert id als invoer) met een klik op een verzendknop (knop Accepteren).
Ik heb alle manieren geprobeerd, maar de echte uitdaging waar ik voor sta is hoe ik de gebruikers-ID aan de voorkant en geef het door aan de methode.
Mijn methode werkt de gebruikersmeta van die specifieke gebruiker bij.
Html-code:
<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>
Momenteel geeft mijn knop Accepteren alleen niets weer wanneer erop wordt geklikt. Ik wil de methode samen met display aanroepen: none;
Mijn PHP-code:
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 ); }
De gegenereerde formuliercode:
<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>
Ik begrijp niet waarom het nonce-veld wordt becommentarieerd. Dit is precies wat de code heeft gegenereerd, ik heb niets in de code bewerkt.
Reacties
- Probeer je de metadata bij te werken zonder opnieuw te laden de huidige pagina? Hoe zit het met het simpelweg verzenden van het formulier naar dezelfde pagina en het bijwerken van de metadata bij het laden van de pagina?
- Ja, ik probeer metadata bij te werken. Kunt u mij een oplossing geven van waar u het over hebt? Het zou geweldig zijn.
Answer
Je kunt AJAX gebruiken als je de huidige niet opnieuw wilt laden pagina — dwz nadat u op de knop “Accepteren” hebt geklikt, dient u een AJAX-verzoek in om de metadata van de gebruiker bij te werken, allemaal zonder de huidige pagina te verlaten.
De oplossing Ik stel voor om niet AJAX te gebruiken; in plaats daarvan sturen we het formulier (stel de action
attribuutwaarde in) naar de startpagina en gebruiken we de template_redirect
hook om de metadata bij te werken (en terugverwijzen naar de vorige of verwijzende pagina).
The Steps
-
Verander de
form
tag in :<form method="post" action="<?php echo esc_url( home_url() ); ?>">
en voeg dit nonce veld toe:
<?php wp_nonce_field( "accept-gdpr", "accept_gdpr_nonce" ); ?>
dus uw
form
ziet er nu als volgt uit:<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>
-
Voeg dit toe aan het thema
functions.php
bestand: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" );
Opmerkingen:
-
De
Gdpr
zoals in"Gdpr" !== $_POST["accept"]
is hetzelfde als in de<input name="accept" type="checkbox" value="Gdpr" required />
hierboven. -
Zorg ervoor dat u de
META_KEY
met de daadwerkelijke meta key. -
Ik geloof dat de AVG-acceptatie gericht is op log alleen ged-in-gebruikers, dus daarom heb ik
is_user_logged_in()
enget_current_user_id()
gebruikt in de bovenstaande code / functie.
-
UPDATE
wp_safe_redirect()
werkte niet voor het OP, dus gebruikte hij wp_redirect()
.
Antwoord
U moet wp_localize_script () ook hier beschikbaar.
Kort verhaal: het is de WordPress-manier om PHP
in JS
Je zou dus zoiets als het volgende kunnen doen.
FIRST maak een js
map aan in de root van je thema, hetzelfde niveau als style.css, als je er geen hebt maak dan in deze js
map een bestand call-php.js
. U kunt het een naam geven die u maar wilt, het belangrijkste is dat het een .js
-bestand moet zijn
In uw functions.php na uw 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" );
TWEEDE , voeg in het call-php.js
bestand toe:
( function( $ ) { $( "#accept-button" ).click( function( e ) { e.preventDefault(); $( "#modal" ).hide(); object_name.my_php_function; }); } )( jQuery );
Ik hoop dat dit je probleem zal oplossen.
Dat deed ik niet ” t test het maar het zou moeten werken.
Laat het me weten nadat ik het heb getest.
Opmerkingen
- bedankt voor het antwoord. Ik waardeer het . Maar op de een of andere manier werkt dit niet. Mijn
function updateHasReadFlag($user)
wordt niet gebeld. Of misschien wordt het wel aangeroepen, maar deupdate_user_meta( $user_id, 'META_KEY', true );
is op de een of andere manier niet werken. Kun je ernaar kijken? Ik heb ook<script>
</script>
verwijderd uit mijn html-code. - Je vragen gewoon om te bevestigen m, My
function updateHasReadFlag($user)
accepteert userID of user Object als parameter, zodat het die specifieke gebruikersmetadata kan updaten. Verzenden we dit als een parameter bij het aanroepen vanfunction updateHasReadFlag($user)
- kunt u
object_name.my_php_function;
vervangen doorconsole.log(object_name.my_php_function);
en vertel me wat je in de console ziet.Gewoon om te weten: wordt#modal
verborgen als je op#accept-button
klikt met mijn antwoord? - Het wordt gelogd als " null " in de console voor call-php.js
- is de
#modal
verbergen wanneer u op#accept-button
klikt met mijn antwoord?