为啥分页不起作用并在 wordpress 网站上出现 404 错误?

Posted

技术标签:

【中文标题】为啥分页不起作用并在 wordpress 网站上出现 404 错误?【英文标题】:Why pagination is not working and gives a 404 error on the wordpress site?为什么分页不起作用并在 wordpress 网站上出现 404 错误? 【发布时间】:2017-06-30 13:32:48 【问题描述】:

美好的一天!问题是这样的:在模板类别(存档)中,当您单击 404 错误的第 2 页时,分页不起作用。 不明白怎么解决的请帮忙,头都坏了

我的循环:

<?php
$paged = ( get_query_var('paged') ) ? get_query_var('paged') : 1;
$arg = array(
  'cat' => get_queried_object_id(),
  'post_type'=>'post',
  'posts_per_page'=>9,
  //'order'=>'desc',
  'paged' => $paged,
  );
$query = new WP_query($arg);
if($query->have_posts()) : ?>
<section class="blog">
  <?php
  echo '<div class="row">';
  $i=0;
  $formcreated=false;
  while( $query->have_posts() ) :
    $query->the_post();
    // display post 
   endwhile;
   wp_reset_postdata();
endif;
?>

<div class="pagination">
  <?php
       if (function_exists('custom_pagination')) 
         custom_pagination($query->max_num_pages,"",$paged);
       
     ?>
   <?php wp_reset_postdata(); ?>
</div>

还有我的自定义分页:

function my_post_queries( $query ) 
    // do not alter the query on wp-admin pages and only alter it if it's the main query
    if (!is_admin() && $query->is_main_query())

        // alter the query for the home and category pages


        if(is_category())
            $query->set('posts_per_page', 1);
            $query->set('post_type','product');
        

    

add_action( 'pre_get_posts', 'my_post_queries' );

function custom_pagination($numpages = '', $pagerange = '', $paged='') 

  if (empty($pagerange)) 
    $pagerange = 2;
  

  /**
   * This first part of our function is a fallback
   * for custom pagination inside a regular loop that
   * uses the global $paged and global $wp_query variables.
   *
   * It's good because we can now override default pagination
   * in our theme, and use this function in default queries
   * and custom queries.
   */
  global $paged;
  if (empty($paged)) 
    $paged = 1;
  
  if ($numpages == '') 
    global $wp_query;
    $numpages = $wp_query->max_num_pages;
    if(!$numpages) 
        $numpages = 1;
    
  

  /**
   * We construct the pagination arguments to enter into our paginate_links
   * function.
   */
  $pagination_args = array(
    'base'            => get_pagenum_link(1) . '%_%',
    'format'          => 'page/%#%',
    'total'           => $numpages,
    'current'         => $paged,
    'show_all'        => False,
    'end_size'        => 1,
    'mid_size'        => $pagerange,
    'prev_next'       => True,
    'prev_text'       => __('&#60;'),
    'next_text'       => __('&#62;'),
    'type'            => 'plain',
    'add_args'        => false,
    'add_fragment'    => ''
  );

  $paginate_links = paginate_links($pagination_args);

  if ($paginate_links) 
    echo "<nav class='custom-pagination'>";
      echo $paginate_links;
    echo "</nav>";
  


【问题讨论】:

Pagination on custom wp_query in WordPress takes to 404 error page的可能重复 ***.com/questions/22364294/… @Christina 在我未经训练的眼睛看来,目前的 OP 已经在我们在这里看到的代码中至少部分地使用了这个技巧? 他在第二组代码中每页有 1 个帖子,大概是在 functions.php 中,并且他在循环参数上每页有 9 个帖子。你看到数字不匹配。此外,他希望所有类别都具有相同的分页,还是只是自定义循环中使用的一个?所以他需要使用比 is_category 更具体的条件,并且检查它是否不是内置的(cpt)不是你这样做的方式。 好的。我明白他的意思。当阅读设置中的每页帖子大于自定义查询中的帖子时,您会得到 404。我将在今天晚些时候回答这个问题。 【参考方案1】:

