Использование paginate_links() для генерации пагинации вида "1, 2, 3 ... 10, 20, 30, 40... 55"
Я нашел этот код:
// Получаем общее количество страниц
global $wp_query;
$total = $wp_query->max_num_pages;
// Пагинация только если у нас больше одной страницы
if ( $total > 1 ) {
// Получаем текущую страницу
if ( !$current_page = get_query_var('paged') )
$current_page = 1;
// Структура "format" зависит от того, используем ли мы красивые постоянные ссылки
$permalinks = get_option('permalink_structure');
$format = empty( $permalinks ) ? '&page=%#%' : 'page/%#%/';
echo paginate_links(array(
'base' => get_pagenum_link(1) . '%_%',
'format' => $format,
'current' => $current_page,
'total' => $total,
'mid_size' => 2,
'type' => 'list'
));
}
Это работает нормально, но генерирует пагинацию вида "1, 2, 3 ... ПОСЛЕДНЯЯ_СТРАНИЦА", я видел плагины, которые генерируют пагинацию вида "1, 2, 3... 19, 20, 30 ... ПОСЛЕДНЯЯ_СТРАНИЦА".
Можно ли этого достичь, используя функцию paginate_links()?
Я не хочу добавлять плагин только ради такой небольшой модификации.

Функция paginate_links()
делает это по умолчанию. Управляющий параметр — mid_size
, который определяет количество ссылок на страницы вокруг текущей страницы для отображения. Значение по умолчанию — 2
.
Это означает, что если у вас 12 страниц, а текущая страница — Страница 1, пагинация будет выглядеть так:
1 2 3 ... 12
Но если текущая страница — Страница 6, пагинация примет вид:
1 ... 4 5 6 7 8 ... 12
Возможно, я ошибаюсь, но, кажется, именно так работают большинство плагинов для пагинации.
Редактирование
Извините, я сначала неправильно понял ваш вопрос и не уловил, что вы хотите выводить каждую десятую страницу в ваших ссылках пагинации.
У этой функции нет встроенного параметра для такого поведения. Лучший вариант — установить 'show_all'
в true
, изменить 'type'
на 'array'
, а затем вручную сформировать вывод, перебирая значения массива.

http://codex.wordpress.org/Function_Reference/paginate_links
То, что вам нужно, это параметр 'end_size' - добавьте его в массив аргументов с нужным вам значением.

$paged = (get_query_var('page')) ? get_query_var('page') : 1;
$args= new WP_Query(array(
'post_type'=>'card', // тип записи - карточки
'posts_per_page' => 6, // количество записей на странице
'paged' => $paged, // текущая страница
));
if($args->have_posts()) :
while($args->have_posts()) : $args->the_post();
$permalink=get_the_permalink(get_the_ID()); // получаем постоянную ссылку
$title=get_the_title(); // получаем заголовок
echo '<div class="col-md-4 card-details"><a href="'.$permalink.'">';
echo '<div class="card-img">';the_post_thumbnail('thumbnail');echo '</div>'; // миниатюра записи
echo '<div class="card-title"><h4>'.$title.'</h4></a>';
echo'</div>';
echo '</div>';
endwhile;
$total_pages = $args->max_num_pages; // общее количество страниц
?>
<div class="greetings-pagination col-md-12">
<?php
if ($total_pages > 1){
$current_page = max(1, get_query_var('page')); // текущая страница
echo paginate_links(array(
'base' => get_pagenum_link(1) . '%_%', // базовый URL
'format' => '/page/%#%', // формат URL
'current' => $current_page, // текущая страница
'total' => $total_pages, // всего страниц
'prev_text' => __('назад'), // текст "назад"
'next_text' => __('вперед'), // текст "вперед"
));
}
?>
</div>
<?php else :?>
<h3><?php _e('Ошибка 404: Страница не найдена', ''); ?></h3>
<?php endif; ?>
<?php wp_reset_postdata();?> // сброс данных запроса

На сайте разработчиков WordPress действительно упоминаются некоторые параметры. Вот страница, посвящённая этой функции. Вы можете проверить параметр 'end_size' для получения дополнительной информации.
У меня остаётся вопрос. Я использую <?php echo paginate_links(); ?>
в шаблоне своей темы, и это прекрасно работает (как показано на изображении).
Но я не уверен, не вызовет ли это других проблем.
