✅ Nowości, motywy, wtyczki WEB i WordPress. Tutaj dzielimy się wskazówkami i najlepszymi rozwiązaniami dla stron internetowych.

Paginacja WordPress: proste narzędzie (i dlaczego)

28

Tworząc szablony dla WordPressa, zazwyczaj masz funkcje stronicowania, które pochodzą z samej aplikacji.

Należą do nich takie rzeczy jak:

Jest też kilka innych postów, które zapewniają większą szczegółowość taksonomii, takich jak get_adjacent_post().

Polecam przeczytanie wszystkich powyższych linków, ponieważ są one przydatne, jeśli tworzysz motyw, pracujesz z niestandardowymi typami postów lub po prostu szukasz głębszego zrozumienia niektórych typowych tagów szablonów.

Jeśli jednak szukasz łatwego sposobu na napisanie narzędzia do stronicowania WordPress (któremu wyjaśnię za chwilę), to reszta tego postu dokładnie to omówi.

Niestandardowa paginacja WordPress

Po pierwsze, za każdym razem, gdy tworzysz dla kogoś aplikację internetową, z pewnością pojawią się niuanse, w których natywna funkcjonalność WordPressa może nie działać. Być może nie działa zgodnie z oczekiwaniami, nie działa zgodnie z przeznaczeniem lub nie spełnia twoich potrzeb.

W każdym razie nie oznacza to, że nie można zbudować paginacji, aby służyła twoim celom. W końcu sedno paginacji – zwłaszcza w odniesieniu do paginacji pojedynczego posta – polega w zasadzie na tym:

Na podstawie bieżącego wpisu sprawdź, czy wpis istnieje przed nim i sprawdź, czy istnieje wpis po nim. Jeśli istnieje którykolwiek typ postu, podaj do niego link; w przeciwnym razie nie.

Stąd możemy ustalić, że będziemy potrzebować następujących funkcji:

  1. sposób na ustalenie, czy post istnieje za aktualnym postem,
  2. sposób na ustalenie, czy post istnieje po aktualnym poście,
  3. sposób na odzyskanie danego posta,
  4. sposób na uzyskanie permalinku dla danego posta.

Jednak staram się być bardzo dokładny w powyższym języku, ponieważ post, który jest „za" lub „po” danym poście, może nie mieć identyfikatora, który jest o jeden mniejszy niż identyfikator bieżącego posta.

To po prostu pierwszy opublikowany post, który można pobrać w dowolnym kierunku, prawda?

Mając to na uwadze, oznacza to, że będziemy potrzebować dwóch zapytań:

  • zapytanie do pobrania posta za aktualnym postem,
  • zapytanie do pobrania posta po aktualnym poście.

W tym przykładzie zakładam, że masz dostęp do identyfikatora bieżącego wpisu poprzez funkcję get_the_ID().

Uzyskaj post za bieżącym postem

Aby to zrobić, musimy utworzyć proste zapytanie, które pobierze jeden opublikowany post z bazy danych określonego typu posta i jest on powiązany z pozycją bieżącego posta.

Możemy to zrobić, ograniczając zestaw wyników do jednego, porządkując wyniki w kolejności malejącej i porównując wartość identyfikatora posta:

<?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') );

Spowoduje to zwrócenie tablicy wyników, którymi za chwilę zobaczymy, jak zarządzać.

Pobierz post po bieżącym poście

W kolejnym poście piszemy podobne zapytanie. Zamiast tego szukamy następnej wartości, która jest większa i która wyprzedza obecny identyfikator:

<?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') );

Teraz potrzebujemy kilku funkcji, aby określić, czy posty istnieją. Możemy to zrobić za pomocą zwróconej tablicy wyników.

Sprawdź, czy post istnieje

Zauważ, że w poniższym przykładzie funkcja akceptuje tablicę wyników i po prostu zwraca, jeśli istnieje poprzedni wpis. Wyniki przekazywane do tej funkcji powinny pochodzić z poprzedniego zapytania post powyżej.

Po drugie, zauważ, że jest prywatny. Możesz chcieć upublicznić swój szablon w zależności od tego, jak chcesz skonstruować swoje szablony.

<?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]);
}

W następnym poście wygląda to tak samo, ale pamiętaj, że wyniki przekazywane do tej funkcji pochodzą z innego zapytania.

<?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]);
}

I wreszcie, możemy użyć tych funkcji warunkowych, aby uzyskać bezpośredni link.

Uzyskaj link

Pamiętaj, że sposób, w jaki korzystasz z tej funkcji, może różnić się od dostarczonej przeze mnie implementacji. Jeśli więc nie chcesz, aby był prywatny, zmień jego widoczność i użyj go w swoim szablonie w razie potrzeby.

<?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);
}

Na koniec zauważ, że ta funkcja akceptuje wyniki przekazywane do niej z dowolnego zapytania i pobierze właściwość ID z pierwszego indeksu wyników.

Dzieje się tak, ponieważ wyniki są ograniczone do jednego i zależą od użycia funkcji warunkowych. Oznacza to, że możesz zrobić coś takiego:

  • jeśli jest następny post, uzyskaj link do następnego posta

Ale twoja implementacja może się różnić.

Dlaczego jest to potrzebne?

Może nie być potrzebne. To wszystko: jeśli korzystasz z gotowego WordPressa z bardzo niewielkimi dostosowaniami lub rozszerzeniami i nie musisz robić niczego poza tym, co może zapewnić, możesz tego nie potrzebować.

Jeśli z drugiej strony szukasz sposobu na wprowadzenie funkcji stronicowania WordPress w pojedynczym poście, to jest to sposób, który może właściwie obsłużyć przypadki postów, które są określonego typu, ale nie t mieć identyfikatory sekwencyjne (które działają tylko ze statusem publikacji posta).

Źródło nagrywania: tommcfarlin.com

Ta strona korzysta z plików cookie, aby poprawić Twoje wrażenia. Zakładamy, że nie masz nic przeciwko, ale możesz zrezygnować, jeśli chcesz. Akceptuję Więcej szczegółów