WordPress. Навигация и пагинация

20.03.2019

Теги: CMSWeb-разработкаWordPressНавигацияФункция

Навигация на странице записи

Функция the_post_navigation()

Выводит на экран HTML блок ссылок на следующую и предыдущую записи. Используется на странице отдельной записи. Эта функция объединяет в одну отдельные функции: next_post_link() и previous_post_link(). Функция создана для удобства, с ней вставлять блок навигации можно одной строкой.

the_post_navigation($args);

Массив $args может содержать ключи:

  • prev_text (строка). Текст, который будет показан, как анкор ссылки на предыдущую запись. По умолчанию: '%title'.
  • next_text (строка). Текст, который будет показан, как анкор ссылки на следующую запись. По умолчанию: '%title'.
  • screen_reader_text (строка). Заголовок блока навигации. По умолчанию: __('Post navigation').
  • in_same_term (логический). Должно быть true, когда нужно, чтобы ссылка была на записи таксономии, указанной в ключе taxonomy. По умолчанию: false.
  • excluded_terms (строка/массив). Идентификаторы элементов таксономии, который нужно исключить. В виде массива или в строке через запятую. По умолчанию: пустая строка.
  • taxonomy (строка). Название таксономии, когда in_same_term равно true. По умолчанию: 'category'

Пример вызова функции:

the_post_navigation([
    'prev_text'          => __('prev post: %title'),
    'next_text'          => __('next post: %title'),
    'in_same_term'       => true,
    'taxonomy'           => __('flowers'), // ссылки на записи с тегом flowers
    'screen_reader_text' => __('Post navigation'),
]);

Функция next_post_link()

Выводит ссылку на следующую по дате запись. Используется на странице отдельной записи.

Функция previous_post_link()

Выводит ссылку на предыдущую по дате запись. Используется на странице отдельной записи.

Навигация для списка записей

Функция the_posts_navigation()

Выводит ссылки на следующую и предыдущую страницы постов. Используется на страницах списка записей.

the_posts_navigation($args);

Массив $args содержит параметры, с помощью которых можно изменить анкоры ссылок: «Старые записи» и «Новые записи». По умолчанию параметры выглядят так:

$args = array(
    'prev_text'          => __( 'Older posts' ),
    'next_text'          => __( 'Newer posts' ),
    'screen_reader_text' => __( 'Posts navigation' ),
);
<nav class="navigation posts-navigation" role="navigation">
    <h2 class="screen-reader-text">Навигация</h2>
    <div class="nav-links">
        <div class="nav-previous">
            <a href="http://wptest.ru/page/3/">Предыдущие записи</a>
        </div>
        <div class="nav-next">
            <a href="http://wptest.ru/">Следующие записи</a>
        </div>
    </div>
</nav>

Функция next_posts_link()

Выводит ссылку на следующий список записей. Используется на страницах списка записей.

Так как записи обычно отсортированы в обратном хронологическом порядке, эта функция выводит ссылку на более старые записи по сравнению с текущими.

Функция previous_posts_link()

Выводит ссылку на предыдущий список записей. Используется на страницах списка записей.

Так как записи обычно отсортированы в обратном хронологическом порядке, эта функция выводит ссылку на более новые записи по сравнению с текущими.

Постраничная навигация

Функция the_posts_pagination()

Выводит на экран ссылки пагинации на следующие и предыдущие наборы постов. Используется на страницах списка записей.

the_posts_pagination($args);

Массив $args может содержать элементы:

$args = array(
    'show_all'     => false, // показаны все страницы участвующие в пагинации
    'end_size'     => 1,     // количество страниц на концах
    'mid_size'     => 1,     // количество страниц вокруг текущей
    'prev_next'    => true,  // выводить ли боковые ссылки «предыдущая/следующая»
    'prev_text'    => __('« Previous'),
    'next_text'    => __('Next »'),
    'add_args'     => false, // массив переменных запроса, которые нужно добавить к ссылкам
    'add_fragment' => '',    // текст, который надо добавить ко всем ссылкам
    'screen_reader_text' => __( 'Posts navigation' ),
);
<nav class="navigation pagination" role="navigation">
    <h2 class="screen-reader-text">Навигация по записям</h2>
    <div class="nav-links"><a class="prev page-numbers" href="http://www.server.com/">Назад</a>
        <a class="page-numbers" href="http://www.server.com/">1</a>
        <span aria-current="page" class="page-numbers current">2</span> <!-- текущая страница -->
        <a class="page-numbers" href="http://www.server.com/page/3/">3</a>
        <span class="page-numbers dots"></span>
        <a class="page-numbers" href="http://www.server.com/page/11/">11</a>
        <a class="next page-numbers" href="http://www.server.com/page/3/">Далее</a>
    </div>
