В чем разница между $paged и $page?
Я создаю пагинацию для своего сайта. Надеюсь, кто-нибудь сможет объяснить мне, для чего используется приведенный ниже код? Заранее спасибо.
<?php
// Проверяем, установлена ли переменная 'paged' в запросе
if ( get_query_var('paged') ) {
$paged = get_query_var('paged');
}
// Если 'paged' не установлена, проверяем переменную 'page'
elseif ( get_query_var('page') ) {
$paged = get_query_var('page');
}
// Если ни одна из переменных не установлена, устанавливаем страницу 1
else {
$paged = 1;
}
// Запрашиваем посты с учетом пагинации
query_posts('paged='.$paged.'&posts_per_page=');
?>

Надеюсь, вы понимаете, что такое переменные запроса. Если нет, вот краткое объяснение. Главный запрос использует WP_Query
для настройки. В главном запросе WP_Query
использует публичные переменные запроса для построения запроса в соответствии с запрашиваемой страницей. Параметры paged
и page
— это две из таких переменных. Чтобы увидеть все публичные переменные запроса, вставьте этот код в шапку вашего сайта и проверьте, как они устанавливаются в зависимости от запрашиваемой страницы:
var_dump($wp_query->query_vars);
Функция get_query_var()
используется для получения значений из этих публичных переменных запроса, и в данном случае это page
и paged
.
Отвечая на ваш вопрос: эти два параметра и их значения используются WP_Query
для расчета пагинации и, что важнее, смещения постов в соответствии с номерами страниц. Именно этот параметр гарантирует, что ваши посты правильно разбиваются на страницы при навигации.
paged
— Используется на главной странице, странице блога, архивах и страницах для расчета пагинации. 1-я страница имеет значение0
, а далее номера соответствуют номеру страницы.page
— Используется на статической главной странице и одиночных страницах для пагинации. Пагинация на этих страницах работает одинаково: статическая главная страница рассматривается как одиночная страница при разбиении на страницы. Под пагинацией на одиночных страницах я подразумеваю, что записи могут быть разбиты на несколько страниц.
Что делает ваш код: он проверяет, установлен ли параметр paged
, если нет — проверяет параметр page
, и если он также не установлен, устанавливает страницу в 1
. Эта проверка всегда будет проваливаться на 1-й странице, поэтому $paged
всегда будет возвращаться к 1
. На любой другой странице, кроме первой, либо paged
, либо page
вернут true и установят $paged
в правильный номер страницы.
Важное замечание: Никогда не используйте query_posts
, если только вы не хотите что-то сломать на странице, и поверьте мне — вам этого не нужно. Всегда используйте WP_Query
для пагинированных кастомных запросов. Для полного объяснения ознакомьтесь с этой статьей, которую я написал некоторое время назад.

Спасибо @pieter-goosen, это действительно отличное объяснение. Используется ли paged
для получения текущей просматриваемой страницы?

Да, вы можете использовать echo get_query_var( 'paged' );
для получения номера текущей просматриваемой страницы.

Отличное объяснение! Параметр page
учитывает ключевое слово <!--nextpage-->
, которое разбивает одну запись на несколько страниц: https://en.support.wordpress.com/nextpage/view-all/

Имейте в виду, что домашнюю страницу можно настроить как статическую главную страницу, и тогда вместо 'paged' будет использоваться 'page'.
@PieterGoosen Я не согласен с вашим заключительным замечанием. Если вы возвращаете записи через шорткод, query_posts может быть использован. Независимо от того, делаете вы это или нет, вам необходимо вызвать wp_reset_query после получения данных, иначе вы столкнётесь с проблемами. Я лично так делаю и у меня вообще не было проблем.
