Structure hiérarchique du type d'article personnalisé "Livre" (par exemple).
Quand nous sommes sur Post 2-95
, je veux savoir:
Post 1-31
)?Post 3-19
, Post 3-10
)?Ensuite, s'il a:
É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);
}
Nous vérifions avec la fonction, si nous sommes ...
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;
}
Nous vérifions, si nous ...
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;
}
Nous vérifions, si ...
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;
}
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;