M é m o - l a b .
Les colonnes des pages d’édition de la partie admin de WordPress peuvent être personnalisées.
functions.php
<?php
function mytheme_custom_manage_column($columns) {
$columns = [
'<champ 1>' => '<Titre colonne champ 1>',
'<champ 2>' => '<Titre colonne champ 2>',
...
];
return $columns;
}
add_filter('manage_<nom du CPT>_posts_columns', 'mytheme_manage_column');
?>
Cas concret basé sur l'exemple du cpt et du groupe de champs vus dans
les chapitres sur les formulaires.
<?php
function mytheme_manage_visit_column($columns) {
$columns = [
'lastname' => 'Nom',
'email' => 'Email',
'place' => 'Lieu'
];
return $columns;
}
add_filter('manage_visit_posts_columns', 'mytheme_manage_visit_column');
?>
functions.php
function mytheme_manage_column_content($column, $post_id) {
global $post;
switch ($column) {
case '<champ 1>':
// ce que l'on souhaite afficher dans la colonne
// correspondant au champ 1
break;
case '<champ 2>':
// ce que l'on souhaite afficher dans la colonne
// correspondant au champ 2
break;
...
default :
break;
}
}
// 10 correspond à la priorité
// 2 correspond au nbre d'arguments que la fct accepte
add_action('manage_<nom du cpt>_posts_custom_column', 'mytheme_manage_column_content', 10, 2);
Cas concret basé sur l'exemple du cpt et du groupe de champs vus dans
les chapitres sur les formulaires.
function mytheme_manage_visit_column_content($column, $post_id) {
global $post;
switch ($column) {
case 'lastname':
// On affiche le nom dans les cellules de cette colonne
$lastname = get_post_meta($post_id, 'lastname', true);
echo $lastname;
break;
case 'email':
// On affiche le mail dans les cellules de cette colonne
$email = get_post_meta($post_id, 'email', true);
echo $email;
break;
case 'place':
// On affiche les 200 premiers caractères du champ "place"
$place = substr(get_post_meta($post_id, 'place', true), 0, 200) .'...';
echo $place;
break;
default :
break;
}
}
add_action('manage_visit_posts_custom_column', 'mytheme_manage_visit_column_content', 10, 2);
?>
functions.php
// On déclare la colonne qui doit être filtrée
add_filter('manage_edit-<nom du cpt>_sortable_columns', function ($column) {
$column['<champ 1>'] = '<champ 1>';
...
return $column;
});
Cas concret basé sur l'exemple du cpt et du groupe de champs vus dans
les chapitres sur les formulaires.
add_filter('manage_edit-visit_sortable_columns', function ($column) {
// On ne rend filtrable que la colonne nom
$column['lastame'] = 'lastname';
return $column;
});
?>
Par défaut, la requête du moteur de recherche admin s’effectue sur la table wp_posts de la bdd. Afin d’étendre la requête sur la table wp_postmeta dans laquelle sont stockées les champs personnalisés (ici avec AVF), il est nécessaire de faire une jointure entre les 2 tables basée sur l’id du post. Puis, on modifie la requête en remplaçant (preg_match()) la recherche sur le champ posts.post_title par la recherche sur LES champs de la table postmeta.
functions.php
<?php
global $pagenow;
// On s'assure que le traitement s'effectue sur la page admin d'édition du CPT "visit"
if ( is_admin() && $pagenow == 'edit.php' && $_GET['post_type'] == 'visit') {
// Jointure entre les tables posts et postmeta
function mytheme_search_join($join) {
if (is_search() && !empty($_GET['s'])) {
global $wpdb;
$join .=' LEFT JOIN '.$wpdb->postmeta. ' ON '. $wpdb->posts . '.ID = ' . $wpdb->postmeta . '.post_id ';
return $join;
}
}
add_filter('posts_join', 'mytheme_search_join' );
// Modification de la requête
function mytheme_search_where($where) {
if (is_search() && !empty($_GET['s'])) {
global $wpdb;
$where = preg_replace(
"/\(\s*" .$wpdb->posts .".post_title\s+LIKE\s*(\'[^\']+\')\s*\)/",
"(" .$wpdb->posts .".post_title LIKE $1) OR (" .$wpdb->postmeta .".meta_value LIKE $1)", $where);
return $where;
}
}
add_filter('posts_where', 'mytheme_search_where');
}
?>