Comment modifier ou ajouter des colonnes personnalisées à la liste des publications dans WordPress Admin
WordPress vous permet de modifier et d’ajouter des colonnes à la liste des publications, des pages ou de tout type de publication personnalisée dans le panneau d’administration. Dans cet article, nous verrons comment !
Il y a deux crochets à considérer : un filtre pour la position et l’en-tête de la colonne, et une action pour la sortie de la colonne pour chaque article. Le type de publication fait partie des noms des crochets. Examinons-les un par un, en commençant par le filtre.
Filtre de colonne
Le filtre pour modifier, supprimer ou ajouter des colonnes à la liste des publications dans le panneau d’administration de WordPress est manage_{$post_type}_posts_columns. Échangez {$post_type}avec le type de publication souhaité. Par exemple; si vous souhaitez modifier les colonnes pour le type de publication ‘ post‘, le nom du filtre serait manage_post_posts_columns. Et pour un type de publication personnalisé ‘ product‘, le nom du filtre serait manage_product_posts_columns.
PS: WordPress a un filtre de colonne exclusivement pour le type de publication ‘ page‘: manage_pages_columns, mais vous obtiendrez le même résultat en utilisant le filtre manage_page_posts_columns.
Fourni comme argument au filtre, vous obtenez le tableau complet de toutes les colonnes pour ce type de publication. Chaque colonne a une clé unique et leurs valeurs sont les étiquettes affichées dans l’en-tête de colonne. Des exemples de clés sont ‘ cb‘ pour la colonne de cases à cocher et ‘ title‘ pour la colonne de titre de publication. L’ordre des éléments dans le tableau détermine l’ordre des colonnes.
Ce que vous devez faire pour ajouter une nouvelle colonne est simplement d’ajouter une nouvelle paire clé + valeur au tableau et de la renvoyer. Vous pouvez manipuler le tableau comme vous le souhaitez, par exemple en le réorganisant.
Crochet de contenu de colonne
Le crochet que vous devez utiliser pour contrôler la sortie du contenu de la colonne dépend du fait que votre type de publication soit ou non défini comme hiérarchique ou non. Un type de poste hiérarchique a été défini comme 'hierarchical' => truedans le register_post_type. Tous les types de publication non hiérarchiques, y compris le type de publication intégré de WordPress ‘ post‘, utilisent le crochet name manage_{$post_type}_custom_column. Tous les types de publication hiérarchiques, y compris le type de publication intégré de WordPress " page", utilisent le nom du crochet manage_pages_custom_column(remarque : aucune injection du nom du type de publication dans le nom du crochet).
Fourni comme arguments à ce crochet, vous obtenez le nom de la colonne, qui est la clé mentionnée dans le filtre de colonne ci-dessus (par exemple ‘ cb‘ pour la colonne de case à cocher), et deuxièmement l’ID de publication. Ce crochet est exécuté sur chaque publication, et le principe de base est que vous vérifiez si nous sommes ou non au bon type de colonne (par la clé), et si nous le sommes, utilisez l’ID de publication pour récupérer la méta de publication ou similaire et sortir quoi tu veux.
Exemples
Regardons un code d’exemples pratiques.
Ajouter une colonne personnalisée aux publications qui affiche une méta de publication personnalisée
Il s’agit de l’utilisation la plus simple de l’ajout de colonnes personnalisées. Disons que nous voulons ajouter une colonne personnalisée pour publier le type ‘post’. Nous le voulons à la toute fin des colonnes, appelé "Vérifié", et il doit afficher "Oui" ou "Non" en fonction d’une valeur de méta de publication personnalisée. Remarque: cet exemple n’inclut pas l’enregistrement ou la mise à jour de la méta de publication personnalisée.
Dans notre functions.phpou n’importe où dans notre code de thème ou de plugin, nous ajouterons la colonne elle-même en la fusionnant dans le tableau de colonnes, et dans le crochet pour la sortie de colonne, nous récupérons la valeur de la méta post et la sortons.
add_filter('manage_post_posts_columns', function($columns) {
return array_merge($columns, ['verified' => __('Verified', 'textdomain')]);
});
add_action('manage_post_posts_custom_column', function($column_key, $post_id) {
if ($column_key == 'verified') {
$verified = get_post_meta($post_id, 'verified', true);
if ($verified) {
echo '<span style="color:green;">'; _e('Yes', 'textdomain'); echo '</span>';
} else {
echo '<span style="color:red;">'; _e('No', 'textdomain'); echo '</span>';
}
}
}, 10, 2);
La sortie peut être ce que vous voulez, j’ai simplement ajouté un spanautour de la sortie avec différentes couleurs de texte pour une identification facile.
Ajouter une colonne personnalisée à un type de publication personnalisé hiérarchique qui affiche sa publication ancêtre
Lorsqu’un type de publication est hiérarchique, les publications peuvent avoir des publications parentes. Disons que nous avons un type de publication personnalisé hiérarchique ‘ subject‘ pour les matières scolaires où il est habituel de faire beaucoup de publications d’enfants, et même des publications d’enfants d’enfants. Pour une meilleure vue d’ensemble, nous voulons ajouter une colonne qui affiche le parent ancêtre de la publication ("sujet racine"). Si le message est un message de niveau supérieur, un simple «-» est affiché, sinon la colonne affiche le titre du message parent de l’ancêtre dans un lien pour modifier le message.
Parce que nous faisons référence à un type de publication hiérarchique, nous devons utiliser un crochet différent pour la sortie du contenu de la colonne que l’exemple ci-dessus, mais le processus est exactement le même.
Ce code montre également un exemple comment injecter une colonne au milieu du tableau de colonnes. Nous définissons que notre colonne doit venir avant ‘author’ et utilisons les fonctions de tableau PHP pour injecter l’élément dans la bonne position.
add_filter('manage_subject_posts_columns', function($columns) {
$offset = array_search('author', array_keys($columns));
return array_merge(array_slice($columns, 0, $offset), ['ancestor' => __('Ancestor', 'textdomain')], array_slice($columns, $offset, null));
});
add_action('manage_pages_custom_column', function($column_key, $post_id) {
if ($column_key == 'ancestor') {
$ancestors = get_ancestors($post_id, 'subject', 'post_type');
$post_ancestor = end($ancestors);
if ($post_ancestor != 0) {
echo '<a href="'. get_edit_post_link($post_ancestor). '">'. get_the_title($post_ancestor). '</a>';
} else {
echo '-';
}
}
}, 10, 2);
Suppression d’une colonne
Supprimer une colonne d’un type de publication est assez simple ; tout ce dont vous avez besoin est de filtrer les colonnes des messages, de supprimer l’élément du tableau et de le renvoyer. Vous n’avez pas besoin de vous connecter au crochet de sortie de la colonne. Par exemple; suppression de la datecolonne ‘ ‘ par défaut du type de message ‘ post‘ :
add_filter('manage_post_posts_columns', function($columns) {
unset($columns['date']);
return $columns;
});
Modification des noms ou de la position des colonnes par défaut
Supposons que nous ayons un type de publication personnalisé ‘ book‘ et que nous souhaitions remplacer le nom de colonne par défaut « Auteur » par « Éditeur ». Nous filtrons simplement le filtre des colonnes et donnons à la clé ‘ author‘ une valeur différente :
add_filter('manage_book_posts_columns', function($columns) {
$columns['author'] = __('Publisher', 'textdomain');
return $columns;
});
La réorganisation des colonnes peut être effectuée à l’aide des fonctions de tableau PHP. Gardez à l’esprit que le tableau résultant doit être un tableau associatif avec les colonnes "ID" comme clés et leur étiquette comme valeurs. Voici un exemple simple de suppression de la authorcolonne ‘ ‘ et de mise à la toute fin, réorganisant ainsi les colonnes :
add_filter('manage_post_posts_columns', function($columns) {
$taken_out = $columns['author'];
unset($columns['author']);
$columns['author'] = $taken_out;
return $columns;
});
Définition d’une colonne personnalisée comme pouvant être triée
Par défaut, certaines colonnes de WordPress sont triables, par exemple le titre du message, le nombre de commentaires et la date. Il est possible de rendre votre colonne personnalisée triable, mais cela nécessite un peu plus de code et de se connecter au crochet de requête de publication de WordPress afin de dire à WordPress comment ordonner par votre méta de publication.
Supposons que nous ayons un type de publication personnalisé ‘ movie‘, et avec le code suivant, nous ajoutons une colonne personnalisée qui affiche la méta de publication personnalisée ‘ duration‘.
add_filter('manage_movie_posts_columns', function($columns) {
return array_merge($columns, ['duration' => __('Duration', 'textdomain')]);
});
add_action('manage_movie_posts_custom_column', function($column_key, $post_id) {
if ($column_key == 'duration') {
$duration = get_post_meta($post_id, 'duration', true);
echo (!empty($duration))? sprintf(__('%s minutes', 'textdomain'), $duration): __('Unknown', 'textdomain');
}
}, 10, 2);
Afin de dire à WordPress que nous voulons que notre colonne soit triable, nous devons nous connecter au filtre manage_edit-{$post_type}_sortable_columns. Nous ajoutons notre colonne au tableau des colonnes filtrables, puis nous définissons la orderbyvaleur ‘ ‘. Nous y définissons une valeur personnalisée unique – le même nom que notre colonne – à laquelle nous pourrons nous référer ultérieurement dans notre crochet de requête.
add_filter('manage_edit-movie_sortable_columns', function($columns) {
$columns['duration'] = 'duration';
return $columns;
});
Si vous actualisez WordPress maintenant, vous devriez voir que notre colonne personnalisée est en effet cliquable et triable, mais elle ne se trie pas correctement. C’est parce que WordPress ne comprend pas ‘ duration‘ comme une orderbyvaleur ‘ ‘. C’est ce que nous allons corriger en nous connectant à ‘ pre_get_posts‘ :
add_action('pre_get_posts', function($query) {
if (!is_admin()) {
return;
}
$orderby = $query->get('orderby');
if ($orderby == 'duration') {
$query->set('meta_key', 'duration');
$query->set('orderby', 'meta_value_num');
}
});
Étant donné que notre méta de publication personnalisée ‘ duration‘ sera toujours un nombre, nous pouvons définir ‘ orderby‘ comme ‘ meta_value_num‘ pour la comparaison des nombres. Ajustez les arguments de la requête en fonction de vos méta-valeurs de publication personnalisées.
Désactiver le tri des colonnes par défaut
La désactivation du tri pour une colonne par défaut est assez simple. Tout ce que nous avons à faire est de nous connecter au filtre manage_edit-{$post_type}_sortable_columnset de supprimer la colonne que nous ne voulons pas trier du tableau. Par exemple, cela supprime le tri de la colonne de date pour le type de publication ‘ post‘.
add_filter('manage_edit-post_sortable_columns', function($columns) {
unset($columns['date']);
return $columns;
});
