a la une meta categorie

Les meta données de catégorie

WordPress permet d’associer des meta données à une catégorie. Une meta donnée désigne une donnée qu’on associe à un article, un utilisateur, une taxonomie… et qui ne fait pas partie des données standards de WordPress.

Depuis WordPress 4.4, les meta données peuvent être associées aux taxonomies (catégorie, étiquette, taxonomie personnalisée).

Comment créer une meta donnée de catégorie ? A quoi sert-elle ? Des réponses dans ce tutoriel.

Haut de page

Pourquoi associer une meta donnée à une catégorie ?

Prenons un exemple concret.
Ce site propose une page, accessible depuis le menu principal, affichant la liste des articles qui sont des tutoriels :

Meta donnée de catégories - liste des articles dont le contenu est un tutoriel
Meta donnée de catégories – liste des articles dont le contenu est un tutoriel

Voici le code utilisé avant que WordPress 4.4 ne permette l’utilisation de meta données de catégorie.
L’objectif est de n’afficher que les articles de certaines catégories (2, 5 et 7 pour l’environnement de test et 15, 18 et 3 pour l’environnement de production) :

// Start the Loop.
// préparer les paramètres en fonction de l'environnement
if(WPDF_ENVT === 'TEST') {
	$wpdf_list_categ_tutoriels = '2, 5, 7';
} else {	
	$wpdf_list_categ_tutoriels ='15, 18, 3';	
}	//	fin test sur environnement
$wpdf_args = array(
	'post_type'  => 'post',
	'cat' => $wpdf_list_categ_tutoriels,
	'posts_per_page' => '-1'
	);
$wpdf_query = new WP_Query( $wpdf_args );
if ( $wpdf_query->have_posts() ) :
	while ( $wpdf_query->have_posts() ) : $wpdf_query->the_post();
		echo '<li>'.'<a href="'.get_the_permalink().'">'.get_the_title().'</a></li><br/>';
	endwhile;
endif;

Cela fonctionne, mais il y a quelques sérieux inconvénients :

  • il faut tenir une liste d’identifiants de catégories par environnement (test, production),
  • si on migre le site, la liste des identifiants doit être modifiée,
  • créer une nouvelle catégorie (ou sous catégorie) peut nécessiter d’ajouter un identifiant,
  • mais surtout : il faut un développeur pour gérer tout ça !

À partir de WordPress  4.4, avec un peu de développement , le gestionnaire du site pourra indiquer en saisissant  le mot « tuto » dans un champ de formulaire, que les articles d’une catégorie sont des tutoriels.

Haut de page

Créer une nouvelle meta donnée associée à une catégorie

Nous allons commencer par enregistrer la meta donnée « contenu » :

add_action( 'init', 'wpdf_register_meta_contenu' );

function wpdf_register_meta_contenu() {
 register_meta( 'term', 'contenu', 'wpdf_sanitize_meta_categorie' );
 }

Le crochet « init » est utilisé car il est déclenché relativement tôt, et en tout cas avant que ne soit saisie la meta donnée.
Dans notre cas, nous enregistrons la possibilité d’utiliser la meta donnée « contenu » avec un terme de taxonomie (une catégorie, une étiquette, une taxonomie personnalisée). Remarquons qu’au niveau de l’enregistrement, nous ne précisons ni le terme ni le type de taxonomie auquel pourra être associée la nouvelle meta data.

Supposons que le site :

  • contient des articles présentant des livres,
  • à chaque article est associé une ou plusieurs catégories (par exemple : roman, science-fiction, sport, informatique, médecine, sciences de l’ingénieur…),
  • parmi les  catégories, nous voulons repérer celles dont le contenu correspond à de la détente;

Nous avons alors :

  • une taxonomie : « la catégorie »,
  • des termes de catégorie : « roman », « science-fiction », « informatique »…
  • une meta-data de catégorie : « contenu » qui peut prendre la valeur « détente » pour les catégories : roman, science-fiction….


La fonction register_meta permet d’associer une fonction personnalisée wpdf_sanitize_meta_categorie() qui va contrôler la valeur de la meta donnée saisie :

function wpdf_sanitize_meta_categorie($wpdf_sanitize_meta_categorie) {
 return ('tuto' === $wpdf_sanitize_meta_categorie)? 'tuto' : '';
 }

Le paramètre de la fonction de contrôle ($wpdf_sanitize_meta_categorie) contient la valeur de la meta donnée saisie dans l’administration. Si la valeur saisie est différente de la valeur « tuto », la meta donnée sera vide.

Cette valeur contrôlée est celle qui est sauvegardée dans la base de données. En matière de sécurité, il est souhaitable de contrôler les données juste avant qu’elles ne soient insérées dans la Base de Données ou affichées.

Haut de page

Ajouter un champ de saisie de la meta donnée

Ajouter le champ à la création d’une catégorie

add_action( 'category_add_form_fields', 'wpdf_cre_taxo_contenu' );

