我有一个类似的问题,并设法解决了它。在我的例子中,我有一个自定义的分类法,issue
, 其中包含使用ACF PRO 插件字段名称为issue_date
. 我想将日期列添加到issue
编辑屏幕位于wp-admin/edit-tags.php?taxonomy=issue
我想让管理员按日期对问题进行排序。
我试着pre_get_posts
正如上面@aifrim所回答的,但当WordPress将分类术语加载到编辑屏幕时,该操作不是查询的一部分。此外,分类术语在WordPress数据库中没有任何本机元数据,因此meta_query
不会工作,因为我的元数据存储在另一个表中。一个有趣的曲球。
Step 1: 创建新列本身,最初将为空
function create_date_column_for_issues($issue_columns) {
$issue_columns[\'date\'] = \'Date\';
return $issue_columns;
}
add_filter(\'manage_edit-issue_columns\', \'create_date_column_for_issues\');
Step 2: 填充新列
function populate_date_column_for_issues($value, $column_name, $term_id) {
$issue = get_term($term_id, \'issue\');
$date = DateTime::createFromFormat(\'Ymd\', get_field(\'issue_date\', $issue));
switch($column_name) {
case \'date\':
$value = $date->format(\'Y/m/d\');
break;
default:
break;
}
return $value;
}
add_filter(\'manage_issue_custom_column\', \'populate_date_column_for_issues\', 10, 3);
Step 3: 使新列可排序
function register_date_column_for_issues_sortable($columns) {
$columns[\'date\'] = \'issue_date\';
return $columns;
}
add_filter(\'manage_edit-issue_sortable_columns\', \'register_date_column_for_issues_sortable\');
Step 4: 定义自定义排序(神奇之处)
function sort_issues_by_date($pieces, $taxonomies, $args) {
global $pagenow;
if(!is_admin()) {
return $pieces;
}
if(is_admin() && $pagenow == \'edit-tags.php\' && $taxonomies[0] == \'issue\' && (!isset($_GET[\'orderby\']) || $_GET[\'orderby\'] == \'issue_date\')) {
$pieces[\'join\'] .= " INNER JOIN wp_options AS opt ON opt.option_name = concat(\'issue_\',t.term_id,\'_issue_date\')";
$pieces[\'orderby\'] = "ORDER BY opt.option_value";
$pieces[\'order\'] = isset($_GET[\'order\']) ? $_GET[\'order\'] : "DESC";
}
return $pieces;
}
add_filter(\'terms_clauses\', \'sort_issues_by_date\', 10, 3);
步骤4中的条件语句也将按降序排序
issue_date
当没有设置其他排序条件时,作为默认排序。
我希望这能帮助其他人获得更好的管理体验!