从管理页面列表中删除自定义排序顺序

时间:2016-03-15 作者:Adam Lobo

作为我问题的背景:在我的页面列表中,我有一组属于国家的页面,这些页面的子页面被分类为“类型”。我有一个这样的页面结构:

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进行精细排序,但如何恢复到页面列表的默认排序,其中显示了页面的缩进层次结构?

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

默认情况下,页面按顺序排列menu_order 然后title. 添加过滤器时country 您订购的是meta_value

有两种选择

删除您添加的所有内容countryorderby 页面将返回到默认顺序orderby 但可以删除country 然后以这种方式调整代码,并通过menu_order title 仅当国家/地区未设置且orderbytype.更新的代码:-

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\');
}

相关推荐

显示作者姓名PHP(自制插件)

我有一个需要帮助的问题,因为我自己找不到解决办法。我接管了一个网站,之前有人在那里创建了一个自制插件。。使用默认插件“Contact Form 7”,用户可以在页面上创建帖子。()https://gyazo.com/c8b20adecacd90fb9bfe72ad2138a980 )关于自行创建的插件“Contact Form 7 extender”,帖子是通过PHP代码在后台生成的(https://gyazo.com/115a6c7c9afafd2970b66fd421ca76a3)其工作原理如下:如果