web-dev-qa-db-fra.com

Post ancêtre et post enfant dans un type de post personnalisé

enter image description here

Structure hiérarchique du type d'article personnalisé "Livre" (par exemple).

Quand nous sommes sur Post 2-95, je veux savoir:

  • Le poste a-t-il cet ancêtre (Post 1-31)?
  • At-il des publications enfants (Post 3-19, Post 3-10)?

Ensuite, s'il a:

  • un post ancêtre: récupérer (objet) de ce post.
  • un enfant messages: récupérer (objets) de ces articles.
2
Vital

Étant donné un article représenté par un objet article $p, vous pouvez savoir si l'article 31 est le parent via:

if($p->post_parent == 31){
    // it is!
} else {
    // it isn't
}

Pour comprendre les parents, quelque chose comme:

$posts = get_posts(array(
    'post_parent' => $p->ID,
    'post_type'   => $p->post_type
));
// if there are children, they will be contained in `$posts`

Enfin, pour déterminer le nombre de niveaux au plus profond de la hiérarchie, vous devrez redéfinir la hiérarchie $p->parent_post == 0, puis compter combien de fois vous avez dû le faire.

par exemple.

$level = 1;
while($parent->parent_post != 0){
    $level++;
    $parent = get_post($parent->parent_post);
}
1
Tom J Nowell

Vérifier si le poste actuel est dans la plage

Nous vérifions avec la fonction, si nous sommes ...

  • dans la boucle?
  • dans la plage définie?

Collez toutes les fonctions de votre fichier functions.php.

function wpse52285_is_post_in_range( $post, int $range_from, int $range_to )
{
    // If we're IN the LOOP @link http://codex.wordpress.org/Function_Reference/in_the_loop
    if ( ! in_the_loop() )
        return false;

    // Abort if not in the allowed range
    if ( ! in_array( $post->ID, range( $range_from, $range_to ) ) )
        return false;

    return true;
}

Vérifiez si nous avons des enfants à portée

Nous vérifions, si nous ...

  • sont dans la boucle?
  • a obtenu des enfants du type de message requis (n'importe quel type de message personnalisé, message, page, pièce jointe, lien, etc.)
  • les enfants sont à portée de main?

Si rien n'a été trouvé, nous retournons false afin de faciliter le contrôle.

function wpse52285_get_children_in_range( $post, int $range_from, int $range_to, $post_type = 'post' )
{
    if ( ! in_the_loop() )
        return false;

    // get_children() @link http://codex.wordpress.org/Function_Reference/get_children
    $children = get_children( "post_parent={$post->ID}&post_type={$post_type}" );
    if ( 0 < count( $children ) )
    {
        foreach ( $children as $child )
        {
            in_array( $id, range( $range_from, $range_to ) ) AND $in_range[] = $child;
        }
        if ( 0 < count( $in_range ) )
            return $in_range;
    }

    return false;
}

Vérifiez si nous avons des ancêtres

Nous vérifions, si ...

  • nous sommes au courant?
  • nous avons des ancêtres?
  • les ancêtres sont à portée?

Si rien ne se rencontre, nous retournons à nouveau false.

function wpse52285_get_ancestors_in_range( $post, int $range_from, int $range_to )
{
    if ( ! in_the_loop() )
        return false;

    // get_post_ancestors @link http://codex.wordpress.org/Function_Reference/get_post_ancestors
    $ancestors = get_post_ancestors( $post->ID );
    foreach ( $ancestors as $ancestor )
    {
        in_array( $ancestor->ID, range( $range_from, $range_to ) ) AND $in_range[] = $ancestor;
    }
    if ( 0 < count( $in_range ) )
        return $in_range;

    return false;
}

Modèle

Maintenant, nous pouvons l’utiliser dans n’importe quel modèle comme celui-ci:

// The loop
if have_posts() : while( have_posts() ): the_post();
    global $post;

    // Is our current post in range?
    if ( wpse52285_is_post_in_range( $post, 2, 95 ) )
    {
        // Are any child posts in range?
        $children = wpse52285_get_children_in_range( $post, 3, 19 );
        if ( $children )
        {
            // Do stuff with the children
        }

        // Are any ancestors in range?
        $ancestors = wpse52285_get_ancestors_in_range( $post, 1, 31 );
        if ( $ancestors )
        {
            // Do stuff with the ancestors 
        }
    }
endwhile;
endif;
3
kaiser