sort child pages on admin

时间:2013-08-29 作者:Norcross

我有一个层次化的CPT,其结构如下:

- parent item 1
   - child item 1
   - child item 2
   - child item 3
   - child item 4
   - child item 5
- parent item 2
   - child item 1
   - child item 2
   - child item 3
   - child item 4
   - child item 5
每个子项都有一个称为“section\\u id”的元键,它是数字,并对应于父项中的顺序。日期戳彼此间隔约5分钟。

我要完成的是按降序日期顺序对每个父项进行排序,然后按升序日期顺序或按meta section\\u id对子项进行排序(两者都可以,因为它们将产生相同的结果)

运行pre_get_postsparse_query 允许我做一个或另一个,但不能同时做两个。有可能做到这一点吗?

note 这仅适用于admin post表,而不是前端。

2 个回复
SO网友:vmassuchetto

因为我找不到任何过滤器来覆盖WP_Posts_List_Table 同学们,我提出了一个相当骇人的解决方案:

仅查询中的父级pre_get_posts;wp 和更改$wp_query->posts 相应地这可能需要更多的工作,因为我可能正在破坏分页编号。

// Use a query variable to control when to change the main admin query
add_filter( \'query_vars\', \'custom_admin_list_query_vars\', 10, 1 );
function custom_admin_list_query_vars( $vars ) {
    array_push( $vars, \'custom_admin_list_children\' );
    return $vars;
}

add_action( \'pre_get_posts\', \'custom_admin_pre_get_posts\' );
function custom_admin_pre_get_posts( $query ) {

    global $post_type;

    // Change query only if it\'s a user-triggered query in admin
    if ( ! is_admin()
        || \'page\' != $post_type
        || $query->get( \'custom_admin_list_children\' ) )
        return false;

    // Query only parents in date order
    $query->set( \'post_parent\', 0 );
    $query->set( \'orderby\', \'post_date\' );
    $query->set( \'order\', \'desc\' );

}

// Query the children of the parents above
add_action( \'wp\', \'custom_admin_list_wp\' );
function custom_admin_list_wp() {

    global $post_type, $wp_query;

    if ( ! is_admin() || \'page\' != $post_type )
        return false;

    $args = array(
        \'post_type\' => \'page\',
        \'numberposts\' => -1,
        \'custom_admin_list_children\' => true,
        \'meta_key\' => \'section_id\',
        \'orderby\' => \'meta_value_num\',
        \'order\' => \'asc\'
    );

    // Get children
    $children = array();
    for( $i = 0; $i < count( $wp_query->posts ); $i++ ) {
        $args[\'post_parent\'] = $wp_query->posts[ $i ]->ID;
        $children[ $i ] = get_posts( $args );
    }

    // Flag as a children with a \'--\' in front of the title
    foreach( $children as &$c ) {
        if ( !empty( $c->post_title ) )
            $c->post_title = \'&mdash;&nbsp;\' . $c->post_title;
    }

    // Put everything together
    $posts = array();
    for( $i = 0; $i < count( $wp_query->posts ); $i++ ) {
        $posts[] = $wp_query->posts[ $i ];
        $posts = array_merge( $posts, $children[ $i ] );
    }

    $wp_query->posts = $posts;
    $wp_query->post_count = count( $posts );

}

SO网友:Eugenious

如果要对分级帖子进行排序,那么最简单的方法就是使用“顺序”字段。这将允许您以任何喜欢的方式重新排列子帖子的顺序。而不是1,2,3,。。。我建议你使用10,20,30,。。。为将来的变化留有空间。

当然,如果Wordpress提供了一个拖放界面,让这项任务变得轻松,那就太好了,但据我所知,没有一个(或者可能有一个插件)。

这并不完全是您所要求的(能够在一个列表中进行两种排序),但希望它能够实现您的最终目标。

结束

相关推荐

我的网站的wp-admin在将站点URL指向一个子目录后重定向到另一个网站的wp-admin

* DETAILS THAT LEAD UP TO MY PROBLEM *我很熟悉WP给WordPress提供自己的codex目录。我正在我的个人网站上进行试验,erons-expressions.com 重定向到不同的子目录。最初,我将WordPress文件加载到它自己的/WordPress子目录中,并成功地将我的站点重定向到它。我正在为一家非营利组织重新设计(wecareabilene.org) 并将使用WP。他们是一个单独的托管帐户,有自己的wp管理员,我需要使用这种方法将他们的站点重定向到全年