gpt4 book ai didi

ajax - WordPress 分页不适用于 AJAX

转载 作者:行者123 更新时间:2023-12-04 03:38:13 24 4
gpt4 key购买 nike

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

最佳答案

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

  • 编写您自己的 get_pagenum_link() 版本,允许您指定基本 URL
  • 在调用 $_SERVER['REQUEST_URI']
  • 时覆盖 get_pagenum_link() 变量
  • 要调用 paginate_links() 函数,返回整个分页的 HTML,然后用 JS 处理它,只获取上一个/下一个链接。

  • #1 get_pagenum_link() 的自定义版本
    优点:您必须更改少量当前代码 - 基本上只需更改您正在调用的函数的名称并传递一个额外的参数。
    缺点:如果功能在 future 发生变化(不太可能,但可能),您也必须调整您的功能。
    我只会发布自定义函数的相关代码 - 您可以假设其他所有内容都可以保留在核心版本中的方式。
    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'] 变量
    优点:相当容易实现,应该是面向 future 的。
    缺点:可能有副作用(理论上不应该,但你永远不知道);您可能需要编辑您的 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() 和它的参数来创建所有的分页链接(好吧 - 至少有四个 - 上一个/下一个和第一个/最后一个)。然后,您将所有 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"> 内的所有元素,除了上一个/下一个链接,我们将它们删除。

    总结一下:
    最简单的解决方案可能是 #2 ,但是如果有人出于某种原因需要知道当前页面是 admin-ajax.php 您正在生成链接,那么您可能会遇到问题。很有可能没有人会注意到,因为运行的是您的代码,任何可以附加到过滤器的函数也应该认为它们在您需要的页面上(否则它们可能会搞砸)。
    PS:如果由我决定,我将始终使用 paginate_links() 函数并在前端显示页码。然后我将使用相同的函数在 AJAX 处理程序中生成更新的 HTML。

    关于ajax - WordPress 分页不适用于 AJAX,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20150653/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com