一尘不染

WordPress分页不适用于AJAX

ajax

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

get_pagenum_link($paged - 1)

问题是通过AJAX创建了分页,因此使此链接看起来像: http://localhost:1234/vendor_new/wp-admin/admin- ajax.php

但是,我想要达到的实际URL就是为此: http://localhost:1234/vendor_new/display-vendor-results

有没有办法在AJAX上使用此功能,并且仍然获得正确的分页URL?


阅读 180

收藏
2020-07-26

共1个答案

一尘不染

我可以为您想到三个选择:

  1. 编写自己的版本get_pagenum_link()将允许您指定基本URL
  2. $_SERVER['REQUEST_URI']调用时覆盖变量get_pagenum_link()
  3. 要调用该paginate_links()函数,请返回整个分页的HTML,然后使用JS处理该HTML,以仅使用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' );

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

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

就是这个解决方案。


#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;

此处发生的是,我们只是使用自己的变量覆盖了REQUEST_URI变量-这样,我们就使add_query_arg函数误以为是在/ vendor_new /
display-vendor-results页面上,而不是在/ wp-admin / admin- 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>';

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();

在这里发生的是,我们找到了<div class="mypagination">除prev / next链接之外的所有元素,然后将其删除。


总结一下:

最简单的解决方案可能是 #2 ,但如果有人出于某种原因需要知道当前页面为admin-ajax.php ,而
你生成的链接,那么你可能有一个问题。可能甚至没有人会注意到,因为这将是您的代码正在运行,并且可能附加到过滤器的任何功能也应该认为它们在您需要的页面上(否则它们可能会弄乱某些内容)。

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

2020-07-26