В чем разница между $paged и $page?

11 мар. 2015 г., 04:50:29
Просмотры: 16.4K
Голосов: 9

Я создаю пагинацию для своего сайта. Надеюсь, кто-нибудь сможет объяснить мне, для чего используется приведенный ниже код? Заранее спасибо.

<?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=');
?>
0
Все ответы на вопрос 1
4
12

Надеюсь, вы понимаете, что такое переменные запроса. Если нет, вот краткое объяснение. Главный запрос использует 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 для пагинированных кастомных запросов. Для полного объяснения ознакомьтесь с этой статьей, которую я написал некоторое время назад.

11 мар. 2015 г. 06:38:17
Комментарии

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

Hung PD Hung PD
12 мар. 2015 г. 04:04:31

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

Pieter Goosen Pieter Goosen
12 мар. 2015 г. 05:27:57

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

Philipp Philipp
13 авг. 2019 г. 12:18:48

Имейте в виду, что домашнюю страницу можно настроить как статическую главную страницу, и тогда вместо 'paged' будет использоваться 'page'.

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

Alexander Behling Alexander Behling
28 июн. 2021 г. 13:07:27