Mémorisation d’informations

 

Si votre extension nécessite la conservation d’informations entre les sessions WordPress, il faut les conserver quelque part. Selon le volume d’informations à conserver, WordPress dispose de plusieurs mécanismes pour cela.

Informations globales pour WordPress

Petit volume de données

Dans ce cas, il est simple d’intégrer les données dans les options du site.

Ajouter des informations

Il nous faut un nom d’option (ci dessous « $option »). Il ne peut être constitué que de lettres minuscules(une des 26) et du souligné, ne pas dépasser 64 caractères. Attention à ne pas utiliser un nom d’option existant (liste: https://codex.wordpress.org/Option_Reference).

Il nous faut aussi la valeur à enregistrer (ci-dessous « $valeur »). Elle peut être de n’importe quel type mais sa taille ne doit pas dépasser 232 octets.

On peut utiliser :

add_option( $option, $valeur, $deprecated, $autoload );

ou

update_option( $option, $valeur, $autoload

Pour la fonction « add_option », l’option ne doit pas déjà exister. Pour « update_option » si l’option n’existe pas elle est créée, si elle existait son contenu est mis à jour.

La paramètre facultatif « $deprecated » n’est plus utilisé et doit être soit omis soit la chaîne vide.

La paramètre facultatif « $autoload » peut valoir « yes » ou « no ». S’il vaut « yes » (valeur par défaut), cette option sera chargée automatiquement lors de tout changement de page.

Les options sont enregistrées dans la table « XX_options » de la base de données (XX est le préfixe que WordPress a donné au site). le nom est dans la colonne « option_name », la valeur dans « option_value ».

Récupérer l’information

Par la fonction :

get_option( $option, $default )

En donnant le nom de l’option, nous renvoie sa valeur. Le paramètre facultatif « $default » est retourné si l’option n’existe pas. S’il est absent et que l’option n’est pas trouvée, la fonction renvoie « FALSE ».

Supprimer une option
delete_option( $option )

Retire l’option de la base de données.

Cela est aussi utile lors de la suppression du plugin ou sa désactivation (voir plus loin).

Obtenir toutes les options du site

Ce peut être utile pour ne pas écraser une option existante ou pour sélectionner les options dont le nom contient un motif particulier.

La fonction :

wp_load_alloptions()

renvoie un tableau associatif de toutes les options du site, indexé par leur nom et ayant comme contenu leur valeur.

Gros volume de données

Dans ce cas, il est utile de créer une table dans la base de données. Cependant le nom de cette table doit être préfixé par ce que WordPress utilise pour les tables du site. Cela se trouve dans la variable globale WordPress « $wpdb->prefix ». Il faudra aussi s’assurer que la table n’existe pas déjà.

Création de la table

Pour cela, il convient d’utiliser la fonction « dbDelta( $sql ) » qui prend en paramètre la requête SQL de création. Cette fonction est présente dans le fichier WordPress « wp-admin/includes/upgrade.php » non inclus par défaut.

Normalement la table est créée à l’activation du plugin, on s’accroche à ce moment par la fonction « register_activation_hook » qui prend en paramètre le fichier contenant la fonction associée à l’activation et le nom de cette fonction.

function ma_table_install() {
  if ( ! current_user_can( 'activate_plugins' ) ) return;
  global $wpdb;

  $nom_table = $wpdb->prefix.'tablespeciale';
  $charset_collate = $wpdb->get_charset_collate();
  $requete = "CREATE TABLE IF NOT EXISTS $nom_table (
     id mediumint(9) NOT NULL AUTO_INCREMENT,
     nom tinytext NOT NULL,
     valeur text NOT NULL,
     PRIMARY KEY (id)
   ) $charset_collate;";

  require_once( ABSPATH.'wp-admin/includes/upgrade.php' );
  $retour= dbDelta( $requete );
}
register_activation_hook( __FILE__, 'ma_table_install' );

On ne doit pas, dans la fonction d’activation, produire de sortie (echo). Si c’est le cas on obtiendra un message dans le tableau de bord, à l’activation, indiquant l’envoi d’informations avant l’envoi du header.

Voir aussi
https://codex.wordpress.org/Creating_Tables_with_Plugins

Utilisation de la table

Pour toute action sur les tables de la base de données de WordPress, il est préférable d’utiliser l’objet global « $wpdb » :
https://codex.wordpress.org/Class_Reference/wpdb

Par exemple, pour insérer :

<?php
  if (!current_user_can('edit_pages')) die(""); //En fait tout dépend de ce que l'on veut
?>
<h1>Ajout</h1>
<?php
  global $wpdb;
  $nom_table = $wpdb->prefix .'tablespeciale';
  $wpdb->insert( 
     $nom_table, 
     array( 
       'nom' => $_SERVER['REMOTE_ADDR'], 
       'valeur' => $_SERVER['REQUEST_URI'], 
     ) 
  );
?>

Ou pour lire :

<?php
  global $wpdb;
  $nom_table = $wpdb->prefix .'tablespeciale';
  $result = $wpdb->get_results( " SELECT nom, valeur FROM $nom_table ");

  foreach ( $result as $ligne ) {
     echo "<p>$ligne->nom -- $ligne->valeur";
  }
?>
Suppression de la table

Lors de la suppression du plugin, il est souhaitable d’effacer les ajouts qu’il a pu faire dans le système, notamment supprimer les tables et options crées.

La suppression du plugin est interceptée par la fonction « register_uninstall_hook ». Continuons notre exemple :

function ma_table_deinstall() {
  if ( ! current_user_can( 'activate_plugins' ) ) return;
  global $wpdb;
  $nom_table = $wpdb->prefix.'tablespeciale';
  $requete = "DROP TABLE IF EXISTS $nom_table";
  $wpdb->query( $requete );
}
register_uninstall_hook( __FILE__, 'ma_table_deinstall' );

Si l’on souhaite effacer dès la désactivation du plugin, on utilisera :

register_deactivation_hook( __FILE__, 'ma_table_deinstall' );

 

Informations associées aux contenus

Sur un ensemble de pages ou d’articles : taxinomie

Il s’agit de classer des contenus (au sens propre : les mettre dans des classes). Par exemple, si le sujet du site est les voyages, on peut avoir une taxinomie par pays.

Pour cela, il faudra mettre en place la taxinomie, l’intégrer éventuellement dans les pages et créer une page de taxinomie.

Mise en place

Dans le fichier principal de l’extension, on ajoute au moment « init » un appel à la fonction « register_taxonomy ».

function tax_pays_init() {
 register_taxonomy (
   'pays',
   'page',
   array(
     'label' => 'Pays',
   )
 );
}
add_action( 'init', 'tax_pays_init' );

Le premier paramètre est l’identifiant de la taxinomie, le second indique à quels éléments elle s’applique (là aux pages) , le troisième est un tableau d’options, ici on a juste utilisé le label pour donner un titre.

Une fois cela chargé on trouvera dans les pages, une boîte (à droite) nommée « Pays » pour indique le ou les pays correspondants à la page.

On aura aussi, dans le menu du tableau de bord, une nouvelle sous-rubrique dans page : « Pays » pour gérer ces listes.

Voir https://codex.wordpress.org/Function_Reference/register_taxonomy

Informations dans les pages

Si l’on veut que les pages indiquent à quelle taxinomie elles appartiennent, il suffit d’ajouter dans leur code :

 <p>
   Appartient au(x) pays(s) :
   <?php the_terms( $post->ID, 'pays', '<span style="background: #eee;">', ' - ', '</span>' ); ?>
 </p>

La fonction « the_term » prend en premier paramètre l’ID de la page, en second le nom de la taxinomie ; ensuite on a ce que l’on doit mettre avant la liste, le séparateur et ce que l’on doit mettre après.

Les éléments qui seront affichés sont des liens vers la page de taxinomie qu’il faut produire.

Page de taxinomie

Il suffit de créer dans le thème une page nommée « taxonomy.php » et y placer la boucle de WordPress.

Attention. Il est nécessaire de revalider, depuis le tableau de bord, la partie « Réglages / Permaliens » afin que WordPress puisse trouver la page de taxonomies.

Liées à une page, un article…

Il s’agit des champs personnalisés (« post_meta »). Bien sûr, le rédacteur peut gérer ses champs personnalisés au moment de l’écriture, mais il est possible d’en ajouter automatiquement et de leur donner une valeur.

Imaginons que nos rédacteurs soient dans différents pays , éventuellement voyagent. On voudrait que les articles produits indiquent la localisation du rédacteur. (On suppose que le serveur dispose de la géolocalisation et produise la variable $_SERVER[‘GEOIP_COUNTRY_NAME’]).

Voici ce que l’on peut mettre dans le fichier principal du plugin :

function champ_localisation($post_id) {
   $origine= $_SERVER['GEOIP_COUNTRY_NAME'];
   add_post_meta( $post_id, 'pays_origine', $origine, TRUE ) or
      update_post_meta( $post_id, 'pays_origine', $origine );
}
add_action( 'save_post', 'champ_localisation' );

La fonction « champ_localisation » est accrochée au moment « save_post » ce qui fait que même si le rédacteur modifie le champ personnalisé la fonction le rétablira.

Dans cette fonction on utilise en premier « add_post_meta » mais si le champ existe déjà elle renvoie FALSE, on utilise alors « update_post_meta ».

Pour l’affichage, le thème indiquera dans la boucle :

 <?php
   $origine = get_post_meta( get_the_ID(), 'pays_origine', true );
   echo empty($origine) ? '' : "<p>Pays d'origine : $origine </p>";
 ?>

Voir :
https://codex.wordpress.org/Function_Reference/add_post_meta
https://developer.wordpress.org/reference/functions/get_post_meta/
https://codex.wordpress.org/Custom_Fields

Ou pour les commentaires

Ce peut être plus utile de connaitre l’origine du commentateur. Le principe est le même, seuls les noms de fonctions changent.

Dans le fichier principal du plugin :

function comment_localisation( $comment_ID) {
  $origine= $_SERVER['GEOIP_COUNTRY_NAME'];
  add_comment_meta( $comment_ID, 'comment_pays_origine', $origine, TRUE ) or
    update_comment_meta( $comment_ID, 'comment_pays_origine', $origine );
}
add_action( 'comment_post', 'comment_localisation' );

Et dans « comments.php » pour l’affichage :

<?php
   $origine = get_comment_meta($comment->comment_ID, 'comment_pays_origine', TRUE );
   echo empty($origine) ? '' : "<p>Publié depuis : $origine </p>";
?>