WordPress分页不适用于AJAX

use*_*676 9 ajax wordpress permalinks

我正在通过AJAX加载一些帖子,我的WordPress分页使用以下函数来计算分页:

get_pagenum_link($paged - 1)
Run Code Online (Sandbox Code Playgroud)

问题是分页是通过AJAX创建的,所以它使这个链接看起来像: http://localhost:1234/vendor_new/wp-admin/admin-ajax.php

但是,我想要实现的实际URL是这样的: http://localhost:1234/vendor_new/display-vendor-results

有没有办法在AJAX中使用此功能,仍然可以获得正确的分页URL?

Nik*_*lov 9

我可以为您考虑三种选择:

  1. 编写自己的版本get_pagenum_link()将允许您指定基本URL
  2. 在$_SERVER['REQUEST_URI']呼叫时覆盖变量get_pagenum_link()
  3. 要调用该paginate_links()函数,返回整个分页的HTML,然后使用JS处理它,只接受prev/next链接.

#1自定义版本 get_pagenum_link()

优点:您必须更改当前代码的少量 - 基本上只需更改您正在调用的函数的名称并传递额外的参数.

缺点:如果功能在将来发生变化(不太可能,但可能),您还必须调整功能.

我只会发布自定义函数的相关代码 - 您可以假设其他所有内容都可以保留在核心版本中.

function my_get_pagenum_link( $pagenum = 1, $escape = true, $base = null ) {
    global $wp_rewrite;

    $pagenum = (int) $pagenum;

    $request = $base ? remove_query_arg( 'paged', $base ) : remove_query_arg( 'paged' );
Run Code Online (Sandbox Code Playgroud)

因此,在这种情况下,我们还有一个参数允许我们指定一个基本URL - 您可以自行修改URL(不是一个好主意),也可以动态生成它.以下是处理AJAX请求的代码将如何更改:

my_get_pagenum_link( $paged - 1, true, 'http://localhost:1234/vendor_new/display-vendor-results' );
Run Code Online (Sandbox Code Playgroud)

对于这个解决方案而言,这就是它.


#2覆盖$_SERVER['REQUEST_URI']变量

优点:相当容易实现,应该是面向未来的.

缺点:可能有副作用(理论上它不应该,但你永远不知道); 您可能需要编辑JS代码.

你可以与你上了后端的值覆盖它,或与您通过您的AJAX请求的值(所以在你的AJAX请求,你可以有实例的参数,base那会是这样的window.location.pathname + window.location.search).区别在于,在第二种情况下,您的JS可以在任何页面上工作(如果将来您最终有多个位置使用相同的AJAX处理程序).

我将发布覆盖变量的代码然后恢复它.

// Static base - making it dynamic is highly recommended
$base = '/vendor_new/display-vendor-results';
$orig_req_uri = $_SERVER['REQUEST_URI'];

// Overwrite the REQUEST_URI variable
$_SERVER['REQUEST_URI'] = $base;

// Get the pagination link
get_pagenum_link( $paged - 1 );

// Restore the original REQUEST_URI - in case anything else would resort on it
$_SERVER['REQUEST_URI'] = $orig_req_uri;
Run Code Online (Sandbox Code Playgroud)

这里发生的是,我们只是覆盖REQUEST_URI变量,我们自己 - 这样,我们欺骗add_query_arg功能分为思想,那我们是/ vendor_new /显示器厂商结果页面上,而不是在/可湿性粉剂管理员/管理 - ajax.php


#3使用paginate_links()JS操作和操作HTML

优点:目前无法想到任何一个.

缺点:您必须调整PHP和JavaScript代码.

这是一个想法:你使用paginate_links()它的参数来创建所有的分页链接(好 - 至少有四个 - prev/next和first/last).然后将所有HTML作为参数传递给您的响应(如果您正在使用JSON - 或者如果您只是返回HTML则作为响应的一部分).

PHP代码:

global $wp_rewrite, $wp_query;

// Again - hard coded, you should make it dynamic though
$base = trailingslashit( 'http://localhost:1234/vendor_new/display-vendor-results' ) . "{$wp_rewrite->pagination_base}/%#%/";
$html = '<div class="mypagination">' . paginate_links( array(
    'base' => $base,
    'format' => '?paged=%#%',
    'current' => max( 1, $paged ),
    'total' => $wp_query->max_num_pages,
    'mid_size' => 0,
    'end_size' => 1,
) ) . '</div>';
Run Code Online (Sandbox Code Playgroud)

JS代码(它应该在你的AJAX成功回调中):

// the html variable is supposed to hold the AJAX response
// either just the pagination or the whole response
jQuery( html ).find('.mypagination > *:not(.page-numbers.next,.page-numbers.prev)').remove();
Run Code Online (Sandbox Code Playgroud)

这里发生的是我们发现<div class="mypagination">除了prev/next链接之外的所有元素,我们删除它们.


包装起来:

最简单的解决方案可能是#2,但如果有人出于某种原因需要知道当前页面为admin-ajax.php ,而你生成的链接,那么你可能有一个问题.很可能没有人会注意到,因为你的代码正在运行,任何可以附加到过滤器的函数也应该认为它们在你需要的页面上(否则它们可能会搞砸了).

PS:如果由我决定,我将始终使用paginate_links()函数并在前端显示页码.然后,我将使用相同的函数在AJAX处理程序中生成更新的HTML.

  • 当你从ajax调用**paginate_links**时也会发生这种情况.我的链接返回**http://local.dev/wp-admin/admin-ajax.php?pg = 2**.是否有paginate_links的解决方案?(提供的解决方案适用于get_pagenum_links) (2认同)