Отображение нескольких конкретных страниц с помощью WP_Query()
Я хочу отобразить страницы 'famous' и 'mschief'.
При использовании этого кода WP_Query() не возвращает никаких результатов:
$args = array(
'post_type' => 'page',
'pagename' => 'famous,mschief', // Неправильный формат для параметра pagename
'posts_per_page' => 3
);
Этот код возвращает одну из 2 страниц:
$args = array(
'post_type' => 'page',
'pagename=famous,mschief', // Неправильный синтаксис массива
);
А этот код правильно возвращает обе страницы:
$args = array(
'post_type' => 'page',
'pagename=famous,mschief', // Работает, но синтаксис не соответствует стандарту
'posts_per_page' => 3
);
Почему первый фрагмент кода (единственный правильный на мой взгляд) не работает? И почему два других дают такие результаты?

Если вы посмотрите на объект запроса после выполнения этих запросов, то увидите, что ни один из этих примеров не делает то, что вы ожидаете. Первая проблема в том, что нельзя смешивать параметры в виде строки запроса и массива, а вторая — что параметр pagename
можно использовать только для загрузки одной страницы.
В этом примере пропущена закрывающая кавычка после pagename
. Предполагая, что это опечатка, проблема указана выше — запрос ищет одну страницу с ярлыком famousmschief
$args = array(
'post_type' => 'page',
'pagename => 'famous,mschief',
'posts_per_page' => 3
);
В этом примере параметр pagename
игнорируется, и запрос просто возвращает последнюю страницу, используя значение по умолчанию для количества записей на странице (похоже, оно равно 1).
$args = array(
'post_type' => 'page',
'pagename=famous,mschief',
);
Здесь та же проблема, что и в предыдущем примере, но загружается больше страниц — просто три последние страницы:
$args = array(
'post_type' => 'page',
'pagename=famous,mschief',
'posts_per_page' => 3
);
Если вам нужно запросить несколько страниц, используйте аргумент post__in
с ID страниц:
$args = array(
'post_type' => 'page',
'post__in' => array( 23,42 )
);

Значит, нет прямого способа выбрать более одной страницы с использованием слагов? Это действительно досадно!

Атрибут post_name__in
Начиная с WordPress 4.4 мы можем использовать атрибут post_name__in
класса WP_Query
. См. тикет в треке #33065.
Пример:
$args = [
'post_name__in' => ['famous', 'mschief'],
'post_type' => 'page',
'ignore_sticky_posts' => 1,
];

Вы можете написать собственную функцию, используя фильтр posts_where
function page_names_query( $n = array() ) {
static $pages;
if ( is_null($pages) && ! empty($n) && is_array($n) ) {
$pages = array_filter( array_map('sanitize_title', $n) );
if ( ! empty($pages) ) {
// используем саму функцию для фильтрации следующего запроса
add_filter('posts_where', __FUNCTION__, 999 );
return new WP_Query('post_type=page'); // возвращаем отфильтрованный запрос
} else { // не переданы корректные названия страниц
$pages = NULL;
return new WP_Query('p=-1'); // возвращаем пустой WP_Query
}
} elseif( current_filter() === 'posts_where' && ! empty($pages) && is_string($n) ) {
$w = ' AND post_name IN (';
global $wpdb;
foreach ( $pages as $page ) { $w .= $wpdb->prepare('%s,', $page); }
$pages = NULL; // сбрасываем статическую переменную
remove_filter('posts_where', __FUNCTION__, 999 ); // удаляем фильтр
return $n . rtrim($w, ',') . ')';
}
}
после этого можно использовать функцию следующим образом
$query = page_names_query( array('famous','mschief') ); // получаем WP_Query
if ( $query->have_posts() ) : while( $query->have_posts() ) : $query->the_post();
// ваш цикл здесь
endwhile; endif;
wp_reset_postdata();

Ваш вопрос требует уточнения. Полагаю, вы имеете в виду 2 записи, а не 2 страницы.
Вы можете использовать этот PHP-код в файле functions.php вашей дочерней темы для отображения записей по их ID.
add_action( 'pre_get_posts', 'wpsites_display_specific_posts_home_page' );
function wpsites_display_specific_posts_home_page( $query ) {
if( $query->is_main_query() && $query->is_home() ) {
$query->set( 'post__in', array( 007, 008 ) );
}
}
Этот код будет отображать только записи с ID 007 и 008 в основном цикле на главной странице. Если вы используете статическую главную страницу, этот код будет работать на странице записей в соответствии с вашими настройками чтения.
Использование ID предпочтительнее, так как они остаются неизменными даже при изменении ярлыка (slug).

Добавить категорию к странице с помощью:
function wpc_cat_pages() {
register_taxonomy_for_object_type('category', 'page');
}
add_action('init', 'wpc_cat_pages');
и вывести её с помощью:
$args = array(
'post_type' => 'page',
'category' => 'categori',
'posts_per_page' => 'number post'
);
