You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WordPress AJAX加载更多:按钮文本与状态无法自动切换问题

WordPress加载更多按钮:加载完最后一页后自动切换状态并禁用

我需要实现一个按钮功能:当WordPress查询无更多结果时,修改按钮文本并禁用该按钮。目前WordPress查询运行正常,$query->max_num_pages可返回总页数,加载更多功能也能正常工作,但按钮的文本切换逻辑始终失效,始终显示仍有更多页面可加载。


现有Ajax代码

var ajaxurl = "<?php echo admin_url('admin-ajax.php'); ?>";
var page = 2;
jQuery(function($){
    // init isotope
    var $grid = $('.team-content');
    $grid.isotope({
      // options
      itemSelector: '.grid-item',
      layoutMode: 'fitRows',
      percentPosition: true,
      transitionDuration: '0s', 
      hiddenStyle: {
        opacity: 0
      },
      visibleStyle: {
        opacity: 1
      }
    });

    $('body').on('click', '.loadmore-team', function(e){

      var data = {
        'action': 'load_posts_by_ajax',
        'page': page,
        'security': "<?php echo wp_create_nonce('load_more_team'); ?>"
      };

      $.post(ajaxurl, data, function(response){
        if (response != '') {
          var $answer = $(response);

          //append items to grid
          $grid.append($answer)
          .isotope('appended', $answer);

          // layaout on imagesLoaded
          $grid.imagesLoaded(function(){
            $grid.isotope('layout');
          });
          page++;
        } else {
            alert(response)
          $('.loadmore-team').text("No more Post!");
          $('.loadmore-team').attr("disabled", true);
          $('.loadmore-team').css("borderColor", "gray");
          $('.loadmore-team').css("color", "gray");
        }
      });
      e.preventDefault();
    });
});

Functions.php中的加载更多逻辑

// load more function by ajax
add_action('wp_ajax_load_posts_by_ajax', 'load_posts_by_ajax_team');
add_action('wp_ajax_nopriv_load_posts_by_ajax', 'load_posts_by_ajax_team');

function load_posts_by_ajax_team(){
  check_ajax_referer('load_more_team', 'security');
  $paged= $_POST['page'];

  $args = array(

    'post_type' => 'team',
    'post_status' => 'publish',
    'posts_per_page' => 4,
    'paged' => $paged,
  );

  $my_posts = new WP_Query($args);

  if ($my_posts-> have_posts()) { ?>

    <?php
      while($my_posts-> have_posts()){
        $my_posts-> the_post();

        $termsArray = get_the_terms( $post->ID, "team-location" );
        $termsSlug = ""; //initialize the variable that will contain the terms
        foreach ( $termsArray as $term ) { // for each term
        $termsSlug .= $term->slug.' '; //create a string that has all the slugs
        }

         ?>
              <?php   get_template_part( 'template-parts/team', 'listing' ); ?>
    <?php  }
    ?>
<?php  }

wp_die();
}

页面初始查询代码

<?php
    $args = array(
        'post_type' => 'team',
        'posts_per_page' => 4,
        'paged' => get_query_var('paged', 1), //page number 1 on load
        'post_status' => 'publish',
    );

    $query = new WP_Query($args);

        while ($query->have_posts()) {
            $query->the_post();
            
            $termsArray = get_the_terms($post->ID, 'team-location');

            $termsSLug = "";
            foreach ($termsArray as $term) {
                $termsSLug .= $term->slug . ' ';
            }
?>
 <?php get_template_part('template-parts/team', 'listing'); ?>
<?php   }
    wp_reset_postdata();
?>  

</div>
 <?php if ($query->max_num_pages > 1) { ?>
              <div class="button_load_more ">
                        <a  class="btn btn-default button loadmore-team" href="#"><?php printf( __( 'Load more', 'bizniz-tools' )); ?></a>

              </div>
 <?php } ?>

编辑记录

  • 首次点击按钮时response输出正常内容,第二次点击时无内容,符合仅多一页数据的预期。
  • 修改判断逻辑为if (response.replace(/^\s*$/, "").length > 0)后,功能有所改善,但加载完最后一页后,按钮不会自动切换状态,需再点击一次才生效,希望避免这次额外点击。

解决方案

核心思路是提前判断是否到达最后一页,在加载完最后一批内容后直接修改按钮状态,无需等待空响应。

方案1:前端提前获取总页数

  1. 在页面初始查询的按钮输出部分,通过data属性传递总页数:
<?php if ($query->max_num_pages > 1) { ?>
<div class="button_load_more ">
    <a class="btn btn-default button loadmore-team" href="#" data-total-pages="<?php echo $query->max_num_pages; ?>">
        <?php printf( __( 'Load more', 'bizniz-tools' )); ?>
    </a>
</div>
<?php } ?>
  1. 修改Ajax代码,每次加载后判断当前页是否等于总页数:
var ajaxurl = "<?php echo admin_url('admin-ajax.php'); ?>";
var page = 2;
// 获取总页数
var totalPages = parseInt($('.loadmore-team').data('total-pages'));

jQuery(function($){
    // init isotope 代码保留不变

    $('body').on('click', '.loadmore-team', function(e){
        var $btn = $(this); // 缓存按钮元素

        var data = {
            'action': 'load_posts_by_ajax',
            'page': page,
            'security': "<?php echo wp_create_nonce('load_more_team'); ?>"
        };

        $.post(ajaxurl, data, function(response){
            if (response.replace(/^\s*$/, "").length > 0) {
                var $answer = $(response);

                $grid.append($answer).isotope('appended', $answer);

                $grid.imagesLoaded(function(){
                    $grid.isotope('layout');
                });

                // 判断是否到达最后一页
                if (page === totalPages) {
                    $btn.text("No more Post!");
                    $btn.attr("disabled", true);
                    $btn.css({"borderColor": "gray", "color": "gray"});
                }
                page++;
            } else {
                // 兜底处理
                $btn.text("No more Post!");
                $btn.attr("disabled", true);
                $btn.css({"borderColor": "gray", "color": "gray"});
            }
        });
        e.preventDefault();
    });
});

方案2:后端返回分页状态(更安全)

如果有动态筛选场景或担心前端数据被篡改,可让后端返回包含内容和分页状态的JSON:

  1. 修改Functions.php中的函数:
function load_posts_by_ajax_team(){
    check_ajax_referer('load_more_team', 'security');
    $paged = $_POST['page'];

    $args = array(
        'post_type' => 'team',
        'post_status' => 'publish',
        'posts_per_page' => 4,
        'paged' => $paged,
    );

    $my_posts = new WP_Query($args);
    ob_start(); // 开启输出缓冲

    if ($my_posts->have_posts()) {
        while($my_posts->have_posts()){
            $my_posts->the_post();

            $termsArray = get_the_terms( $post->ID, "team-location" );
            $termsSlug = "";
            foreach ( $termsArray as $term ) {
                $termsSlug .= $term->slug.' ';
            }

            get_template_part( 'template-parts/team', 'listing' );
        }
    }

    $content = ob_get_clean(); // 获取缓冲内容
    // 返回JSON数据,包含内容和是否还有更多
    wp_send_json(array(
        'content' => $content,
        'has_more' => $paged < $my_posts->max_num_pages
    ));
}
  1. 修改Ajax代码处理JSON响应:
var ajaxurl = "<?php echo admin_url('admin-ajax.php'); ?>";
var page = 2;

jQuery(function($){
    // init isotope 代码保留不变

    $('body').on('click', '.loadmore-team', function(e){
        var $btn = $(this);

        var data = {
            'action': 'load_posts_by_ajax',
            'page': page,
            'security': "<?php echo wp_create_nonce('load_more_team'); ?>"
        };

        $.post(ajaxurl, data, function(response){
            // 解析JSON
            var res = typeof response === 'object' ? response : JSON.parse(response);
            if (res.content.replace(/^\s*$/, "").length > 0) {
                var $answer = $(res.content);

                $grid.append($answer).isotope('appended', $answer);

                $grid.imagesLoaded(function(){
                    $grid.isotope('layout');
                });

                // 根据后端返回的状态判断
                if (!res.has_more) {
                    $btn.text("No more Post!");
                    $btn.attr("disabled", true);
                    $btn.css({"borderColor": "gray", "color": "gray"});
                }
                page++;
            } else {
                $btn.text("No more Post!");
                $btn.attr("disabled", true);
                $btn.css({"borderColor": "gray", "color": "gray"});
            }
        });
        e.preventDefault();
    });
});

内容的提问来源于stack exchange,提问作者Corre

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 06:49:54