web-dev-qa-db-fra.com

trier les pages enfants sur admin

J'ai un CPT hiérarchique avec la structure suivante:

- 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

chaque élément enfant a une clé méta appelée "section_id" qui est numérique et correspond à son ordre dans le parent. Les timbres à date sont à environ 5 minutes les uns des autres.

ce que je veux faire, c'est trier chaque article parent par ordre de date décroissant, ALORS les articles enfants par ordre de date croissant ou par la meta section_id (cela fonctionnera, car ils produiront les mêmes résultats).

exécuter un pre_get_posts ou parse_query me permet de faire l’un ou l’autre, mais pas les deux. Est-il possible de faire cela?

note ceci ne concerne que la table des posts de l'administrateur, pas le front-end.

6
Norcross

Comme je ne pouvais trouver aucun filtre pour remplacer la classe WP_Posts_List_Table, je propose une solution assez compliquée en procédant comme suit:

  1. Interroger uniquement les parents dans pre_get_posts;
  2. Interrogez leurs enfants sur wp et changez $wp_query->posts en conséquence.

Cela pourrait nécessiter un peu plus de travail car je suis probablement en train de casser des chiffres de pagination.

// 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 );

}
1
vmassuchetto

Si vous souhaitez trier les publications hiérarchiques, la méthode la plus simple consiste à utiliser le champ "Commande". Cela vous permettra de réorganiser l'ordre des publications enfants comme vous le souhaitez. Au lieu de 1,2,3, ... je vous recommande d'utiliser 10,20,30, ... en laissant de la place pour les modifications futures.

Ce serait bien, bien sûr, si Wordpress offrait une interface glisser-déposer pour rendre cette tâche facile, mais pour autant que je sache, il n'y en a pas (ou peut-être un plugin).

Ce n'est pas exactement ce que vous avez demandé (la possibilité de faire deux types de tri dans une liste), mais j'espère que cela permettra d'atteindre votre objectif final.

0
Eugenious