web-dev-qa-db-ja.com

ページ/現在のページの直接の子ではなく、孫だけを取得しますか?

私は今javascriptをかなりよく知っていますが、私はphpとwordpressのテーマ構築に慣れていません。私はかなりの部分を検索しましたが、非常に単純なタスクのように思える何かの解決策を見つけることができません、私が達成したいのはページの孫だけで、直接の子供たちではありません。

ポートフォリオ

  • 子供1
    • 孫1A
    • 孫1B
  • 子供2
    • 孫2A
    • 孫2B

私のページは "Portfolio"で、 "get_pages"を使用したいのですが、 "Portfolio"の孫であるものだけを使用しています。したがって、この場合は次のページしか返されません。 - "grandchild 1A"、 "grandchild 1B"、 "grandchild 2A"、 「孫2B」.

助言がありますか?

2

これを行うためのネイティブな方法はありません。最も簡単な方法は次のとおりです。

  • 渡されたページIDの階層内のすべてのページを単純に照会する

  • 次に、配列内のすべてのページからすべての親ID(投稿オブジェクトの $ post_parentプロパティ )を返します。

  • ページをループして、ページIDを親IDの配列内のIDと比較します。

  • 親IDの配列にIDがあるページはすべてスキップして除外します。

  • iDが親ID配列に含まれていないページ。新しい配列を作成するためにこれを使用します。これらのページは最低レベルのページになります。

最も簡単な方法は、任意のページテンプレートで呼び出すことができる独自のカスタム関数を構築することです。これが関数です:

function get_lowest_level_pages( $page_id = '' )
{
    // Check if we have a page id, if not, return false
    if ( !$page_id )
            return false;

    // Validate the page id
    $page_id = filter_var( $page_id, FILTER_VALIDATE_INT );

    // Check if this is a page, if not, return false
    if ( !is_page() )
        return false;

    // Get all pages in hierarchy of the current page
    $args = [
        'child_of' => $page_id,
    ];
    $q = get_pages( $args );

    // Check if there are pages, if not, return false
    if ( !$q )
        return false;

    // Use wp_list_pluck to get all the post parents from all return pages
    $parents = wp_list_pluck( $q, 'post_parent' );
    // Set the $new__page_array variable that will hold grandchildren/lowest level pages
    $new__page_array = [];

    // Loop through all the pages
    foreach ( $q as $page_object ) {
        // Simply skip any page if it has child page
        if ( in_array( $page_object->ID, $parents ) )
            continue;

        // Create a new array holding only grandchild pages
        $new__page_array[] = $page_object;
    }

    return $new__page_array; 
}

それから、それを次のように使うことができます:( ちょうどあなたが祖国を得るために必要な親ページのIDを渡すことを忘れないでください

$page_id = get_queried_object_id(); // Returns the current page ID
$q = get_lowest_level_pages( $page_id );

if ( $q ) {
    foreach ( $q as $post ) {
        setup_postdata( $post );

        the_title();

    }
    wp_reset_postdata();
}
2
Pieter Goosen

get_page_children を使用

$all_wp_pages = get_all_page_ids();

// Get the page as an Object
$portfolio = get_page_by_title('Portfolio');

// Filter through all pages and find Portfolio's children
$portfolio_children = get_page_children($portfolio->ID, $all_wp_pages);

foreach ($portfolio_children as $child) {

    $post_data = array('child_of' => $child->ID);
    $grandchild = get_pages($post_data);
}

// echo what we get back from WP to the browser
echo '<pre>' . print_r($grandchild, true) . '</pre>';
1
John Priestakos

これはあなたがアイデアを得ることができるように、このコードをテストしていないので多分あなたは試すべきです。

<?php

    $args = array(
    'post_parent' => 0, //post parent id
    'post_type'   => 'any', 
    'numberposts' => -1,
    'post_status' => 'any' 
); 
    $childen = get_children( $args, OBJECT );

    foreach($children as $child){

      $args = array(
    'post_parent' => $child->ID,
    'post_type'   => 'any', 
    'numberposts' => -1,
    'post_status' => 'any' 
); 
      $grand_children[] = get_children($args, OBJECT);
}

多分あなたはそのように試すことができます。

0
1inMillion