function wpdf_cre_taxo_contenu() {
    wp_nonce_field( basename( __FILE__ ), 'wpdf_categ_contenu_nonce' ); 
?>
<div class="form-field wpdf-categ-contenu-wrap">
        <label for="wpdf-categ-contenu">Type de contenu</label>
        <input type="text" name="wpdf_categ_contenu" id="wpdf-categ-contenu" value="tuto" class="cre-taxo-contenu-field" />
</div>
<?php }	// fin fonction wpdf_cre_taxo_contenu

Le crochet utilisé est générique : « {taxonomy}_add_form_fields« . On l’applique à la taxonomie « category ».

Un « nonce » est un nombre unique valide un temps limité permettant de s’assurer que la saisie de formulaire transmise au site n’est pas une tentative de piratage.
La fonction « wp_nonce_field() » permet de créer des champs cachés dont le contenu sera transmis avec le formulaire pour vérification avant prise en compte par WordPress.

Dans cet exemple, le champ de saisie est un champ texte avec le titre « Type de contenu » et la valeur par défaut « tuto ». Voici le bas du formulaire de création d’une catégorie avec le champ de saisie de la meta donnée :

Meta donnée de catégorie - champ de saisie en création de catégorie
Meta donnée de catégorie – champ de saisie en création de catégorie

Ajouter le champ à la modification d’une catégorie

add_action( 'category_edit_form_fields', 'wpdf_mod_taxo_contenu' );

function wpdf_mod_taxo_contenu( $wpdf_categorie ) {

    $default = '';
    $wpdf_contenu   = get_term_meta( $wpdf_categorie->term_id, 'contenu', true );

    if ( ! $wpdf_contenu ) $wpdf_contenu = $default; ?>

    <tr class="form-field wpdf-categ-contenu-wrap">
        <th scope="row"><label for="wpdf-categ-contenu">Type de contenu</label></th>
        <td>
            <?php wp_nonce_field( basename( __FILE__ ), 'wpdf_categ_contenu_nonce' ); ?>
            <input type="text" name="wpdf_categ_contenu" id="wpdf-categ-contenu" value="<?php echo esc_attr( $wpdf_contenu ); ?>" class="mod-taxo-contenu-field" />
        </td>
    </tr>
<?php }	//	fin fonction wpdf_mod_taxo_contenu

Le crochet utilisé est générique : « {taxonomy}_edit_form_fields » appliqué à la taxonomie « category ».

La mise en forme de la page d’administration étant différente entre la création et la modification de catégorie, nous devons utiliser deux fonctions différentes (« wpdf_cre_taxo_contenu » et « wpdf_mod_taxo_contenu »).

La fonction « wpdf_mod_taxo_contenu() » récupère en paramètre l’objet « WP_Term » décrivant la catégorie en modification; voici un exemple d’objet WP_Term :

object(WP_Term)[6527]
  public 'term_id' => string '11' (length=2)
  public 'name' => string 'Actualité' (length=10)
  public 'slug' => string 'communaute-wp' (length=13)
  public 'term_group' => string '0' (length=1)
  public 'term_taxonomy_id' => string '11' (length=2)
  public 'taxonomy' => string 'category' (length=8)
  public 'description' => string '' (length=0)
  public 'parent' => string '0' (length=1)
  public 'count' => string '8' (length=1)
  public 'filter' => string 'edit' (length=4)
Meta donnée de catégorie - l'objet WP_Term

En utilisant la fonction WordPress get_term_meta(), on retrouve l’identifiant de la catégorie puis la meta donnée « contenu » associée, .
S’il n’y a pas de meta donnée associée à la catégorie, le champ de saisie de la meta donnée est initialisé à la valeur nulle.

On retrouve l’utilisation d’un nonce. Sa valeur est générée avec le même paramétrage que pour la création de catégorie (basename( __FILE__ ), ‘wpdf_categ_contenu_nonce’) car le programme de vérification du nonce est identique pour la création et la modification d’une catégorie.

Voici le formulaire de modification d’une catégorie avec le champ de saisie de la meta donnée :

Meta donnée de catégorie - champ de saisie en modification
Meta donnée de catégorie – champ de saisie en modification

Haut de page

Sauvegarder la meta donnée

add_action( 'edit_category',   'wpdf_sauve_categ_contenu' );
add_action( 'create_category', 'wpdf_sauve_categ_contenu' );

function wpdf_sauve_categ_contenu( $wpdf_categ_id ) {

    if ( ! isset( $_POST['wpdf_categ_contenu_nonce'] ) || ! wp_verify_nonce( $_POST['wpdf_categ_contenu_nonce'], basename( __FILE__ ) ) ) {
       return;
	}

    $wpdf_ancien_contenu   = get_term_meta( $wpdf_categ_id, 'contenu', true );
    $wpdf_nouveau_contenu = isset( $_POST['wpdf_categ_contenu'] ) ? $_POST['wpdf_categ_contenu'] : '';

    if ( $wpdf_ancien_contenu && '' === $wpdf_nouveau_contenu )
		delete_term_meta( $wpdf_categ_id, 'contenu' );

    else if ( $wpdf_ancien_contenu !== $wpdf_nouveau_contenu )
		update_term_meta( $wpdf_categ_id, 'contenu', $wpdf_nouveau_contenu) ;
}	// fin fonction wpdf_sauve_categ_contenu
Meta donnée de catégorie - sauvegarder la meta donnée

