Intereting Posts

Wp получает все вспомогательные страницы родителя, используя запрос wp

Вот мой код

$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.

Но мне действительно нужно отсортировать заказ, выполнив мета-значение. Поэтому я должен использовать пользовательский запрос.

пожалуйста помоги. благодаря

Почему бы просто не использовать 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 ); ?> 

Проблема

У вас возникают проблемы с пониманием: «Как мне сделать 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 ); 

Затем мы отсортируем массив $ children, ключи будут идентификаторами сообщений, а значения будут мета-значениями.

 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 и т. Д. Это предоставит вам список сообщений из коробки.

Альтернативно, используйте навигационные меню и полностью обходите эту проблему

Рекурсивно получить все текущие подстраницы

Вот рекурсивный подход с использованием 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 вы можете использовать WP_Query , как первоначально запрошено автором этого вопроса.

Не уверен, что это именно то, что вам нужно, но вы можете использовать функцию wp_list_pages и использовать параметры «child_of» и «depth».

См. Следующую страницу в Codex для получения дополнительной информации: http://codex.wordpress.org/Function_Reference/wp_list_pages

Я сделал рекурсивную функцию, которая получает все дочерние элементы родительской страницы. После того, как у нас есть идентификаторы, мы делаем запрос для страниц и можем заказывать результаты по мета-ключу / значению.

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

Если вам нужно сортировать дочерние элементы по мета-ключу / значению в иерархическом порядке, вы должны передать значения meta_key и order_by в WP_Query в функции _get_children_ids (вместо конечного WP_Query).

Если нет, более простой способ получить весь дочерний идентификатор:

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

Я ДЕЛАТЬ ЭТУ РАБОТУ, ТОЛЬКО КОПИРОВАТЬ В ПРОСМОТРЕТЬ КОД НА ВАШЕЙ СТРАНИЦЕ. PHP FILE

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