我已经创建了一些自定义列,以便在管理部分更吸引人地显示我的自定义帖子类型-这些列主要是自定义字段。大多数情况下,这工作非常好,我可以按预期的自定义字段列进行排序。
但是,其中一个自定义字段指向不同帖子类型的帖子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;
}
最合适的回答,由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 );