Пагинация: Как всегда отображать «предыдущий»?

Вопрос или проблема

Я использую следующий код для своей пагинации.

// Пагинация
function my_paginate_links() {
    global $wp_rewrite, $wp_query;
    $wp_query->query_vars['paged'] > 1 ? $current = $wp_query->query_vars['paged'] : $current = 1;
    $pagination = array(
        'base' => @add_query_arg('page','%#%'),
        'format' => '',
        'total' => $wp_query->max_num_pages,
        'current' => $current,
        'prev_text' => __(''),
        'next_text' => __('далее »'),
        'end_size' => 1,
        'mid_size' => 2,
        'show_all' => true,
        'type' => 'list'
    );
    if ( $wp_rewrite->using_permalinks() )
            $pagination['base'] = user_trailingslashit( trailingslashit( remove_query_arg( 's', get_pagenum_link( 1 ) ) ) . 'page/%#%/', 'paged' );
    if ( !empty( $wp_query->query_vars['s'] ) )
            $pagination['add_args'] = array( 's' => get_query_var( 's' ) );
    echo paginate_links( $pagination );
}

Когда на первой странице, ссылка ‘назад’ не отображается. Я понимаю, почему так, но мне нужно, чтобы она отображалась, так как я определенным образом проектирую сайт. Есть ли часть кода выше, которую я могу изменить, чтобы это произошло? Я прочитал кодекс по этому вопросу, но не нашел ответа, который был бы мне понятен. Буду признателен за любую помощь. Спасибо.

Изучая исходный код paginate_links(), кажется, что нет доступной опции, чтобы всегда включать ссылки ‘предыдущая’ или ‘следующая’. Функция просто сравнивает текущий номер страницы с общим количеством страниц, чтобы определить, нужно ли добавлять эти ссылки.

Однако, обход этого возможен. Это может помочь начать:

$page_links = paginate_links(array(
    // Заставляет функцию никогда не возвращать ссылки на предыдущую или следующую страницы,
    // мы добавим их вручную.
    'prev_next' => FALSE,

    // Возвращает массив, с которым легче работать.
    'type' => 'array',

    // + все ваши остальные аргументы здесь
));

// Теперь остается только вручную добавить ссылку на предыдущую и следующую страницы.
// Примечание: вам все равно нужно построить фактические URL-адреса для prev/next.
$prev_link = '<a href="#">'.__('Предыдущая').'</a>';
$next_link = '<a href="#">'.__('Следующая').'</a>';

array_unshift($page_links, $prev_link);
$page_links[] = $next_link;

// Вывод
echo implode($page_links);

Немного поздно, но у меня была эта проблема, и я нашел вашу нераскрытую проблему. Вот к чему я пришел… Мы можем получить массив ссылок, поэтому, если мы сравним номер текущей страницы, мы можем вручную добавить наши ссылки prev/next и обработать остальные ссылки:

    // Пагинация
function my_paginate_links() {
    global $wp_rewrite, $wp_query;
    $wp_query->query_vars['paged'] > 1 ? $current = $wp_query->query_vars['paged'] : $current = 1;
    $pagination = array(
        'base' => @add_query_arg('page','%#%'),
        'format' => '',
        'total' => $wp_query->max_num_pages,
        'current' => $current,
        'prev_text' => __(''),
        'next_text' => __('далее &raquo;'),
        'end_size' => 1,
        'mid_size' => 2,
        'show_all' => true,
        'type' => 'array'
    );
    if ( $wp_rewrite->using_permalinks() )
            $pagination['base'] = user_trailingslashit( trailingslashit( remove_query_arg( 's', get_pagenum_link( 1 ) ) ) . 'page/%#%/', 'paged' );
    if ( !empty( $wp_query->query_vars['s'] ) )
            $pagination['add_args'] = array( 's' => get_query_var( 's' ) );
    $pages = paginate_links( $pagination );
    echo '<ul>';
    if ( $paged == 1) echo '<li><a href="#" class="disabled">&laquo;</a></li>';
    foreach ($pages as $page) :
        echo '<li>'.$page.'</li>';
    endforeach;
    if ( $paged == $wp_query->max_num_pages ) echo '<li><a href="#" class="disabled">&raquo;</a></li>';
    echo '</ul>';
}

У нас тоже была такая необходимость. Мы решили, что хотим, чтобы элемент-заполнитель был <span>, а не <a> по причинам доступности и для соответствия поведению текущего номера страницы, который также не является кликабельным.

Пробовали некоторые из решений на этой странице, но оказалось проще просто проверить, если в выводе есть предыдущая или следующая ссылка, и добавлять заполнитель, если нет.

Вот мое решение:

$page_links = paginate_links();
if ( ! str_contains( $page_links, 'class="prev' ) ) { // phpcs:ignore PHPCompatibility.FunctionUse.NewFunctions.str_containsFound
    $page_links="<span class="prev page-numbers placeholder-prevnext">Предыдущая</span>" . $page_links;
}
if ( ! str_contains( $page_links, 'class="next' ) ) { // phpcs:ignore PHPCompatibility.FunctionUse.NewFunctions.str_containsFound
    $page_links .= '<span class="next page-numbers placeholder-prevnext">Следующая</span>';
}

echo $page_links;

и если вам нужна поддержка <PHP8, добавьте

// основано на исходной работе из фреймворка PHP Laravel
if ( ! function_exists( 'str_contains' ) ) {
    function str_contains( $haystack, $needle ) {
        return $needle !== '' && mb_strpos( $haystack, $needle ) !== false; //phpcs:ignore WordPress.PHP.YodaConditions.NotYoda
    }
}

Посмотрев на документацию paginate_links, мы видим, что он просто не добавляет отключенные ссылки, поэтому мы можем сделать это вместо этого.

$links = paginate_links($args);
if (strpos($links, 'prev page-numbers') === false) {
    $links="<button class="page-numbers prev" disabled>&lt;</button>" . $links;
} else if (strpos($links, 'next page-numbers') === false) {
    $links .= '<button class="page-numbers next" disabled>&gt;</button>';
}
echo $links;

Показывает отключенную ссылку

.

Ответ или решение

Пагинация является важным элементом пользовательского интерфейса, особенно в веб-приложениях и на веб-сайтах, где представлено большое количество данных. Она позволяет пользователям перемещаться по страницам с данными, уменьшая при этом нагрузку на сервер и отображая только ограниченное количество записей за раз. В рассматриваемом вопросе перед нами стоит задача отображения ссылки "предыдущая" ("previous") на всех страницах, включая первую, несмотря на то, что по умолчанию такая ссылка обычно отсутствует на первой странице.

Теория

Для начала, важно понять, как работает функция paginate_links() в WordPress. Она создает навигационные ссылки для пагинации на основе текущей страницы и общего количества страниц. Параметры, такие как 'prev_text' и 'next_text', определяют текст для ссылок "предыдущая" и "следующая" соответственно. Однако, функция paginate_links() по умолчанию убирает ссылки предыдущий и следующий, когда до или после текущей страницы нет соответствующей страницы. Таким образом, на первой странице ссылка "предыдущая" просто не будет отображаться, так как нет предыдущей страницы.

Пример

Вот пример модификации функции paginate_links() для того, чтобы всегда отображалась ссылка "предыдущая":

function my_paginate_links() {
    global $wp_rewrite, $wp_query;
    $current = max(1, get_query_var('paged'));

    $pagination_args = array(
        'base'         => @add_query_arg('page', '%#%'),
        'format'       => '',
        'total'        => $wp_query->max_num_pages,
        'current'      => $current,
        'prev_text'    => __('&laquo; Previous'),
        'next_text'    => __('Next &raquo;'),
        'type'         => 'array',
    );

    if ($wp_rewrite->using_permalinks())
        $pagination_args['base'] = user_trailingslashit(trailingslashit(remove_query_arg('s', get_pagenum_link(1))) . 'page/%#%/', 'paged');

    if (!empty($wp_query->query_vars['s']))
        $pagination_args['add_args'] = array('s' => get_query_var('s'));

    $pages = paginate_links($pagination_args);

    if ($pages) {
        echo '<ul class="pagination">';

        // Добавление ссылки "предыдущая" на первой странице
        if ($current === 1) {
            echo '<li class="disabled"><span>&laquo; Previous</span></li>';
        }

        foreach ($pages as $page) {
            echo '<li>' . $page . '</li>';
        }

        if ($current >= $wp_query->max_num_pages) {
            echo '<li class="disabled"><span>Next &raquo;</span></li>';
        }

        echo '</ul>';
    }
}

Применение

  1. Текущая страница: Мы используем max(1, get_query_var('paged')) для определения текущей страницы, чтобы избежать проблемы с неопределенными значениями на первой странице.

  2. Параметры пагинации: Здесь настраиваются базовые параметры, такие как формат URL и текст для навигационных ссылок. Обратите внимание, что установлен тип 'type' => 'array', который позволяет получить массив ссылок, с которыми можно работать далее.

  3. Обработчик ссылок:

    • Если пользователи находятся на первой странице: добавляем специальный HTML-код, чтобы визуально обозначить, что ссылка "предыдущая" недоступна (и обычно, это может быть в виде <li class="disabled"><span>&laquo; Previous</span></li>).
  4. Вывод: Используем стандартный foreach цикл, чтобы вывести каждую из страниц в виде элементов списка, обеспечивая, что ссылки "предыдущая" и "следующая" будут выглядеть и вести себя согласно нашим требованиям.

Данный код всегда отображает невзаимодействующую (неактивную) ссылку "предыдущая" на первой странице. Это поможет вам сохранить визуальное единообразие вашего пользовательского интерфейса и не разочарует пользователей, которые могут ожидать постоянное наличие всех элементов навигации.

Важно понимать, что в веб-разработке всегда лучше следовать стандартам и рекомендациям дизайна пользовательского интерфейса. Однако, новые требования и уникальные дизайн-решения могут требовать таких изменений, чтобы соответствовать определенной эстетике или функциональности вашего проекта.

Оцените материал
Добавить комментарий

Капча загружается...