Wp get post


Многие плагины WordPress получают списки постов из базы данных с индивидуальным порядком сортировки, извлекая их на основе какого-то meta ключа или таксономии. Вы когда-нибудь задавались вопросом, как эти плагины получают такие списки записей без выполнения каких-либо SQL запросов? Чтобы разобраться в этом, мы исследуем функцию get posts, а также рассмотрим некоторые типичные случаи ее использования.

Что это за функция

Функция get posts стала доступна в ядре WordPress еще с версии 1.2.0.

Она предназначена для того, чтобы извлекать списки постов из базы данных, применяя на них пользовательские фильтры для сортировки конечного результата.

По своей сути, эта функция подобна классу wp query, поскольку также возвращает объекты wp post из базы данных. Более того, внутри она использует все тот же класс wp query для построения и исполнения SQL запросов. Однако, в ней задаются несколько другие аргументы, о которых более подробно можно узнать из кодекса WordPress.

date_query-1024x576

Как работает эта функция


Механика работы get posts достаточно проста. Сперва, вы задаете массив аргументов, по которым будет извлечено заданное количество записей из базы данных и их сортировка. При этом, можно отсортировать их по множеству параметров, таких как ID, заголовок, дата публикации, значение meta ключа и т.д. После чего, вы разбираете этот массив на отдельные объекты wp post (иными словами, отдельные записи) и задаете определенные свойства, которые будут отображаться в шаблоне WordPress.

Почему бы не использовать wp_query напрямую

В плагинах рекомендуется применение именно get posts, а не класса wp query, для получения объектов wp post. Так сделано потому, что этот класс изменяет основной цикл, который по умолчанию используется для отображения записей в WordPress. Из-за этого, он может вызвать некоторые проблемы в работе сайта. Кроме того, использование wp query может значительно увеличить время загрузки страницы, так как сценарий будет выполнять в 2 раза больше работы.

wp_query

Примеры использования функции

Чтобы лучше понять механику работы get posts, давайте рассмотрим некоторые примеры ее использования, такие как:

  • Отображение последних статей по ID;
  • Отображение статей в случайном порядке;
  • Отображение статей с определенным произвольным полем.

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

Последние записи

Если вы хотите отобразить определенное число последних постов, находящихся на вашем сайте, то вы можете использовать эту функцию для извлечения объектов wp post и сортировке по ID. Вот пример:

<?php
$args = array ("posts_per_page" => 10, "order" => "DESC", "orderby" => "ID");
$lastarticles = get_posts ($args);
foreach ($lastarticles as $article)
{
echo "<h1>" . $article - > post_title . "</h1><br>";
echo "<p>" . $article - > post_content . "</p><br>";
}
?>

Здесь используется параметр «OrderBy» для сортировки сообщений по убыванию значения их ID (идентификатора). Таким образом, вы получаете 10 самых последних записей, так как каждый новый пост сохраняется в БД под следующим по счету ID.

Случайные записи

Вы также можете легко получить случайные посты. Это полезно, когда вы хотите порекомендовать пользователям другие статьи, находящиеся на вашем сайте, после того, как они закончат прочтение текущей статьи. Вот так будет выглядеть код:


<?php
$args = array ("posts_per_page" => 1, "orderby" => "rand");
$randarticles = get_posts ($args);
foreach ($randarticles as $article)
{
echo "<h1>" . $article -> post_title . "</h1><br>";
echo "<p>" . $article -> post_content . "</p><br>";
}
?>

В данном примере, параметру «OrderBy» передается значение «rand», что означает случайную сортировку объектов wp post.

Записи с определенным значением произвольного поля

Бывают ситуации, в которых нужно получить все посты, имеющие определенный meta ключ с конкретным значением. Например, на некоторых блогах используется имя ревьювера для каждого обзора. Используя следующий код, можно получить объекты wp post, в которых имеется заданный meta ключ:

<?php
$args = array ("posts_per_page" => - 1, "meta_key" => "reviewer", "meta_value" => "victordark");
$metaarticles = get_posts ($args);
foreach ($metaarticles as $article)
{
echo "<h1>" . $article -> post_title . "</h1><br>";
echo "<p>" . $article -> post_content . "</p><br>";
}
?>


