Appeler une méthode depuis functions.php en un clic sur un bouton

Jai travaillé sur un projet où je devrais appeler une méthode (qui accepte lutilisateur id comme entrée) à partir dun clic sur un bouton denvoi (bouton Accepter).

Jai essayé toutes les méthodes, mais le vrai défi auquel je suis confronté est de savoir comment obtenir lidentifiant dutilisateur dans le front-end et transmettez-le à la méthode.

Ma méthode met à jour la méta utilisateur de cet utilisateur particulier.

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

À lheure actuelle, mon bouton Accepter lorsque je clique dessus nen affiche aucun. Je veux appeler la méthode avec display: none;

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

Le code de formulaire généré:

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

Je ne comprends pas pourquoi le champ nonce est commenté. Cest exactement ce que le code a été généré, je nai rien modifié dans le code.

Commentaires

  • Essayez-vous de mettre à jour les métadonnées sans recharger la page actuelle? Que diriez-vous simplement de soumettre le formulaire à la même page et de mettre à jour les métadonnées lors du chargement de la page?
  • Oui, jessaie de mettre à jour les métadonnées. Pouvez-vous me fournir une solution de ce dont vous parlez. Ce serait génial.

Réponse

Vous pouvez utiliser AJAX si vous ne voulez pas recharger l’actuel page — cest-à-dire en cliquant sur le bouton « Accepter », faites une requête AJAX pour mettre à jour les métadonnées de lutilisateur, le tout sans quitter la page actuelle.

Cependant, la solution Je propose pas d’utiliser AJAX; à la place, nous soumettons simplement le formulaire (définissez sa valeur dattribut action) à la page daccueil, puis nous utilisons le hook template_redirect pour mettre à jour les métadonnées (et redirigez vers la page précédente ou de référence).

Les étapes

  1. Remplacez la balise form par :

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

    et ajoutez ce champ nonce :

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

    ainsi votre form ressemble maintenant à:

    <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. Ajoutez ceci au fichier de thème 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" ); 

    Remarques:

    1. Le Gdpr comme dans "Gdpr" !== $_POST["accept"] est le même que dans le <input name="accept" type="checkbox" value="Gdpr" required /> ci-dessus.

    2. Assurez-vous de remplacer le META_KEY avec la clé méta réelle.

    3. Je crois que lacceptation du RGPD vise à enregistrer utilisateurs ged-in uniquement, cest pourquoi jai utilisé is_user_logged_in() et get_current_user_id() dans le code / la fonction ci-dessus.

UPDATE

wp_safe_redirect() ne fonctionnait pas pour lOP, il a donc utilisé wp_redirect().

Réponse

Vous devrez utiliser wp_localize_script () également disponible ici .
Petite histoire: cest la façon WordPress dappeler PHP in JS
Vous pouvez donc faire quelque chose comme ce qui suit.
FIRST créer un dossier js à la racine de votre thème, au même niveau que style.css, si vous nen avez pas cependant, dans ce dossier js, créez un fichier call-php.js. Vous pouvez le nommer comme vous le souhaitez, limportant est quil doit sagir dun fichier .js
Dans votre functions.php après votre 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 , dans le fichier call-php.js ajoutez:

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

Jespère que cela résoudra votre problème.
Je ne lai pas fait  » t le tester mais ça devrait marcher.
Faites-le moi savoir après lavoir testé.

Commentaires

  • merci pour la réponse. Je lapprécie . Mais dune manière ou dune autre, cela ne fonctionne pas. Mon function updateHasReadFlag($user) nest pas appelé. Ou peut-être est-il en train dêtre appelé mais le update_user_meta( $user_id, 'META_KEY', true ); ne lest pas fonctionne. Pouvez-vous lexaminer. Jai également supprimé <script> </script> de mon code html.
  • Vous demander juste pour confirmer m, Mon function updateHasReadFlag($user) accepte lID utilisateur ou lobjet utilisateur comme paramètre, afin quil puisse mettre à jour les métadonnées de cet utilisateur particulier. Lenvoyons-nous comme paramètre lors de lappel de function updateHasReadFlag($user)
  • pourriez-vous sil vous plaît remplacer object_name.my_php_function; par console.log(object_name.my_php_function); et dites-moi ce que vous voyez dans la console.Juste pour savoir, est-ce que #modal se cache lorsque vous cliquez sur #accept-button en utilisant ma réponse?
  • Il est enregistré comme " null " dans la console pour call-php.js
  • est le #modal se cacher lorsque vous cliquez sur #accept-button en utilisant ma réponse?

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *