Aufrufen einer Methode aus functions.php auf Knopfdruck

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

  1. Ändern Sie das Tag form in :

    <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 form sieht 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> 
  2. 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:

    1. Die Gdpr wie in "Gdpr" !== $_POST["accept"] ist dasselbe wie in <input name="accept" type="checkbox" value="Gdpr" required /> oben.

    2. Stellen Sie sicher, dass Sie es ersetzen die META_KEY mit dem tatsächlichen Metaschlüssel.

    3. 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() und get_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 die update_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 die function updateHasReadFlag($user)
  • aufrufen. Könnten Sie bitte object_name.my_php_function; durch console.log(object_name.my_php_function); und sag mir, was du in der Konsole siehst.Nur um zu wissen, wird die #modal ausgeblendet, wenn Sie mit meiner Antwort auf #accept-button klicken?
  • Sie wird protokolliert als " null " in der Konsole für call-php.js
  • ist die #modal wird ausgeblendet, wenn Sie mit meiner Antwort auf #accept-button klicken?

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.