Ringa en metod från functions.php med ett klick på en knapp

Jag har jobbat med ett projekt där jag måste ringa en metod (som accepterar användare id som inmatning) från ett klick på en skicka-knapp (Acceptera-knapp).

Jag har försökt alla vägar men den verkliga utmaningen jag står inför är hur man får användar-id i fronten och skicka det till metoden.

Min metod uppdaterar användarens meta för just den användaren.

HTML-kod:

<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> 

För närvarande visar min accept-knapp när du klickar på den ingen. Jag vill kalla metoden tillsammans med display: none;

Min PHP-kod:

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 genereras:

<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> 

Jag förstår inte varför nonce-fältet kommenteras. Det är precis vad koden genererades, jag har inte redigerat något i koden.

Kommentarer

  • Försöker du uppdatera metadata utan att ladda om den aktuella sidan? Vad sägs om att helt enkelt skicka formuläret till samma sida och uppdatera metadata vid sidläsning?
  • Ja, jag försöker uppdatera metadata. Kan du ge mig en lösning på vad du pratar om. Det skulle vara jättebra.

Svar

Du kan använda AJAX om du inte vill ladda om strömmen sida — dvs när du klickar på ”Acceptera” -knappen, gör en AJAX-begäran om att uppdatera användarens metadata, allt utan att lämna den aktuella sidan.

Lösningen är dock Jag föreslår att inte använder AJAX; istället skickar vi helt enkelt formuläret (ställ in action attributvärdet) till startsidan och sedan använder vi template_redirect kroken för att uppdatera metadata (och omdirigeras tillbaka till föregående eller hänvisande sida).

Stegen

  1. Ändra taggen form :

    <form method="post" action="<?php echo esc_url( home_url() ); ?>"> 

    och lägg till det här nonce -fältet:

    <?php wp_nonce_field( "accept-gdpr", "accept_gdpr_nonce" ); ?> 

    så att din form nu ser 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> 
  2. Lägg till detta i temat 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" ); 

    Anteckningar:

    1. Gdpr som i "Gdpr" !== $_POST["accept"] är samma som i <input name="accept" type="checkbox" value="Gdpr" required /> ovan.

    2. Var noga med att byta ut META_KEY med den aktuella metaknappen.

    3. Jag tror att GDPR-godkännandet syftar till logg endast inbyggda användare, så att jag använde is_user_logged_in() och get_current_user_id() i ovanstående kod / funktion.

UPPDATERING

wp_safe_redirect() fungerade inte för OP, så han använde wp_redirect().

Svar

Du måste använda wp_localize_script () finns också här .
Novell: det är WordPress-sättet att ringa PHP i JS
Så du kan göra något liknande följande.
FIRST skapa en js -mapp i roten till ditt tema, samma nivå som style.css, om du inte har en ändå skapar du en fil call-php.js i den här js -mappen. Du kan namnge det vad du vill, det viktiga är att det måste vara en .js -fil
I din funktioner.php efter din function updateHasReadFlag($user) lägg till:

/** * 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 ); 

Hoppas att detta kommer att lösa ditt problem.
Det gjorde jag inte ” t testa det men det ska fungera.
Låt mig veta efter att ha testat det.

Kommentarer

  • tack för svaret. Jag uppskattar det Men på något sätt fungerar det inte. Mitt function updateHasReadFlag($user) blir inte uppringt. Eller kanske det blir att det kallas men update_user_meta( $user_id, 'META_KEY', true ); är på något sätt inte fungerar. Kan du titta på det. Jag har också tagit bort <script> </script> från min html-kod.
  • Frågar dig bara för att bekräfta m, Mitt function updateHasReadFlag($user) accepterar användar-ID eller användarobjekt som en parameter så att det kan uppdatera den specifika användarmetadata. Skickar vi detta som en parameter när vi ringer till function updateHasReadFlag($user)
  • kan du ersätta object_name.my_php_function; med console.log(object_name.my_php_function); och berätta vad du ser i konsolen.Bara för att veta, blir #modal gömning när du klickar på #accept-button med mitt svar?
  • Det är loggat som " null " i konsolen för call-php.js
  • är #modal blir jag gömd när du klickar på #accept-button med mitt svar?

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *