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.php
al 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:
Gdpr
din'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_KEY
cu 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.

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

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?

se ascunde #modal
când dai click pe #accept-button
folosind răspunsul meu?

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.

Am folosit BugFu debugger. my_php_function
este null. Asta am descoperit.

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.

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.

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.

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.
