Apelarea unei metode din functions.php la click pe un buton

6 iul. 2019, 06:47:21
Vizualizări: 16.6K
Voturi: 1

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.

2
Comentarii

Încerci să actualizezi metadatele fără a reîncărca pagina curentă? Ce zici să trimiti pur și simplu formularul către aceeași pagină și să actualizezi metadatele la încărcarea paginii?

Sally CJ Sally CJ
8 iul. 2019 18:22:54

Da, încerc să actualizez metadatele. Poți să-mi oferi o soluție pentru ce spui? Ar fi minunat.

Subham Subham
8 iul. 2019 18:38:23
Toate răspunsurile la întrebare 2
0

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

  1. 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>
    
  2. 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:

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

    2. Asigură-te că înlocuiești META_KEY cu cheia meta reală.

    3. Presupun că acceptarea GDPR este destinată doar utilizatorilor autentificați, de aceea am folosit is_user_logged_in() și get_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().

9 iul. 2019 06:05:03
13

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.

6 iul. 2019 22:04:54
Comentarii

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 Subham
7 iul. 2019 07:31:46

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 Subham
7 iul. 2019 07:52:48

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 LebCit
7 iul. 2019 11:12:37

Este înregistrat ca "null" în consolă pentru call-php.js

Subham Subham
7 iul. 2019 11:38:32

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

LebCit LebCit
7 iul. 2019 11:43:49

da @LebCit. Se ascunde.

Subham Subham
7 iul. 2019 11:44:56

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 LebCit
7 iul. 2019 11:49:02

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

Subham Subham
7 iul. 2019 16:58:35

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 Subham
7 iul. 2019 17:36:32

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 LebCit
7 iul. 2019 17:48:10

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 Subham
7 iul. 2019 17:51:40

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 LebCit
7 iul. 2019 20:31:43

Ce ai vrut să spui prin "a face o decizie greșită în funcția ta php". Funcția mea din functions.php este exact la fel ca în întrebarea mea.

Subham Subham
7 iul. 2019 20:41:27
Arată celelalte 8 comentarii