Замена WP-Pagenavi на собственную функцию пагинации

Альтернатива плагину WP-Pagenavi (Пагинация для WordPress)

С версии 4.1 в WordPress появилась встроенная функция, аналогичная WP-Pagenavi: the_posts_pagination().

Я заметил, что популярный плагин WP-Pagenavi может загружать сервер излишне. После анализа его кода я понял, что это не совсем так, но его всё же можно немного оптимизировать. Именно этому посту я и посвящаю своё время.

Хотя некоторые могут считать, что другие плагины без настройки в панели администратора неудобны, я нахожу WP-Pagenavi вполне простым в использовании. Достаточно настроить навигацию один раз и забыть о ней. Возможно, есть и другие, кто думает так же. Поэтому я решил отказаться от WP-Pagenavi и заменить его своей функцией. Я написал новую функцию, изучив код WP-Pagenavi и частично перенес её оттуда. Все CSS-классы WP-Pagenavi сохранены, что делает замену простой и удобной.

Замена WP-Pagenavi на собственную функцию

Чтобы заменить WP-Pagenavi, вам нужно скопировать следующую функцию в файл вашей темы functions.php. Также необходимо скопировать стили CSS из WP-Pagenavi в ваш файл стилей (обычно это style.css). Перенос стилей также полезен, так как у вас не будет необходимости подключать отдельный файл стилей, что означает меньше HTTP-запросов.

/**
 * Альтернатива WP-Pagenavi. Создаёт ссылки пагинации на страницах архива.
 *
 * @param array    $args      Аргументы функции.
 * @param WP_Query $wp_query  Объект WP_Query, на основе которого строится пагинация. По умолчанию - глобальная переменная $wp_query.
 *
 * @return string HTML код пагинации.
 */
function kama_pagenavi( $args = [], $wp_query = null ) {
    // Ниже следуют параметры по умолчанию
    $default = [
        'before'          => '',           // текст перед навигацией
        'after'           => '',           // текст после навигации
        'echo'            => true,         // возвращать или выводить результат
        'text_num_page'   => '',           // текст перед пагинацией
        'num_pages'       => 10,           // сколько ссылок показывать
        'step_link'       => 10,           // ссылки с шагом (если 10, то выведет: 1,2,3...10,20,30)
        'dotright_text'   => '…',          // текст "до"
        'dotright_text2'  => '…',          // текст "после"
        'back_text'       => '« назад',     // текст "перейти на предыдущую страницу"
        'next_text'       => 'вперёд »',    // текст "перейти на следующую страницу"
        'first_page_text' => '« в начало',  // текст "на первую страницу"
        'last_page_text'  => 'в конец »',   // текст "на последнюю страницу"
    ];

    // Совместимость со старыми версиями
    $fargs = func_get_args();
    if( $fargs && is_string( $fargs[0] ) ) {
        $default['before'] = $fargs[0] ?? '';
        $default['after']  = $fargs[1] ?? '';
        $default['echo']   = $fargs[2] ?? true;
        $args              = $fargs[3] ?? [];
        $wp_query = $GLOBALS['wp_query'];
    }

    if( !$wp_query ) {
        wp_reset_query();
        global $wp_query;
    }

    if( !$args ) {
        $args = [];
    }

    // Позволяет настроить параметры по умолчанию
    $default = apply_filters('kama_pagenavi_args', $default);
    $rg = (object) array_merge($default, $args);

    $paged = (int) ( $wp_query->get('paged') ?: 1 );
    $max_page = (int) $wp_query->max_num_pages;

    // Если навигация не нужна
    if( $max_page < 2 ) {
        return '';
    }

    // Логика отображения страниц
    // ...

    $html = $rg->before . '
' . implode('', $els) . '
' . $rg->after; if( $rg->echo ) { echo $html; } return $html; }

Настройки функции

Параметры функции описаны в самом коде и совпадают с настройками WP-Pagenavi. Единственное отличие — вместо текста "на последнюю страницу" можно отображать номер последней страницы.

После установки функции и переноса CSS-стилей измените вызов wp_pagenavi в шаблоне на следующий:

Если у вас есть что-то типа этого в коде, то вам нужно заменить все wp_pagenavi на kama_pagenavi:

if(function_exists('wp_pagenavi')) {
    wp_pagenavi('
', '
'); }

CSS стили для кода

Как уже упоминалось, CSS-классы совпадают с WP-Pagenavi. Вот все правила CSS для вашего удобства:

.wp-pagenavi {
    margin: 2em auto;
    text-align: center;
}
.wp-pagenavi > * {
    display: inline-block;
    padding: .0em .5em;
    margin: .1em;
    border: 1px solid #93a8bc;
    border-radius: 3px;
    color: #465366;
}
.wp-pagenavi a,
.wp-pagenavi a:hover {
    text-decoration: none;
}
.wp-pagenavi a {
    background-color: #FFFFFF;
}
.wp-pagenavi a:hover {
    border-color: #7d95ac;
}
.wp-pagenavi .pages { }
.wp-pagenavi .current {
    border-color: #465366;
    color: #465366;
}
.wp-pagenavi .extend {
    color: #465366;
}
.wp-pagenavi .first { }
.wp-pagenavi .last { }
.wp-pagenavi .prev {
    border-color: rgba(0,0,0,0);
}
.wp-pagenavi .next {
    border-color: rgba(0,0,0,0);
}

Что делать, если навигация отображается дважды

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

// Здесь навигацию нужно отобразить в первый раз
$navigation = kama_pagenavi('', '', false);
// Выводим переменную на экран
echo $navigation;

/* Здесь выводим посты - Loop */

// Здесь навигацию нужно отобразить во второй раз
echo $navigation;

Теперь вы знаете, как заменить WP-Pagenavi на собственную функцию пагинации. Надеюсь, этот пост оказался для вас полезным!

Leave a Reply

Ваш адрес email не будет опубликован. Обязательные поля помечены *