Ich habe an einem Projekt gearbeitet, in dem ich eine Methode aufrufen muss (die Benutzer akzeptiert) ID als Eingabe) durch Klicken auf eine Senden-Schaltfläche (Akzeptieren-Schaltfläche).
Ich habe alle Möglichkeiten ausprobiert, aber die eigentliche Herausforderung besteht darin, die Benutzer-ID im Front-End und zu erhalten Übergeben Sie es an die Methode.
Meine Methode aktualisiert das Benutzer-Meta dieses bestimmten Benutzers.
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> 
Derzeit zeigt meine Schaltfläche Akzeptieren beim Klicken nur keine an. Ich möchte die Methode zusammen mit display aufrufen: none;
Mein 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 ); } 
Der generierte Formularcode:
<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> 
Ich verstehe nicht, warum das Nonce-Feld kommentiert wird. Dies ist genau das, was der Code generiert wurde. Ich habe nichts im Code bearbeitet.
Kommentare
- Versuchen Sie, die Metadaten zu aktualisieren, ohne sie neu zu laden die aktuelle Seite? Wie wäre es, wenn Sie das Formular einfach an dieselbe Seite senden und die Metadaten beim Laden der Seite aktualisieren?
 - Ja, ich versuche, Metadaten zu aktualisieren. Können Sie mir eine Lösung für das geben, wovon Sie sprechen? Es wäre großartig.
 
Antwort
Sie könnten AJAX verwenden, wenn Sie den aktuellen nicht neu laden möchten Seite — Wenn Sie auf die Schaltfläche „Akzeptieren“ klicken, stellen Sie eine AJAX-Anforderung zum Aktualisieren der Benutzermetadaten, ohne die aktuelle Seite zu verlassen.
 Die Lösung ist jedoch verfügbar Ich schlage vor,  nicht  AJAX zu verwenden; Stattdessen senden wir einfach das Formular (setzen Sie den Attributwert action) an die Homepage und verwenden dann den Hook template_redirect, um die Metadaten zu aktualisieren (und leiten Sie zurück zur vorherigen oder verweisenden Seite). 
Die Schritte
- 
Ändern Sie das Tag
formin :<form method="post" action="<?php echo esc_url( home_url() ); ?>">und fügen Sie dieses nonce -Feld hinzu:
<?php wp_nonce_field( "accept-gdpr", "accept_gdpr_nonce" ); ?>Ihre
formsieht jetzt so aus:<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> - 
Fügen Sie dies der
functions.php-Datei hinzu: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" );Hinweise:
- 
Die
Gdprwie in"Gdpr" !== $_POST["accept"]ist dasselbe wie in<input name="accept" type="checkbox" value="Gdpr" required />oben. - 
Stellen Sie sicher, dass Sie es ersetzen die
META_KEYmit dem tatsächlichen Metaschlüssel. 
 - 
 - 
Ich glaube, dass die GDPR-Akzeptanz auf das Protokoll abzielt Nur ged-in-Benutzer, daher habe ich im obigen Code / in der obigen Funktion
is_user_logged_in()undget_current_user_id()verwendet. 
UPDATE
 wp_safe_redirect() funktionierte nicht für das OP, daher verwendete er wp_redirect(). 
Antwort
 Sie müssen  wp_localize_script ()  auch verfügbar  hier . 
 Kurzgeschichte: Es ist die WordPress-Methode, um PHP in JS 
 Sie können also Folgendes tun. 
  FIRST  Erstellen Sie einen js -Ordner im Stammverzeichnis Ihres Themas, auf derselben Ebene wie style.css, falls Sie keinen haben Erstellen Sie dann in diesem js -Ordner eine Datei call-php.js. Sie können es benennen, was immer Sie wollen. Wichtig ist, dass es sich um eine .js -Datei 
 in Ihrer  handelt functions.php   nach  Ihrer 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" ); 
  ZWEITER , Fügen Sie in der Datei call-php.js Folgendes hinzu: 
( function( $ ) { $( "#accept-button" ).click( function( e ) { e.preventDefault(); $( "#modal" ).hide(); object_name.my_php_function; }); } )( jQuery ); 
 Ich hoffe, dies wird Ihr Problem lösen. 
 Ich habe es nicht getan. “ t teste es, aber es sollte funktionieren. 
 Lass es mich wissen, nachdem du es getestet hast. 
Kommentare
-  Danke für die Antwort. Ich weiß es zu schätzen Aber irgendwie funktioniert das nicht. Mein 
function updateHasReadFlag($user)wird nicht aufgerufen. Oder es wird vielleicht aufgerufen, aber dieupdate_user_meta( $user_id, 'META_KEY', true );ist es irgendwie nicht Ich habe auch<script></script>aus meinem HTML-Code entfernt. -  Ich habe Sie gefragt nur um zu bestätigen m, My 
function updateHasReadFlag($user)akzeptiert Benutzer-ID oder Benutzerobjekt als Parameter, damit diese bestimmten Benutzer-Metadaten aktualisiert werden können. Senden wir dies als Parameter, wenn wir diefunction updateHasReadFlag($user) -  aufrufen. Könnten Sie bitte 
object_name.my_php_function;durchconsole.log(object_name.my_php_function);und sag mir, was du in der Konsole siehst.Nur um zu wissen, wird die#modalausgeblendet, wenn Sie mit meiner Antwort auf#accept-buttonklicken? - Sie wird protokolliert als " null " in der Konsole für call-php.js
 -  ist die 
#modalwird ausgeblendet, wenn Sie mit meiner Antwort auf#accept-buttonklicken?