Ringe til en metode fra functions.php ved å klikke på en knapp

Jeg har jobbet med et prosjekt der jeg må ringe en metode (som godtar bruker id som en inngang) fra et klikk på en send-knapp (Godta-knappen).

Jeg har prøvd alle måter, men den virkelige utfordringen jeg står overfor er hvordan jeg får bruker-IDen i frontenden og gi den til metoden.

Metoden min oppdaterer brukerens meta for den aktuelle brukeren.

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> 

For øyeblikket viser ikke min Godta-knapp når du klikker på den. Jeg vil ringe metoden sammen med skjerm: ingen;

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

Formkoden som genereres:

<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 ikke-felt er kommentert. Dette er nøyaktig hva koden ble generert, jeg har ikke redigert noe i koden.

Kommentarer

  • Prøver du å oppdatere metadataene uten å laste inn på nytt den nåværende siden? Hva med å bare sende inn skjemaet til den samme siden og oppdatere metadataene for sideinnlasting?
  • Ja, jeg prøver å oppdatere metadata. Kan du gi meg en løsning på det du snakker om. Det ville være flott.

Svar

Du kan bruke AJAX hvis du ikke vil laste inn gjeldende side — dvs. når du klikker på «Godta» -knappen, gjør du en AJAX-forespørsel om å oppdatere brukerens metadata, alt uten å forlate den nåværende siden.

Løsningen Jeg foreslår at ikke bruker AJAX; i stedet sender vi bare skjemaet (angi action attributtverdi) til hjemmesiden, og deretter bruker vi template_redirect kroken for å oppdatere metadataene (og viderekoble tilbake til forrige eller henvisende side).

Trinnene

  1. Endre form -koden til :

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

    og legg til dette nonce -feltet:

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

    form ser nå 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. Legg 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" ); 

    Merknader:

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

    2. Sørg for å erstatte META_KEY med selve metanøkkelen.

    3. Jeg mener at GDPR-aksept er rettet mot logg bare innlagte brukere, slik at «det er grunnen til at jeg brukte is_user_logged_in() og get_current_user_id() i ovennevnte kode / funksjon.

OPPDATERING

wp_safe_redirect() fungerte ikke for OP, så han brukte wp_redirect().

Svar

Du må bruke wp_localize_script () er også tilgjengelig her .
Novelle: det er WordPress-måten å kalle PHP i JS
Så du kan gjøre noe sånt som følgende.
FIRST opprett en js -mappe i roten til temaet ditt, samme nivå som style.css, hvis du ikke har en ennå, i denne js -mappen oppretter du en fil call-php.js. Du kan navngi det hva du vil, det viktige er at det må være en .js -fil
I functions.php etter din 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" ); 

SECOND , i filen call-php.js:

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

Håper dette løser problemet ditt.
Det gjorde jeg ikke » t test det, men det skal fungere.
Gi meg beskjed etter å ha testet det.

Kommentarer

  • takk for svaret. Jeg setter pris på det Men på en eller annen måte fungerer ikke dette. Min function updateHasReadFlag($user) blir ikke ringt. Eller det kan være at det blir ringt, men update_user_meta( $user_id, 'META_KEY', true ); er på en eller annen måte fungerer. Kan du se nærmere på det. Jeg har også fjernet <script> </script> fra html-koden min.
  • Ber deg bare for å bekrefte m, Mitt function updateHasReadFlag($user) godtar brukerID eller brukerobjekt som parameter, slik at det kan oppdatere de spesifikke brukermetadataene. Sender vi dette som en parameter når vi ringer til function updateHasReadFlag($user)
  • kan du erstatte object_name.my_php_function; med console.log(object_name.my_php_function); og fortell meg hva du ser i konsollen.Bare for å vite, blir #modal skjul når du klikker på #accept-button ved å bruke svaret mitt?
  • Det er logget som " null " i konsollen for call-php.js
  • er #modal blir skjul når du klikker på #accept-button ved hjelp av svaret mitt?

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *