当前位置: 首页 > 面试题库 >

WordPress分页不适用于AJAX

云锦
2023-03-14
问题内容

我通过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?


问题答案:

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

  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。



 类似资料:
  • 似乎Laravel分页DEO与group by子句不能正常工作。例如: 产生 请注意,查询上没有子句。 如果查询中没有group by子句,则工作罚款: 产生了以下查询: 有人知道我该怎么解决这个问题吗?

  • Frontpage分页不起作用:当点击page2/3/4/etc时,它只是重新加载首页,而不显示旧条目。我尝试了几件事情:首先,禁用所有活动插件,以确保没有冲突。第二,尝试在设置中将永久链接更改为默认 我的代码是 谢啦

  • 我尝试了多种解决方案,但都不起作用。 当我转到/page/2时,它不起作用。 我正在index.php我的主题执行自定义查询。 这是我的网站链接:我的网站主页 此页面不工作(404)-页面不工作(格式为-mywebsite/page/2/) 刚刚意识到这一页2作品-正在工作的页面(的格式-mywebsite.com/?page=2)

  • 我试图在wordpress中使用AMP与表单动作。我使用action-xhr与POST方法。 当我提交表单时,它会给出错误信息 响应必须包含AMP-访问-控制-允许-源-起源头 表单提交失败:错误:响应必须包含AMP-访问-控制-允许-源-源头 甚至尝试添加标题,如下所示 这个问题仍然存在。有什么建议吗? 我使用的是wordpress版本5.0.3

  • 本文向大家介绍MvcPager分页控件 适用于Bootstrap,包括了MvcPager分页控件 适用于Bootstrap的使用技巧和注意事项,需要的朋友参考一下 软件开发分页效果必不可少,对于Asp.Net MVC 而言,MvcPager 是个不错的选择。 请访问http://www.webdiyer.com/mvcpager/ 由于自带的分页样式不能和项目整体风格兼容,所以我们准备改写源代码,

  • 不明白为什么这个突然停止工作。网站是:http://www.revival.tv/sermons/topical-messages/ 当它进入第二页时,它只使用了归档模板:(不确定为什么这样做,它在去年工作得很好。想知道Wordpress更新是否做到了这一点,我们只是注意到了它。 我使用以下的分页: 然后改写布道: