使自定义列可按来自不同自定义帖子类型的值排序

时间:2015-08-06 作者:SinisterBeard

我已经创建了一些自定义列,以便在管理部分更吸引人地显示我的自定义帖子类型-这些列主要是自定义字段。大多数情况下,这工作非常好,我可以按预期的自定义字段列进行排序。

但是,其中一个自定义字段指向不同帖子类型的帖子ID。当显示它时,它看起来很好,因为我可以从它的ID中获取相关帖子的标题,而不是显示ID本身——所有这些都在下面的代码中。

我不知道如何在列排序中复制它,或者即使有可能,我只能看到如何按元值排序,即链接帖子的ID,而不是标题。

我的代码在技术上是正确的,正如它正确地按元值排序一样,但我想按带有该ID的帖子标题的字母顺序排序,而不是ID本身。是否可以做到这一点,如果可以,如何做到?

add_action( \'manage_posts_custom_column\' , \'custom_columns\', 10, 2 );

    function custom_columns( $column, $post_id ) {
        global $wpdb;
        switch ( $column ) {
            case \'extranet_client_area\': // Extranet documents
                $get_case_ID = get_post_meta( $post_id, \'extranet_client_area\', true );
                $get_case_name = $wpdb->get_results(\'SELECT post_title FROM `cn_bf_posts` WHERE `ID` = \'.$get_case_ID);
                echo \'<a href="http://www.bishopfleminginsolvency.co.uk/wp-admin/post.php?post=\'.$get_case_ID.\'&action=edit">\'.$get_case_name[0]->post_title.\'</a>\';
                break;
            case \'extranet_document_type\':
                extranet_nice_document_type(get_post_meta( $post_id, \'extranet_document_type\', true ));
                break;
            case \'extranet_document_date\':
                echo date(\'d/m/Y\',strtotime(get_post_meta( $post_id, \'extranet_document_date\', true ))); 
                break;
            case \'extranet_file\':
                echo \'<a target="_blank" href="\'.get_the_guid(get_post_meta( $post_id, \'extranet_file\', true )).\'">Download</a>\';
                break;
            default:
                break;
        }
    }

add_action( \'pre_get_posts\', \'extranet_orderby\' );

    function extranet_orderby( $query ) {
        if( ! is_admin() )
            return;

        $orderby = $query->get( \'orderby\');
        switch ( $orderby ) {
            case \'extranet_sort_document_case\':
                $query->set(\'meta_key\',\'extranet_client_area\');
                $query->set(\'orderby\',\'meta_value\');
                break;  
            case \'extranet_sort_document_type\':
                $query->set(\'meta_key\',\'extranet_document_type\');
                $query->set(\'orderby\',\'meta_value_num\');
                break;
            case \'extranet_sort_document_date\':
                $query->set(\'meta_key\',\'extranet_document_date\');
                $query->set(\'orderby\',\'meta_value\');
                break;
            default:
                break;
        }


add_filter(\'manage_clientdocument_posts_columns\',\'extranet_document_columns\');

function extranet_document_columns($columns) {

    $columns = array(
        \'cb\'=>\'<input type="checkbox" />\',
        \'extranet_client_area\' => __( \'Case Name\' ),
        \'title\' => __( \'Document Name\' ),
        \'extranet_document_type\' => __( \'Document Type\' ),
        \'extranet_document_date\' => __( \'Document Date\' ),
        \'extranet_file\' => __( \'Download link\' )            
    );

    return $columns;

}

add_filter( \'manage_edit-clientdocument_sortable_columns\', \'my_sortable_clientdocuments_columns\' );

function my_sortable_clientdocuments_columns( $columns ) {
    $columns[\'extranet_client_area\'] = \'extranet_sort_document_case\';
    $columns[\'extranet_document_type\'] = \'extranet_sort_document_type\';
    $columns[\'extranet_document_date\'] = \'extranet_sort_document_date\';
    return $columns;
}

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

基于Phil的回答:

对开关进行了以下更改:

case \'extranet_sort_document_case\':
add_filter(\'posts_join\', \'extranet_clientdocument_case_join\');
add_filter(\'posts_fields\', \'extranet_clientdocument_case_fields\');
add_filter(\'posts_orderby\', \'extranet_clientdocument_case_order\');
break;  
并编写了以下函数:

function extranet_clientdocument_case_join($join) {
    global $wpdb;
    $join .= " LEFT JOIN ".$wpdb->postmeta." AS case_ids ON (".$wpdb->posts.".ID = case_ids.post_id AND case_ids.meta_key = \'extranet_client_area\') 
               LEFT JOIN ".$wpdb->posts." AS case_names ON (case_names.ID = case_ids.meta_value) ";
    return $join;           
}

function extranet_clientdocument_case_fields($fields) {
    $fields.=", case_names.post_title";
    return $fields;
}

function extranet_clientdocument_case_order($order_by) {
    if(isset($_GET[\'order\'])) $direction = $_GET[\'order\'];
    else $direction = \'ASC\';
    $order_by = \'case_names.post_title \'.$direction;
    return($order_by);  
}
这在使列按相关自定义帖子的帖子名称而不是元数据本身排序方面起到了作用。然而,它带来了一个新的问题,即被列出的主要职位的标题(通常是第二列)现在变成了相关职位的职位标题。我使用以下附加代码修复了此问题:

function restore_original_title($title) {
    global $wpdb;
    $post_id = get_the_ID();
    $get_document_name = $wpdb->get_results(\'SELECT * FROM `wp_posts` WHERE `ID` = \'.$post_id);
    $title = $get_document_name[0]->post_title;
    return $title;          
}
并添加了以下附加过滤器:

add_filter( \'the_title\', \'restore_original_title\', 10, 2 );

SO网友:phil

(我本来打算加上这个作为评论,因为这不是一个完整的答案,但我还不能…)

我认为您需要使用SQL查询,因为标准的meta\\u查询/orderby无法工作。看看Custom Table Column Sortable by Taxonomy Queryhttp://wpdreamer.com/2014/04/how-to-make-your-wordpress-admin-columns-sortable/#sorting-posts-option-b 举几个例子。

结束

相关推荐

Sort order in get_posts

我创建了一个custom template 对于客户。这将是一个多站点安装上的多语言站点设置。正如你在每个分类字母下看到的,帖子都是按字母顺序开始的,但“M”和“O”都不正常。如果您使用顶部的字母栏点击这些类别,这些帖子将按字母顺序排列。两个页面使用相同的代码,所以我不知道我做错了什么。我有一种感觉,我在某处有一个查询冲突,但我找不到它。下面是进行排序的代码:<section class=\"atozlist\"> <?php $newargs =