Tạo Load More bằng ajax wordpress

Để thực hiện chúng ta cần có kiến thức cơ bản về wordpress, ajax wordpress. Để tạo load more bằng ajax trong wordpress chúng ta thực hiện như sau:

<div class="post__content" id="post-container">
                    <?php
                    $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
                    $args = array(
                        'post_type'   => 'du-an',
                        'post_status' => 'publish',
                        'paged'          => $paged,
        				'posts_per_page' => 12,
                    );
                     $query = new WP_Query($args);

                    if ($query->have_posts()) :
                    while ($query->have_posts()) : $query->the_post();
                    ?>
                    <article class="item">
                        <?php $thumbnail = get_the_post_thumbnail_url(); ?>
                        <div class="item__thumbnail">
                            <a href="<?php the_permalink(); ?>">
                                <?php if ($thumbnail) : ?>
                                <?= get_the_post_thumbnail(get_the_id(), 'thumbnail', array('class' => 'thumbnail')); ?>
                                <?php else : ?>
                                <img src="<?= get_template_directory_uri(); ?>/assets/images/noImage.jpg"
                                     alt="<?php the_title(); ?>">
                                <?php endif; ?>
                            </a>
                        </div>
                        <div class="item__content">
                            <a href="<?php the_permalink(); ?>">
                                <h2><?php the_title(); ?></h2>
                            </a>
                            <p class="limit-text limit-text-2"> <?= get_the_excerpt() ?></p>
                        </div>
                    </article>
                    <?php
                    endwhile;
                    wp_reset_postdata();
                    else :
                    echo '<p>No posts found.</p>';
                    endif;
                    ?>
                </div>

                <?php if ($query->max_num_pages > 1) : ?>
                <div class="ajax-pagination">
                    <button id="load-more" data-paged="1"><?php ($lang == 'vi') ? printf('Xem thêm') : printf('Load More') ?></button>
                </div>
                <?php endif; ?>

Tiếp theo ta thêm đoạn code này vào file function.php. Code này đăng ký hook trong ajax wordpress

// Xử lý AJAX cho phân trang
function ajax_pagination_handler() {
    $paged = isset($_POST['paged']) ? intval($_POST['paged']) : 1;

    $args = array(
        'post_type'      => 'du-an',
        'post_status'    => 'publish',
        'paged'          => $paged,
        'posts_per_page' => 12,
    );

    $query = new WP_Query($args);

    if ($query->have_posts()) :
    while ($query->have_posts()) : $query->the_post();
?>
<article class="item">
    <div class="item__thumbnail">
        <a href="<?php the_permalink(); ?>">
            <?= get_the_post_thumbnail(get_the_id(), 'thumbnail', array('class' => 'thumbnail')); ?>
        </a>
    </div>
    <div class="item__content">
        <a href="<?php the_permalink(); ?>">
            <h2><?php the_title(); ?></h2>
        </a>
        <p class="limit-text limit-text-2"> <?= get_the_excerpt() ?></p>
    </div>
</article>
<?php
        endwhile;
    wp_reset_postdata();
    else :
    echo '<p>No posts found.</p>';
    endif;

    wp_die(); // Dừng script sau khi trả về dữ liệu
}

// Thêm action AJAX
add_action('wp_ajax_ajax_pagination', 'ajax_pagination_handler');
add_action('wp_ajax_nopriv_ajax_pagination', 'ajax_pagination_handler');

Tiếp theo ta viết thêm đoạn mã js để thực hiện chúng

jQuery(document).ready(function ($) {
    $('#load-more').on('click', function () {
        let button = $(this);
        let paged = parseInt(button.attr('data-paged')) + 1;

        $.ajax({
            url: ajaxurl, // Biến ajaxurl tự động có trong WordPress
            type: 'POST',
            data: {
                action: 'load_more_posts',
                paged: paged,
            },
            beforeSend: function () {
                button.text('Loading...'); // Thay đổi nội dung nút khi đang tải
            },
            success: function (data) {
                if (data) {
                    $('#post-container').append(data); // Thêm bài viết mới vào container
                    button.attr('data-paged', paged);
                    button.text('Load More');
                } else {
                    button.text('No More Posts').prop('disabled', true); // Vô hiệu hóa nút
                }
            },
            error: function () {
                button.text('Error');
            },
        });
    });
});

Cuối cùng thêm đoạn sau vào functions.php để nạp file JavaScript và truyền biến ajaxurl:

function enqueue_custom_scripts() {
wp_enqueue_script(‘ajax-pagination’, get_template_directory_uri() . ‘/js/scripts.js’, array(‘jquery’), null, true);

// Truyền biến ajaxurl cho script
wp_localize_script(‘ajax-pagination’, ‘ajaxurl’, admin_url(‘admin-ajax.php’));
}
add_action(‘wp_enqueue_scripts’, ‘enqueue_custom_scripts’);