我正在尝试使用分页在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
谢谢!
答案 0 :(得分:9)
这听起来与我的经历非常相似(在我的孩子主题中,自定义永久链接%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并未请求正确的自定义类别。这个修复救了我!
答案 1 :(得分:4)
我有同样的问题,劳伦的修复对我有帮助。我的问题是,使用此代码,当前页面没有改变,它被卡在第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
));
答案 2 :(得分:0)
我会首先尝试切换到WP_Query,但它对Pagination的影响较小。
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()) : ?>
如果这不起作用,请尝试将永久链接结构更改为帖子ID,看看是否会更改它。 如果这些都不起作用,请将$ cat设置为您知道的类别(并且有26个帖子),并确保不会导致问题。
希望这有帮助。