Wordpress category.php分页404错误

Nic*_*son 6 php wordpress pagination categories http-status-code-404

我正在尝试使用分页显示我的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()):
?>
Run Code Online (Sandbox Code Playgroud)

我使用的永久链接结构是/%category%/%postname%/

我已经读过,如果"posts_per_page"设置为小于默认值,那么有一个错误会给你留下404错误,但这似乎不是问题.我的设置中的默认值为20.

有任何想法吗?这是永久链接设置的问题吗?不应该/ category-name/page/2的工作方式与/ blog-page/page/2相同吗?

如果我尝试访问这样的类别,我也会得到404:/ category/cat-name,或/ blog-page/category/cat-name

谢谢!

Lau*_*ren 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');
Run Code Online (Sandbox Code Playgroud)

我花了很多时间阅读有关此错误的不同原因和解决方案,在我的情况下,WP并没有请求正确的自定义类别.这个修复救了我!

  • 谢谢!!(一个错字:将`is_category()`更改为`&& is_category()`.)感谢天堂为StackOverflow!我以为我会用HOURS来解决这个问题. (4认同)
  • 这适用于 404。现在 www.domain.com/taxonomy/page/2 不显示 404 但它每次只加载第一页内容。 (2认同)

Lau*_*hes 5

我遇到了同样的问题,劳伦的修复帮助了我。我的问题是,使用此代码,当前页面没有改变,它卡在了第 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');
Run Code Online (Sandbox Code Playgroud)

在类别模板(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'));
Run Code Online (Sandbox Code Playgroud)

对于分页,我像这样更改了此代码。希望我的解决方案有帮助:

$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
                    ));
Run Code Online (Sandbox Code Playgroud)


And*_*der 1

我会首先尝试切换到 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()) : ?>
Run Code Online (Sandbox Code Playgroud)

如果这不起作用,请尝试将永久链接结构更改为帖子 ID,看看是否会改变。如果这些都不起作用,请将 $cat 设置为您知道存在的类别(并且有 26 个帖子),并确保这不会导致问题。

希望这可以帮助。