web-dev-qa-db-ja.com

分類クエリでソート可能なカスタムテーブル列

ダッシュボードのカスタム投稿タイプの投稿一覧表にカスタム列を追加しようとしています。

私は この記事 と共にWPSEに関する多くの質問/回答を読みました。しかし、それは誰もがメタキー/値で問い合わせをしたいようです。

カスタムの投稿タイプテーブルに分類値(基本的にカテゴリ)を追加しようとしています。

列をソート可能にしたいのですが、クエリの調整がわかりません。

列のタイトルを追加します。

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

行の値を追加してください。

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

注文キーを準備します。

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

列をFAQカテゴリで実際に並べ替える方法に困惑しています。これは分類法の問い合わせになると思います。私がこれを処理しようとしたことを投稿することすら恥ずかしくて、私がしたことはすべて失敗したようです。可能であれば、これを処理するためにpre_get_postsフィルタを使用したいと思います。

4
Michael Ecklund

WordPress管理バックエンドダッシュボード内の投稿タイプのWP_List_Tableにカスタムの並べ替え可能な列を追加するには、以下を実行する必要があります。

  1. 出現するYOUR-POST-TYPE-NAMEをすべて実際の投稿タイプ名に置き換えます。
  2. 出現するYOUR-TAXONOMY-NAMEをすべて実際の分類名に置き換えます。
  3. 出現するYOUR COLUMN NAMEをすべて実際の列名に置き換えます。
  4. 出現するYOUR-COLUMN-SLUGをすべて実際の列スラッグに置き換えます。

ステップ1

WordPress Adminテーブルの列を追加する

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

ステップ2

カスタムWordPress Adminテーブル列内のすべての割り当てられたリンク可能な分類用語を行データとして追加

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

ステップ3

カスタムWordPress Adminテーブル列を有効にしてソート可能にする

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

ステップ4

post_clausesを変更して、分類用語によるカスタムWordPress Adminテーブル列のソートを許可します

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

ステップ5(ボーナス)

カスタムWordPress Adminテーブル列の幅を調整する

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

@goto10 に感謝します post_metaからデータが来ていない場合、Sortable adminカラム および @scribu 投稿用 カスタムソート可能列 および 元の質問に対するこの回答の分類可能な分類列分類クエリでソート可能なカスタムテーブル列

13
Michael Ecklund