Все данные, которые вы вводите в WordPress, будут храниться в базе данных, в зависимости от того, на какой странице вы находитесь, WordPress будет запрашивать базу данных по-разному.
Если вы находитесь на странице индекса, то WordPress запросит базу данных, чтобы получить последние сообщения, если вы находитесь на страницах категорий, то WordPress вернет последние сообщения в этой категории, если вы находитесь на одной странице, то WordPress вернет эту. после.
Но вы можете изменить вызов SQL для запроса к базе данных любой информации, которую вы хотите.
Есть 3 способа сделать запрос к базе данных WordPress, вы можете использовать действие pre_get_posts, функцию query_posts () или класс WP_Query .
Действие pre_get_posts
Когда вы делаете запрос к базе данных, WordPress создает глобальную переменную с именем $ query. Используя действие pre_get_posts, вы можете получить доступ к этой переменной $ query в качестве параметра функции обратного вызова. Внутри этой функции обратного вызова вы можете изменить ее, прежде чем она вызовет базу данных.
Имейте в виду, что это действие используется для всех вызовов базы данных, которые включают вызовы внутри области администратора, его также можно вызывать несколько раз, поэтому важно проверить, является ли изменяемый вызов основным запросом. Чтобы проверить, меняете ли вы основной запрос, вы можете использовать функцию is_main_query () .
if(is_main_query()) { // Modify the query }
Но это также может быть вызвано из области администратора, поэтому вам также необходимо проверить, что вы находитесь на ожидаемой странице, например, если вы хотите изменить запрос категории, вам также необходимо использовать функцию is_category () .
if(is_main_query() && is_category()) { // Modify the query }
Например, если вы хотите исключить категорию из запроса страницы индекса, вы можете изменить запрос с помощью этого вызова.
add_action( 'pre_get_posts', 'exclude_category' ); function exclude_category( $query ) { if ( $query->is_home() && $query->is_main_query() && ! $query->get( 'cat' ) ){ $query->set( 'cat', '-5' ); } }
Вы можете изменить количество сообщений, которые вы получите от запроса, изменив параметр posts_per_page .
add_action( 'pre_get_posts', 'get_one_post' ); function get_one_post( $query ) { if ( $query->is_home() && $query->is_main_query() ){ $query->set( 'posts_per_page', 1 ); } }
Действие pre_get_posts следует использовать, когда вам просто нужно изменить существующий запрос, используемый WordPress, если вам нужно выполнить дополнительные запросы, вам следует использовать класс WP_Query .
Функция query_posts
Функция query_posts — это еще один способ редактирования основного запроса в WordPress, это самый простой способ редактирования запроса к базе данных, поскольку он переопределяет переменную $ query. Хотя это самый простой способ редактирования основного запроса, он не является предпочтительным или наиболее эффективным, но лучше использовать действие pre_get_post и изменить основной запрос.
Так же, как и действие pre_get_post, вы можете использовать функцию query_post, чтобы изменить количество возвращаемых постов, по умолчанию WordPress вернет 10 постов, если вы хотите изменить это на 1 пост, вы можете использовать этот код.
<?php query_posts( 'posts_per_page=1' ); while ( have_posts() ) : the_post(); echo ' <h1>'; the_title(); echo '</h1> '; endwhile; ?>
WP_Query Class
Класс WP_Query определен в wp-includes / query.php и является классом, который используется для выполнения запросов к базе данных для получения сообщений, которые нам нужны для определенной страницы. Класс WP_Query создаст переменную, которую можно использовать в любом месте на странице, переменная $ wp_query и имеет несколько методов, которые можно использовать для получения информации из запроса.
Основными методами, о которых вы, возможно, уже знаете, является метод $ wp_query-> have_posts (), который вызывается из цикла функцией have_posts (). Вы также можете использовать эту переменную внутри Цикла , получая информацию о текущем сообщении с помощью метода the_post ().
Если вы используете класс WP_Query для изменения запроса WordPress, вам нужно использовать переменную класса для вызова методов have_posts () и метода the_post ().
$new_query = new WP_Query( $args ); // The Loop while ( $new_query->have_posts() ) : $new_query->the_post(); printf(' <h1>%s</h1> ', get_the_title() ); endwhile;
Класс WP_Query может использоваться для вторичного вызова базы данных, но если вы хотите сделать новый вызов, вам нужно сбросить предыдущий запрос запроса с помощью функции wp_reset_postdata () .
$new_query = new WP_Query( $args ); // The Loop while ( $new_query->have_posts() ) : $new_query->the_post(); printf(' <h1>%s</h1> ', get_the_title() ); endwhile; wp_reset_postdata(); $second_query = new WP_Query( $second_args ); // The Loop while ( $second_query->have_posts() ) : $second_query->the_post(); printf(' <h1>%s</h1> ', get_the_title() ); endwhile; wp_reset_postdata();
Существует ряд различных параметров и методов, которые вы можете использовать с классом WP_Query. В кодексе WordPress есть список всех их.
Примеры запросов с WP_Query
Получать сообщения по автору
$query = new WP_Query( 'author=' . $author_id );
Исключить сообщения по автору
$query = new WP_Query( 'author=-' . $author_id );
Получать сообщения в определенной категории
$query = new WP_Query( 'cat=' . $category_id );
Исключить сообщения в определенной категории
$query = new WP_Query( 'cat=-' . $category_id );
Получить сообщения в теге
$query = new WP_Query( 'tag=' . $tag_name );
Получить сообщения в определенной таксономии
$args = array( 'post_type' => 'post', 'custom_tax' => 'term' ); $query = new WP_Query( $args );
Получить сообщения из условий поиска
$query = new WP_Query( 's=' . $search_term );
Получить сообщение по идентификатору
$query = new WP_Query( 'p=' .$post_id );
Получить сообщение по почте Slug
$query = new WP_Query( 'name=' . $post_slug );
Получить все сообщения
$query = new WP_Query( 'posts_per_page=-1' );
Получить случайный пост
$query = new WP_Query( array ( 'orderby' => 'rand', 'posts_per_page' => '1' ) );
Получать сообщения по большинству комментариев
$query = new WP_Query( array( 'orderby' => 'comment_count' ) );