Formation PUB020 : WordPress, 2023 Formulaire d'ajout dans le tableau de bord WordPress

41.2 Formulaire d'ajout et code qui enregistre les données


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 :

  • Elle sera exécutée lorsque l'option de menu pour ajouter des données sera cliquée.

    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().

    Fichier functions.php ou son sous-fichier tableau-de-bord-menus.php

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

  • Elle sera également exécutée lorsque le lien situé dans le haut de la page de gestion sera cliqué. Notez que le lien contiendra le slug de la page. Ce slug doit être défini dans une option de menu pour que WordPress puisse faire le lien entre le slug et la fonction de rappel.
    Fichier functions.php ou son sous-fichier tableau-de-bord-pages.php

    // 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 cet extrait de code, remarquez la présence de la balise <hr>. C'est elle qui assure que lors de l'affichage du message de confirmation, le message apparaîtra au bon endroit. Sans cette balise, il apparaîtrait entre le titre de la page et le bouton d'ajout.

Fonction de rappel qui affiche le formulaire d'ajout

Dans la fonction de rappel qui crée la page d'ajout, nous prendrons soin de :

  • Afficher le titre de la page entre les balises <h1> et </h1> (dans certains thèmes, ce sera plutôt entre <h2> et </h2>). Comme pour toute page rattachée à une option de menu du tableau de bord WordPress, il est possible d'utiliser le même texte que pour la balise <title> en utilisant la variable $title.
    Fichier functions.php ou son sous-fichier tableau-de-bord-pages.php

    function monprefixe_creer_page_ajout() {
        ...
        ?>
        ...
        <h1 class="wp-heading-inline"><?php echo $title; ?></h1>

  • Générer un nonce pour le formulaire.
  • Générer le formulaire. L'attribut action doit retourner le contrôle à un fichier PHP qui se chargera d'enregistrer les données.

    Ce fichier sera placé dans le dossier du thème enfant. Il portera un nom du genre enregistrer-item.php.

    Fichier functions.php ou son sous-fichier tableau-de-bord-pages.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 :

    Fichier de l'extension (PHP)

    $url_action = plugins_url( 'enregistrer-item.php', __FILE__ );
    ...
    ?>
    <form method="post" id="..." name="..." action="<?php echo $url_action; ?>" >
    ...
    <?php

  • Aligner correctement les cases de saisie du formulaire. Au besoin, il faudra charger une feuille de style pour nos pages personnelles du tableau de bord.
  • Effectuer les validations côté client à l'aide de HTML et/ou JavaScript.

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.

Fichier functions.php ou son sous-fichier tableau-de-bord-pages.php

function monprefixe_creer_page_ajout() {
    ...

    if ( ! current_user_can( 'manage_options' ) )  {

        wp_die( __( "Vous n'avez pas les droits requis pour accéder à cette page.", "mon-domaine-de-localisation" ) );

    }
    ...
}

Activation des variables de session

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

Fichier functions.php

/**
 * 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 );

Contenu de la page qui traite le formulaire

Le traitement du formulaire se fait en plusieurs étapes.

Chargement de wp-load.php

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.

Fichier enregistrer-item.php

require_once "../../../wp-load.php";

Validation du nonce

La technique pour y arriver est détaillée ici.

Gestion des apostrophes et des guillemets

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().

Fichier enregistrer-item.php

// protection XSS
foreach ($_POST as $cle => $valeur) {
    $_POST[$cle] = htmlspecialchars( $valeur );
}

$_POST = stripslashes_deep( $_POST );

Validation côté serveur

Toutes les validations qui ont été faites côté client doivent être reprises côté serveur.

Traitement du formulaire

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.

Retourner le contrôle à la liste d'items

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.

Fichier enregistrer-item.php

$url_retour = admin_url( "admin.php?page=monprefixe_gestion" );
wp_redirect( $url_retour );

Mettons tout cela ensemble

Voici un algorithme qui permet de faire tout ce qui doit être fait dans la page de traitement.

Fichier enregistrer-item.php

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

Affichage d'un message pour informer du résultat de l'opération

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.

Fichier functions.php ou son sous-fichier tableau-de-bord-messages.php

/**
 * 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 :

Message de confirmation d'ajout bien affiché

Sans cette balise <hr>, on obtiendrait ceci :

Message mal affiché

▼Publicité

Veuillez noter que le contenu de cette fiche vous est partagé à titre gracieux, au meilleur de mes connaissances et sans aucune garantie.
Merci de partager !
Soumettre