WP는 wp 쿼리를 사용하여 부모의 모든 하위 페이지를 가져옵니다.


13

여기 내 코드가 있습니다

$my_wp_query = new WP_Query();
$all_wp_pages = $my_wp_query->query(array('post_type' => 'page','post_parent'=>$parid,'orderby'=>'title','order'=>'ASC' ));

첫 번째 수준의 하위 페이지 만 표시합니다. 모든 하위 페이지, 하위의 하위 페이지 ... 및 모두가 필요합니다. 나는 해결책을 찾았고 get_pages와 wp_list_pages를 사용하여 모든 하위 페이지를 얻을 수 있습니다.

그러나 실제로 사용자 정의 포스트 메타 값으로 주문을 정렬해야합니다. 그래서 나는 사용자 정의 쿼리를 사용해야합니다.

도와주세요. 감사


1
아래에서 답변을 찾았습니다. 무엇입니까?
Drew Baker

4
get_page_children 을 체크 아웃 습니까?
t31os

답변:


6

왜 사용하지 get_pages()않습니까?

예 :

<?php
// Determine parent page ID
$parent_page_id = ( '0' != $post->post_parent ? $post->post_parent : $post->ID );
// Get child pages as array
$page_tree_array = get_pages( array(
    'child_of' => $parent_page_id;
) );
?>

그러나 실제로 WP_Query()객체 이어야 하는 경우 비슷한 방법을 사용하십시오.

<?php
// Determine parent page ID
$parent_page_id = ( '0' != $post->post_parent ? $post->post_parent : $post->ID );
// Build WP_Query() argument array
$page_tree_query_args = array(
    'post_parent' => $parent_page_id;
);
// Get child pages as a WP_Query() object
$page_tree_query = new WP_Query( $page_tree_query_args );
?>

get_pages () 기능을 사용하면 사용자 정의 필드에 대한 정렬 (sort_column)을 구현할 수 없습니다. 포스트 테이블 필드 만 허용합니다. 사용자 정의 필드 정렬을 구현해야합니다. 그래서 나는 오직 wp query ()를 사용합니다. 다른 방법이 있습니까?
phpuser

내 대답의 후반부를 보았습니까 WP_Query()?
칩 베넷

이 코드를 시도했지만 첫 번째 수준의 하위 페이지 만 반환합니다. 하위 페이지 >> 하위의 하위 >> 등이 필요합니다 (여러 하위 레벨의 페이지). 마지막으로 해결책을 찾았습니다. 답장을 보내 주셔서 감사합니다
phpuser

7
당신의 해결책은 무엇입니까!?
JCHASE11

위의 배열 정의 안에 구문 오류가 발생하는 세미콜론이 있습니다.
ptrin

4

문제

파악하는 데 문제가있는 것은 "X는 어떻게합니까?"입니다. 이것은 1 단계 조치가 아니며 다단계 프로세스이므로 분리해야합니다.

이 작업을 수행 할 필요가 없습니다.

get all the posts that are a child of X ordered by meta

이 작업을 수행해야합니다.

get all the posts that are a child of X
    for each child, get all the posts that are a child
        foreach child of that child get all the posts that are a child
            ...
                hmmm we don't have any more children left

Take our list of posts and order them by meta

일반적인 해결책

따라서 하드 코딩없이 끝까지 도달 할 때까지 무한히 수행하는 방법을 이해하려면 재귀 함수를 이해해야합니다.

예 :

function make_zero( $amount ) {
    $amount = $amount - 1;
    if ( $amount > 1 ){
        return make_zero( $amount );
    }
    return $amount;
}

솔루션에 대해이 문제에 재귀 적용

따라서 부모님은 $parid이고 게시물 메타에는 키가 $metakey있습니다.

그것을 자식을 잡는 함수에 전달하자.

$children = get_children_with_meta( $parid, $metakey );

그런 다음 $ children 배열을 정렬하고 키는 게시물 ID가되고 값은 메타 값이됩니다.

asort($children);