由于最近在两个不同的论坛上出现了这个问题,所以我正在回答这个问题。

如果您使用自定义分页,例如您正在使用的分页似乎来自 http://callmenick.com/post/custom-wordpress-loop-with-pagination,但它也会发生在 Genesis 子主题中,因为父编号的分页是人们所想的。

为什么会出现 404 页面? callmenick.com 和 Genesis (genesis_posts_nav) 中的自定义分页用于 ma​​in 查询,因此如果您的分页为您的不同的查询在您的阅读设置中的每页帖子下(为主查询设置),那么您将在第 2 页得到 404。

WordPress 网站上的每个前端页面请求都会生成一个主页面 询问。 WordPress 决定加载的模板基于 该主要查询的结果(您可以看到 WordPress 执行的顺序 这些东西通过查看操作参考页面)。尽管 事实上,您从未输出该查询的结果,它仍在运行, 对于分页档案,如果您是 尝试将该分页用于不同的查询。 ——米洛https://wordpress.stackexchange.com/a/120963/64742

您不会经常看到这个问题,因为许多人只是为该循环构建分页,而不是从 functions.php 文件或父主题中重新使用它。你可以在这里了解:https://codex.wordpress.org/Function_Reference/paginate_links

让我们从头开始,每当您编写代码时,请在 wp-config.php 中打开调试


我的 cpt 存档中的基本自定义循环。

存档产品.php

 <?php $paged = ( get_query_var('paged') ) ? get_query_var('paged') : 1;

  $product_args = array(
      'post_type' => 'product',
      'posts_per_page' => 2, //the same as the parse_query filter in our functions.php file
      'paged' => $paged,
      'page' => $paged
    );

  $product_query = new WP_Query( $product_args ); ?>

  <?php if ( $product_query->have_posts() ) : ?>

    <!-- the loop -->
    <?php while ( $product_query->have_posts() ) : $product_query->the_post(); ?>
      <article class="loop">
        <h3><?php the_title(); ?></h3>
        <div class="content">
          <?php the_excerpt(); ?>
        </div>
      </article>
    <?php endwhile; ?>
    <!-- end of the loop -->


    <!-- pagination here -->
    <?php
       if (function_exists( 'custom_pagination' )) :
          custom_pagination( $product_query->max_num_pages,"",$paged );
      endif;
   ?>


  <?php wp_reset_postdata(); ?>

  <?php else:  ?>
    <p><?php _e( 'Sorry, no posts matched your criteria.' ); ?></p>
  <?php endif; ?>

在你的functions.php文件中:

了解条件。 https://codex.wordpress.org/Conditional_Tags https://codex.wordpress.org/Function_Reference/is_post_type_archive

/** 
 * Posts per page for CPT archive
 * prevent 404 if posts per page on main query
 * is greater than the posts per page for product cpt archive
 *
 * thanks to https://sridharkatakam.com/ for improved solution!
 */

function prefix_change_cpt_archive_per_page( $query ) 
    
    //* for cpt or any post type main archive
    if ( $query->is_main_query() && ! is_admin() && is_post_type_archive( 'product' ) ) 
        $query->set( 'posts_per_page', '2' );
    


add_action( 'pre_get_posts', 'prefix_change_cpt_archive_per_page' );

/**
 * 
 * Posts per page for category (test-category) under CPT archive 
 *
*/
function prefix_change_category_cpt_posts_per_page( $query ) 

    if ( $query->is_main_query() && ! is_admin() && is_category( 'test-category' ) ) 
        $query->set( 'post_type', array( 'product' ) );
        $query->set( 'posts_per_page', '2' );
    


add_action( 'pre_get_posts', 'prefix_change_category_cpt_posts_per_page' );