</nav>

Пример постраничной навигации

Допустим, при верстке шаблона был использован фреймворк Bootstrap 4. Чтобы не создавать стили для постраничной навигации с нуля, нам нужно задать свой шаблон, с классами bootstrap. Этот шаблон выглядит так:

<nav aria-label="Постраничная навигация">
    <ul class="pagination">
        <li class="page-item disabled">
            <span class="page-link">Предыдущая</span>
        </li>
        <li class="page-item">
            <a class="page-link" href="#">1</a>
        </li>
        <li class="page-item active">
            <span class="page-link">2</span>
        </li>
        <li class="page-item">
            <a class="page-link" href="#">3</a>
        </li>
        <li class="page-item">
            <a class="page-link" href="#">Следующая</a>
        </li>
    </ul>
</nav>

Для начала получаем массив ссылок постраничной навигации:

$items = paginate_links(['type' => 'array']);
print_r($items);
Array
(
    [0] => <span aria-current='page' class='page-numbers current'>1</span>
    [1] => <a class='page-numbers' href='http://www.server.com/page/2/'>2</a>
    [2] => <a class='page-numbers' href='http://www.server.com/page/3/'>3</a>
    [3] => <span class="page-numbers dots">&hellip;</span>
    [4] => <a class='page-numbers' href='http://www.server.com/page/11/'>11</a>
    [5] => <a class="next page-numbers" href="http://www.server.com/page/2/">Далее &rarr;</a>
)

И проходим по нему циклом, извлекая URL и текст ссылок:

$items = paginate_links(['type' => 'array']);
$links = [];
foreach ($items as $item) {
    $url = $txt = $type = '';
    if (preg_match('~href=("|\')([^"\']+)\1>([^<]+)</a>~', $item, $match)) {
        $url  = $match[2];
        $txt  = $match[3];
        $type = 'link';
    }
    if (preg_match('~page-numbers current("|\')>([^<]+)</span>~', $item, $match)) {
        $txt  = $match[2];
        $type = 'curr';
    }
    if (preg_match('~page-numbers dots("|\')>([^<]+)</span>~', $item, $match)) {
        $txt  = $match[2];
        $type = 'dots';
    }
    $links[] = ['type' => $type, 'url' => $url, 'txt' => $txt];
}
print_r($links);
Array
(
    [0] => Array
        (
            [type] => curr
            [url] => 
            [txt] => 1
        )
    [1] => Array
        (
            [type] => link
            [url] => http://www.server.com/page/2/
            [txt] => 2
        )
    [2] => Array
        (
            [type] => link
            [url] => http://www.server.com/page/3/
            [txt] => 3
        )
    [3] => Array
        (
            [type] => dots
            [url] => 
            [txt] => &hellip;
        )
    [4] => Array
        (
            [type] => link
            [url] => http://www.server.com/page/11/
            [txt] => 11
        )
    [5] => Array
        (
            [type] => link
            [url] => http://www.server.com/page/2/
            [txt] => Далее &rarr;
        )
)

А теперь выводим эти ссылки так, чтобы применились стили bootstrap:

<?php if (!empty($links)): ?>
    <nav aria-label="Постраничная навигация">
        <ul class="pagination">
        <?php foreach ($links as $link): ?>
            <?php if ($link['type'] == 'link'): ?>
                <li class="page-item">
                    <a class="page-link" href="<?= $link['url']; ?>"><?= $link['txt']; ?></a>
                </li>
            <?php elseif ($link['type'] == 'curr'): ?>
                <li class="page-item active">
                    <span class="page-link"><?= $link['txt']; ?></span>
                </li>
            <?php elseif ($link['type'] == 'dots'): ?>
                <li class="page-item disabled">
                    <span class="page-link"><?= $link['txt']; ?></span>
                </li>
            <?php endif; ?>
        <?php endforeach; ?>
        </ul>
    </nav>
