web-dev-qa-db-fra.com

Comment obtenir tous les enfants et petits enfants d'un type de message personnalisé hiérarchisé?

Je dois obtenir tous les sous-postes d'un identifiant parent spécifique (racine).

get_posts( array( 'numberposts' => -1, 'post_status' => 'publish', 'post_type' => 'microsite', 'post_parent' => $root_parent_id, 'suppress_filters' => false ) );

WP-Codex: get_post () function a le paramètre post_parent mais pas de paramètre child_of.

L'avantage de la fonction get_pages () en combinaison avec le paramètre child_of est "... Notez que le paramètre child_of récupère également les" petits-enfants "de l'ID donné, pas uniquement les descendants directs." *

7
Paul Geisler

Vous devrez parcourir ces publications en boucle, puis multiplier les requêtes pour chaque publication, jusqu'à ce que vous ne trouviez aucune publication dans une requête.

par exemple.

function get_posts_children($parent_id){
    $children = array();
    // grab the posts children
    $posts = get_posts( array( 'numberposts' => -1, 'post_status' => 'publish', 'post_type' => 'microsite', 'post_parent' => $parent_id, 'suppress_filters' => false ));
    // now grab the grand children
    foreach( $posts as $child ){
        // recursion!! hurrah
        $gchildren = get_posts_children($child->ID);
        // merge the grand children into the children array
        if( !empty($gchildren) ) {
            $children = array_merge($children, $gchildren);
        }
    }
    // merge in the direct descendants we found earlier
    $children = array_merge($children,$posts);
    return $children;
}

// example of using above, lets call it and print out the results
$descendants = get_posts_children($post->ID);
echo '<pre>';
print_r($descendants);
echo '</pre>';

Oui, la fonction ci-dessus s’appelle elle-même, c’est une fonction récursive. Il continuera à s’appeler lui-même jusqu’à atteindre un point où le poste examiné n’aura plus d’enfants, puis il reviendra sans s’appeler lui-même et la pile entière remontera à l’augmentation du nombre d’enfants. Vous feriez bien de faire des recherches plus poussées dans ce domaine.

Notez qu'il existe un coût inhérent à ce que vous voulez, que vous utilisiez des fonctions récursives ou non, qui est lié au nombre de niveaux de messages que vous avez. 5 niveaux de postes seront plus coûteux que 2, et ce n'est pas une mise à l'échelle linéaire. Vous voudrez peut-être utiliser des éléments transitoires pour mettre en cache votre sortie, en fonction de la procédure.

Un autre moyen de réduire les coûts consiste à ne regarder dans l’arbre des publications qu’un certain nombre de niveaux, par exemple. petits-enfants mais pas d’arrière petits-enfants. Cela peut être fait en passant un paramètre de profondeur et en le décrémentant à chaque appel récursif, en veillant à renvoyer un tableau vide au début si la profondeur est égale ou inférieure à 0. De nombreux tutoriels sur les fonctions récursives l'utilisent à titre d'exemple.

9
Tom J Nowell

Utilisez simplement get_page_children() . Cela fonctionne pour chaque type de message (pas seulement les pages) et est fondamentalement ce que @TomJNowell a montré dans l'autre question, mais déjà mis en œuvre par core.

$children = get_page_children( $post->ID, $GLOBALS['wp_query'] );

L’échantillon ci-dessus est semblable au Codex. C'est pourquoi vous pouvez simplement utiliser l'objet de requête global (ou tout autre objet de requête) comme base de recherche.

0
kaiser

Utilisez le code court suivant pour afficher tous les enfants et petits-enfants dans une vue hiérarchique. Utilisation: [my_children_list] ou [my_children_list page_id = 123]

function my_children_list_func($atts, $content = null) {
    global $post;

    $a = shortcode_atts( array(
            'page_id' => ''
    ), $atts );

    $args = array( 
            'numberposts' => -1, 
            'post_status' => 'publish', 
            'post_type' => 'microsite', 
            'post_parent' => (isset($a['page_id']) && $a['page_id']) ? $a['page_id'] : $post->ID,
            'suppress_filters' => false 
    );

    $parent = new WP_Query( $args );

    ob_start();

    if ( $parent->have_posts() ) :?>
            <ul>
            <?php while ( $parent->have_posts() ) : $parent->the_post(); ?>
                    <li><a href="<?php the_permalink(); ?>" title="<?php the_title(); ?>"><?php the_title(); ?></a>
                    <?php echo do_shortcode('[tadam_children_list page_id='.get_the_ID().']') ?>
                    </li>
            <?php endwhile;?>
            </ul>
    <?php endif; wp_reset_postdata();

    return ob_get_clean();
}
add_shortcode( 'my_children_list', 'my_children_list_func' );
0
Adam Pery