Ładowanie wpisów za pomocą AJAX zamiast tradycyjnej paginacji
Ajax pozwala dynamicznie ładować wpisy bez konieczności odświeżania całej strony. Dzięki niemu można stworzyć płynne przeglądanie treści dla odwiedzających, zwłaszcza na stronach z dużą ilością treści.
Ten samouczek przeprowadzi Cię przez implementację funkcjonalności wczytywania wpisów za pomocą AJAX w WordPress.
Szczegółowe wskazówki:
1. Wyświetlanie wpisów i przycisku “Wczytaj więcej”:
Możesz użyć poniższego kodu w następujących plikach motywu:
index.php
: aby wyświetlić wpisy na głównej stronie bloga.archive.php
: do wyświetlania wpisów na stronach archiwum (kategorie, tagi, daty, autorzy, itp.).search.php
: do wyświetlania wyników wyszukiwania.home.php
: dla głównej strony bloga, jeśli nie ma plikuindex.php
.page.php
: jeśli chcesz wyświetlać wpisy na statycznej stronie.single.php
: do wyświetlania wpisów indywidualnie.
<div id="posts_list">
<?php if (have_posts()) : while (have_posts()) : the_post(); ?>
<div class="post">
<?php the_title(); ?>
<?php the_excerpt(); ?>
</div>
<?php endwhile; else: echo '<p>'.__('No content.', 'text-domain').'</p>'; endif; ?>
</div>
<?php
$load_more_btn = (get_query_var('paged') < $wp_query->max_num_pages)
? '<div class="load-more-btn"><a href="#" id="load-more-posts">Wczytaj więcej</a></div>'
: 'none';
echo $load_more_btn;
?>
Szczegółowy opis kodu:
- Po sekcji wyświetlającej wpisy sprawdzane jest warunkowe wyrażenie oparte na bieżącej stronie paginacji. Jeśli bieżąca strona jest mniejsza niż całkowita liczba stron (
$wp_query->max_num_pages
), generowany jest element<div>
o klasieload-more-btn
, zawierający link “Wczytaj więcej” z identyfikatoremload-more-posts
. - Jeśli warunek nie jest spełniony, zamiast przycisku “Wczytaj więcej” wyświetlane jest “none”.
- Na koniec kod wypisuje stworzony blok przycisku “Wczytaj więcej” lub “none” w zależności od warunku paginacji.
Upewnij się, że dodajesz ten kod w odpowiedni plik szablonu, w którym chcesz wyświetlić wpisy i przycisk w swoim motywie WordPress.
2. Rejestrowanie skryptów i obsługa żądań AJAX:
Ten kod, który obsługuje ładowanie postów za pomocą AJAX i rejestruje skrypty, powinien zostać dodany do pliku functions.php w Twojej motywie WordPress.
function loadmoreposts_scripts() {
wp_enqueue_script('loadmoreposts', get_template_directory_uri() . '/js/loadmoreposts.js', array('jquery'), '1.0', true);
global $wp_query;
$total_pages = $wp_query->max_num_pages;
wp_localize_script('loadmoreposts', 'loadmore_params', array(
'ajax_url' => admin_url('admin-ajax.php'),
'total_pages' => $total_pages,
));
}
add_action('wp_enqueue_scripts', 'loadmoreposts_scripts');
function load_more_posts() {
$args = array(
'post_type' => 'post',
'posts_per_page' => get_option('posts_per_page'),
'paged' => $_POST['page'],
);
$query = new WP_Query($args);
if ($query->have_posts()) {
while ($query->have_posts()) {
$query->the_post();
echo '<div class="post">';
the_title();
the_excerpt();
echo '</div>';
}
}
wp_die();
}
add_action('wp_ajax_load_more_posts', 'load_more_posts');
add_action('wp_ajax_nopriv_load_more_posts', 'load_more_posts');
Szczegółowy opis kodu:
- Funkcja
loadmoreposts_scripts()
odpowiada za dodanie skryptuloadmoreposts.js
do kolejki zależności jQuery. Dodatkowo lokalizuje skrypt, przekazując dane takie jakajax_url
itotal_pages
, które będą używane w skrypcie. - Wewnątrz funkcji
loadmoreposts_scripts()
obliczana jest łączna liczba stron w bieżącym zapytaniu za pomocą zmiennej$wp_query->max_num_pages
. - Dane lokalizacyjne są przekazywane do skryptu za pomocą funkcji
wp_localize_script()
, co umożliwia dostęp do zmiennych w skrypcieloadmoreposts.js
. - Funkcja
load_more_posts()
obsługuje żądanie Ajax dotyczące wczytywania kolejnych postów na podstawie numeru strony przesłanego za pomocą$_POST['page']
. - Wewnątrz funkcji
load_more_posts()
tworzony jest nowy obiektWP_Query
z parametrami, aby pobrać następny zestaw postów na podstawie numeru strony przekazanego w żądaniu AJAX. - Funkcja następnie iteruje przez pobrane posty za pomocą pętli
while
i wyświetla tytuł i streszczenie każdego posta, opakowane w element<div>
z klasąpost
. - Po przetworzeniu wszystkich postów wywoływana jest funkcja
wp_die()
, aby zakończyć skrypt i zapobiec dodatkowemu wyjściu. - Dwa haki akcji
wp_ajax_load_more_posts
iwp_ajax_nopriv_load_more_posts
są używane do obsługi żądania AJAX dla użytkowników uwierzytelnionych i nieuwierzytelnionych, poprzez przypisanie ich do funkcjiload_more_posts()
.
3. Kod JavaScript:
Aby zaimplementować opisaną funkcjonalność w JavaScript, musisz utworzyć plik o nazwie loadmoreposts.js
w katalogu motywu (zwykle w podfolderze, np. /js/
).
Skopiuj powyższy fragment kodu JavaScript do pliku loadmoreposts.js
.
jQuery(function($) {
var page = 1;
var totalPages = loadmore_params.total_pages;
$('#load-more-posts').on('click', function(e) {
e.preventDefault();
var $btn = $(this);
$.ajax({
url: loadmore_params.ajax_url,
type: 'POST',
data: {
action: 'load_more_posts',
page: page,
},
success: function(response) {
$('#posts_list').append(response);
page++;
if (page > totalPages) {
$btn.hide();
}
},
error: function(xhr, status, error) {
console.log(error);
}
});
});
});
Szczegółowy opis kodu:
- Kod JavaScript w pliku
loadmoreposts.js
ma na celu obsługę funkcjonalności AJAX do wczytywania kolejnych postów bez konieczności odświeżania strony. - Skrypt rozpoczyna się od umieszczenia swojego kodu w funkcji jQuery
document-ready
, aby upewnić się, że kod zostanie wykonany po pełnym załadowaniu DOM. - Inicjalizuje zmienne
page
itotalPages
, aby śledzić bieżący numer strony i łączną liczbę dostępnych stron do paginacji postów. - Ustawiony jest nasłuch na kliknięcia przycisku “Wczytaj więcej” o identyfikatorze
load-more-posts
. - Po kliknięciu przycisku wykonywane jest żądanie AJAX w celu pobrania dodatkowych postów. Żądanie zawiera numer bieżącej strony w danych przesyłanych.
- Po pomyślnym zakończeniu żądania Ajax, odpowiedź zawierająca dodatkową treść postów jest dołączana do elementu
#posts_list
, wyświetlając je na stronie. - Skrypt zwiększa zmienną
page
, aby przygotować się do wczytania kolejnych postów po kolejnych kliknięciach, i sprawdza, czy bieżąca strona przekracza dostępną łączną liczbę stron, aby ukryć przycisk “Wczytaj więcej”, gdy wszystkie posty zostaną wczytane. - W przypadku błędów podczas żądania AJAX, skrypt rejestruje błąd w konsoli przeglądarki w celu debugowania.
Zastąpienie tradycyjnej paginacji funkcjonalnością wczytywania wpisów za pomocą AJAX nie tylko poprawia doświadczenie użytkowników, ale także zmniejsza czas ładowania i zasoby serwera potrzebne do pobrania i wyświetlenia treści. To prowadzi do szybszego ładowania strony i bardziej angażującego przeglądania dla Twojej widowni.