함수를 다음과 같이 정의하십시오.

function get_children_with_meta( $parent_id, $metakey ) {
    $q = new WP_Query( array( 'post_parent' => $parent_id, 'meta_key' => $metakey ));
    if ( $q->have_posts() ) {
        $children - array();
        while ( $q->have_posts() ) {
            $q->the_post();
            $meta_value = get_post_meta(get_the_ID(), $metakey, true );
            $children[get_the_ID() ] = $meta_value;
        }
        return $children;
    } else {
        // there are no children!!
        return array();
    }
}

이렇게하면 가장 낮은 순서에서 높은 순서로 일련의 게시물 ID 및 값이 제공됩니다. 다른 PHP 정렬 함수를 사용하여 최고에서 최저로 수행 할 수 있습니다.

이제 어린이 어린이는 어떻습니까?

루프 중간에 부모 ID가 아닌 자식을 전달하여 재귀 호출을해야합니다.

그래서 이건:

$q->the_post();
$meta_value = get_post_meta(get_the_ID(), $metakey, true );
$children[get_the_ID() ] = $meta_value;

이것이된다 :

$q->the_post();
$meta_value = get_post_meta(get_the_ID(), $metakey, true );
$children[get_the_ID() ] = $meta_value;

// now get the childrens children
$grandchildren = get_children_with_meta( get_the_ID(), $metakey );

// merge the grandchildren and the children into the same list
$children = array_merge( $children, $grandchildren );

이 수정으로 함수는 이제 어린이, 어린이 어린이, 어린이 어린이 어린이 등을 검색합니다.

마지막으로 배열의 값을 잘라내어 다음과 같은 ID를 얻을 수 있습니다.

