Apelarea unei metode de la functions.php printr-un clic pe un buton

Am lucrat la un proiect în care va trebui să apelez la o metodă (care acceptă utilizator id ca intrare) dintr-un clic al unui buton de trimitere (butonul Acceptare).

Am încercat toate modalitățile, dar adevărata provocare cu care mă confrunt este cum să obțin ID-ul utilizatorului în front-end și transmiteți-o metodei.

Metoda mea actualizează meta utilizatorului respectivului utilizator.

Cod HTML:

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

În prezent, butonul Acceptare atunci când faceți clic nu afișează niciunul. Vreau să apelez metoda împreună cu display: none;

Codul meu PHP:

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

Codul formularului generat:

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

Nu înțeleg de ce este comentat câmpul nonce. Exact acest lucru a fost generat de cod, nu am editat nimic în cod.

Comentarii

  • Încercați să actualizați metadatele fără a reîncărca pagina curentă? Ce zici de simpla trimitere a formularului la aceeași pagină și actualizarea metadatelor la încărcarea paginii?
  • Da Încerc să actualizez metadatele. Îmi puteți oferi o soluție la ceea ce vorbiți. Ar fi grozav.

Răspuns

Ați putea folosi AJAX dacă nu doriți să reîncărcați actualul pagina — adică la clic pe butonul „Acceptă”, faceți o cerere AJAX pentru actualizarea metadatelor utilizatorului, toate fără a părăsi pagina curentă.

Propun că nu folosesc AJAX; în schimb, trimitem pur și simplu formularul (setăm valoarea atributului action) la pagina principală și apoi folosim cârligul template_redirect pentru a actualiza metadatele (și redirecționați înapoi la pagina anterioară sau de referință).

Pașii

  1. Schimbați eticheta form la :

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

    și adăugați acest câmp nonce :

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

    astfel încât form acum să arate ca:

    <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. Adăugați acest lucru la tema functions.php fișier:

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

    Note:

    1. Gdpr ca în "Gdpr" !== $_POST["accept"] este același lucru ca în <input name="accept" type="checkbox" value="Gdpr" required /> de mai sus.

    2. Asigurați-vă că înlocuiți META_KEY cu cheia meta reală.

    3. Cred că acceptarea GDPR are ca scop logarea numai pentru utilizatorii ged-in, așa că „de ce am folosit is_user_logged_in() și get_current_user_id() în codul / funcția de mai sus.

UPDATE

wp_safe_redirect() nu a funcționat pentru OP, așa că a folosit wp_redirect().

Răspuns

Va trebui să utilizați wp_localize_script () disponibil de asemenea aici .
Nuvelă: este modul WordPress de a apela PHP în JS
Deci, puteți face ceva de genul următor.
FIRST creați un folder js la rădăcina temei dvs., același nivel cu style.css, dacă nu aveți unul totuși, atunci în acest folder js creați un fișier call-php.js. Îl poți numi oricând dorești, important este că trebuie să fie un fișier .js
În functions.php după 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 , în fișierul call-php.js adăugați:

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

Sper că acest lucru vă va rezolva problema.
Nu am făcut-o ” Testați-l, dar ar trebui să funcționeze.
Anunțați-mă după testare.

Comentarii

  • Vă mulțumim pentru răspuns. Apreciez . Dar cumva acest lucru nu funcționează. function updateHasReadFlag($user) nu este apelat. Sau poate că este apelat, dar update_user_meta( $user_id, 'META_KEY', true ); nu este cumva funcționează. Poți să te uiți la el. De asemenea, am eliminat <script> </script> din codul meu html.
  • Vă întreb doar pentru a confirma m, function updateHasReadFlag($user) acceptă ID-ul utilizatorului sau Obiectul utilizatorului ca parametru, astfel încât să poată actualiza respectivele meta date ale utilizatorului. Trimitem acest lucru ca parametru atunci când apelăm function updateHasReadFlag($user)
  • puteți înlocui object_name.my_php_function; cu console.log(object_name.my_php_function); și spune-mi ce vezi în consolă.Doar să știu, #modal se ascunde atunci când faceți clic pe #accept-button folosind răspunsul meu?
  • Este înregistrat ca " null " în consola pentru call-php.js
  • este #modal te ascunzi când dai clic pe #accept-button folosind răspunsul meu?

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *