Để thêm tính năng
Infinite Scroll (Cuộn vô hạn) vào theme
MH Magazine Lite trong WordPress, bạn có thể làm theo các bước sau:
Bước 1: Thêm hàm xử lý AJAX trong functions.php
Chúng ta cần một hàm PHP để truy vấn bài viết tiếp theo và trả về nội dung đó.
Hướng dẫn:
- Nhận danh sách ID bài viết đã tải (excluded_ids) từ AJAX.
- Truy vấn bài viết tiếp theo bằng WP_Query, loại trừ các bài đã tải.
- Trả về nội dung bài viết bằng get_template_part('content', 'single').
- Đăng ký AJAX handler để hỗ trợ cả người dùng đã đăng nhập (wp_ajax_...) và chưa đăng nhập (wp_ajax_nopriv_...).
👉 Thực hiện:
Thêm đoạn code sau vào file functions.php của theme:
Mã: Chọn tất cả
function load_next_article() {
$excluded_ids = isset($_GET['excluded_ids']) ? array_map('intval', explode(',', $_GET['excluded_ids'])) : [];
$args = [
'post_type' => 'post',
'post_status' => 'publish',
'posts_per_page' => 1,
'orderby' => 'date',
'order' => 'DESC',
'post__not_in' => $excluded_ids,
];
$query = new WP_Query($args);
if ($query->have_posts()) {
while ($query->have_posts()) {
$query->the_post();
get_template_part('content', 'single');
}
} else {
echo '';
}
wp_reset_postdata();
wp_die();
}
add_action('wp_ajax_load_next_article', 'load_next_article');
add_action('wp_ajax_nopriv_load_next_article', 'load_next_article');
Bước 2: Viết JavaScript để tải bài viết khi cuộn trang
Ta cần một đoạn script để lắng nghe sự kiện cuộn trang (scroll), khi người dùng gần chạm đến cuối trang thì gọi AJAX để tải bài tiếp theo.
Hướng dẫn:
- Lắng nghe sự kiện scroll để kiểm tra vị trí #loader.
- Nếu #loader xuất hiện trên màn hình, gửi yêu cầu AJAX để lấy bài viết tiếp theo.
- Thêm bài viết mới vào cuối danh sách bài viết.
- Đảm bảo không tải lại bài đã hiển thị.
👉 Thực hiện:
Tạo file infinite-scroll.js trong thư mục theme và thêm đoạn code sau:
Mã: Chọn tất cả
document.addEventListener('DOMContentLoaded', function() {
const mainContent = document.querySelector('#main-content');
const loader = document.querySelector('#loader');
let isLoading = false;
let excludedIDs = [parseInt(mainContent.dataset.currentPostId)];
function loadNextArticle() {
if (isLoading) return;
isLoading = true;
loader.textContent = 'Đang tải bài viết...';
fetch(`/wp-admin/admin-ajax.php?action=load_next_article&excluded_ids=${excludedIDs.join(',')}`)
.then(response => response.text())
.then(data => {
if (data.trim() !== '') {
const div = document.createElement('div');
div.innerHTML = data;
const article = div.querySelector('article');
if (article) {
article.classList.add('fade-in');
mainContent.appendChild(article);
const newPostID = parseInt(article.id.replace('post-', ''));
excludedIDs.push(newPostID);
setTimeout(() => { article.classList.remove('fade-in'); }, 1000);
}
} else {
loader.textContent = 'Không còn bài viết!';
}
isLoading = false;
})
.catch(error => {
console.error('Lỗi tải bài:', error);
loader.textContent = 'Lỗi tải bài!';
isLoading = false;
});
}
window.addEventListener('scroll', function() {
if (loader.getBoundingClientRect().top < window.innerHeight && !isLoading) {
loadNextArticle();
}
});
});
Sau đó, chèn script này vào footer của theme bằng cách thêm đoạn này vào functions.php
Mã: Chọn tất cả
function enqueue_infinite_scroll_script() {
wp_enqueue_script('infinite-scroll', get_template_directory_uri() . '/infinite-scroll.js', array('jquery'), null, true);
}
add_action('wp_enqueue_scripts', 'enqueue_infinite_scroll_script');
Bước 3: Cập nhật file single.php để thêm phần tải bài
Chúng ta cần chỉnh sửa single.php để thêm phần loader và đảm bảo rằng bài viết đầu tiên có thể được nhận diện.
Hướng dẫn:
- Thêm ID #main-content để chứa nội dung bài viết.
- Thêm phần tử #loader để hiển thị trạng thái tải bài.
- Gán data-current-post-id cho bài viết đầu tiên.
👉 Thực hiện:
Mở single.php và chỉnh sửa như sau:
Mã: Chọn tất cả
<?php get_header(); ?>
<div class="mh-wrapper clearfix">
<div class="mh-container mh-container-inner">
<div id="main-content" class="mh-content" role="main" itemprop="mainContentOfPage" data-current-post-id="<?php the_ID(); ?>">
<?php
while (have_posts()) : the_post();
get_template_part('content', 'single');
endwhile;
?>
</div>
<div id="loader">Đang tải bài viết...</div>
</div>
</div>
<?php get_footer(); ?>
Bước 4: Kiểm tra và hoàn thiện
Sau khi thực hiện các bước trên, bạn cần kiểm tra xem tính năng Infinite Scroll hoạt động như mong muốn hay chưa.
Kiểm tra hoạt động:
- Tải lại trang và cuộn xuống cuối bài viết.
- Khi đến gần phần "Đang tải bài viết...", kiểm tra xem bài viết tiếp theo có tự động tải không.
- Nếu gặp lỗi, mở Console của trình duyệt (F12 > Console) để xem có thông báo lỗi JavaScript hay không.
- Nếu bài viết không tải, kiểm tra phản hồi của AJAX bằng cách vào Network > XHR trong DevTools.
Gợi ý cải tiến
- Thay scroll bằng IntersectionObserver để tối ưu hiệu suất.
- Tối ưu trải nghiệm bằng cách thêm hiệu ứng hiển thị bài viết mới.
- Kiểm tra số lượng bài còn lại để dừng tải khi không còn bài mới.
Với 4 bước trên, bạn đã triển khai thành công Infinite Scroll cho theme MH Magazine Lite trong WordPress. Hy vọng hướng dẫn này giúp bạn thực hiện tính năng này dễ dàng hơn. Nếu gặp vấn đề, hãy kiểm tra log hoặc chia sẻ để cùng nhau khắc phục!