
WordPress 自定义 WP_Query 分页时出现 404,通常因 paginate_links() 的 base 和 format 参数不匹配导致 URL 重写失败;正确做法是统一使用查询参数式分页(?paged=N),并动态生成兼容 WordPress 重写的 base。
wordpress 自定义 wp_query 分页时出现 404 错误,通常因 `paginate_links()` 的 `base` 和 `format` 参数不匹配导致 url 重写失败;正确做法是统一使用查询参数式分页(`?paged=n`),并动态生成兼容 wordpress 重写的 base。
在 WordPress 中,使用 WP_Query 手动查询(如商品列表、自定义分类归档)时,若直接调用 paginate_links() 却未适配当前请求上下文,极易触发 404 —— 表面链接可渲染(如「1, 2, 下一页」),但点击后服务器无法识别分页参数,最终返回页面未找到。
根本原因在于:WordPress 默认的分页机制依赖 paged 查询变量,而 paginate_links() 生成的 URL 必须确保该变量能被主查询(或重写规则)正确捕获。你原代码中:
'base' => get_pagenum_link(1) . '%_%', 'format' => '/page/%#%',
会生成类似 https://yoursite.com/products/page/2/ 的路径式 URL。但该路径仅对主查询驱动的标准归档页(如 archive-product.php)有效;若此代码运行在页面模板(page.php)、首页或自定义页面中,WordPress 并未为此类上下文注册 /page/N/ 的重写规则,因此 Apache/Nginx 将其视为不存在的子路径,直接返回 404。
✅ 正确解法:强制使用查询参数格式(?paged=N),并让 base 动态适配当前页面 URL:
$args = array(
'post_type' => 'product',
'tax_query' => array(
array(
'taxonomy' => 'product_cat',
'field' => 'slug',
'terms' => 'clothing'
)
),
'posts_per_page' => 1,
'order' => 'DESC',
'paged' => $paged // 注意:$paged 需已正确定义
);
$loop = new WP_Query($args);
if ($loop->have_posts()) {
while ($loop->have_posts()) : $loop->the_post();
global $product;
echo $product->get_regular_price();
endwhile;
// ✅ 安全获取当前分页数(兼容首页和静态页面)
$current_page = max(1, get_query_var('paged'));
// ✅ 使用动态 base + 查询参数 format(关键!)
$big = 999999999;
echo paginate_links(array(
'base' => str_replace($big, '%#%', esc_url(get_pagenum_link($big))),
'format' => '?paged=%#%',
'current' => $current_page,
'total' => $loop->max_num_pages,
'prev_text' => __('« 上一页', 'textdomain'),
'next_text' => __('下一页 »', 'textdomain'),
'type' => 'list', // 可选:输出为
- 列表,便于 CSS 样式化
));
wp_reset_postdata();
}
-
$paged变量必须提前声明:在WP_Query前添加$paged = get_query_var('paged') ? get_query_var('paged') : 1;,否则'paged' => $paged将始终为 0 或未定义; -
避免硬编码
product_cat参数:应使用'tax_query'替代过时的'product_cat' => 'clothing'(后者在较新 WooCommerce 版本中可能失效); -
不要遗漏
wp_reset_postdata():防止干扰后续主循环或其它查询; -
主题/插件冲突排查:若仍 404,请临时停用缓存插件、检查
.htaccess是否被修改,并确认「固定链接」设置已保存(后台 → 设置 → 固定链接 → 点击“保存更改”以刷新重写规则)。
? 关键注意事项:
? 进阶提示:如需 SEO 友好的路径式分页(如 /products/page/2/),需配合 add_rewrite_rule() 注册自定义重写规则,并确保该页面本身为真实存在的 WordPress 页面(非纯 PHP 文件),但这会显著增加复杂度;对于绝大多数场景,?paged=N 是最稳定、兼容性最佳的选择。











