web-dev-qa-db-fra.com

Colonne de table personnalisée triable par requête de taxonomie

Je cherche à ajouter une colonne personnalisée à une table de publication de type publication personnalisée dans le tableau de bord.

J'ai lu de nombreuses questions/réponses sur WPSE, ainsi que cet article . Bien que tout le monde semble vouloir interroger par méta clé/valeur.

J'essaie d'ajouter une valeur de taxonomie (essentiellement une catégorie) à une table de type publication personnalisée.

J'aimerais que la colonne puisse être triée, mais je ne comprends pas l'ajustement de la requête.

Ajoutez le titre de la colonne.

function mbe_column_titles($columns){
    $columns['title'] = 'Frequently Asked Question';
    $columns['mbe-faq-category'] = 'Category';
    return $columns;
}
add_filter('manage_mbe-faqs_posts_columns', 'mbe_column_titles');

Ajoutez les valeurs de ligne.

function mbe_column_rows($column_name, $post_id){
    if($column_name == 'mbe-faq-category'){
        $categories = wp_get_object_terms($post_id, 'mbe-faq-categories');
        $the_category = array();
        if($categories){
            foreach($categories as $category){
                $the_category[] = $category->name;
            }
        }
        echo join(', ', $the_category);
    }
}
add_action('manage_mbe-faqs_posts_custom_column', 'mbe_column_rows', 10, 2);

Préparer la clé de commande,

function mbe_sortable_columns($columns){
    $columns['mbe-faq-category'] = 'mbe-faq-category';
    return $columns;
}
add_filter('manage_edit-mbe-faqs_sortable_columns', 'mbe_sortable_columns');

Je suis perplexe sur la façon de trier la colonne par la catégorie FAQ. Je suppose que ce serait une question de taxonomie. Je suis trop gêné pour même poster ma tentative, et tout ce que je fais semble échouer. Je voudrais utiliser le filtre pre_get_posts pour gérer cela si possible.

4
Michael Ecklund

Pour pouvoir ajouter une colonne triable personnalisée au WP_List_Table de votre type de message dans le tableau de bord principal de l'administration WordPress, vous devez procéder comme suit:

  1. Remplacez toutes les occurrences de YOUR-POST-TYPE-NAME par votre nom de type de message réel.
  2. Remplacez toutes les occurrences de YOUR-TAXONOMY-NAME par votre nom de taxonomie actuel.
  3. Remplacez toutes les occurrences de YOUR COLUMN NAME par votre nom de colonne actuel.
  4. Remplacez toutes les occurrences de YOUR-COLUMN-SLUG par votre slug de colonne.

Étape 1

Ajouter des colonnes supplémentaires au tableau d'administration WordPress

if(!function_exists('mbe_change_table_column_titles')){
    function mbe_change_table_column_titles($columns){
        unset($columns['date']);// temporarily remove, to have custom column before date column
        $columns['YOUR-COLUMN-SLUG'] = 'YOUR COLUMN NAME';
        $columns['date'] = 'Date';// readd the date column
        return $columns;
    }
    add_filter('manage_YOUR-POST-TYPE-NAME_posts_columns', 'mbe_change_table_column_titles');
}

Étape 2

Ajouter tous les termes de taxonomie pouvant être liés attribués sous forme de données de ligne dans une colonne de tableau d'administration WordPress personnalisée

if(!function_exists('mbe_change_column_rows')){
    function mbe_change_column_rows($column_name, $post_id){
        if($column_name == 'YOUR-COLUMN-SLUG'){
            echo get_the_term_list($post_id, 'YOUR-TAXONOMY-NAME', '', ', ', '').PHP_EOL;
        }
    }
    add_action('manage_YOUR-POST-TYPE-NAME_posts_custom_column', 'mbe_change_column_rows', 10, 2);
}

Étape 3

Activer la colonne de la table d'administration WordPress personnalisée pour devenir triable

if(!function_exists('mbe_change_sortable_columns')){
    function mbe_change_sortable_columns($columns){
        $columns['YOUR-COLUMN-SLUG'] = 'YOUR-COLUMN-SLUG';
        return $columns;
    }
    add_filter('manage_edit-YOUR-POST-TYPE-NAME_sortable_columns', 'mbe_change_sortable_columns');
}

Étape 4

Modifier post_clauses pour autoriser le tri des colonnes de la table d'administration WordPress personnalisées par terme de taxonomie

if(!function_exists('mbe_sort_custom_column')){
    function mbe_sort_custom_column($clauses, $wp_query){
        global $wpdb;
        if(isset($wp_query->query['orderby']) && $wp_query->query['orderby'] == 'YOUR-COLUMN-SLUG'){
            $clauses['join'] .= <<<SQL
LEFT OUTER JOIN {$wpdb->term_relationships} ON {$wpdb->posts}.ID={$wpdb->term_relationships}.object_id
LEFT OUTER JOIN {$wpdb->term_taxonomy} USING (term_taxonomy_id)
LEFT OUTER JOIN {$wpdb->terms} USING (term_id)
SQL;
            $clauses['where'] .= "AND (taxonomy = 'YOUR-TAXONOMY-NAME' OR taxonomy IS NULL)";
            $clauses['groupby'] = "object_id";
            $clauses['orderby'] = "GROUP_CONCAT({$wpdb->terms}.name ORDER BY name ASC)";
            if(strtoupper($wp_query->get('order')) == 'ASC'){
                $clauses['orderby'] .= 'ASC';
            } else{
                $clauses['orderby'] .= 'DESC';
            }
        }
        return $clauses;
    }
    add_filter('posts_clauses', 'mbe_sort_custom_column', 10, 2);
}

Étape 5 (BONUS)

Ajuster la largeur des colonnes personnalisées du tableau d'administration WordPress

if(!function_exists('mbe_print_admin_styles')){
    function mbe_print_admin_styles(){
        if(!is_admin()){
            return false;
        }
        global $pagenow;
        if($pagenow == 'edit.php' && isset($_GET['post_type']) && $_GET['post_type'] == 'YOUR-POST-TYPE-NAME'){
            echo '
        <style type="text/css">
            .column-YOUR-COLUMN-SLUG{
                width: 10%;
            }
        </style>
        '.PHP_EOL;
        }
    }
    add_action('wp_print_scripts', 'mbe_print_admin_styles');
}

Merci à @goto10 pour demander Colonnes admin triables, lorsque les données ne proviennent pas de post_meta et @scribu pour publication Colonnes personnalisables triables et Colonnes taxables triés pour cela répondre à la question initiale Colonne de table personnalisée triable par requête de taxonomie .

13
Michael Ecklund