$post_ids = array_keys( $children );
$q = new WP_Query( array( 'post__in' => $post_ids );
// etc

이 전략을 사용하면 메타 키 값을 다른 메트릭으로 바꾸거나 다른 방식으로 재귀 함수를 사용할 수 있습니다.

전체 코드는 몇 초의 기본 이해와 빠른 복사 붙여 넣기 만 필요하므로 전체 복사 붙여 넣기 코드 블록으로 지능을 손상시키지 않습니다.

장점

  • 모든 게시물 유형 및 데이터 형식에 대한 수정 작업
  • 중첩 마크 업을 생성하도록 수정 가능
  • 반환 된 배열을 과도 상태로 만들어 속도를 높이기 위해 쉽게 캐시
  • 최종 WP_Query에 페이징을 적용하여 페이징으로 설정 가능

당신이 겪을 문제

  • 당신이 그들을 찾을 때까지 얼마나 많은 아이들이 있는지 알 수있는 방법이 없으므로 성능 비용이 확장되지 않습니다
  • 당신이 원하는 것은 많은 쿼리를 생성 할 것이고, 잠재적 인 깊이가 있기 때문에 본질적으로 비용이 많이 든다.

내 추천

페이지 계층 구조를 병합하거나 분류법을 대신 사용하는 것이 좋습니다. 예를 들어 게시물을 평가하는 경우 1,2,3,4 및 5와 같은 용어로 페이지 등급 분류법을 사용하십시오. 그러면 즉시 게시 된 게시물 목록이 제공됩니다.

또는 탐색 메뉴를 사용하고이 문제를 완전히 무시하십시오.


3

재귀 적으로 모든 현재 서브 페이지 가져 오기

다음은를 사용하는 재귀 적 접근 방식 get_children입니다. 당신의 다음을 넣어 functions.php:

function get_all_subpages($page, $args = '', $output = OBJECT) {
    // Validate 'page' parameter
    if (! is_numeric($page))
        $page = 0;

    // Set up args
    $default_args = array(
        'post_type' => 'page',
    );
    if (empty($args))
        $args = array();
    elseif (! is_array($args))
        if (is_string($args))
            parse_str($args, $args);
        else
            $args = array();
    $args = array_merge($default_args, $args);
    $args['post_parent'] = $page;

    // Validate 'output' parameter
    $valid_output = array(OBJECT, ARRAY_A, ARRAY_N);
    if (! in_array($output, $valid_output))
        $output = OBJECT;

    // Get children
    $subpages = array();
    $children = get_children($args, $output);
    foreach ($children as $child) {
        $subpages[] = $child;

        if (OBJECT === $output)
            $page = $child->ID;
        elseif (ARRAY_A === $output)
            $page = $child['ID'];
        else
            $page = $child[0];

        // Get subpages by recursion
        $subpages = array_merge($subpages, get_all_subpages($page, $args, $output));
    }

    return $subpages;
}

이것을 어떻게 사용 하는가

예를 들어 다음과 같이 원하는 곳에서 위 기능을 사용하십시오.

$all_current_subpages = get_all_subpages(0);

이 함수는 args매개 변수 (쿼리 문자열 또는 배열) 및 output유형 (위 참조)을 지원합니다.

따라서 다음과 같이 사용할 수도 있습니다.

$args = array(
    'post_status' => 'private',
    'order_by' => 'post_date',
    'order' => 'DESC',
);
$all_current_subpages = get_all_subpages(42, $args, ARRAY_A);

그리고 종속성 get_children=> get_posts=> WP_Query때문에이 질문의 작성자가 처음 요청한대로 메타 값을 사용할 수 있습니다.



2

부모 페이지의 모든 자식 ID를 가져 오는 재귀 함수를 만들었습니다. ID가 있으면 페이지를 쿼리하고 메타 키 / 값별로 결과를 정렬 할 수 있습니다.

// Gets all the children ids of post_parent
function _get_children_ids( $post_parent ) {
    $results = new WP_Query( array(
        'post_type' => 'page',
        'post_parent' => $post_parent
    ) );

    $child_ids = array();
    if ( $results->found_posts > 0 )
        foreach ( $results->posts as $post ) // add each child id to array
            $child_ids[] = $post->ID;

    if ( ! empty( $child_ids ) )
        foreach ( $child_ids as $child_id ) // add further children to array
            $child_ids = array_merge( $child_ids, _get_children_ids( $child_id ) );

    return $child_ids;
}

$children_ids = _get_children_ids( 9 ); // use your numeric page id or get_the_id()

$results = new WP_Query( array(
    'post_type'   => 'page',
    'post__in'   => $children_ids
    #'meta_key'   => 'meta_key', // your meta key
    #'orderby'    => 'meta_key',
    /* 'meta_query' => array( // optional meta_query
        array(
            'key' => 'meta_key', // key
            'value' => array(3, 4), // values
            'compare' => 'IN', // operator
        )
    ) */
) );

var_dump( $results );

하위 키를 계층 적 방식으로 메타 키 / 값별로 정렬해야하는 경우, 최종 WP_Query 대신 _get_children_ids 함수의 WP_Query에 meta_key 및 order_by 값을 전달해야합니다.

그렇지 않은 경우 모든 자식 ID를 얻는 간단한 방법은 다음과 같습니다.

$children = get_pages( 'child_of=9');

$children_ids = array();
if ( ! empty( $children ) )
    foreach ( $children as $post )
        $children_ids[] = $post->ID;

-1

이 작업을 수행하면 페이지에 코드를 붙여 넣습니다 .PHP 파일

//REDIRECT TO FIRST CHILD FROM PARENT PAGE

// Build WP_Query() argument array
$page_tree_query_args = array(
    'post_parent' => $post -> ID,
    'post_type' => 'page',
    'order' => 'asc'
);
// Get child pages as a WP_Query() object
$page_tree_query = new WP_Query( $page_tree_query_args );
if(!empty($page_tree_query -> posts)){
    $first_subpage = $page_tree_query -> posts[0] -> ID;
    wp_redirect( get_permalink( $first_subpage ) );
    exit;   
}

이것은 A) 작동하지 않습니다 ( $post -> ID?), B) 요청한 것이 아니며, C) 잘 설명되지 않았습니다.
tfrommen
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.