Проблема
У вас виникають проблеми з розумінням: "Як зробити X?" Це не одноетапна дія, це багатоступеневий процес, і його потрібно розбити.
Вам цього не потрібно:
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 );
Тоді ми відсортуємо дочірній масив $, ключі будуть ідентифікаторами пошти, а значення - метазначеннями.
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();
}
}
Це дає вам масив ідентифікаторів та значень публікацій, упорядкованих від найнижчих до найвищих. Ви можете використовувати інші функції сортування PHP, щоб зробити це від найвищого до нижнього.
Тепер що робити з дітьми дітей?
У середині нашого циклу нам потрібно здійснити рекурсивний дзвінок, передаючи дитині, а не батьківському ідентифікатору.
Отже це:
$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 );
За допомогою цієї модифікації тепер функція отримує дітей, дітей, дітей, дітей, дітей ..... і т.д.
Наприкінці ви можете обрізати значення масиву, щоб отримати такі ідентифікатори:
$post_ids = array_keys( $children );
$q = new WP_Query( array( 'post__in' => $post_ids );
// etc
За допомогою цієї стратегії ви можете замінити значення мета-ключа будь-яким іншим показником або використовувати рекурсивні функції іншими способами.
Оскільки повний код вимагає лише декількох секунд основного розуміння та швидкої копії пасти, я не буду ображати ваш інтелект повним блоком коду вставлення коду.
Переваги
- З модифікацією працює для будь-якого типу та форми даних
- Можна змінити для створення вкладеної розмітки
- Легко кешуйте, щоб пришвидшити, поміщаючи повернені масиви в перехідні періоди
- Можна налаштувати за допомогою підкачки, застосувавши підкачку до кінця WP_Query
Проблеми, з якими ви зіткнетесь
- Ви не можете дізнатися, скільки дітей є, поки ви їх не знайшли, тому витрати на продуктивність не зменшуються
- Те, що ви хочете, генерує безліч запитів і по суті коштує дорого через потенційні глибини.
Моя рекомендація
Я рекомендую вам або вирівняти ієрархію сторінки, або скористатися таксономією. Наприклад, якщо ви оцінюєте повідомлення, вкажіть таксономію рейтингу сторінок з умовами 1,2,3,4 та 5 тощо. Це забезпечить вам публікацію публікацій поза полем.
Крім того, використовуйте навігаційні меню та цілком обходьте цю проблему