Opkald til en metode fra functions.php med et klik på en knap

Jeg har arbejdet på et projekt, hvor jeg bliver nødt til at kalde en metode (der accepterer bruger id som input) fra et klik på en send-knap (Accept-knap).

Jeg har prøvet alle måder, men den virkelige udfordring, jeg står over for, er, hvordan man får bruger-idet i frontenden og overfør det til metoden.

Min metode opdaterer brugerens meta for den pågældende bruger.

HTML-kode:

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

På nuværende tidspunkt viser min accept-knap, når der klikkes på, kun ingen. Jeg vil kalde metoden sammen med display: none;

Min PHP-kode:

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 ); } 

Den genererede formkode:

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

Jeg forstår ikke, hvorfor nonce-feltet er kommenteret. Dette er præcis, hvad koden blev genereret, jeg har ikke redigeret noget i koden.

Kommentarer

  • Forsøger du at opdatere metadataene uden at genindlæse den aktuelle side? Hvad med blot at sende formularen til den samme side og opdatere metadataene ved sideindlæsning?
  • Ja, jeg prøver at opdatere metadata. Kan du give mig en løsning på, hvad du taler om. Det ville være dejligt.

Svar

Du kan bruge AJAX, hvis du ikke vil genindlæse den aktuelle side — dvs. når du klikker på knappen “Accepter”, lav en AJAX-anmodning om at opdatere brugerens metadata, alt sammen uden at forlade den aktuelle side.

Løsningen er dog Jeg foreslår ikke at bruge AJAX; i stedet sender vi simpelthen formularen (indstil dens action attributværdi) til startsiden, og brug derefter template_redirect krog til at opdatere metadataene (og omdiriger tilbage til forrige eller henvisende side).

Trinene

  1. Skift form -tagget til :

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

    og tilføj dette nonce -felt:

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

    så din form ser nu ud:

    <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øj dette til temaet 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" ); 

    Bemærkninger:

    1. Gdpr som i "Gdpr" !== $_POST["accept"] er den samme som i <input name="accept" type="checkbox" value="Gdpr" required /> ovenfor.

    2. Sørg for at udskifte META_KEY med den aktuelle metanøgle.

    3. Jeg mener, at GDPR-accept er rettet mod log kun ged-in-brugere, så “hvorfor jeg brugte is_user_logged_in() og get_current_user_id() i ovenstående kode / funktion.

UPDATE

wp_safe_redirect() fungerede ikke for OP, så han brugte wp_redirect().

Svar

Du bliver nødt til at bruge wp_localize_script () findes også her .
Novel: det er WordPress-måde at kalde PHP i JS
Så du kunne gøre noget som det følgende.
FIRST Opret en js mappe i roden af dit tema, samme niveau som style.css, hvis du ikke har en alligevel skal du i denne js -mappe oprette en fil call-php.js. Du kan navngive det, hvad du vil, det vigtige er, at det skal være en .js -fil
I din funktioner.php efter din function updateHasReadFlag($user) tilføj:

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

ANDET , i filen call-php.js:

( function( $ ) { $( "#accept-button" ).click( function( e ) { e.preventDefault(); $( "#modal" ).hide(); object_name.my_php_function; }); } )( jQuery ); 

Håber dette løser dit problem.
Det gjorde jeg ikke ” t test det, men det skulle fungere.
Giv mig besked, når du har testet det.

Kommentarer

  • tak for svaret. Jeg sætter pris på det Men på en eller anden måde fungerer dette ikke. Min function updateHasReadFlag($user) bliver ikke kaldt. Eller måske bliver det kaldt, men update_user_meta( $user_id, 'META_KEY', true ); er på en eller anden måde ikke fungerer. Kan du se på det. Jeg har også fjernet <script> </script> fra min html-kode.
  • At bede dig bare for at bekræfte m, Mit function updateHasReadFlag($user) accepterer brugerID eller brugerobjekt som en parameter, så det kan opdatere de bestemte brugermetadata. Sender vi dette som en parameter, når vi ringer til function updateHasReadFlag($user)
  • kan du udskifte object_name.my_php_function; med console.log(object_name.my_php_function); og fortæl mig, hvad du ser i konsollen.Bare for at vide, bliver #modal skjul, når du klikker på #accept-button ved hjælp af mit svar?
  • Det er logget som " null " i konsollen til call-php.js
  • er #modal bliver skjul, når du klikker på #accept-button ved hjælp af mit svar?

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *