作为我问题的背景:在我的页面列表中,我有一组属于国家的页面,这些页面的子页面被分类为“类型”。我有一个这样的页面结构:
Country 1
-- Resource
-- Resource
-- Organisation
-- Overview
Country 2
-- Overview
-- Overview
-- Overview
-- Organisation
Country 3
.
.
.
我添加了一些额外的过滤器,以仅显示选定国家/地区的子页面,当此过滤器运行时,会显示一个额外的列,以显示页面的“类型”。我还添加了必要的代码以使此列可排序。所以我的代码如下:
// Add Type column
add_filter(\'manage_pages_columns\', \'my_columns\');
function my_columns($columns) {
if(!empty($_GET[\'country\']) && empty($_GET[\'type\'])) {
$column_type = array(\'type\' => \'Type\');
$columns = array_slice($columns, 0, 2, true) + $column_type + array_slice($columns, 3, NULL, true);
}
return $columns;
}
// Populate Type column
add_action(\'manage_pages_custom_column\', \'my_show_columns\');
function my_show_columns($name) {
if(!empty($_GET[\'country\']) && empty($_GET[\'type\'])) {
global $post;
switch ($name) {
case \'type\':
$type = get_field(\'type\', $post->ID);
echo $type;
}
}
}
// Make Type column sortable
add_filter(\'manage_edit-page_sortable_columns\', \'my_website_manage_sortable_columns\');
function my_website_manage_sortable_columns($sortable_columns) {
if(!empty($_GET[\'country\']) && empty($_GET[\'type\'])) {
$sortable_columns[\'type\'] = \'type\';
}
return $sortable_columns;
}
// Add sort logic
add_filter(\'request\', \'type_column_orderby\');
function type_column_orderby($vars) {
if (isset($vars[\'orderby\']) && \'type\' == $vars[\'orderby\']) {
$vars = array_merge( $vars, array(
\'meta_key\' => \'type\',
\'orderby\' => \'meta_value\'
));
}
return $vars;
}
因此,我可以对类型ASC或DESC进行精细排序,但如何恢复到页面列表的默认排序,其中显示了页面的缩进层次结构?
最合适的回答,由SO网友:Sumit 整理而成
默认情况下,页面按顺序排列menu_order
然后title
. 添加过滤器时country
您订购的是meta_value
有两种选择
删除您添加的所有内容country
和orderby
页面将返回到默认顺序如果无法删除orderby
但可以删除country
然后以这种方式调整代码,并通过menu_order title
仅当国家/地区未设置且orderby
是type
.更新的代码:-
function type_column_orderby($vars) {
// You can also wrap this code in one more condition using $vars to only alter page list!
if (!empty($_GET[\'country\']) && isset($vars[\'orderby\']) && \'type\' == $vars[\'orderby\']) {
$vars = array_merge( $vars, array(
\'meta_key\' => \'type\',
\'orderby\' => \'meta_value\'
));
} else if (empty($_GET[\'country\']) && isset($vars[\'orderby\']) && \'type\' == $vars[\'orderby\']) {
$vars = array_merge( $vars, array(
\'orderby\' => \'menu_order title\',
\'posts_per_page\' => -1
));
}
return $vars;
}
注:
request
过滤器会影响每个查询,因此请将过滤器包装在
load-edit.php
仅更改post类型列表查询的操作。
add_action( \'load-edit.php\', \'custom_page_order\' );
function custom_page_order() {
add_filter(\'request\', \'type_column_orderby\');
}