✅ Новости WEB и WordPress, темы, плагины. Здесь мы делимся советами и лучшими решениями для веб-сайтов.

Разбиение на страницы WordPress: простая утилита (и почему)

35

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

К ним относятся такие вещи, как:

И есть несколько других сообщений, которые дают вам большую детализацию таксономий, таких как get_adjacent_post().

Я рекомендую прочитать все приведенные выше ссылки, потому что они полезны, если вы создаете тему, работаете с пользовательскими типами сообщений или просто ищете более глубокое понимание некоторых общих тегов шаблонов.

Если, однако, вы ищете простой способ написать свою утилиту разбивки на страницы WordPress (обоснование которой я сейчас объясню), то остальная часть этого поста будет посвящена именно этому.

Пользовательская пагинация WordPress

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

В любом случае это не означает, что нумерация страниц не может служить вашим целям. В конце концов, суть разбивки на страницы — особенно в том, что касается разбивки на страницы отдельных сообщений — в основном такова:

Из текущего сообщения посмотрите, существует ли сообщение до него, и посмотрите, существует ли сообщение после него. Если существует какой-либо тип сообщения, укажите ссылку на него; в противном случае не делайте этого.

Отсюда мы можем определить, что нам понадобятся следующие функции:

  1. способ определить, существует ли пост за текущим постом,
  2. способ определить, существует ли пост после текущего поста,
  3. способ получить данный пост,
  4. способ получить постоянную ссылку на данный пост.

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

Это просто первое опубликованное сообщение, и его можно найти в любом направлении, верно?

Имея это в виду, это означает, что нам понадобятся два запроса:

  • запрос для получения поста за текущим постом,
  • запрос для получения поста после текущего поста.

В этом примере я предполагаю, что у вас есть доступ к идентификатору текущего сообщения через функцию get_the_ID().

Получить сообщение за текущим сообщением

Для этого нам нужно создать простой запрос, который будет извлекать один опубликованный пост из базы данных указанного типа поста, связанный с позицией текущего поста.

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

<?php

global $wpdb;
$results = $wpdb->get_results(
    $wpdb->prepare(
        "
        SELECT *
        FROM $wpdb->posts
        WHERE ID < (SELECT ID
            FROM $wpdb->posts
            WHERE ID = %d
            AND post_type = '%s'
            AND post_status = '%s'
            ORDER BY ID DESC) AND post_type = '%s'
        AND post_status = '%s'
        ORDER BY ID DESC
        LIMIT 1
        ",
        get_the_ID(),
        'acme-custom-post-type',
        'publish',
        'acme-custom-post-type',
        'publish') );

Это вернет массив результатов, которым мы вскоре увидим, как управлять.

Получить пост после текущего поста

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

<?php

global $wpdb;
$results = $wpdb->get_results(
    $wpdb->prepare(
        "
        SELECT *
        FROM $wpdb->posts
        WHERE ID > (SELECT ID
            FROM $wpdb->posts
            WHERE ID = %d
            AND post_type = '%s'
            AND post_status = '%s'
            ORDER BY ID ASC) AND post_type = '%s'
        AND post_status = '%s'
        ORDER BY ID ASC
        LIMIT 1
        ",
        get_the_ID(),
        'acme-custom-post-type',
        'publish',
        'acme-custom-post-type',
        'publish') );

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

Проверить, существует ли сообщение

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

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

<?php 
/**
 * @param array $results the results of the query to determined if there are past posts
 *
 * @return bool true if there is a previous post; otherwise, false
 */
private function hasPreviousPost($results)
{
    return isset($results[0]);
}

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

<?php
/**
 * @param array $results the results of the query to determined if there are future posts
 *
 * @return bool true if there is a next post; otherwise, false
 */
private function hasNextPost($results)
{
    return isset($results[0]);
}

И, наконец, мы можем использовать эти условные функции для получения постоянной ссылки.

Получить ссылку

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

<?php
/**
 * @param array $results the results of the array from which to retrieve the post ID
 *
 * @return string the ID of the post to which we're going to link
 */
private function getPostLink($results)
{
    return get_the_permalink($results[0]->ID);
}

Наконец, обратите внимание, что эта функция принимает результаты, которые вы передаете ей из любого запроса, и извлекает свойство ID из первого индекса результатов.

Это связано с тем, что результаты ограничены одним и зависят от использования вами условных функций. То есть вы можете сделать что-то вроде:

  • если есть следующий пост, то получите ссылку на следующий пост

Но ваша реализация может отличаться.

Зачем это нужно?

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

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

Источник записи: tommcfarlin.com

Этот веб-сайт использует файлы cookie для улучшения вашего опыта. Мы предполагаем, что вы согласны с этим, но вы можете отказаться, если хотите. Принимаю Подробнее