可按分类查询排序的自定义表列

时间:2013-08-13 作者:Michael Ecklund

我希望在仪表板中的自定义帖子类型帖子列表表中添加一个自定义列。

我已经阅读了WPSE上的许多问题/答案,以及this article. 尽管如此,似乎每个人都想通过元键/值进行查询。

我正在尝试将分类法值(基本上是一个类别)添加到自定义的post类型表中。

我希望列可以排序,但是我不理解查询调整。

添加列标题。

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\');
我对如何按常见问题分类对专栏进行排序感到困惑。我假设这是一个分类查询。我太尴尬了,甚至不敢发表我的处理尝试,我所做的一切似乎都失败了。我想使用pre_get_posts 如有可能,过滤以处理此问题。

2 个回复
最合适的回答,由SO网友:Michael Ecklund 整理而成

要实现将自定义可排序列添加到WP_List_Table 对于WordPress管理后端仪表板中的帖子类型,您需要执行以下操作:

替换所有出现的YOUR-POST-TYPE-NAME 使用您的实际职位类型名称YOUR-TAXONOMY-NAME 使用实际的分类名称YOUR COLUMN NAME 使用实际列名YOUR-COLUMN-SLUG 使用实际列段塞

步骤1添加其他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\');
}

步骤2

将所有分配的可链接分类术语添加为自定义WordPress管理表列中的行数据

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管理表列可排序

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管理表列进行排序

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);
}
调整自定义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\');
}
感谢@goto10 谢谢你的邀请Sortable admin columns, when data isn\'t coming from post_meta@scribu 用于过帐Custom Sortable ColumnsSortable Taxonomy Columns 对于原始问题的回答Custom Table Column Sortable by Taxonomy Query.

SO网友:Kevin Leary

使用单个过滤器可以轻松完成此操作:

/**
 * Sorting by Taxonomy Term
 *
 * Add column sorting for a custom taxonomy to a custom post type edit view in WordPress.
 *
 * Note: Replace the {post_type} and {taxonomy} values below.
 */
add_filter( \'manage_edit-{post_type}_sortable_columns\', function( $sortable_columns ) {
  $sortable[ \'taxonomy-{taxonomy}\' ] = [\'orderby\', \'asc\'];
  return $sortable;
}, 10, 1 );
更换{post_type}{taxonomy} 使用您正在使用的帖子类型和分类法。最终结果将是自定义帖子类型上的一个自定义列,该列可排序,并可用于对中的帖子进行排序WP_List_Table.

结束

相关推荐

Reorder dashboard widgets

我最近试图通过编写插件对仪表板小部件进行重新排序。我做到了这一点:使用以下代码:<?php /* * Plugin Name: Custom Dashboard * Description: Custom dashboard for Avare sites. * Author: Avare * Version: 1.0 */ function sort_dashboard_widgets() { $lef