문제
파악하는 데 문제가있는 것은 "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와 같은 용어로 페이지 등급 분류법을 사용하십시오. 그러면 즉시 게시 된 게시물 목록이 제공됩니다.
또는 탐색 메뉴를 사용하고이 문제를 완전히 무시하십시오.