Lorsque des données doivent être ajoutées via le tableau de bord, le formulaire d'ajout sera codé dans une fonction de rappel, par exemple dans la fonction monprefixe_creer_page_ajout.
Dans le cas d'un thème, la fonction de rappel sera codée dans functions.php ou dans son sous-fichier tableau-de-bord-menus.php .
Pour une extension, elle sera codée dans la classe de l'extension.
Mais pourquoi coder le formulaire dans une fonction de rappel plutôt que dans un fichier qui lui est propre? Simplement pour assurer que l'affichage du formulaire soit fait dans l'interface du tableau de bord WordPress.
En effet, si on avait codé le formulaire dans son propre fichier, il aurait fallu nous-même coder la vérification de l'authentification, l'affichage du menu à gauche, etc. On travaillera donc avec une fonction de rappel pour éviter d'avoir à tout recoder.
Le hook auquel la fonction de rappel est rattachée se chargera d'exécuter la fonction de rappel au moment opportun.
Cette fonction de rappel sera exécutée dans deux circonstances :
Par exemple, si l'option de menu a été ajoutée comme suit, on voit qu'un clic sur cette option exécutera la fonction de rappel monprefixe_creer_page_ajout().
add_submenu_page(
"monprefixe_gestion", // slug du menu parent
__( "Mon thème - Ajouter un ...", "mon-domaine-de-localisation" ), // texte de la balise <title>
__( "Ajouter un ...", "mon-domaine-de-localisation" ), // titre de l'option de sous-menu
"manage_options", // droits requis pour voir l'option de menu
"monprefixe_ajout", // slug
"monprefixe_creer_page_ajout" // fonction de rappel pour créer la page
);
// chaîne au format https://mondomaine.com/wp-admin/admin.php?page=monprefixe_ajout
$url_ajout = admin_url( "admin.php?page=monprefixe_ajout");
?>
<div class="wrap">
<h1 class="wp-heading-inline"><?php echo $title; ?></h1>
<a href="<?php echo $url_ajout; ?>" class="page-title-action"><?php _e( "Ajouter", "mon-domaine-de-localisation" ) ?></a>
<hr class="wp-header-end">
</div>
<?php
Dans la fonction de rappel qui crée la page d'ajout, nous prendrons soin de :
function monprefixe_creer_page_ajout() {
...
?>
...
<h1 class="wp-heading-inline"><?php echo $title; ?></h1>
Ce fichier sera placé dans le dossier du thème enfant. Il portera un nom du genre enregistrer-item.php.
$url_action = get_stylesheet_directory_uri() . '/enregistrer-item.php';
...
?>
<form method="post" id="..." name="..." action="<?php echo $url_action; ?>" >
...
<?php
ou, pour une extension :
$url_action = plugins_url( 'enregistrer-item.php', __FILE__ );
...
?>
<form method="post" id="..." name="..." action="<?php echo $url_action; ?>" >
...
<?php
Notez qu'il n'est pas nécessaire de valider les droits de l'usager logué puisque le noyau WordPress se charge de vérifier ces droits.
function monprefixe_creer_page_ajout() {
...
...
}
Lors du traitement du formulaire, des variables de session devront être initialisées afin de permettre d'afficher, en haut de la page qui apparaîtra après le traitement, un message pour indiquer le résultat de l'opération.
Il faudra pour cela commencer par activer les variables de session.
Ce code sera écrit directement dans functions.phpm (donc pas dans une fonctionn de rappel).
/**
* Active les variables de session.
* @author Christiane Lagacé <christiane.lagace@hotmail.com>
*
* Utilisation : add_action( 'init', 'monprefixe_session_start', 1 );
*/
function monprefixe_session_start() {
if ( ! session_id() ) {
@session_start();
}
}
add_action( 'init', 'monprefixe_session_start', 1 );
Le traitement du formulaire se fait en plusieurs étapes.
Si vous avez choisi de renvoyer le traitement à une autre page PHP, cette page devra prendre soin de charger le fichier wp-load.php afin d'avoir accès aux différentes fonctions WordPress pour gérer les nonces, accéder à la base de données, etc.
require_once "../../../wp-load.php";
La technique pour y arriver est détaillée ici.
Lorsque des données saisies dans un formulaire contiennent des apostrophes ou des guillemets, WordPress ajoutera automatiquement une barre oblique inverse devant. Ainsi, l'été deviendra l\'été.
WordPress fait ceci pour des raisons de sécurité mais il existe des techniques moins intrusives et qui n'affectent pas l'affichage, par exemple une boucle qui applique htmlspecialchars() à toutes les informations saisies.
Si vous avez pris le soin d'inclure cette boucle avant de procéder à l'enregistrement, vous pouvez vous débarasser des barres obliques sans risque en utilisant la fonction stripslashes_deep().
// protection XSS
foreach ($_POST as $cle => $valeur) {
$_POST[$cle] = htmlspecialchars( $valeur );
}
$_POST = stripslashes_deep( $_POST );
Toutes les validations qui ont été faites côté client doivent être reprises côté serveur.
Lorsque vous avez testé que le nonce et les données du formulaire sont valides, vous pouve procéder au traitement proprement dit, par exemple enregistrer les données.
La page de traitement devra, après avoir effectué le traitement, retourner le contrôle à une page du tableau de bord.
On choisira généralement la page qui affiche la liste des items dans le tableau de bord.
$url_retour = admin_url( "admin.php?page=monprefixe_gestion" );
wp_redirect( $url_retour );
Voici un algorithme qui permet de faire tout ce qui doit être fait dans la page de traitement.
<?php
// chargement des fonctionnalités WordPress nécessaires au traitement
require_once "../../../wp-load.php";
// les variables de session seront initialisées à true seulement si tous les tests sont réussis
$_SESSION['monprefixe_ajout_reussi'] = false;
$_SESSION['monprefixe_nonce_valide'] = false;
if ( isset( $_POST['soumettre'] ) ) { // si la page a reçu des données du formulaire
// vérification de la validité du nonce
if ( ... ) {
$_SESSION['monprefixe_nonce_valide'] = true;
// validation côté serveur des données lues dans le formulaire
...
// traitement du formulaire
...
// initialisation de variables de session pour indiquer le résultat de l'opération
if ( ... ) {
$_SESSION['monprefixe_ajout_reussi'] = true;
}
}
}
// renvoie le contrôle à la page qui affiche la liste des items dans le tableau de bord
$url_retour = admin_url( "admin.php?page=monprefixe_gestion" );
wp_redirect( $url_retour );
?>
Une fois l'opération terminée, il faut aviser l'usager du résultat de l'opération : l'ajout a-t-il été réussi? Y a-t-il eu un problème?
Puisque, lors de l'ajout, nous avons pris soin d'initialiser des variables de session pour retenir le résultat de l'opération, nous allons nous en servir pour afficher un message approprié.
Nous allons utiliser ici le hook admin_notices pour afficher le message d'erreur. Il aurait également été possible d'afficher les messages directement dans la page de gestion avant d'afficher la liste d'items.
Cet exemple affiche un message de réussite. Il faudra créer une autre fonction de rappel et utiliser un autre hook pour afficher le message d'erreur.
/**
* Affiche un message indiquant que l'item a été ajouté avec succès, seulement si la variable de session existe.
* @author Christiane Lagacé <christiane.lagace@hotmail.com>
*
* Utilisation : add_action( 'admin_notices', 'monprefixe_message_ajout_item_reussi' );
*/
function monprefixe_message_ajout_item_reussi() {
if ( isset( $_SESSION['monprefixe_ajout_reussi'] ) && $_SESSION['monprefixe_ajout_reussi'] == true ) {
echo '<div class="notice notice-success is-dismissible"><p>';
_e( "L'item a été ajouté avec succès !", "mon-domaine-de-localisation" );
echo '</p></div>';
// supprime la variable de session pour ne pas que le message soit affiché à nouveau
$_SESSION['monprefixe_ajout_reussi'] = null;
}
}
add_action( 'admin_notices', 'monprefixe_message_ajout_item_reussi' );
Si le code HTML a été bien monté, incluant la balise <hr class="wp-header-end"> après le bouton d'ajout, le message apparaîtra comme suit :

Sans cette balise <hr>, on obtiendrait ceci :

▼Publicité