WordPress分页不适用于AJAX

时间:2013-11-22 17:14:37

标签: ajax wordpress permalinks

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

2 个答案:

答案 0 :(得分:6)

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

  1. 编写您自己的get_pagenum_link()版本,以便您指定基本网址
  2. 在致电$_SERVER['REQUEST_URI']
  3. 时覆盖get_pagenum_link()变量
  4. 要调用paginate_links()函数,请返回整个分页的HTML,然后使用JS处理它,只接受上一个/下一个链接。
  5. #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。

答案 1 :(得分:3)

如果没有关于调用内容和方式的具体细节,这实际上很难回答。我打赌你想在某种无尽的sroll网站上实现它,对吗?

您最好的选择是通过AJAX获取分页页面本身,并获取相关标记。 假设您有帖子http://www.yourdomain.com/post-1/

我想你想抓住下一页的分页,因此你需要这样的东西:

$( "#pagination" ).load( "http://www.yourdomain.com/post-1/page/2 #pagination" );

这可以轻松使用get_next_posts_link()代替get_pagenum_link()

现在,为了让你的AJAX调用变得动态,你可以这样:

$( "#pagination" ).load( $("#pagination a").attr('href') + " #pagination" );

这将从当前页面获取下一页的链接,并加载其分页标记代替旧页面。

这也适用于get_pagenum_link(),但您需要相应地更改$("#pagination a").attr('href')选择器才能获得下一页(因为您有多个a个元素在#pagination