Deux crochets génériques sont utilisés pour déclencher la sauvegarde de la meta donnée, lors de la création  (create_{$taxonomy}) et de la modification (edit_{$taxonomy}) d’une catégorie. En revanche, la fonction de sauvegarde (wpdf_sauve_categ_contenu()) est identique dans les deux cas.

L’identifiant de la catégorie est passé en paramètre de la fonction de sauvegarde ($wpdf_categ_id).

Avant tout chose, le nonce est vérifié avec la fonction wp_verify_nonce(). Si le nonce n’est pas correct, il n’y a pas de sauvegarde (return).

Si l’utilisateur a laissé le champ « Type de contenu » à vide en modification de catégorie et qu’il existe une meta donnée, celle-ci est supprimée en utilisant la fonction delete_term_meta().

Si la valeur saisie est différente de la meta donnée existante (ou si la catégorie est en création), la meta donnée saisie est sauvegardée dans la Base de données en utilisant la fonction update_term_meta().

Voici la table wp_termmeta après sauvegarde d’une meta donnée :

Meta donnée catégorie - la table wp_termmeta
Meta donnée catégorie – la table wp_termmeta

« term_id » est l’identifiant de la catégorie à laquelle on a associé une meta donnée.

Haut de page

Ajouter une colonne à l’affichage des catégories

Créer une nouvelle colonne

add_filter('manage_edit-category_columns', 'wpdf_ajoute_colonne_contenu' );

function wpdf_ajoute_colonne_contenu( $wpdf_colonne_contenu ){
    $wpdf_colonne_contenu['contenu'] = 'Contenu';
    return $wpdf_colonne_contenu;
}	// fin fonction wpdf_ajoute_colonne_contenu
Meta donnée catégorie - ajouter une colonne à la description des catégories

On utilise le crochet générique manage_edit-{$taxonomy}_columns appliqué à la taxonomie « category ».

Le paramètre de la fonction associée au crochet wpdf_ajoute_colonne_contenu() est un tableau qui liste les colonnes :

array (size=5)
  'cb' => string '' (length=25)
  'name' => string 'Nom' (length=3)
  'description' => string 'Description' (length=11)
  'slug' => string 'Identifiant' (length=11)
  'posts' => string 'Compte' (length=6)
Meta donnée de catégorie - tableau des colonnes dans l'administration

Pour ajouter une colonne, il faut ajouter un élément au tableau et le retourner.

Ajouter la valeur pour chaque catégorie dans le tableau

add_filter('manage_category_custom_column', 'wpdf_ajoute_valeur_colonne_contenu', 10, 3 );

function wpdf_ajoute_valeur_colonne_contenu( $wpdf_content, $wpdf_column_name, $wpdf_term_id ){
    if( $wpdf_column_name !== 'contenu' ){
        return $wpdf_content;
    }

    $wpdf_term_id = absint( $wpdf_term_id );
    $wpdf_contenu = get_term_meta( $wpdf_term_id, 'contenu', true );

    if( !empty( $wpdf_contenu ) ){
        $wpdf_content = sanitize_text_field( $wpdf_contenu);
    }
    return $wpdf_content;
}	// fin fonction wpdf_ajoute_valeur_colonne_contenu
Meta donnée catégorie - afficher la valeur de la meta donnée

On utilise le crochet générique manage_{$taxonomy}_custom_column appliqué à la taxonomie « category ».

La fonction associée au crochet est de priorité 10 (valeur de priorité par défaut) et a trois paramètres : ‘wpdf_ajoute_valeur_colonne_contenu’, 10, 3.

Les trois paramètres passés par la fonction sont :

  • le contenu pour la catégorie courante,
  • le nom de la colonne,
  • l’identifiant du terme de taxonomie .

Rappelons que la catégorie est une taxonomie et que les différentes catégories sont des termes de taxonomie.

La fonction commence par vérifier si la colonne traitée est la colonne qui a pour nom « contenu ».

Si oui, la fonction récupère la valeur de la meta donnée associée à la catégorie dont l’identifiant était passé en paramètre en utilisant la fonction get_term_meta().

Si une meta donnée existait, elle est nettoyée d’un éventuel code malveillant avec la fonction sanitize_text_field() et retournée pour être affichée.

Haut de page

Afficher les articles pour certaines catégories

Après avoir créé et modifié la meta donné de catégorie « contenu », nous allons l’utiliser pour n’afficher que les articles associés à une catégorie dont la meta donnée « contenu » a la valeur « tuto ».

Récupérer la liste des catégories

$wpdf_categ_meta = array(
	'hide_empty' => true, // ne pas prendre en compte les catégories sans article public
	'meta_query' => array(
		array(
		   'key'       => 'contenu',
		   'value'     => 'tuto',
		   'compare'   => 'LIKE'
		)
	)
);
	
$wpdf_list_categ = get_terms( 'category', $wpdf_categ_meta );

