Een methode aanroepen vanuit functions.php met een klik op een knop

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

  1. 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> 
  2. 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:

    1. De Gdpr zoals in "Gdpr" !== $_POST["accept"] is hetzelfde als in de <input name="accept" type="checkbox" value="Gdpr" required /> hierboven.

    2. Zorg ervoor dat u de META_KEY met de daadwerkelijke meta key.

    3. Ik geloof dat de AVG-acceptatie gericht is op log alleen ged-in-gebruikers, dus daarom heb ik is_user_logged_in() en get_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 de update_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 van function updateHasReadFlag($user)
  • kunt u object_name.my_php_function; vervangen door console.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?

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *