Apelarea unei metode din functions.php la click pe un buton
Lucrez la un proiect unde trebuie să apelez o metodă (care acceptă ID-ul utilizatorului ca parametru) atunci când se face click pe un buton de submit (butonul Accept).
Am încercat diverse metode, dar provocarea principală este cum să obțin ID-ul utilizatorului în front-end și să îl transmit metodei.
Metoda mea actualizează metadatele utilizatorului respectiv.
Cod HTML:
<div id="modal">
<div class="modalconent">
<h3 align=center>GDPR</h3>
<p>Acesta este un Pop-up GDPR</p><br><br><br>
<form>
<input name="accept" type="checkbox" value="Gdpr" required/>Accept GDPR
<input type="submit" id="accept-button" 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 meu Accept doar ascunde elementul când este apăsat. Vreau să apelez și metoda împreună cu display:none;
Codul meu PHP:
function updateHasReadFlag($user) {
// Am adăugat suport pentru folosirea funcției atât cu ID user cât și cu obiect user
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=""> Accept GDPR
<input type="submit" id="accept-button" value="Acceptă">
<!--?php wp_nonce_field( 'accept-gdpr', 'accept_gdpr_nonce' ); ?-->
</form>
Nu înțeleg de ce câmpul nonce este comentat. Acesta este exact codul generat, nu am modificat nimic în el.
Ai putea folosi AJAX dacă nu dorești să reîncarci pagina curentă — adică la apăsarea butonului "Accept", faci o cerere AJAX pentru a actualiza metadatele utilizatorului, fără a părăsi pagina curentă.
Totuși, soluția pe care o propun nu folosește AJAX; în schimb, pur și simplu trimitem formularul (setăm valoarea atributului action) către pagina principală și apoi folosim hook-ul template_redirect pentru a actualiza metadatele (și redirecționăm înapoi la pagina anterioară sau de referință).
Pașii
Schimbă tag-ul
formîn:<form method="post" action="<?php echo esc_url( home_url() ); ?>">și adaugă acest câmp nonce:
<?php wp_nonce_field( 'accept-gdpr', 'accept_gdpr_nonce' ); ?>deci
form-ul tău arată acum astfel:<form method="post" action="<?php echo esc_url( home_url() ); ?>"> <input name="accept" type="checkbox" value="Gdpr" required /> Accept GDPR-ul <input type="submit" id="accept-button" value="Acceptă" /> <?php wp_nonce_field( 'accept-gdpr', 'accept_gdpr_nonce' ); ?> </form>Adaugă acest cod în fișierul
functions.phpal temei:function accept_gdpr() { // Verifică dacă utilizatorul este autentificat. if ( ! is_user_logged_in() ) { return; } // Verifică dacă avem toate datele necesare. if ( empty( $_POST['accept_gdpr_nonce'] ) || empty( $_POST['accept'] ) || 'Gdpr' !== $_POST['accept'] ) { return; } // Verifică nonce-ul. if ( ! wp_verify_nonce( $_POST['accept_gdpr_nonce'], 'accept-gdpr' ) ) { return; } // Actualizează meta. update_user_meta( get_current_user_id(), 'META_KEY', '1' ); // Redirecționează înapoi la pagina anterioară. wp_safe_redirect( wp_get_referer() ); exit; } add_action( 'template_redirect', 'accept_gdpr' );Note:
Gdprdin'Gdpr' !== $_POST['accept']este același ca în<input name="accept" type="checkbox" value="Gdpr" required />de mai sus.Asigură-te că înlocuiești
META_KEYcu cheia meta reală.Presupun că acceptarea GDPR este destinată doar utilizatorilor autentificați, de aceea am folosit
is_user_logged_in()șiget_current_user_id()în codul/funcția de mai sus.
ACTUALIZARE
wp_safe_redirect() nu a funcționat pentru OP, așa că a folosit wp_redirect().
Va trebui să folosești wp_localize_script() disponibil și aici.
Pe scurt: acesta este modul WordPress de a apela PHP în JS
Așadar, poți face ceva similar cu următorul exemplu.
PRIMUL pas este să creezi un folder js în rădăcina temei tale, la același nivel cu style.css, dacă nu ai unul deja, apoi în acest folder js creează un fișier call-php.js. Poți să-i dai orice nume dorești, important este ca acesta să fie un fișier .js.
În fișierul tău functions.php după funcția function updateHasReadFlag($user) adaugă:
/**
* Încărcarea codului JS.
*/
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' );
AL DOILEA pas, în fișierul call-php.js adaugă:
( function( $ ) {
$( "#accept-button" ).click( function( e ) {
e.preventDefault();
$( "#modal" ).hide();
object_name.my_php_function;
});
} )( jQuery );
Sper că această soluție îți va rezolva problema.
Nu am testat-o, dar ar trebui să funcționeze.
Dă-mi de veste după ce o testezi.
mulțumesc pentru răspuns. Apreciez. Dar cumva nu funcționează. Funcția mea function updateHasReadFlag($user) nu este apelată. Sau poate este apelată, dar update_user_meta( $user_id, 'META_KEY', true ); nu funcționează cumva. Poți să te uiți peste asta. Am eliminat și <script> </script> din codul meu HTML.
Subham
Te întreb doar pentru confirmare, funcția mea function updateHasReadFlag($user) acceptă ca parametru ID-ul utilizatorului sau obiectul utilizator, astfel încât să poată actualiza metadatele respective ale utilizatorului. Trimitem acest parametru când apelăm function updateHasReadFlag($user)?
Subham
poți să înlocuiești object_name.my_php_function; cu console.log(object_name.my_php_function); și să-mi spui ce vezi în consolă? Doar ca să știu, #modal dispare când dai click pe #accept-button folosind răspunsul meu?
LebCit
se ascunde #modal când dai click pe #accept-button folosind răspunsul meu?
LebCit
poți te rog să folosești BugFu Console Debugger pe funcția ta function updateHasReadFlag($user) pentru a vedea exact output-ul, dacă funcționează... Spune-mi când o să faci asta, cred că vei înțelege care e problema.
LebCit
Am folosit BugFu debugger. my_php_function este null. Asta am descoperit.
Subham
Cred că am găsit problema. Codul meu php updateHasReadFlag($user) este în child theme-ul meu, în timp ce call-php.js este în parent theme. get_template_directory_uri() direcționează către parent theme. Așa că am crezut că de aceea probabil my_php_function este null. Dar acum am direcționat totul către child theme și my_php_function este tot null.
Subham
Ar trebui să faci tot ce este menționat mai sus DOAR în tema ta copil !!! Deci funcția ta ar trebui să fie în functions.php din tema copil și toți pașii din răspunsul meu ar trebui aplicați în tema copil.
LebCit
Da, am făcut asta. Am înlocuit get_template_directory_uri() cu get_stylesheet_directory_uri() și filemtime( get_theme_file_path( '/js/call-php.js' ) cu filemtime( get_stylesheet_directory( '/js/call-php.js' ). Dar totuși log-ul este null.
Subham
Folosește codul așa cum este dat! filemtime( get_stylesheet_directory( '/js/call-php.js' ) este greșit! Dacă vrei să modifici asta, ar trebui să fie filemtime( get_stylesheet_directory() . '/js/call-php.js' ). Verifică Code Reference înainte de a face modificări. Cred că faci un apel greșit al acțiunii în funcția ta php.
LebCit