✅ WEB і WordPress новини, теми, плагіни. Тут ми ділимося порадами і кращими рішеннями для сайтів.

Пагінація WordPress: проста утиліта (і чому)

20

Під час створення шаблонів для 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);
}

Насамкінець зауважте, що ця функція приймає результати, які ви передаєте в неї з будь-якого запиту, і отримує властивість ідентифікатора з першого індексу результатів.

Це пояснюється тим, що результати обмежені одним і залежать від використання вами умовних функцій. Тобто ви можете зробити щось на кшталт:

  • якщо є наступна публікація, тоді отримайте посилання на наступну публікацію

Але ваша реалізація може відрізнятися.

Навіщо це потрібно?

Може не знадобитися. Ось і все: якщо ви використовуєте WordPress готовий із дуже невеликими налаштуваннями чи розширеннями й вам не потрібно робити нічого, окрім того, що він може надати, то вам це може не знадобитися.

З іншого боку, якщо ви шукаєте спосіб запровадити функцію розбиття сторінок WordPress на одну публікацію, тоді це спосіб зробити це, який може належним чином обробляти повідомлення, які належать до певного типу, але не t мають послідовні ідентифікатори (і вони працюють лише зі статусом публікації).

Джерело запису: tommcfarlin.com

Цей веб -сайт використовує файли cookie, щоб покращити ваш досвід. Ми припустимо, що з цим все гаразд, але ви можете відмовитися, якщо захочете. Прийняти Читати далі