Cách tạo Infinite Scroll (Cuộn vô hạn) cho bài viết WordPress

Cách tạo Infinite Scroll (Cuộn vô hạn) cho bài viết WordPress

Chào mọi người. Mình đang sử dụng theme MH Magazine Lite trên WordPress và muốn thêm tính năng Infinite Scroll, tức là khi người dùng cuộn xuống cuối trang, các bài viết tiếp theo sẽ tự động tải mà không cần chuyển trang.

Mình đã tìm hiểu và thấy có thể dùng AJAX để tải bài viết mới khi người dùng cuộn xuống, nhưng chưa rõ cách triển khai thế nào để đảm bảo:
  • Khi cuộn xuống cuối bài, bài tiếp theo tự động hiển thị.
  • Không lặp lại bài đã tải trước đó.
  • Vẫn giữ nguyên giao diện hiện tại của theme MH Magazine Lite.
Mọi người có ai từng làm tính năng này hoặc có kinh nghiệm về Infinite Scroll cho WordPress không?
Mình cần hướng dẫn hoặc gợi ý về cách làm phù hợp với theme này.

Cảm ơn rất nhiều!
Từ khóa:
Google Adsense
Đã xác thực
Quảng Cáo

Re: Cách tạo Infinite Scroll (Cuộn vô hạn) cho bài viết WordPress

Để 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!
Chuyên mục Công nghệ chia sẻ kiến thức về thiết bị, phần mềm và xu hướng số, giúp bạn cập nhật thông tin và ứng dụng hiệu quả trong thực tế.