Wordpress category.php 分页 404 错误
Posted
技术标签:
【中文标题】Wordpress category.php 分页 404 错误【英文标题】:Wordpress category.php Pagination 404 Errors 【发布时间】:2015-07-18 11:13:33 【问题描述】:我正在尝试使用分页在 category.php 文件中显示类别的帖子,但是当我单击“旧帖子”按钮时,我得到了 404。这是我目前用于查询的代码:
<?php
// Get ID of category we're currently looking at
$cat = get_cat_id( single_cat_title("",false) );
query_posts(array(
'posts_per_page'=>25,
'cat' => $cat,
'paged' => ( get_query_var('paged') ? get_query_var('paged') : 1 )
));
if(have_posts()):
?>
我使用的永久链接结构是 /%category%/%postname%/
我了解到,如果“posts_per_page”设置为小于默认值,则会出现 404 错误,但这似乎不是问题。我的设置中的默认值为 20。
有什么想法吗?这是永久链接设置的问题吗? /category-name/page/2 的工作方式不应该与 /blog-page/page/2 的工作方式相同吗?
如果我尝试访问以下类别,我也会收到 404:/category/cat-name 或 /blog-page/category/cat-name
谢谢!
【问题讨论】:
【参考方案1】:这听起来与我的经历非常相似(在我的子主题中,自定义永久链接 %category%%postname% 在 category.php 中使用分页时会导致 404,但仅在第 2 页上)。
我发现这个解决方案效果很好:http://www.bamboosolutions.co.uk/fix-404-errors-wordpress-pagination/
总结解决方案,在我的孩子functions.php
文件中,我添加了这段代码:
function custom_pre_get_posts( $query )
if( $query->is_main_query() && !$query->is_feed() && !is_admin() && is_category())
$query->set( 'paged', str_replace( '/', '', get_query_var( 'page' ) ) );
add_action('pre_get_posts','custom_pre_get_posts');
function custom_request($query_string )
if( isset( $query_string['page'] ) )
if( ''!=$query_string['page'] )
if( isset( $query_string['name'] ) ) unset( $query_string['name'] ); return $query_string;
add_filter('request', 'custom_request');
我花了很多时间阅读有关此错误的不同原因和解决方案,在我的情况下,WP 没有请求正确的自定义类别。这个修复节省了我很多时间!
【讨论】:
在我设法为该类别设置分页后,这个问题就出现了。有了您的回答,我一切正常,谢谢! 这适用于 404。现在 www.domain.com/taxonomy/page/2 不显示 404 但它每次只加载第一页内容。 是的!谢谢...与原始答案中的query_posts
结合的脚本对我有用
有一个插件可以实现这个:wordpress.org/plugins/category-pagination-fix
谢谢!! (一个错字:将 is_category()
更改为 && is_category()
。)感谢 ***!我以为我会花 HOURS 解决这个问题。【参考方案2】:
我遇到了同样的问题,Lauren 的解决方案帮助了我。我的问题是,使用此代码当前页面没有改变,它卡在第 1 页。
在functions.php中我添加了以下代码:
function custom_pre_get_posts($query)
if ($query->is_main_query() && !$query->is_feed() && !is_admin() && is_category())
$query->set('page_val', get_query_var('paged'));
$query->set('paged', 0);
add_action('pre_get_posts', 'custom_pre_get_posts');
在类别模板(category.php)中我使用了这个代码:
$paged = (get_query_var('page_val') ? get_query_var('page_val') : 1);
$query = new WP_Query(array(
'posts_per_page' => 3,
'cat' => $cat,
'orderby' => 'date',
'paged' => $paged,
'order' => 'DESC'));
对于分页,我像这样更改了此代码。希望我的解决方案有所帮助:
$big = 999999999;
echo paginate_links(array(
'base' => str_replace($big, '%#%', esc_url(get_pagenum_link($big))),
'format' => '/page/%#%',
'current' => max(1, $paged),
'prev_text' => __('Previous Page'),
'next_text' => __('Next Page'),
'show_all' => true,
'total' => $query->max_num_pages
));
【讨论】:
这也解决了 404 问题。感谢您发布此信息。我遇到了 /category/news/page/2 显示 404 的问题。这个解决方案解决了它。【参考方案3】:我会先尝试切换到 WP_Query,它的分页问题较少。
https://codex.wordpress.org/Function_Reference/query_posts
query_posts() 是通过用新的查询实例替换页面的主查询来修改页面的主查询的过于简单和有问题的方法。它效率低下(重新运行 SQL 查询)并且在某些情况下会彻底失败(尤其是在处理帖子分页时)。
$cat = get_cat_id( single_cat_title("",false) );
$paged = ( get_query_var( 'paged' ) ) ? absint( get_query_var( 'paged' ) ) : 1;
$the_query = new WP_Query
(
array
(
'posts_per_page'=>25,
'cat' => $cat,
'paged' => $paged
),
);
if ($the_query->have_posts()) : ?>
如果这不起作用,请尝试将您的永久链接结构更改为 Post ID,看看是否会改变它。 如果这些都不起作用,请将 $cat 设置为您知道存在的类别(并且有 26 个帖子)并确保这不会导致问题。
希望这会有所帮助。
【讨论】:
如果我将永久链接结构从/%category%/%postname%
更改为/%category%/%post_id%
,这将有效。但这并不是一个真正可行的选择。出于 SEO 目的,我需要 URL 中的帖子标题。
当我将链接从 /%category%/page/2/
更改为 /category/%category%/page/2/
时,它可以工作。但是,添加较旧/较新帖子链接的 wordpress 功能在其 URL 中没有。
你可以试试这个wordpress.org/support/view/plugin-reviews/…它已经2年没有更新了,但是上个月的一篇评论说它仍然有效。 (这只是两个小功能。)希望这可以帮助您解决问题。
谢谢!这部分奏效了。我必须更改插件中的一些内容才能使其正常工作。代码在这里供任何可能需要的人使用:creative.link/code/wordpress-category-pagination-fix以上是关于Wordpress category.php 分页 404 错误的主要内容,如果未能解决你的问题,请参考以下文章