/**
*
* custom numbered pagination 
* @http://callmenick.com/post/custom-wordpress-loop-with-pagination
* 
*/
function custom_pagination( $numpages = '', $pagerange = '', $paged='' ) 

  if (empty($pagerange)) 
    $pagerange = 2;
  

  /**
   * This first part of our function is a fallback
   * for custom pagination inside a regular loop that
   * uses the global $paged and global $wp_query variables.
   * 
   * It's good because we can now override default pagination
   * in our theme, and use this function in default queries
   * and custom queries.
   */
  global $paged;
  if (empty($paged)) 
    $paged = 1;
  
  if ($numpages == '') 
    global $wp_query;
    $numpages = $wp_query->max_num_pages;
    if(!$numpages) 
        $numpages = 1;
    
  

  /** 
   * We construct the pagination arguments to enter into our paginate_links
   * function. 
   */
  $pagination_args = array(
    'base'            => get_pagenum_link(1) . '%_%',
    'format'          => 'page/%#%',
    'total'           => $numpages,
    'current'         => $paged,
    'show_all'        => False,
    'end_size'        => 1,
    'mid_size'        => $pagerange,
    'prev_next'       => True,
    'prev_text'       => __('&laquo;'),
    'next_text'       => __('&raquo;'),
    'type'            => 'plain',
    'add_args'        => false,
    'add_fragment'    => ''
  );

  $paginate_links = paginate_links($pagination_args);

  if ($paginate_links) 
    echo "<nav class='custom-pagination'>";
      echo "<span class='page-numbers page-num'>Page " . $paged . " of " . $numpages . "</span> ";
      echo $paginate_links;
    echo "</nav>";
  


【讨论】:

按照您的指示,我能够让我的 CPT 显示和显示分页链接,但不幸的是,当我单击下一页 /page/2 时,我仍然收到 404 错误?有什么建议吗? 我唯一的想法是访问永久链接页面并重新保存。这会冲洗它们。 我能够让它工作克里斯蒂娜,我的代码中有错字。非常感谢您对您的帖子的帮助。你甚至不知道它对我有多大帮助。【参考方案2】:

关于 wp-include/functions.php

添加这些行

function my_pagination_rewrite() 
 add_rewrite_rule('([a-z]+)/page/?([0-9]1,)/?$', 'index.php?category_name=$matches[1]&paged=$matches[2]', 'top');



add_action('init', 'my_pagination_rewrite');

【讨论】:

这会做什么,为什么它会解决 OP 遇到的问题? 如果这行得通,但它不起作用,它会在下一次自动 wordpress 更新时被覆盖。【参考方案3】:

我在我的网站https://chronodivers.com 上遇到了同样的问题我有 3 个类似的网站都运行相同的主题、插件、WP 版本 (5.6) 等。只有这个网站有问题。

所有网站都使用 PERMALINK 格式 /%category%/%postname%/

我试过插件 (https://wordpress.org/support/view/plugin-reviews/category-pagination-fix) 对我不起作用。

然后我执行了这些简单的前端任务

    将永久链接格式更改为 PLAIN 并保存。

    刷新缓存

    将永久链接格式改回 /%category%/%postname%/ 并保存 40 刷新缓存

    我从 YOAST 插件中弹出一个“警告”,建议由于永久链接结构的变化,可能需要重建索引数据库(不记得确切的措辞),它提到了 WP CLI...

    我只是去了 YOAST > 工具 > 优化 SEO 数据

    5 完成后清除缓存

    它工作正常。我检查了所有类别,它们都有效

这次我不用更改 PHP 文件、htaccess 等

【讨论】:

以上是关于为啥分页不起作用并在 wordpress 网站上出现 404 错误?的主要内容,如果未能解决你的问题,请参考以下文章

woocommerce产品类别短代码分页不起作用

使用 Ajax 调用的 Extjs Grid 分页不起作用

DataTables - 排序,搜索,分页不起作用

RecyclerView分页不起作用

数据表分页不起作用?

ExtJs 网格分页不起作用