Отображение нескольких конкретных страниц с помощью WP_Query()

28 дек. 2013 г., 00:08:56
Просмотры: 16.1K
Голосов: 4

Я хочу отобразить страницы '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
);

Почему первый фрагмент кода (единственный правильный на мой взгляд) не работает? И почему два других дают такие результаты?

2
Комментарии

Мне сложно понять, почему какой-либо из этих вариантов должен работать. В первом случае серьезная синтаксическая ошибка, а два других не соответствуют ни одному известному мне валидному шаблону. Интересно...

s_ha_dum s_ha_dum
28 дек. 2013 г. 00:28:29

Извините, первый вариант я много раз менял и вставил последнюю версию, но даже с правильным синтаксисом он ничего не возвращает.

drake035 drake035
28 дек. 2013 г. 00:30:21
Все ответы на вопрос 6
2

Если вы посмотрите на объект запроса после выполнения этих запросов, то увидите, что ни один из этих примеров не делает то, что вы ожидаете. Первая проблема в том, что нельзя смешивать параметры в виде строки запроса и массива, а вторая — что параметр 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 )
);
28 дек. 2013 г. 00:29:43
Комментарии

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

drake035 drake035
28 дек. 2013 г. 00:43:27

@drake035: Выбор страницы по слагу вызывает дополнительные запросы. Смотрите это и это, так что меня не удивляет, что передать список не так просто. И, действительно, вам следует избегать использования этого параметра, если это возможно.

s_ha_dum s_ha_dum
28 дек. 2013 г. 01:40:49
0

Атрибут 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,
];
16 нояб. 2015 г. 20:32:03
0

Для первого варианта у вас несоответствие кавычек в третьей строке. Похоже, вы пытались сделать следующее:

'pagename' => 'famous,mschief',
28 дек. 2013 г. 00:28:49
0

Вы можете написать собственную функцию, используя фильтр 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();
28 дек. 2013 г. 01:44:09
0

Ваш вопрос требует уточнения. Полагаю, вы имеете в виду 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).

28 дек. 2013 г. 09:17:49
0

Добавить категорию к странице с помощью:

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'
);
3 сент. 2018 г. 11:48:23