首页 > 解决方案 > AJAX 分页未在新帖子中加载(未找到 admin-ajax)

问题描述

我有一个custom post type内置的 WordPress,名为Knowledge.

Knowledge目前总共只有 4 个帖子。默认情况下,显示 3 个帖子,然后在加载更多点击时,我希望显示最后的第四个博客卡。

但是,目前,我的 AJAX 请求没有成功,它给了我/wp-admin/admin-ajax.php 403 (Forbidden)错误。类似的问题表明它可能与安全插件有关。但是,我已禁用任何与安全相关的插件(Jetpack)并且错误仍然存​​在。

到目前为止,这是我的方法:

知识列表.php

<?php
global $post;

$args = array(
    'post_type' => 'knowledge',
    'posts_per_page' => 3,
    'post_status' => 'publish',
    'orderby' => 'publish_date',
    'order' => 'DESC'
);

$query = new WP_Query($args);

if ($query->have_posts()):

    while ($query->have_posts()):
        $query->the_post();
        get_part('templates/snippets/knowledge-card', array(
            'heading' => get_the_title() ,
            'subheading' => get_the_excerpt() ,
            'background' => wp_get_attachment_url(get_post_thumbnail_id($post->ID)) ,
        ));
    endwhile;
    wp_reset_postdata(); ?>

    <div class="knowledgeListing__loadmore">
        <a href="#" id="loadmore" class="button--loadmore" data-type="knowledge" data-max-num-pages="<?php echo $query->max_num_pages; ?>">
            <?php echo _e('Load More', 'theme'); ?>
        </a>
    </div>

<?php
endif; ?>

加载更多.js

jQuery(function($){
  $(document).ready(function(){

    $("#loadmore").on('click', function (e) {
      e.preventDefault();
      var btn = $(this);
      showNextItems(btn);
    });

    function showNextItems(btn) {

      var max_num_pages = btn.data('max-num-pages');
      var post_type = btn.data('type');

      var button = btn,
        data = {
          'action':'loadmore',
          'query': loadmore_params.posts,
          'page' : loadmore_params.current_page,
          // 'security' : loadmore_params.security,
          // 'max_num_pages' : max_num_pages,
          // 'post_type' : post_type
      };

      $.ajax({
        url : loadmore_params.ajaxurl,
        data : data,
        type : 'POST',
        beforeSend : function ( xhr ) {
          button.text('Loading...');
        },
        success : function( data ){
          if( data ) {
            button.text( 'Load More' ).prev().before(data);
            loadmore_params.current_page++;

            $('.knowledgeListing__wrapper').find('.knowledgeCard').last().after( data );

            if ( loadmore_params.current_page == max_num_pages ){
              button.remove();
            }

            console.log("success");

          } else {
            button.remove();
          }
        },
        error : function(error){
          button.text( 'Load More' );
          console.table("Data: " + data);
          console.table("loadmore_params: " + loadmore_params);
          // console.log(error);
        }
      });
    }

  });
});

下面两个console.log的吐槽[object Object]

不确定哪里出了问题?

编辑:

console.log("Data:", data)console.log("loadmore_params:", loadmore_params);下面的结果:

在此处输入图像描述

在进一步检查中,当我尝试访问该/wp-admin/admin-ajax.phpurl 时,我看到一个0. 在线搜索时,建议使用die(). 但是,当我添加die()到末尾时knowledge-listing.php,它仍然显示一个0.

这是我的本地化脚本供参考:

global $wp_query;

wp_localize_script( 'theme', 'loadmore_params', array(
  'ajaxurl' => admin_url( 'admin-ajax.php' ),
  'posts' => json_encode( $wp_query->query_vars ),
  'current_page' => get_query_var( 'paged' ) ? get_query_var('paged') : 1,
  'max_page' => $wp_query->max_num_pages,
  'security' => wp_create_nonce("load_more")
) );

action小号:

add_action('wp_ajax_loadmore', 'pagination_ajax_handler'); // wp_ajax_{action}
add_action('wp_ajax_nopriv_loadmore', 'pagination_ajax_handler'); // wp_ajax_nopriv_{action}

标签: javascriptphpjqueryajaxwordpress

解决方案


只是我的 2 美分,但“loadmore”作为动作名称很常见,可能会被其他一些插件/主题功能使用。你真的应该考虑切换到像 wp_ajax_mypluginname_loadmore 这样的命名空间。

也就是说,另一个常见的问题是你执行 add_actions 太晚了,或者在 wp-admin-ajax 做他的事情之前它们永远不会被代码击中。请在代码输入 wp-admin-ajax 之前 100% 地点击 add_actions。要进行快速测试,您可以将这些行(包括函数)移动到子主题 functions.php 文件中


推荐阅读