Функция разбиения на страницы опирается на $wp_query->max_num_pages
(т. Е. Максимальное количество страниц для основного запроса ), поэтому функция не будет работать с пользовательскими запросами:
function understrap_pagination( $args = array(), $class = 'pagination' ) {
if ( $GLOBALS['wp_query']->max_num_pages <= 1 ) {
return;
}
...
}
Ихотя ваш подход работает, на самом деле не стоит менять глобальный объект $wp_query
, потому что это по сути то же самое, что и использование query_posts()
, которое вообще не рекомендуется - вы можете понять, почему это так, проверив документы здесь .
Однако, если вы не хотите редактировать функцию нумерации страниц (или создавать свою собственную), то временным обходным путем, позволяющим получить нумерацию страниц с вашим пользовательским запросом, является временноеизменение - и только - $wp_query->max_num_pages
:
$orig_max_num_pages = $wp_query->max_num_pages; // backup
// Change it just for the pagination.
// and $latestArticles is your custom WP_Query instance.
$wp_query->max_num_pages = $latestArticles->max_num_pages;
$paged = max( get_query_var( 'paged' ), get_query_var( 'page' ), 1 );
understrap_pagination( [
'current' => $paged,
] );
$wp_query->max_num_pages = $orig_max_num_pages; // restore
Образец шаблона страницы на основе вашего исходного кода .
A Лучшая практика: Копирование / редактирование функции нумерации страниц .
Поскольку вы используете дочернюю тему , а этот Understrap использует locate_template()
для загрузкифайл (inc/pagination.php
), который определяет pagination функция, вы можете просто скопировать файл в дочернюю тему (your-theme/inc/pagination.php
) и отредактировать функцию так, чтобы она работала с пользовательскими запросами WP_Query
. или , поскольку функция является подключаемой (т.е. определяется с помощью блока if ( ! function_exists() )
), вы можете просто скопировать код в файл functions.php
вашей дочерней темы.
Вы можете использовать эту модифицированную функцию (которая хорошо работает для меня) или использовать ее в качестве ссылки для создания своей собственной:
function understrap_pagination( $args = array(), $class = 'pagination' ) {
$args = wp_parse_args(
$args,
array(
'mid_size' => 2,
'prev_next' => true,
'prev_text' => __( '«', 'understrap' ),
'next_text' => __( '»', 'understrap' ),
'screen_reader_text' => __( 'Posts navigation', 'understrap' ),
'type' => 'array',
'current' => max( 1, get_query_var( 'paged' ) ),
'total' => $GLOBALS['wp_query']->max_num_pages,
)
);
// Nothing to paginate, so let's bail.
if ( ! $links = paginate_links( $args ) ) {
return;
}
?>
<nav aria-label="<?php echo $args['screen_reader_text']; ?>">
<ul class="pagination">
<?php
foreach ( $links as $key => $link ) {
?>
<li class="page-item <?php echo strpos( $link, 'current' ) ? 'active' : ''; ?>">
<?php echo str_replace( 'page-numbers', 'page-link', $link ); ?>
</li>
<?php
}
?>
</ul>
</nav>
<?php
}
Затем в своем шаблоне вызовите функцию следующим образом:
$paged = max( get_query_var( 'paged' ), get_query_var( 'page' ), 1 );
understrap_pagination( [
'current' => $paged,
'total' => $latestArticles->max_num_pages,
] );
Образец шаблона страницы на основе вашего исходного кода .
paged
против page
paged
и page
- это номер текущей страницы , однако:
paged
используется с запросами / URL-адресами на основе архива, такими как категорияархивы и страницы результатов поиска. На эти запросы page
не устанавливается по умолчанию. Также следует отметить, что paged
используется с is_paged()
.
page
используется с единичными запросами / URL, такими как одиночная публикация и страницастраницы. По этим запросам paged
не устанавливается по умолчанию.
И Codex рекомендует следующий подход для получения правильного номера страницы для отдельных запросов / URL:
if ( get_query_var( 'paged' ) ) { $paged = get_query_var( 'paged' ); }
elseif ( get_query_var( 'page' ) ) { $paged = get_query_var( 'page' ); }
else { $paged = 1; }
Или более простая версия: $paged = max( get_query_var( 'paged' ), get_query_var( 'page' ), 1 );
Примечание: эта статья Кодекса относится к статической титульной странице, но эта информация также относится к любым страницам / постам.
И последнее, но не менее важное ... со вторичными WP_Query
вызовами (такими как $latestArticles = new WP_Query( $args )
), вам просто нужно позвонить wp_reset_postdata()
и не нужно звонить wp_reset_query()
. :)