Здесь извлекаются все посты ревьювера «victordark». Обратите внимание, что имя ревьювера для каждого поста должно быть сохранено с помощью meta ключа «reviewer». Но вы можете использовать любое другое название для сохранения meta ключа, а потом извлекать его по этому названию.

Заключение

Функция get posts является наиболее часто используемой в WordPress, потому что имеет огромное количество возможностей. Практически каждый плагин так или иначе применяет ее в своей работе. Если вы разрабатываете свой плагин или тему, или просто хотите вывести определенные записи в каком-то месте своего сайта, то вам не обойтись без нее.

Peakmqc5liY

Похожие статьи

wordpresslib.ru


WordPress POST запросы: обработка

От автора: хорошему интерактивному сайту необходимо взаимодействовать с данными, которые вводит пользователь. Данные вводятся в специальных формах, которые являются частью вида. И WordPress в этом случае не исключение. За один день на сайте происходит масса различных форм взаимодействия пользователей с сервером. К примеру, подписка на рассылку новостей, сообщение владельцу сайта из формы обратной связи или заполнение формы заказа. Все это выполняется через POST запросы. И в данной статье мы рассмотри обработку WordPress POST запросов

В этой статье мы рассмотрим простой пример обработки POST запроса из контактной формы. Чтобы правильно вытянуть данные будем использовать встроенный хук WordPress’а. Полученные данные соответственно будем обрабатывать и перенаправлять пользователя на заготовленную страницу.

Данная статья рассчитана на тех, кто знаком с основами WordPress Plugin API. Если же вы совсем не работали с этим API, лучше просмотрите страницу кодекса WordPress перед тем, как продолжить. Также мы предлагаем наш курс, посвященный работе с API WordPress, и созданию собственных плагинов.

Предыстория

В основе WordPress лежит событийно-ориентированная архитектура. Это значит, что в ядре WordPress хранятся различные действия и фильтры, которые определенным образом изменяют работу программы или контент. Примерами действий запускаемых одновременно со стартом CMS являются init, wp, template_redirect и wp_head. Множество плагинов используют эти действия и фильтры для модификации работы системы.


Мы хотим добиться примерно того же. Нам всего лишь нужно знать правильные хуки для POST запросов и изменить код. Сделать это можно, разместив все формы в отдельном файле admin-post.php в директории wp-admin. Если вы уже работали с WordPress internal AJAX API, то должны заметить, что структура admin-post.php не сильно отличается от файла admin-ajax.php.

Анатомия admin-post.php

Если брать только самые основы, то в файле admin-post.php всего 71 строка кода. Сначала задается константа WP_ADMIN и подключается сам WordPress с помощью файла wp-load.php. После этого отсылаются заголовки и запускается admin_init. Ниже строка, выполняющая то, что мы сказали выше:

Несмотря на имя admin-post.php, данный файл обрабатывает как POST, так и GET запросы. Тем не менее нас будут интересовать только POST запросы.

Как видно два разных хука срабатывают в зависимости от статуса пользователя, залогинился он или нет. Для залогиненных пользователей используется admin_post, а для незалогиненных admin_post_nopriv. Если же нужно обработать данные только из вашего запроса, можно воспользоваться другим действием admin_post_nopriv_{$action} или admin_post_{$action}, которые тоже основаны на статусе польозвателя.


Скажем, у нашего POST запроса action со значением foobar. Если пользователь не зашел под своими данными, то выполнятся два экшена:

Если вы залогинитесь, выполнятся два других экшена:

Все вышеописанные хуки можно применить и для GET запроса, если адрес примерно такой: http://www.example.com/wp-admin/admin-post.php?action=foobar&data=test

Зная это, можно работать с данными из POST запроса напрямую, избегая шаблонов формы представления.

Испытание концепции

Для примера возьмем контактную форму. Самый простой способ это создать форму в файле page.php самому (не рекомендуется), закодировать форму и обрабатывать данные POST запроса в этом же файле. Примерно вот так это работает:

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

Для того, чтобы избавиться от этой проблемы и полностью задействовать событийно-ориентированную природу WordPress нам понадобится файл admin-post.php. С его помощью можно конвертировать существующую форму, чтобы она стала совместима с файлом admin-post.php, и сделать это довольно просто. Сперва, замените эту строку:

На:

Для генерации правильной ссылки, которая будет вести на файл admin-post.php мы используем встроенную функцию admin_url. Таким образом, мы обеспечим надежный редирект на наш сайт. Также нам необходимо добавить скрытый action к форме, а для этого нам понадобится еще один хук. Укажем name=»action», value=»contact_form». И добавим эту строку между тегов формы.


Теперь наш шаблон страницы выглядит так:

Заметьте, что мы удалили функцию обработки POST запроса из верхней части шаблона, мы вызовем ее позже.

Обработка POST запроса

На этом этапе у нас есть два варианта, и оба рабочие. Можно запустить action admin_post_* через functions.php в нашей теме, или создать простой плагин обработки контактной формы. Для простоты будем записывать все в functions.php. Вспомним, что у нас есть наш action contact_form, а значит, нам доступны четыре хука:

Откройте functions.php текущей темы и добавьте эти строки:

Так как нам надо обработать форму независимо от того, залогинился пользователь или нет, мы запускаем функцию как для admin_post_nopriv_contact_form, так и для admin_post_contact_form. prefix_send_email_to_admin – основная функция, где происходит обработка данных.

webformyself.com

Как выводить посты с помощью get_posts

Предположим, что нужно вывести заголовки последних 6 записей из рубрики «Новости» в отдельном блоке в сайдбаре (к примеру, рубрика «Новости» имеет id=3). Тогда в файл sidebar.php нужно добавить следующий код:


<?php  $my_posts = get_posts('numberposts=6&category=3');  foreach ($my_posts as $post) :  setup_postdata($post);  ?>  <h2 class="entry-title"><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2>  <?php endforeach; ?>

Критерии отбора записей могут быть различны. Например вы можете вывести записи из нескольких категорий, указав их id через запятую в параметре «category=номер категорий», или наоборот исключить записи определенных категорий, указав их id со знаком «-«.

Параметры вывода постов для функции get_posts

Функция get_posts может принимать различные параметры, знакомтесь.

numberposts — определяет количество выводимых постов. Чтобы убрать это ограничение нужно поставить значение -1. Значение 0 будет выводить столько постов, сколько уазано в настройках WordPress.

category — определяет из каких категорий нужно выводить посты. Необходимо указывать ID категорий. ID категорий со знаком минус будут исключены из вывода. Можно указать сразу несколько id категорий, указав из через запятую.

tag — выводит записи имеющие определенные метки. Необходимо указывать slug метки — альтернативное имя. Если указать несколько меток через запятую, то будут выведены все записи, имеющие хотя бы одну из этих меток. Если указать несколько меток через пробел, то будут выведены только те посты, которые имеют все эти метки одновременно.

orderby — сортирует показанные посты. Сортировать посты можно по нескольким критериям:


  • ‘author’ — сортировка по ID авторов
  • ‘category’ — сортировка по ID категорий
  • ‘content’ — сортировка по контенту
  • ‘date’ — сортировка по дате создания записи
  • ‘ID’ — сортировка по ID самой записи
  • ‘menu_order’ — сортировка по полю menu_order. Используется для постоянных страниц и прикреплений (картинки, файлы и т.п.)
  • ‘mime_type’ — сортировка по MIME типу
  • ‘modified’ — сортировка по дате изменения
  • ‘name’ — сортировка по альтернативному имени (slug)
  • ‘rand’ — Случайная сортировка
  • ‘status’ — сортировка по статусу (черновик, опубликовано и т.п.)
  • ‘title’ — сортировка по названию
  • ‘parent’ — сортировка по ID родителя (parent ID)
  • ‘password’ — сортировка по паролю
  • ‘type’ — сортировка по типу

order — порядок сортировки, «ASC» — сортирует в прямом порядке, «DESC» — сортирует записи в обратном порядке.

meta_key и meta_value выводит записи имеющие указанное произвольное поле (meta_key) со значением (meta_value). Необходимо определить два параметра, иначе ни один из них не будет работать.

post_type — выводит посты определенного типа: post — посты, page — страницы, attachment — прикрепленные записи, any — все записи.

Я привел неполный список параметров, по которым можно выводить посты в любом месте шаблона, полный список можно посмотреть в кодексе WordPress.

www.onwordpress.ru

Создание карты сайта с помощью функции get_posts()

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

Шаблон функции, которую вы можете изменять по собственному желанию:

<ul>
<?php
global $post;
$args = array('posts_per_page' => -1, 'post_type' => array('post','page'), 'offset'=> 1, 'order'=> 'ASC' );
$myposts = get_posts( $args );
foreach( $myposts as $post ){ setup_postdata($post);
?>
<li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
<?php
}
wp_reset_postdata();
?>
</ul>

Данный код выведет абсолютно все страницы и записи вашего блога в алфавитном порядке. С помощью аргумента exclude исключим закрытые для индексации и технические страницы, такие как поиск или пользовательское соглашение на моём блоге:

<ul>
<?php
global $post;
$args = array('posts_per_page' => -1, 'exclude' => array(221,1213), 'post_type' => array('post','page'), 'offset'=> 1 );
$myposts = get_posts( $args );
foreach( $myposts as $post ){ setup_postdata($post);
?>
<li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
<?php
}
wp_reset_postdata();
?>
</ul>

Комбинируем посты по рубрикам:

Рубрика ID 11
<ul>
<?php
global $post;
$args = array( 'posts_per_page' => -1, 'offset'=> 1, 'category' => 11 );
$myposts = get_posts( $args );
foreach( $myposts as $post ){ setup_postdata($post);
?>
<li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
<?php
}
wp_reset_postdata();
?>
</ul>
Рубрика ID 9
<ul>
<?php
global $post;
$args = array( 'posts_per_page' => -1, 'offset'=> 1, 'category' => 9 );
$myposts = get_posts( $args );
foreach( $myposts as $post ){ setup_postdata($post);
?>
<li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
<?php
}
wp_reset_postdata();
?>
</ul>

Вывод последних постов с помощью функции get_posts()

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

<ul>
<?php
global $post;
$args = array( 'posts_per_page' => 5, 'offset'=> 1 );
$myposts = get_posts( $args );
foreach( $myposts as $post ){ setup_postdata($post);
?>
<li>
<?php echo get_the_date('j F Y'); ?>
<a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
<?php the_post_thumbnail (array(300,175)); ?>
<?php comments_popup_link( __( 'Комментариев нет', 'twentyten' ), __( 'Комментарий 1', 'twentyten' ), __( '<span content="Комментариев: %»>Комментариев: %</span>', 'twentyten' ) ); ?>
</li>
<?php
}
wp_reset_postdata();
?>
</ul>

Вывод последних пяти постов с указанием даты публикации, миниатюрой и количеством комментариев к записи. Вы можете использовать любые дополнительные свойства.

Вывод случайных постов

Данная функция выведет 3 случайные записи блога:

<ul>
<?php
global $post;
$args = array( 'posts_per_page' => 3, 'orderby' => 'rand' );
$myposts = get_posts( $args );
foreach( $myposts as $post ){ setup_postdata($post);
?>
<li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
<?php
}
wp_reset_postdata();
?>
</ul>

Выводит 3 случайные записи из определенной рубрики:

<ul>
<?php
global $post;
$args = array( 'posts_per_page' => 3, 'orderby' => 'rand', 'category' => 9 );
$myposts = get_posts( $args );
foreach( $myposts as $post ){ setup_postdata($post);
?>
<li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
<?php
}
wp_reset_postdata();
?>
</ul>

Вывод запланированных записей

Видел довольно часто на блогах подобный функционал — анонсирование предстоящих статей:

<ul>
<?php
global $post;
$args = array( 'posts_per_page' => 3, 'post_status' => 'future' );
$myposts = get_posts( $args );
foreach( $myposts as $post ){ setup_postdata($post);
?>
<li><?php the_title(); ?></li>
<?php
}
wp_reset_postdata();
?>
</ul>

И прочие, прочие возможности функции get_posts().

marseo.ru

What is the get_posts() Function?

The get_posts function has been available in WordPress core since WordPress 1.2.0. This function is basically used to retrieve posts from the database by applying custom filters and sorting the final result based on a set of parameters.

The get_posts() function returns an array of WP_Post objects. Each WP_Post object represents an individual post.

Internally get_posts uses the WP_Query object to construct and execute the SQL queries based on the passed set of parameters.

Note: Posts means post, page and custom post type.

Why Not Use the WP_Query Object Directly?

Plugins use get_posts function instead of WP_Query object because using the WP_Query object directly alters the main loop (i.e., the global $wp_query variable) which would cause site issues.

What Is the Difference Between get_posts() and get_pages() Functions?

Both of them are used to retrieve posts from the WordPress database, however, here are some of the differences between them:

  • Several of the parameter names and values differ between them. Although they behave the same way regardless of the names of the parameters.
  • The get_pages() function currently does not retrieve posts based on meta_key and meta_value parameters.
  • The get_pages() function doesn’t use the WP_Query object. Instead, it constructs and executes SQL queries directly.

get_posts() Function Parameters

The get_posts function takes only one argument as an array. The array contains the different parameters to apply custom filters and sort the result.

Here’s a code example which shows how to call this function and the various parameters available:

<?php     $args = array(  	"posts_per_page" => 5,  	"paged" => 1  	"tax_query" => array(  		array(  			"taxonomy" => "category",  			"field" => "slug",  			"terms" => "videos,movies",  		)  	),  	"orderby" => "post_date",  	"order" => "DESC",  	"exclude" => "1123, 4456",  	"meta_key" => "",  	"meta_value" => "",  	"post_type" => "post",  	"post_status" => "publish"  );    $posts_array = get_posts($args);     ?>

There are more parameters available, but these are the most commonly used ones. Let’s look at each of these parameters:

  1. posts_per_page: This parameter defines the number of posts to return. Use -1 if you want all the posts.
  2. paged: Allows us to navigate between a set of posts while using the posts_per_page parameter. It is used for pagination. For example: suppose posts_per_page is 10 and there are 20 posts in the result, then if you assign paged to 2 then last 10 posts are returned.
  3. tax_query: Display posts of a particular taxonomy slug i.e., filter out posts of the other taxonomy slug. terms can take a comma separated string representing multiple taxonomy slugs.
  4. orderby: It’s used to sort the retrieved posts. Some possible values are: “none”, “date”, “rand”, “comment_count”, “meta_value”, “meta_value_num” etc. While sorting using “meta_value” and “meta_value_num” you need to provide the meta_key parameter.
  5. order: Designates the ascending or descending order of the orderby parameter. Possible values are “DESC” or “ASC”.
  6. exclude: It takes a comma separated list of post IDs which will be excluded from a database search.
  7. meta_key and meta_value: If you provide only meta_key, then posts which have the key will be returned. If you also provide meta_value then posts matching the meta_value for the meta_key is returned.
  8. post_type: Retrieves content based on post, page or custom post type. Remember that the default post_type is only set to display posts but not pages.
  9. post_status: Retrieves posts by status of the post. Possible values are: “publish”, “pending”, “draft”, “future”, “any” or “trash”.

The WP_Post Object

The get_posts function returns an array that contains WP_Post objects. Here are the important properties of the WP_Post object:

  1. ID: ID of the post
  2. post_author: Author name of the post
  3. post_type: Type of the post
  4. post_title: Title of the post
  5. post_date: Date on which post was published. Format: 0000-00-00 00:00:00
  6. post_content: Content of the post.
  7. post_status: Status of the post
  8. comment_count: Number of comments for the post

Examples of get_posts

Let’s check out some examples using the get_posts function.

If you want to display the top n number of the most discussed posts on your site, then you can use get_posts to retrieve them. Here’s an example:

<?php  	$args = array("posts_per_page" => 10, "orderby" => "comment_count");  	$posts_array = get_posts($args);  	foreach($posts_array as $post)  	{  	 echo "<h1>" . $post->post_title . "</h1><br>";  	 echo "<p>" . $post->post_content . "</p><br>";  	}   ?>

Here, we are using the orderby parameter to sort the posts based on the number of comments, retrieving the top 10 posts.

Random Posts

You can also easily retrieve random posts. This is helpful to recommend users another article on your site once they’ve finished reading the current one. Here’s the code for this:

<?php   $args = array("posts_per_page" => 1, "orderby" => "rand");   $posts_array = get_posts($args);   foreach($posts_array as $post)   {   echo "<h1>" . $post->post_title . "</h1><br>";   echo "<p>" . $post->post_content . "</p><br>";   }   ?>

In the above example, we passed the value rand to the order_by parameter.

Posts with Matching Meta Key and Value

We might want to retrieve all posts which have a particular meta key and value assigned. For example: some blogs have a reviewer for every article. We might want to retrieve articles reviewed by a particular reviewer.

Here is the code to do just that:

<?php   $args = array("posts_per_page" => -1, "meta_key" => "reviewer", "meta_value" = "narayanprusty");   $posts_array = get_posts($args);   foreach($posts_array as $post)   {   echo "<h1>" . $post->post_title . "</h1><br>";   echo "<p>" . $post->post_content . "</p><br>";   }   ?>

Here, we’re retrieving all the posts reviewed by “narayanprusty”. We’re assuming the reviewer name is stored via the meta key “reviewer” for every post.

Custom Post Type with Custom Taxonomy

We may want to retrieve posts of a custom post type with a custom taxonomy name. Consider this code example:

<?php   $args = array("posts_per_page" => -1, "post_type" => "coupons", "tax_query" => array(   array(   "taxonomy" => "coupon_category",   "field" => "slug",   "terms" => "plugins,themes",   )   ));   $posts_array = get_posts($args);   foreach($posts_array as $post)   {   echo "<h1>" . $post->post_title . "</h1><br>";   echo "<p>" . $post->post_content . "</p><br>";   }   ?>

In this example, we’re retrieving the posts of a custom post type named “coupons” which belong to the “plugins” and “themes” custom taxonomies.

Conclusion

In this article we saw how the get_posts function works, the various parameters it supports, looping through the returned result and some sample use cases. The get_posts function is one of the most used WordPress functions, I hope you can now start using it your own projects.

www.sitepoint.com

Основные и вторичные запросы

Основной запрос (или основной цикл) в WordPress это тот, который выполняется на раннем этапе загрузки ядра, он строится из запрошенного URL, настроек постоянных ссылок и т.д. Во время основного запроса WordPress определяет такие параметры как количество записей на страницу, используемый шаблон в теме и прочие. Основной запрос делает сам WordPress.

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

  • Вывести в боковой колонке список самых популярных записей
  • Вывести выделенные записи в слайдере на главной странице
  • Вывести записи из той же категории в блоке «похожие записи»

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

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

Для сравнения рассмотрим цикл для вывода популярных записей с помощью WP_Query:

// Вторичный цикл  $popular = new WP_Query( ... );  while ( $popular->have_posts() ) {   $popular->the_post();     the_title(); // вывести название   the_content(); // вывести содержимое  }

Этот же цикл с помощью query_posts():

// Вторичный цикл  query_posts( ... );  while ( have_posts() ) {   the_post();     the_title(); // вывести название   the_content(); // вывести содержимое  }  

Безусловно второй вариант выглядит немного чище и привычнее, поскольку такая конструкция чаще всего встречается при работе с основным циклом WordPress.

Именно поэтому разработчики часто думают, что query_posts() изменяет основной запрос WordPress, но это не так. Функция query_posts() заменяет основной цикл новым вторичным циклом, и происходит это после выполнения основного запроса.

$wp_query и $wp_the_query

После выполнения основного запроса WordPress помещает его результат в глобальную переменную $wp_the_query, а в глобальной переменной $wp_query хранится всего лишь ссылка на $wp_the_query. Функции have_posts(), the_post() и прочие работают именно с глобальным объектом $wp_query.

Чтобы в этом убедиться достаточно взглянуть на реализацию подобных функций:

function have_posts() {   global $wp_query;   return $wp_query->have_posts();  }

Функция query_posts() создает новый вторичный запрос с помощью WP_Query и помещает результат в эту же глобальную переменную $wp_query:

function query_posts( $query ) {   $GLOBALS['wp_query'] = new WP_Query();   return $GLOBALS['wp_query']->query( $query );  }

Таким образом функции, которые предназначены для работы с основным циклом WordPress начинают работать с нашим вторичным запросом, а основной запрос остался в глобальной переменной $wp_the_query, ссылку на которую можно восстановить с помощью функции wp_reset_query().

function wp_reset_query() {   $GLOBALS['wp_query'] = $GLOBALS['wp_the_query'];   wp_reset_postdata();  }

После этого, функции have_posts() и другие вновь работают с основным циклом WordPress, но разработчики часто об этом забывают, в результате чего перестает работать пагинация, некоторые виджеты и прочее.

Пагинация

Самым частым результатом использования query_posts() является сломанная пагинация, когда например первые две страницы работают, а третья и четвертая возвращают ошибку 404. Давайте рассмотрим как, и почему это происходит.

По умолчанию WordPress показывает десять записей на одной странице. Допустим у нас всего двадцать записей, это всего две страницы. Изменить количество записей на страницу можно легко с помощью query_posts() в начале нашего шаблона index.php или archive.php:

global $query_string;  query_posts( $query_string . '&posts_per_page=5' );  

Таким образом на каждой странице у нас будет пять записей, а не десять, а наш плагин для пагинации будет отображать четыре страницы вместо двух. Все сходится, но при переходе на третью страницу мы получаем ошибку 404. Почему это происходит?

Напоминаем, что основной запрос WordPress происходит еще до того, как обрабатываются шаблоны index.php или archive.php, где происходит наша «подмена». В основном запросе количество записей на страницу — десять, и всего две страницы. Третей и четвертой страниц в основном запросе нет.

Именно основной запрос определяет какой шаблон темы будет использоваться, и при запросе третей или четвертой страницы WordPress будет использовать шаблон 404.php.

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

Событие pre_get_posts

Наиболее правильным способом изменить основной цикл WordPress является событие pre_get_posts, которое происходит перед каждым запросом WP_Query. Работать с этим событием можно в плагине или в файле functions.php вашей темы:

function my_pre_get_posts( $query ) {   if ( ! is_admin() && $query->is_main_query() ) {   $query->set( 'posts_per_page', 5 );   }  }  add_action( 'pre_get_posts', 'my_pre_get_posts' );  

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

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

Альтернативы query_posts()

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

Когда вам необходимо изменить основной запрос WordPress перед его выполнением, самым простым способом является событие pre_get_posts, или фильтр request, который выполняется еще раньше, чем pre_get_posts и только для основного запроса.

Если у вас возникли вопросы про query_posts() или WP_Query, оставьте комментарий и мы обязательно вам ответим.

wpmag.ru

Описание:
Этот тег используется для цикла вывода записей.

Использование:

<?php get_posts(); ?>

Пример:

<?php
$postslist = get_posts(‘numberposts=10&order=ASC&orderby=post_title’);
foreach ($postslist as $post) :
setup_postdata($post);
?>
<div>
<?php the_date(); ?>
<?php the_title(); ?>
<?php the_excerpt(); ?>
</div>
<?php endforeach; ?>
Выводит 10 последних сообщений с датой, заголовком и кратким содержанием отсортированных в алфавитном порядке по возрастанию

<ul><li><h2>A random selection of my writing</h2>
<ul>
<?php
$rand_posts = get_posts(‘numberposts=5&orderby=RAND()’);
foreach( $rand_posts as $post ) :
?>
<li><a href=»<?php the_permalink(); ?>»><?php the_title(); ?></a></li>
<?php endforeach; ?>
</ul>
</li></ul>
Выводит список из 5 записей случайным образом, с использованием функции MySQL RAND()

Параметры:
$numberposts
(integer) (optional) Количество возвращаемых сообщений. (По умолчанию: 5)
$offset
(integer) (optional) Смещение от последнего сообщения. (По умолчанию: 0)
$category
(integer) (optional) Показывать сообщения только этой категории. (По умоланию: нет)
$orderby
(string) (optional) Сортирует сообщения в зависимости от значения (По умолчанию: post_title):
* ‘post_title’ — Сортировка в алфавитном порядке по заголовку страницы или сообщения.
* ‘post_date’ — Сортировка по дате создания.
* ‘post_modified’ — Сортировка по дате последнего изменения.
* ‘ID’ — Сортировка по ID сообщений.
* ‘post_author’ — Сортировка по ID авторов.
* ‘post_name’ — Сортировка в алфавитном порядке по короткому имени сообщения.
Замечание: Значение $orderby может быть именем любого поля в таблице wp_posts table.
$order
(string) (optional) Как сортировать по $orderby. Значения (По умолчанию: ASC):
* ‘ASC’ — В порядке возрастания (снизу вверх).
* ‘DESC’ — В порядке убывания (сверху вниз).
$include
(string) (optional) ID сообщений которые вы хотите вывести, разделенные запятыми и/или пробелами. (По умолчанию: нет) Например:
* ‘45,63, 78 94 ,128 , 140’
Использование этого параметра отменит действие параметров numberposts, offset, category, exclude, meta_key, meta_value, and post_parent.
$exclude
(string) (optional) ID любых сообщений которые вы хотите исключить, разделенных запятыми и/или пробелами (смотри параметр $include) (По умолчанию: нет).
$meta_key и $meta_value
(string) (optional) Выводит сообщения которые содержат в дополнительном поле этот ключ и значение. Оба параметра должны быть указаны, иначе работать не будут. (По умолчанию: нет)
$post_type
(string) (optional) Тип сообщения для вывода. Значения (По умолчанию: post):
* post — По умолчанию(Сообщение)
* page — (Страница)
* attachment — (Прикрепления)
* (blank) — Все типы сообщений
$post_status
(string) (optional) Показывает сообщения со статусом. Значения (По умолчанию: publish):
* publish — По умолчанию(Опубликовано)
* private — (Личное)
* draft — (Черновик)
* future — (Ожидает утверждения)
* (blank) — Все типы сообщений
$post_parent
(integer) (optional) Показывает только потомков сообщения с указанным ID (По умолчанию: Нет)

Более подробное описание get_posts смотрите здесь.

« Вернуться к выбору тегов

www.wp-info.ru

Пример использования функции get_post

Данный код позволит нам получить все данные записи 1 в виде объекта.

Обратите внимание, что номер записи в функцию get_post должен передаваться как переменная, в противном случае это приведёт к ошибке:

Получение данных записи WordPress в виде массива или объекта

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

  • ARRAY_N — получим данные в виде простого массива;
  • ARRAY_A — получим данные как ассоциативный массив;
  • OBJECT — получим объект с всеми данными;

Давайте посмотрим на примере:

Какие данные мы можем получить с помощью get_post

После того как мы сделали запрос в базу данных с помощью функции WordPress — get_post, мы получим следующие данные:

  • ID — Номер ID записи;
  • post_author — Идентификатор автора запрашиваемой записи;
  • post_date — Дата создания запрашиваемой записи в виде YYYY-MM-DD HH:MM:SS;
  • post_date_gmt — Дата создания запрашиваемой записи по Гринвичу — YYYY-MM-DD HH:MM:SS;
  • post_modified — Дата последнего изменения запрашиваемой записи в виде YYYY-MM-DD HH:MM:SS;
  • post_modified_gmt — Дата последнего изменения запрашиваемой записи по Гринвичу YYYY-MM-DD HH:MM:SS;
  • post_content — Сам текст (контент) запрашиваемой записи;
  • post_title — Заголовок запрашиваемой записи;
  • post_excerpt — Анонс (вводный текст) запрашиваемой записи;
  • post_status — Статут запрашиваемой записи, который может быть: private, publish, inherit, pending, draft, static, future, object, attachment, trash;
  • comment_status — Можно ли комментировать запись, ответ может быть: closed, open, registered_only;
  • ping_status — Статус трэкбэков/пингов запрашиваемой записи, может быть следующим: closed, open;
  • post_password — Пароль запрашиваемой записи;
  • post_name — Слаг записи — название которое указывается в ЧПУ адресе записи(home иди about и т.п.);
  • to_ping — URL из записи, на которые необходимо отправить уведомления в случае обновлении записи;
  • pinged — URL из записи, которыми уже было получено уведомление об обновлении;
  • post_parent — ID идентификатор родительской страницы записи;
  • guid — Ссылка на запрашиваемую запись;
  • menu_order — Порядковый номер записи для создания меню WordPress;
  • post_type — Тип запрашиваемой записи. Может быть: page, post, attachment;
  • post_mime_type — MIME-тип запрашиваемой записи. К примеру: zip, png, gif, pdf, jpg;
  • comment_count — Кол-во комментариев запрашиваемой записи;

Пример вывода данных с помощью функции get_post

Как видите использование функции WordPress — get_post() очень просто.

www.school-wp.net


You May Also Like

About the Author: admind

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.