Mémos

M é m o - l a b .

Admin – Les colonnes

Les colonnes des pages d’édition de la partie admin de WordPress peuvent être personnalisées.

Le code ci-dessous permet de définir les colonnes que l’on souhaite afficher.





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');
?>

Le code ci-dessous permet de définir le contenu des colonnes.





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);
?>

Le code ci-dessous permet de rendre les colonnes filtrables.





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;
});
?>

Le code ci-dessous permet dintégrer les champs personnalisés dans la recherche admin.

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');
}
?>