AJAX WP查询导致的帖子搜索结果页面上的WP分页

时间:2021-05-12 作者:DevelJoe

我有一个简单的WP post查询,它应该每页加载8篇文章,下面显示一个帖子导航,如下所示:

$query_args = [
  "post_type" => "post",
  "post_status" => "publish",
  "posts_per_page" => 8,
  "paged" => ( get_query_var( "paged" ) ? get_query_var( "paged" ) : 1 )
];

// Get all the posts
$posts = new \\WP_Query( $query_args );

$output = "";

if ( $posts->have_posts() ) {

  while ( $posts->have_posts() ) {

    $posts->the_post();
    $output .= get_the_excerpt();

  }

  $output .= "<div id=\\"post-navigation-links\\">".

  paginate_links( array(
    \'base\' => get_pagenum_link(1) . \'%_%\',
    \'format\' => \'/page/%#%\',
    \'current\' => max( 1, get_query_var(\'paged\') ),
    \'total\' => $posts->max_num_pages
  ) ).

  "</div>";

} else {

  $output = \'<div id="no-posts-found">Nothing found</div>\';

} // loop which is entered if no posts matching the query args have been found

wp_reset_postdata();
当我加载页面时,这一切都能正常工作。

在同一页上,我有一个搜索字段。如果我提交了该搜索字段,我将调用与通过AJAX加载页面时完全相同的代码(上面的代码),以使用新结果替换页面内容,只需使用额外的;s“;中的参数$query_args. 结果:我得到了完全匹配的帖子,下面显示了正确的分页。然而,当我点击更新页面上的分页链接时,我得到一个400 Bad Request 和a0 来自服务器的回答(页面全部为白色,仅包含0). 在初始页面加载时,分页工作正常。

单击页面加载后比较URL时:

在内容替换为字符串查询(页面加载时)之前,分页URL具有以下结构,并且工作正常:

https://example.com/page/3

将内容替换为字符串查询后,分页URL具有此结构,并导致400个错误:

https://example.com/wp-admin/admin-ajax.php?ranum=0.825265473159516/page/3

因此,问题似乎发生在ajax处理程序上。有什么想法吗???

1 个回复
SO网友:DevelJoe

我似乎找到了一个解决方案,这比我想象的要复杂得多。再次明确一点,假设我有一个这样的页面:

<header></header>
<main>
  <!-- Posts from query (see question) inserted here -->
  <!-- Pagination Links from query (see question) inserted here -->
</main>
<footer></footer>
生成<main> 第二部分,我使用一个函数来保存问题的代码function A, 返回要插入的内容<main> 作为HTML字符串。因此,在页面加载时,我只需插入function A 进入<main> 部分

然后,我的页面上有一个按钮,可以重新调用function A 通过wp-ajax,并替换<main> 通过另外使用s WP\\u查询中的参数,如我的问题中所述。

内容和分页链接都已成功更新,但有一个区别:wp-admin/admin-ajax.php?ranum=0.825265473159516 添加到每个分页链接的URL中,该随机数可能是为了避免缓存子页面结果。当单击其中一个分页链接时,我得到一个400错误,没有请求/响应数据,结果显示一个空白页面,显示0。网络分析中没有显示其他有用的内容。

然后我发现this post. 这说明如何将搜索字符串参数添加到URL,以便能够在更新的分页过程中使用它。我这样做了,然后编辑了search.php 通过使用$_GET["s"] 的参数function A 打电话进来search.php, 现在一切都成功了。中更改的代码function A 是:

$paginate_args = [
  \'base\' => home_url( \'/%_%\' ),
  \'format\' => \'page/%#%/\',
  \'current\' => max( 1, get_query_var(\'paged\') ),
  \'total\' => $posts->max_num_pages
];

// $query_string holds the sanitized input of the typed string 
// into the search field

if( $query_string !== "" ) {

  $paginate_args[\'add_args\'] = array( \'s\' => $query_string );

}

$output .= "<div id=\\"post-navigation-links\\">".

        paginate_links( $paginate_args ).

        "</div>";
包含搜索过滤帖子的更新页面的分页现在可以完美工作。有趣的是,链接的结构现在是:

https://example.ch/page/3/?s=star&ranum=0.3987907805552596

所以wp-admin/admin-ajax.php 部分已从链接中删除,但我们现在也正在加载另一个页面(搜索页面),而不仅仅是发出AJAX请求。现在可以了,但我不知道如何/是否可以让这种行为在AJAX请求中工作,也不知道实际的问题是什么。当然,最好还是找到一个AJAX解决方案,以避免每次分页都需要重新加载整个页面,但这似乎是wp分页中的默认行为。也许您最好开发自己的分页脚本,为每个分页请求设置8的特定偏移量和post限制,或者类似的。。

问题可能与我之前使用的get_pagenum_link(1) 作为分页的基本URL,这就是为什么通过AJAX调用时,分页链接包含AJAX URL部分。。尽管如此,当只使用新的home_url( \'/%_%\' ), 当您单击其中一个新分页链接时,您将进入初始分页的相应页面,加载在页面加载上;因此,唯一的解决方案似乎是我在回答中指定的解决方案(页面重新加载+搜索页面)或自定义AJAX脚本,如前所述。

相关推荐

使用php、无需使用js和ajax的高级定制字段,即可获得不同的移动和桌面图像。

我希望大家都好!我正在寻找一种可能性,以加载不同的画廊,背景图像等的电话和桌面。例如,我将我的英雄背景图像设置为: <section class="hero" style="background-image: url(<?php echo esc_url(wp_get_attachment_image_src(get_field(\'advanced_custom_fields_field\'), \'full\')[0]);