Статьи

Освоение WP_Query: связанные функции

Привет и добро пожаловать во вторую часть серии под названием «Мастеринг WP_Query». В первой части мы начали с серии, просто представив, что WP_Query класс WP_Query . И во второй части мы узнаем о функциях, связанных с WP_Query .

Давайте начнем!

Я не специалист по программированию, но я вижу, что класс WP_Query является одним из лучших примеров шаблона MVC. Он чрезвычайно мощный, полностью расширяемый и очень простой в использовании, когда вы познакомитесь с основами.

В дополнение к своим свойствам, методам и параметрам (которые мы рассмотрим в будущем), WordPress предлагает дополнительные функции и хуки (то есть действия и фильтры) для работы с классом WP_Query . В этом уроке мы познакомимся с функциями, а в следующей части увидим действия и фильтры, связанные с WP_Query . Если вы видите, что я что-то забыл, не стесняйтесь сообщить мне, сняв комментарий.

Существует 13 функций WordPress, которые работают с классом WP_Query которые могут помочь вам использовать возможности WP_Query . Они не нуждаются в представлении, поэтому здесь мы идем:

Имя нашей первой функции говорит само за себя: она берет глобальный объект $wp_query и извлекает из него общедоступную переменную запроса. Он имеет два параметра: первый — это переменная, которая возвращает свое значение, а второй — значение по умолчанию, которое возвращается, если переменная не установлена:

1
2
3
4
5
<?php
 
$paged = get_query_var( ‘paged’, 1 );
 
?>

Если честно, это плохая функция. Вы действительно не должны использовать это вообще, но ради того, чтобы сказать «правильный путь», мы собираемся пройти через это и сказать вам, что это «неправильный путь».

query_posts() — это функция, которая изменяет основной запрос, откладывая основной запрос и выполняя новый запрос, и вам нужно будет использовать wp_reset_query() для очистки после него.

1
2
3
4
5
<?php
 
query_posts( ‘category_name=news’ );
 
?>

Эта функция является одной из наиболее часто используемых функций в ядре WordPress. Вы не должны использовать его для создания вторичных запросов — вы можете использовать класс WP_Query или get_posts() (о которой мы поговорим позже в этом уроке). Вы также не должны использовать его для изменения основного запроса — вы должны использовать действие pre_get_posts (о котором мы также поговорим позже). Даже Кодекс отговаривает нас от его использования и показывает альтернативы.

Итог: не используйте его.

Другая get_post() функция — get_post() , которую вы используете, чтобы получить один пост. Имеет три необязательных параметра:

  • Первый — это идентификатор сообщения (или идентификатор текущего сообщения по умолчанию).
  • Второй — тип результата, который вы получите: OBJECT , ARRAY_A (ассоциативный массив) или ARRAY_N (числовой массив).
  • Третий — выбор фильтрации результата. По умолчанию используется значение 'raw' поэтому оно не будет отфильтровано, если вы не установите для него значение 'edit' , 'display' , 'attribute' или 'js' .
1
2
3
4
5
6
<?php
 
$first_post = get_post( 1, ARRAY_A );
$post_title = $first_post[ ‘post_title’ ];
 
?>

Функция get_posts() позволяет нам запускать запросы и сохранять их как массивы для использования в разных местах. Он требует тех же аргументов с WP_Query чтобы вы могли настроить запрос так, как вам нравится. (Мы рассмотрим параметры WP_Query в будущем, так что следите за обновлениями!) Это лучший и самый эффективный способ создания списков сообщений, но не циклов.

01
02
03
04
05
06
07
08
09
10
11
12
13
<?php
 
$args = array(
    ‘category_name’ => ‘news’,
    ‘order’ => ‘ASC’,
    ‘orderby’ => ‘post_title’,
    ‘posts_per_page’ => -1
);
 
// Return an array of all posts in the «news» category.
$all_posts_list = get_posts( $args );
 
?>

Хотя эту функцию можно использовать для выполнения «вторичных запросов» без проблем, Кодекс рекомендует использовать WP_Query при создании нескольких циклов и использовать get_posts() при получении списка сообщений. Питер Р. Найт объясняет разницу между get_posts() и WP_Query простыми словами: главное отличие заключается в том, что WP_Query выполняет больше запросов к базе данных ( WP_Query данные, метаданные, данные об get_posts() и комментарии), а get_posts() выполняет только один запрос (публикация). данные).

Эта нечетная функция предназначена для извлечения списка страниц, хотя у нее есть параметр post_type который также может позволить вам выбрать другой тип записи (при условии, что тип записи является иерархическим, в противном случае он возвращает false ).

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
 
$args = array(
    ‘sort_order’ => ‘ASC’,
    ‘sort_column’ => ‘post_title’,
    ‘hierarchical’ => 1,
    ‘exclude’ => »,
    ‘include’ => »,
    ‘meta_key’ => »,
    ‘meta_value’ => »,
    ‘authors’ => »,
    ‘child_of’ => 0,
    ‘parent’ => -1,
    ‘exclude_tree’ => »,
    ‘number’ => »,
    ‘offset’ => 0,
    ‘post_type’ => ‘page’,
    ‘post_status’ => ‘publish’
);
 
$pages = get_pages( $args );
 
?>

Он принимает аргументы, которые очень похожи на аргументы WP_Query , но они немного отличаются:

  • sort_order : сортировать ли страницы по возрастанию (по asc ) или по убыванию ( desc ).
  • sort_column : как отсортировать страницы. Принимает post_title , menu_order , post_date , post_modified , ID , post_author и post_name .
  • hierarchical : отображать ли страницы иерархически ( 1 ) или нет ( 0 ).
  • exclude : список, разделенный запятыми, или массив идентификаторов страниц, которые необходимо исключить из списка.
  • include : список через запятую или массив идентификаторов страниц для включения в список и исключения всего остального.
  • meta_key : при использовании с аргументом meta_value он включает только страницы, которые имеют определенный мета-ключ и значение.
  • meta_value : при использовании с аргументом meta_key он включает только страницы, которые имеют определенный мета-ключ и значение.
  • authors : список идентификаторов authors через запятую.
  • child_of : идентификатор страницы, из которой можно выбрать только своих детей и внуков в списке.
  • parent : список страниц с указанным идентификатором страницы в качестве родительского. Чтобы этот аргумент работал, hierarchical аргумент должен быть установлен в 0 .
  • exclude_tree : список, разделенный запятыми, или массив идентификаторов страниц, которые необходимо исключить вместе со своими дочерними элементами.
  • number : количество страниц для извлечения.
  • offset : количество страниц, пропускаемых сверху.
  • post_type : тип записи для запроса. Естественно, по умолчанию это page .
  • post_status : разделенный запятыми список типов статуса записи для включения.

Не принимая никаких параметров, эта функция просто возвращает TRUE если запрос возвращает какие-либо записи, и FALSE если нет.

01
02
03
04
05
06
07
08
09
10
11
12
13
<?php
 
if ( have_posts() ) {
     
    // Success.
     
} else {
     
    // Failure.
     
}
 
?>

Кодекс говорит, что он «выполняет итерации индекса в цикле». Это делает несколько вещей:

  1. Извлекает следующую запись из запроса.
  2. Он устанавливает данные $post .
  3. Он устанавливает для параметра in_the_loop значение TRUE .
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
<?php
 
if ( have_posts() ) {
 
    while ( have_posts() ) {
 
        the_post();
 
        the_title();
 
        the_content();
 
    }
     
}
 
?>

Эта функция также говорит сама за себя: она устанавливает глобальные почтовые данные. Давайте посмотрим, что Кодекс говорит об этом:

setup_postdata () заполняет глобальные переменные $id, $authordata, $currentday, $currentmonth, $page, $pages, $multipage, $more, $numpages , которые помогают многим $id, $authordata, $currentday, $currentmonth, $page, $pages, $multipage, $more, $numpages шаблона работать в контексте текущего поста. Он не назначает глобальную переменную $post , но, похоже, ожидает, что ее аргумент является ссылкой на нее.

1
2
3
4
5
6
7
<?php
 
global $post;
 
setup_postdata( $post );
 
?>

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

1
2
3
4
5
6
<?php
 
// After the loop.
rewind_posts();
 
?>

Эта функция сбрасывает глобальную переменную $post обратно на первое сообщение в основном запросе. Лучше использовать этот после вторичного запроса.

1
2
3
4
5
6
<?php
 
// After a secondary query.
wp_reset_postdata();
 
?>

Этот следует использовать, если основной запрос изменен (с помощью функции query_posts() или действия pre_get_posts которое мы увидим в следующей части), чтобы основной запрос можно было сбросить.

1
2
3
4
5
6
<?php
 
// After the main query is altered.
wp_reset_query();
 
?>

Это условный тег, который возвращает TRUE если текущий запрос является основным, и FALSE если это не так. Просто, правда?

01
02
03
04
05
06
07
08
09
10
11
12
13
<?php
 
if ( is_main_query() ) {
     
    // Success.
     
} else {
     
    // Failure.
     
}
 
?>

Другой in_the_loop() тег — это in_the_loop() который просто возвращает TRUE или FALSE если ваш код выполняется внутри цикла или нет.

01
02
03
04
05
06
07
08
09
10
11
12
13
<?php
 
if ( in_the_loop() ) {
     
    // Success.
     
} else {
     
    // Failure.
     
}
 
?>

Вот и все — теперь вы знаете (возможно) все функции, связанные с WP_Query ! Следите за следующей частью, где мы узнаем о действиях и фильтрах, связанных с WP_Query .

Есть ли у вас какие-либо комментарии или что-нибудь добавить к этой части? Не стесняйтесь поделиться своими мыслями, комментируя ниже. И если вам понравилась статья, не забудьте поделиться ею с друзьями!