$wpdf_id_categ_tuto = array();	//	liste des idnetifiants de catégories dont le contenu est un tuto
if ( ! empty( $wpdf_list_categ ) && ! is_wp_error( $wpdf_list_categ ) ){
	foreach ( $wpdf_list_categ as $wpdf_tuto_categ ) {
		$wpdf_id_categ_tuto []= $wpdf_tuto_categ->term_id;
	}	//	fin boucle sur les catégories associées à des tutos
}	// fin test si au moins une catégorie dont la meta 'contenu' est 'tuto'
Meta donnée catégorie - sélection de catégories

Créer un tableau de critère qui va paramétrer la recherche à effectuer dans la base de données.
On indique d’abord que la recherche se fait sur une meta (meta_query).
On précise ensuite qu’on recherche les meta données « contenu » dont la valeur est « tuto ».
Attention : bien noter l’utilisation d’un tableau de tableau  : « ‘meta_query’ => array(  array( »

Les critères de comparaison disponibles (« compare« ) sont décrits dans le codex WordPress :  meta_query.

La fonction get_terms() récupère tous les objets php des catégories répondant au tableau de critère. Il suffit ensuite de faire une boucle pour récupérer, dans une variable ($wpdf_id_categ_tuto) la liste des identifiants des catégories sélectionnées.

On exploite ensuite cette liste pour afficher les articles correspondants à ces catégories :

// Démarrer la boucle d'affichage 			
$wpdf_args = array(
	'post_type'  => 'post',
	'cat' => $wpdf_id_categ_tuto,
	'posts_per_page' => '-1'
	);
$wpdf_query = new WP_Query( $wpdf_args );
if ( $wpdf_query->have_posts() ) :
	while ( $wpdf_query->have_posts() ) : $wpdf_query->the_post();
		echo '<li>'.'<a href="'.get_the_permalink().'">'.get_the_title().'</a></li><br/>';
	endwhile;
endif;
?>
</ul>

Haut de page

L’extension (plugin)

Voici une extension reprenant la gestion de la meta donnée « contenu » dans l’administration :

<?php
/**
 * Plugin Name: gère meta categ
 * Plugin URI: http://dfarnier.fr/
 * Description: crée et gère une meta donnée de catégorie "contenu"
 * Author: Daniel Farnier
 * Author http://dfarnier.fr/
 * Version: 0.1.0
*/

if ( !defined('ABSPATH') ) exit ('Faites demi-tour !'); // Bloquer si la fonction n'est pas appelée depuis Wordpress

/**
 *	Enregistrement de la meta "contenu" associée à la taxonomie "catégorie"
 *
 * 	La meta donnée "contenu" permet d'identifier les articles qui présentent un certain type de contenu
 *	Elle est, par exemple utilisée, pour repérer les tutoriels.
 *	L'enregistrement permet d'insérer un contrôle de la saisie avant de sauvegarder la meta donnée.
 *
 *	La fonction est déclenchée par le crochet 'init'
 *
 * @param   none
 * @return  none
*/ 

add_action( 'init', 'wpdf_register_meta_contenu' );

function wpdf_register_meta_contenu() {

    register_meta( 'term', 'contenu', 'wpdf_sanitize_meta_contenu' );
}	//	fin fonction wpdf_register_meta_contenu

/**
 *	Contrôle la validité d'une meta donnée associée à une catégorie
 *
 * 	La valeur de la meta donnée doit être "tuto"
 *
 *
 * @param   string	$wpdf_sanitize_meta_categorie	valeur saisie de la meta donnée "contenu"
 * @return  string|null valeur nettoyée de la meta donnée "contenu"
*/ 
function wpdf_sanitize_meta_contenu($wpdf_sanitize_meta_categorie) {
    return ('tuto' === $wpdf_sanitize_meta_categorie)? 'tuto' : '';
}	//	fin fonction wpdf_sanitize_meta_contenu

/**
 *	Ajoute un champ de saisie de la meta lors de la création d'une catégorie
 *
 * 	Ajouter un champ de saisie dans la page de création d'une catégorie
 *	dans l'administration.
 *
 *	La fonction est déclenchée par le crochet '{taxonomy}_add_form_fields'
 * @param   none
 * @return  none
*/

add_action( 'category_add_form_fields', 'wpdf_cre_taxo_contenu' );

function wpdf_cre_taxo_contenu() {
    wp_nonce_field( basename( __FILE__ ), 'wpdf_categ_contenu_nonce' ); 
?>

    <div class="form-field wpdf-categ-contenu-wrap">
        <label for="wpdf-categ-contenu">Type de contenu</label>
        <input type="text" name="wpdf_categ_contenu" id="wpdf-categ-contenu" value="tuto" class="cre-taxo-contenu-field" />
    </div>
<?php }	// 	fin fonction wpdf_cre_taxo_contenu

/**
 *	Ajoute un champ de saisie de la meta lors de la modification d'une catégorie
 *
 * 	Ajouter un champ de saisie dans la page de modification d'une catégorie
 *	dans l'administration.
 *	La mise en page est différente entre la création et la modification,
 *	c'est pourquoi on utiise deux fonctions différentes.
 *
 *	La fonction est déclenchée par le crochet '{taxonomy}_edit_form_fields'
 * @param   object	$wpdf_categorie	objet WP_Term
 * @return  none
*/

add_action( 'category_edit_form_fields', 'wpdf_mod_taxo_contenu' );

function wpdf_mod_taxo_contenu( $wpdf_categorie ) {

    $default = '';
    $wpdf_contenu   = get_term_meta( $wpdf_categorie->term_id, 'contenu', true );

    if ( ! $wpdf_contenu ) $wpdf_contenu = $default; ?>

    <tr class="form-field wpdf-categ-contenu-wrap">
        <th scope="row"><label for="wpdf-categ-contenu">Type de contenu</label></th>
        <td>
            <?php wp_nonce_field( basename( __FILE__ ), 'wpdf_categ_contenu_nonce' ); ?>
            <input type="text" name="wpdf_categ_contenu" id="wpdf-categ-contenu" value="<?php echo esc_attr( $wpdf_contenu ); ?>" class="mod-taxo-contenu-field" />
        </td>
    </tr>
<?php }	//	fin fonction wpdf_mod_taxo_contenu

/**
 *	Sauvegarde la meta "contenu" saisie dans l'administration.
 *
 * 	Cette fonction permet de récupérer la valeur saisie dans l'administration
 *	et de la sauver dans la table wp-termmeta.
 *	Elle est commune à la création et à la modification de catégorie.
 *
 *	La fonction est déclenchée par les crochets 'create_{$taxonomy}' et 'edit_{$taxonomy}'
 * @param	integer	$wpdf_categ_id	identifiant de la catégorie associée à la meta donnée à sauver
 * @return  none
*/

add_action( 'edit_category', 'wpdf_sauve_categ_contenu' );
add_action( 'create_category', 'wpdf_sauve_categ_contenu' );

function wpdf_sauve_categ_contenu( $wpdf_categ_id ) {

    if ( ! isset( $_POST['wpdf_categ_contenu_nonce'] ) || ! wp_verify_nonce( $_POST['wpdf_categ_contenu_nonce'], basename( __FILE__ ) ) ) {
       return;
	}

    $wpdf_ancien_contenu   = get_term_meta( $wpdf_categ_id, 'contenu', true );
    $wpdf_nouveau_contenu = isset( $_POST['wpdf_categ_contenu'] ) ? $_POST['wpdf_categ_contenu'] : '';

    if ( $wpdf_ancien_contenu && '' === $wpdf_nouveau_contenu )
		delete_term_meta( $wpdf_categ_id, 'contenu' );

    else if ( $wpdf_ancien_contenu !== $wpdf_nouveau_contenu )
		update_term_meta( $wpdf_categ_id, 'contenu', $wpdf_nouveau_contenu) ;
}	// fin fonction wpdf_sauve_categ_contenu
 
 /**
 *	Créer une colonne "Contenu" dans la page d'administration des catégories.
 *
 *	Ajouter une colonne affichant la valeur de la meta donnée "Contenu"
 *	pour chaque catégorie.
 *
 *	La fonction est déclenchée par le crochet 'manage_edit-{$taxonomy}_columns'
 * @param   array	$wpdf_colonne_contenu	libellé des colonnes des paramètres de la catégorie
 * @return  array		tableau de colonnes avec ajout de colonne
*/
 
add_filter('manage_edit-category_columns', 'wpdf_ajoute_colonne_contenu' );

function wpdf_ajoute_colonne_contenu( $wpdf_colonne_contenu ){
    $wpdf_colonne_contenu['contenu'] = 'Contenu';
    return $wpdf_colonne_contenu;
}	// fin fonction wpdf_ajoute_colonne_contenu

/**
 *	Affiche le type de contenu de chaque catégorie dans l'administration.
 *
 *	Dans la colonne contenu" de la page d'administrtion des catégories
 *	afficher le type de contenu de chaque catégorie.
 *
 *	La fonction est déclenchée par le crochet 'manage_{$taxonomy}_custom_column'
 * @param   string	$wpdf_content	chaîne vide
 * @param	string	$wpdf_column_name 	nom de la colonne affichant la meta donnée
 * @param	integer	$wpdf_term_id	identifiant de la meta donnée
 * @return  string	$wpdf_content	contenu de la meta donnée
*/
 
add_filter('manage_category_custom_column', 'wpdf_ajoute_valeur_colonne_contenu', 10, 3 );

function wpdf_ajoute_valeur_colonne_contenu( $wpdf_content, $wpdf_column_name, $wpdf_term_id ){
    if( $wpdf_column_name !== 'contenu' ){
        return $wpdf_content;
    }

    $wpdf_term_id = absint( $wpdf_term_id );
    $wpdf_contenu = get_term_meta( $wpdf_term_id, 'contenu', true );

    if( !empty( $wpdf_contenu ) ){
        $wpdf_content = sanitize_text_field( $wpdf_contenu);
    }
    return $wpdf_content;
}	// fin fonction wpdf_ajoute_valeur_colonne_contenu

?>

À noter : pour des raisons de sécurité, l’extension du fichier à télécharger est « .wpdf ».

Pour le télécharger, vous pouvez cliquer sur le nom du fichier en bas de l’affichage du code :

Cliquer sur le nom du fichier en dessous du code pour tlécharger
Télécharger le code

Le code doit être recopié dans un fichier dont l’extension est « .php » : le fichier « functions.php » du thème, ou un fichier (par exemple « wpdf_affichage_tutos.php ») déposé dans le répertoire « wp-content/plugins » ou le répertoire « wp-content/mu-plugins ».

Haut de page

Autre exemple avec checkbox

Suite à une question d’un lecteur, j’ai créé une version qui utilise une checkbox en plus du champ de texte précédent.

<?php
/**
 * Plugin Name: gère meta categ
 * Plugin URI: http://dfarnier.fr/
 * Description: crée et gère une meta donnée de catégorie "contenu". Un champ texte et une checkbox
 * Author: Daniel Farnier
 * Author http://dfarnier.fr/
 * Version: 0.2.0
*/

if ( !defined('ABSPATH') ) exit ('Faites demi-tour !'); // Bloquer si la fonction n'est pas appelée depuis WordPress

/**
 *	Enregistrement de meta associées à la taxonomie "catégorie"
 *
 * 	La meta donnée "contenu" permet d'identifier les articles qui présentent un certain type de contenu
 *	La meta donnée "contenu_checkbox" est saisie via une checkbox qui activée vaut "VRAI"
 *	L'enregistrement permet d'insérer un contrôle de la saisie avant de sauvegarder la meta donnée.
 *
 *	La fonction est déclenchée par le crochet 'init'
 *
 * @param   none
 * @return  none
*/ 

add_action( 'init', 'wpdf_register_meta_contenu_checkbox' );

function wpdf_register_meta_contenu_checkbox() {

    register_meta( 'term', 'contenu', 'wpdf_sanitize_meta_contenu' );
    register_meta( 'term', 'contenu_checkbox', 'wpdf_sanitize_meta_contenu_checkbox' );
}	//	fin fonction wpdf_register_meta_contenu_checkbox

/**
 *	Contrôle la validité d'une meta donnée associée à une catégorie
 *
 * @param   string	$wpdf_sanitize_meta_categorie	valeur saisie de la meta donnée "contenu"
 * @return  string|null valeur nettoyée de la meta donnée "contenu"
*/

/*
 * 	La valeur de la meta donnée "contenu" doit être "tuto"
*/
 
function wpdf_sanitize_meta_contenu($wpdf_sanitize_meta_categorie) {
    return ('tuto' === $wpdf_sanitize_meta_categorie)? 'tuto' : '';
}	//	fin fonction wpdf_sanitize_meta_contenu

/*
 * 	La valeur de la meta donnée "contenu_checkbox" doit être "VRAI" ou "FAUX"
*/ 

function wpdf_sanitize_meta_contenu_checkbox($wpdf_sanitize_meta_categorie_checkbox) {
	$wpdf_sanitize_meta_categorie_checkbox = ($wpdf_sanitize_meta_categorie_checkbox ==='VRAI') ? 'VRAI' : 'FAUX';
    return ($wpdf_sanitize_meta_categorie_checkbox);
}	//	fin fonction wpdf_sanitize_meta_contenu_checkbox

/**
 *	Ajoute deux champs de saisie de metas lors de la création d'une catégorie
 *
 * 	Ajouter deux champs de saisie dans la page de création d'une catégorie
 *	dans l'administration.
 *
 *	La fonction est déclenchée par le crochet '{taxonomy}_add_form_fields'
 * @param   none
 * @return  none
*/

add_action( 'category_add_form_fields', 'wpdf_cre_taxo_contenu_checkbox' );

function wpdf_cre_taxo_contenu_checkbox() {

    wp_nonce_field( basename( __FILE__ ), 'wpdf_categ_contenu_nonce' ); 
?>

    <div class="form-field wpdf-categ-contenu-wrap">
        <label for="wpdf-categ-contenu">Type de contenu</label>
        <input type="text" name="wpdf_categ_contenu" id="wpdf-categ-contenu" value="tuto" class="cre-taxo-contenu-field" />
        <label for="wpdf-categ-contenu_checkbox">VRAI / FAUX</label>
        <input type="checkbox" name="wpdf_categ_contenu_checkbox" id="wpdf-categ-contenu-checkbox" value="VRAI" class=
"cre-taxo-contenu-field_checkbox" checked/>
    </div>
<?php }	// 	fin fonction wpdf_cre_taxo_contenu_checkbox

/**
 *	Ajoute deux champs de saisie de meta lors de la modification d'une catégorie
 *
 * 	Ajouter deux champs de saisie dans la page de modification d'une catégorie
 *	dans l'administration.
 *	La mise en page est différente entre la création et la modification,
 *	c'est pourquoi on utiise deux fonctions différentes.
 *
 *	La fonction est déclenchée par le crochet '{taxonomy}_edit_form_fields'
 * @param   object	$wpdf_categorie	objet WP_Term
 * @return  none
*/

add_action( 'category_edit_form_fields', 'wpdf_mod_taxo_contenu_checkbox' );

function wpdf_mod_taxo_contenu_checkbox( $wpdf_categorie ) {

    $default = '';
    $wpdf_contenu   = get_term_meta( $wpdf_categorie->term_id, 'contenu', true );
    $wpdf_contenu_checkbox = get_term_meta( $wpdf_categorie->term_id, 'contenu_checkbox', true );
	$wpdf_contenu_checkbox = ('VRAI' === $wpdf_contenu_checkbox) ? 'checked' : '';

    if ( ! $wpdf_contenu ) $wpdf_contenu = $default;
    if ( ! $wpdf_contenu_checkbox ) $wpdf_contenu_checkbox = 'FAUX'; ?>

    <tr class="form-field wpdf-categ-contenu-wrap">
        <th scope="row"><label for="wpdf-categ-contenu">Type de contenu</label></th>
        <td>
            <?php wp_nonce_field( basename( __FILE__ ), 'wpdf_categ_contenu_nonce' ); ?>
            <input type="text" name="wpdf_categ_contenu" id="wpdf-categ-contenu" value="<?php echo esc_attr( 
$wpdf_contenu ); ?>" class="mod-taxo-contenu-field" />
        </td>
		
    </tr>
	<tr class="form-field wpdf-categ-contenu-wrap">
        <th scope="row"><label for="wpdf-categ-contenu-checkbox">VRAI / FAUX</label></th>
        <td>
            <input type="checkbox" name="wpdf_categ_contenu_checkbox" id="wpdf-categ-contenu-checkbox" value="VRAI" <?php echo 
 $wpdf_contenu_checkbox; ?> class="mod-taxo-contenu-field" />
        </td>
    </tr>
<?php }	//	fin fonction wpdf_mod_taxo_contenu_checkbox

/**
 *	Sauvegarde des metas "contenu" et "contenu-checkbox saisies dans l'administration.
 *
 * 	Cette fonction permet de récupérer les valeurs saisies dans l'administration
 *	et de les sauver dans la table wp-termmeta.
 *	Elle est commune à la création et à la modification de catégorie.
 *
 *	La fonction est déclenchée par les crochets 'create_{$taxonomy}' et 'edit_{$taxonomy}'
 * @param	integer	$wpdf_categ_id	identifiant de la catégorie associée à la meta donnée à sauver
 * @return  none
*/

add_action( 'edit_category', 'wpdf_sauve_categ_contenu_checkbox' );
add_action( 'create_category', 'wpdf_sauve_categ_contenu_checkbox' );

function wpdf_sauve_categ_contenu_checkbox( $wpdf_categ_id ) {

    if ( ! isset( $_POST['wpdf_categ_contenu_nonce'] ) || ! wp_verify_nonce( $_POST['wpdf_categ_contenu_nonce'], basename( 
__FILE__ ) ) ) {
       return;
	}

    $wpdf_ancien_contenu   = get_term_meta( $wpdf_categ_id, 'contenu', true );
    $wpdf_nouveau_contenu = isset( $_POST['wpdf_categ_contenu'] ) ? $_POST['wpdf_categ_contenu'] : '';
		
    $wpdf_ancien_contenu_checkbox   = get_term_meta( $wpdf_categ_id, 'contenu_checkbox', true );
    $wpdf_nouveau_contenu_checkbox = isset( $_POST['wpdf_categ_contenu_checkbox'] ) ? $_POST['wpdf_categ_contenu_checkbox'] : 
'';

    if ( $wpdf_ancien_contenu && '' === $wpdf_nouveau_contenu )
		delete_term_meta( $wpdf_categ_id, 'contenu' );

    else if ( $wpdf_ancien_contenu !== $wpdf_nouveau_contenu )
		update_term_meta( $wpdf_categ_id, 'contenu', $wpdf_nouveau_contenu) ;
	
    if ( $wpdf_ancien_contenu_checkbox && '' === $wpdf_nouveau_contenu_checkbox )
		delete_term_meta( $wpdf_categ_id, 'contenu_checkbox' );

    else if ( $wpdf_ancien_contenu_checkbox !== $wpdf_nouveau_contenu_checkbox )
		update_term_meta( $wpdf_categ_id, 'contenu_checkbox', $wpdf_nouveau_contenu_checkbox) ;

}	// fin fonction wpdf_sauve_categ_contenu
 
 /**
 *	Créer des colonnes "Contenu" et "checkbox" dans la page d'administration des catégories.
 *
 *	Ajouter des colonnes affichant les valeurs des meta données "Contenu" et "contenu_checkbox"
 *	pour chaque catégorie.
 *
 *	La fonction est déclenchée par le crochet 'manage_edit-{$taxonomy}_columns'
 * @param   array	$wpdf_colonne_contenu	libellé des colonnes des paramètres de la catégorie
 * @return  array		tableau de colonnes avec ajout de colonne
*/
 
add_filter('manage_edit-category_columns', 'wpdf_ajoute_colonnes_contenu' );

function wpdf_ajoute_colonnes_contenu( $wpdf_colonne_contenu ){
    $wpdf_colonne_contenu['contenu'] = 'Contenu';
    $wpdf_colonne_contenu['checkbox'] = 'checkbox';
    return $wpdf_colonne_contenu;
}	// fin fonction wpdf_ajoute_colonnes_contenu

/**
 *	Affiche les valeurs contenu et checkbox pour chaque catégorie dans l'administration.
 *
 *	Dans la colonne "contenu" de la page d'administrtion des catégories
 *	afficher le type de contenu de chaque catégorie.
 *
 *	Dans la colonne "checkbox" de la page d'administrtion des catégories
 *	afficher la valeur de la checkbox (VRAI, FAUX ou rien).
 *
 *	La fonction est déclenchée par le crochet 'manage_{$taxonomy}_custom_column'
 * @param   string	$wpdf_content	chaîne vide
 * @param	string	$wpdf_column_name 	nom de la colonne affichant la meta donnée
 * @param	integer	$wpdf_term_id	identifiant de la meta donnée
 * @return  string	$wpdf_content	contenu de la meta donnée
*/
 
add_filter('manage_category_custom_column', 'wpdf_ajoute_valeur_colonne_contenu', 10, 3 );
add_filter('manage_category_custom_column', 'wpdf_ajoute_valeur_colonne_contenu_checkbox', 10, 3 );

function wpdf_ajoute_valeur_colonne_contenu( $wpdf_content, $wpdf_column_name, $wpdf_term_id ){
    if( $wpdf_column_name !== 'contenu' ){
        return $wpdf_content;
    }

    $wpdf_term_id = absint( $wpdf_term_id );
    $wpdf_contenu = get_term_meta( $wpdf_term_id, 'contenu', true );

    if( !empty( $wpdf_contenu ) ){
        $wpdf_content = sanitize_text_field( $wpdf_contenu);
    }

    return $wpdf_content;
}	// fin fonction wpdf_ajoute_valeur_colonne_contenu


function wpdf_ajoute_valeur_colonne_contenu_checkbox( $wpdf_content, $wpdf_column_name, $wpdf_term_id ){
    if( $wpdf_column_name !== 'checkbox' ){
        return $wpdf_content;
    }

    $wpdf_term_id = absint( $wpdf_term_id );

    $wpdf_contenu_checkbox = get_term_meta( $wpdf_term_id, 'contenu_checkbox', true );
    if( !empty( $wpdf_contenu_checkbox ) && 'VRAI' === $wpdf_contenu_checkbox ){
        $wpdf_content = $wpdf_contenu_checkbox;
	} else {
		$wpdf_content = '';
    }

    return $wpdf_content;
}	// fin fonction wpdf_ajoute_valeur_colonne_contenu_checkbox

?>
Haut de page

Supprimer les meta données

Le code suivant permet de supprimer les meta données de catégories « contenu » et « contenu_checkbox » :

delete_metadata( ‘term‘, false, ‘contenu‘,  », true );
delete_metadata( ‘term‘, false, ‘contenu_checkbox‘,  », true );

La fonction delete_metadata permet de supprimer les meta données :

  • associées à un « terme » terme de taxonomie (une catégorie, une étiquette, un terme personnalisé),
  • dont la clé est « contenu » ou « contenu_checkbox« ,
  • quelle que soit la catégorie et non pas les meta données associée à une catégorie désignée par son identifiant (term_id)

Voici une extension qui supprime les meta données « contenu » et « contenu_checkbox ». Il suffit de l‘activer puis de le désactiver :

<?php
/**
 * Plugin Name: supprime meta categ
 * Plugin URI: http://dfarnier.fr/
 * Description: supprime des meta données de catégorie "contenu". Un champ texte et une checkbox
 * Author: Daniel Farnier
 * Author http://dfarnier.fr/
 * Version: 0.1.0
*/

if ( !defined('ABSPATH') ) exit ('Faites demi-tour !'); // Bloquer si la fonction n'est pas appelée depuis WordPress

/**
 *	Suppression de meta associées à la taxonomie "catégorie"
 *
 * 	La meta donnée "contenu" permet d'identifier les articles qui présentent un certain type de contenu
 *	La meta donnée "contenu_checkbox" est saisie via une checkbox qui activée vaut "VRAI"
 *
 *	La fonction est déclenchée par le crochet 'init'
 *
 * @param   none
 * @return  none
*/ 

add_action( 'init', 'wpdf_supprime_meta_contenu_checkbox' );

function wpdf_supprime_meta_contenu_checkbox() {

	delete_metadata( 'term', false, 'contenu', '', true );
	delete_metadata( 'term', false, 'contenu_checkbox', '', true );
	
}	//	fin fonction wpdf_supprime_meta_contenu_checkbox

?>

La fonction delete_term_meta permet de supprimer les meta données  associées à une taxonomie. Malheureusement, cette fonction qui fait pourtant appel à la fonction « delete_metadata« , ne possède pas le paramètre permettant de supprimer toutes les meta données correspondant à une clé.

Laisser un commentaire

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.