<?php endif; ?>

В результате получим такой html-код:

<nav aria-label="Постраничная навигация">
    <ul class="pagination">
        <li class="page-item active">
            <span class="page-link">1</span>
        </li>
        <li class="page-item">
            <a class="page-link" href="http://www.server.com/page/2/">2</a>
        </li>
        <li class="page-item">
            <a class="page-link" href="http://www.server.com/page/3/">3</a>
        </li>
        <li class="page-item disabled">
            <span class="page-link">&hellip;</span>
        </li>
        <li class="page-item">
            <a class="page-link" href="http://www.server.com/page/11/">11</a>
        </li>
        <li class="page-item">
            <a class="page-link" href="http://www.server.com/page/2/">Далее &rarr;</a>
        </li>
    </ul>
</nav>

Можно оформить этот код в виде функции, для многократного использования в темах:

/*
 * Функция для вывода постраничной навигации с использованием классов Bootstrap 4
 */
function echo_posts_pagination($echo = true) {
    $items = paginate_links(['type' => 'array']);
    if (empty($items)) {
        return null;
    }

    $links = [];
    foreach ($items as $item) {
        $url = $txt = $type = '';
        if (preg_match('~href=("|\')([^"\']+)\1>([^<]+)</a>~', $item, $match)) {
            $url  = $match[2];
            $txt  = $match[3];
            $type = 'link';
        }
        if (preg_match('~page-numbers current("|\')>([^<]+)</span>~', $item, $match)) {
            $txt  = $match[2];
            $type = 'curr';
        }
        if (preg_match('~page-numbers dots("|\')>([^<]+)</span>~', $item, $match)) {
            $txt  = $match[2];
            $type = 'dots';
        }
        $links[] = ['type' => $type, 'url' => $url, 'txt' => $txt];
    }

    if (empty($links)) {
        return null;
    }

    $html = '<nav aria-label="Постраничная навигация">' . "\n";
    $html .= '  <ul class="pagination">' . "\n";
    foreach ($links as $link) {
        if ($link['type'] == 'link') {
            $html .= '    <li class="page-item">';
            $html .= '<a class="page-link" href="'.$link['url'].'">'.$link['txt'].'</a>';
            $html .= '</li>' . "\n";
        } elseif ($link['type'] == 'curr') {
            $html .= '    <li class="page-item active">';
            $html .= '<span class="page-link">'.$link['txt'].'</span>';
            $html .= '</li>' . "\n";
        } elseif ($link['type'] == 'dots') {
            $html .= '    <li class="page-item disabled">';
            $html .= '<span class="page-link">'.$link['txt'].'</span>';
            $html .= '</li>' . "\n";
        }
    }
    $html .= '  </ul>' . "\n";
    $html .= '</nav>' . "\n";

    if ($echo) {
        echo $html;
        return null;
    }
    return $html;
}
<nav aria-label="Постраничная навигация">
  <ul class="pagination">
    <li class="page-item active"><span class="page-link">1</span></li>
    <li class="page-item"><a class="page-link" href="http://www.server.com/page/2/">2</a></li>
    <li class="page-item"><a class="page-link" href="http://www.server.com/page/3/">3</a></li>
    <li class="page-item disabled"><span class="page-link">&hellip;</span></li>
    <li class="page-item"><a class="page-link" href="http://www.server.com/page/11/">11</a></li>
    <li class="page-item"><a class="page-link" href="http://www.server.com/page/2/">Далее &rarr;</a></li>
  </ul>
</nav>

Поиск: CMS • PHP • Web-разработка • WordPress • Навигация • Функция • Пагинация • the_post_navigation • the_posts_navigation • the_posts_pagination

Каталог оборудования
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Производители
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Функциональные группы
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.