Chiamare un metodo da functions.php con un clic di un pulsante

Ho lavorato a un progetto in cui dovrò chiamare un metodo (che accetta lutente id come input) da un clic di un pulsante di invio (pulsante Accetta).

Ho provato tutti i modi, ma la vera sfida che sto affrontando è come ottenere lID utente nel front-end e passalo al metodo.

Il mio metodo aggiorna il meta utente di quel particolare utente.

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

Al momento, il mio pulsante Accetta quando si fa clic mostra solo nessuno. Voglio chiamare il metodo insieme a display: none;

Il mio codice 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 ); } 

Il codice del modulo generato:

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

Non capisco perché il campo nonce sia commentato. Questo è esattamente ciò che il codice è stato generato, non ho modificato nulla nel codice.

Commenti

  • Stai tentando di aggiornare i metadati senza ricaricare la pagina corrente? Che ne dici di inviare semplicemente il modulo alla stessa pagina e aggiornare i metadati al caricamento della pagina?
  • Sì, sto cercando di aggiornare i metadati. Puoi fornirmi qualche soluzione di ciò di cui stai parlando. Sarebbe fantastico.

Rispondi

Potresti usare AJAX se non vuoi ricaricare la corrente page — ovvero, facendo clic sul pulsante “Accetta”, effettua una richiesta AJAX per aggiornare i metadati dellutente, il tutto senza lasciare la pagina corrente.

Tuttavia, la soluzione Sto proponendo non di usare AJAX; invece, inviamo semplicemente il modulo (imposta il suo valore di attributo action) alla home page e quindi usiamo lhook template_redirect per aggiornare i metadati (e reindirizza alla pagina precedente o di riferimento).

I passaggi

  1. Modifica il tag form in :

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

    e aggiungi questo campo nonce :

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

    quindi il tuo form ora avrà il seguente aspetto:

    <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. Aggiungilo al file functions.php:

    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 come in "Gdpr" !== $_POST["accept"] è uguale a <input name="accept" type="checkbox" value="Gdpr" required /> sopra.

    2. Assicurati di sostituire META_KEY con la meta chiave effettiva.

    3. Ritengo che laccettazione del GDPR sia finalizzata al log Solo per utenti ged-in, quindi è per questo che ho utilizzato is_user_logged_in() e get_current_user_id() nel codice / funzione sopra.

UPDATE

wp_safe_redirect() non ha funzionato per lOP, quindi ha usato wp_redirect().

Risposta

Dovrai utilizzare wp_localize_script () disponibile anche qui .
Breve storia: è il modo in cui WordPress chiama PHP in JS
Quindi potresti fare qualcosa di simile.
FIRST crea una cartella js nella radice del tema, allo stesso livello di style.css, se non ne hai una tuttavia, in questa cartella js crea un file call-php.js. Puoi nominarlo come vuoi, la cosa importante è che deve essere un .js file
Nel tuo functions.php dopo il tuo function updateHasReadFlag($user) aggiungi:

/** * 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 , nel file call-php.js aggiungi:

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

Spero che questo risolva il tuo problema.
Non lho fatto ” t provalo ma dovrebbe funzionare.
Fammi sapere dopo averlo testato.

Commenti

  • grazie per la risposta. Lo apprezzo . Ma in qualche modo non funziona. Il mio function updateHasReadFlag($user) non viene chiamato. O potrebbe essere stato chiamato ma update_user_meta( $user_id, 'META_KEY', true ); in qualche modo non lo è funzionante. Puoi esaminarlo. Ho anche rimosso <script> </script> dal mio codice html.
  • Chiederti solo per confermare m, My function updateHasReadFlag($user) accetta userID o user Object come parametro, quindi può aggiornare quel particolare metadati utente. Stiamo inviando questo come parametro quando si chiama function updateHasReadFlag($user)
  • potresti sostituire object_name.my_php_function; con console.log(object_name.my_php_function); e dimmi cosa vedi nella console.Solo per sapere, #modal si nasconde quando fai clic su #accept-button usando la mia risposta?
  • Viene registrato come " null " nella console per call-php.js
  • è #modal mi nascondi quando fai clic su #accept-button utilizzando la mia risposta?

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *