web-dev-qa-db-ja.com

カスタム投稿タイプでの投稿先祖と子投稿

enter image description here

カスタム投稿タイプ "Book"の階層構造(たとえば)。

私達がPost 2-95にいるとき、私は知りたいです:

  • 投稿にこの投稿の祖先(Post 1-31)がいますか?
  • 子投稿はありますか(Post 3-19Post 3-10)。

それがあれば:

  • 先祖投稿:この投稿の取得(オブジェクト)。
  • 子投稿:これらの投稿の(オブジェクト)を取得します。
2
Vital

投稿オブジェクト$pで表される投稿を考えると、投稿31が親であるかどうかを調べることができます。

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

両親を把握するには、次のようにします。

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

最後に、自分の階層の深さがいくつあるかを判断するには、階層の$p->parent_post == 0を再帰し、それを実行するのに必要な回数を数える必要があります。

例えば.

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

現在の投稿が範囲内かどうかを確認

我々がそうであるならば、我々は機能でチェックします...

  • ループの中?
  • 設定範囲内?

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;
}

子供たちが範囲内にいるかどうか確認する

我々がチェックすれば...

  • ループの内側にありますか?
  • 必要な投稿タイプの子を取得しました(任意のカスタム投稿タイプ、投稿、ページ、添付ファイル、リンクなど)。
  • 子供たちは範囲内にいますか?

何も見つからなかった場合はfalseを返すので、チェックを簡単にすることができます。

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;
}

先祖が来たかどうか確認する

確認したら...

  • 我々はループに入っている?
  • 私たちは先祖を手に入れた?
  • 先祖は範囲内にいますか?

何も満たさない場合は、再び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;
}

テンプレート

これで、これを次のような任意のテンプレートで使用できます。

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