Intereting Posts
Загружать визуальный редактор без специального стиля Создание подменю: отображение родительской категории / детей страницы при просмотре детей График Cron не обновляется после запуска удалить панель управления браузером show hide из настроек профиля Перемещение заголовка и содержимого позиции редактора WYSIWYG Пытаясь отредактировать страницу, но она отправляет меня на страницу редактирования продукта Добавление администратора для определенных пользователей Пользовательский тип сообщения / таксономия URL-адрес перезаписи Не показывать изображения, вставленные в контент wp_embed_register_handler не работает Как отображать содержимое из внешнего db с соответствующими URL-адресами Показать изображение EXIF ​​info Как загрузить файл мультимедиа через FTP, а затем создать надпись с ним? Неполная страница вложения Крюк перед публикацией через API JSON REST

Лучшая практика для запросов внуков?

Задача: Запросить и прокрутить «внуков» третьего уровня страницы таким образом, чтобы это позволяло разбивать на страницы.

Вот код, который я использую (исключение страницы):

// Get the ID of the first generation $gen1_ids = $post->ID; // Query for second generation IDs $gen2 = $wpdb->get_col( "SELECT ID FROM $wpdb->posts WHERE $wpdb->posts.post_parent IN ($gen1_ids) AND $wpdb->posts.post_type = 'page' AND $wpdb->posts.post_status = 'publish' ORDER BY $wpdb->posts.ID ASC" ); // Test ordering by title // Implode the results for further use $gen2_ids = implode( $gen2,', ' ); // Now, query for third generation IDs using second generation IDs $gen3 = $wpdb->get_col( "SELECT ID FROM $wpdb->posts WHERE $wpdb->posts.post_parent IN ($gen2_ids) AND $wpdb->posts.post_type = 'page' AND $wpdb->posts.post_status = 'publish' ORDER BY $wpdb->posts.ID ASC" ); $args = array( 'post__in' => $gen3, 'post_type' => 'page', 'post_status' => 'publish', 'posts_per_page' => 5, 'paged' => get_query_var('paged') ); $results = null; $results = new WP_Query( $args ); if( $results->have_posts() ) { while ( $results->have_posts() ) : $results->the_post(); ?> <li> <a href="<?php the_permalink(); ?>" class="img"><img src="#"></a> <div class="text"> <h3><a href="<?php the_permalink() ?>"><?php the_title(); ?></a></h3> <p>...</p> </div> </li> <?php endwhile; } /* end if */ ?> <?php wp_reset_query(); // Restore global post data stomped by the_post(). ?> 

Я адаптировал код из ответа на вопрос поддержки два года назад на форумах WordPress.org. Код работает.

Есть ли способ сделать это лучше?

Ты на правильном пути. Вы можете сделать это только с одним MySQL-запросом вместо двух, присоединившись к post_parent . Отбросьте эту функцию в файл functions.php, а затем в своем шаблоне вы можете заменить свой вызов WP_Query $results = wpse_84810_get_grandchildren(); , измените предложение if( $results && $results->have_posts() ) , а затем продолжайте с остальным кодом вашего шаблона.

 function wpse_84810_get_grandchildren( $grandparent_id = false ) { global $wpdb; if ( !$grandparent_id ) $grandparent_id = get_the_ID(); $grandchildren_ids = $wpdb->get_col( $wpdb->prepare( "SELECT p1.ID FROM {$wpdb->posts} AS p1 INNER JOIN {$wpdb->posts} AS p2 ON p1.post_parent = p2.ID WHERE p2.post_parent = %d", $grandparent_id ) ); if ( $grandchildren_ids ) { return new WP_Query( array( 'post__in' => $grandchildren_ids, 'post_type' => 'page', 'post_status' => 'publish', 'posts_per_page' => 5, 'paged' => get_query_var( 'paged' ) ? get_query_var( 'paged' ) : 1 ) ); } return false; }