L’interface d’administration de WordPress permet, par défaut, de filtrer les articles par date ou par catégorie. Mais si vous utilisez les champs personnalisés, vous trouverez probablement utile de filtrer vos articles en fonction du contenu de ces derniers. Pour ce faire, il vous mettre la main à la pâte et générer quelques lignes de code.

<?php add_action('restrict_manage_posts','monsite_restrict_manage_posts');
function monsite_restrict_manage_posts(){
	global $post_type_object;
	if($post_type_object->name == 'mon_post_type'){
		?>
		<select name="mon_champ">
			<option value="all">Tous</option>
			<option value="valeur1" <?php if($_GET['mon_champ'] == $valeur1) $selected = 'selected="selected"';?>>Valeur 1</option>
			<option value="valeur2" <?php if($_GET['mon_champ'] == $valeur2) $selected = 'selected="selected"';?>>Valeur 2</option>
		</select>
		<?php
	}
} ?>

Cette première fonction gère l’affichage du filtre. La chaine « mon_post_type » permet d’afficher le filtre uniquement sur le type de contenu de votre choix (page, post ou autre custom post type). On génère ensuite une boite de sélection contenant les différentes valeurs possibles du champ personnalisé « mon_champ ».

add_filter( 'parse_query', 'monsite_parse_query' );
function monsite_parse_query($query){
	global $pagenow;
	$qv = &$query->query_vars;
	if( $pagenow=='edit.php' && $_GET['post_type'] == 'mon_post_type'){
		if(!empty($_GET['mon_champ'])){
			if($_GET['mon_champ'] != 'all'){
				$qv['meta_query'][] = array(
					'field' => 'mon_champ',
					'value' => $_GET['mon_champ'],
					'compare' => '='
				);
			}
		}	
	}
}

Cette seconde fonction modifie la requête WordPress afin de rendre effectif notre filtre. On commence par vérifier si l’on est bien sur la bonne page (edit.php) et sur le bon type de contenu (mon_post_type). Ensuite, si une valeur a bien été sélectionnée pour ce filtre, on modifie en conséquence les variables qui génèreront la requête SQL.

Bonus : l’ajout de colonnes

Les codes précédents suffisent à remplir notre but initial. Mais il vous sera peut-être utile d’ajouter dans la liste des articles une colonne contenant la valeur de ce fameux champ personnalisé.

add_filter('manage_edit-mon_post_type_columns', 'monsite_manage_edit-mon_post_type_columns',10,1);
function monsite_manage_edit-mon_post_type_columns($columns){
		$columns['mon_champ'] = 'Mon champ';
		return $columns;
}

Ces quelques lignes vont créer la nouvelle colonne dans le tableau. Notez le nom du filtre (manage_edit-mon_post_type_columns), qui permet de restreindre l’affichage de notre colonne sur un type de contenu précis.

add_action('manage_mon_post_type_posts_custom_column','monsite_manage_mon_post_type_posts_custom_column', 10, 2);
function monsite_manage_mon_post_type_posts_custom_column($column_name, $post_id){
	if ( $column_name == 'mon_champ' ){
		$mon_champ = get_post_meta($post_id,'mon_champ',true);
		echo $mon_champ;
	}
}

Cette dernière fonction (qui utilise encore une fois un filtre destiné à restreindre selon le type de contenu) récupère la valeur du champ personnalisé pour l’article en cours et l’affiche. Mais si vous le souhaitez, vous pouvez également utiliser cette colonne pour lancer le filtre correspondant :

echo '<a href="'.admin_url( 'edit.php?post_type=mon_post_type&mon_champ='.$mon_champ).'">'.$mon_champ.'</a>';

Laisser un commentaire

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

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

Bonjour, comment puis-je vous aider ?