You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WordPress非管理员角色CPT每页显示数修改后分页页数计算错误

问题:自定义文章类型(CPT)后台分页总页数计算错误

我通过WordPress主题创建了自定义文章类型(CPT),允许非管理员用户在后台查看自己的CPT列表。目前已成功将非管理员角色的CPT每页显示数量修改为100,但分页的总页数仍显示默认的145页,未根据新的每页数量重新计算。

当前使用pre_get_posts钩子实现每页显示数修改,但发现主题后台使用的是wp-admin/includes/class-wp-list-table.php中的默认WP分页机制,之前尝试重新查询设置分页总页数的方法无效。

当前使用的代码(修改每页数量生效,但分页页数计算错误)

// 修改自定义文章类型每页显示数量 - 数量修改生效,但总页数计算不正确
function change_cpt_posts_per_page( $query ) {
    $main_user = wp_get_current_user();
    if( $main_user->roles[0] !== 'administrator' && $query->is_main_query() && is_post_type_archive('my_cpt') ) {
        $query->set( 'posts_per_page', '100' ); // 设置每页显示数量
    }
}
add_action( 'pre_get_posts', 'change_cpt_posts_per_page' );

尝试过的无效代码

$the_query = new WP_Query( $args );
$args = array('total' => $the_query->max_num_pages);

// 或者:
global $wp_query;
// $total = $wp_query->max_num_pages;
the_posts_pagination( array('total' => $wp_query->max_num_pages));

解决方案

问题出在原代码的条件判断上:is_post_type_archive('my_cpt')是针对前台归档页面的判断,而后台的CPT列表页不会触发这个条件,导致后台查询仍使用默认的posts_per_page值,总页数计算自然错误。

修改pre_get_posts钩子的条件,加入后台判断并针对后台CPT查询调整参数:

function change_cpt_posts_per_page( $query ) {
    $current_user = wp_get_current_user();
    // 判断:非管理员 + 后台环境 + 主查询 + 当前查询的是目标CPT
    if ( !current_user_can('administrator') && is_admin() && $query->is_main_query() && $query->get('post_type') === 'my_cpt' ) {
        $query->set( 'posts_per_page', 100 );
        // 强制重新计算总页数(确保WP_List_Table获取正确的总条目数)
        $query->set( 'no_found_rows', false );
    }
}
add_action( 'pre_get_posts', 'change_cpt_posts_per_page' );

说明:

  1. 替换is_post_type_archive为is_admin() + $query->get('post_type') === 'my_cpt',确保后台的CPT列表查询被命中
  2. 使用current_user_can('administrator')替代直接取roles[0],判断用户权限更严谨
  3. 设置no_found_rows为false,强制WordPress查询总条目数,保证WP_List_Table能基于新的每页数量计算正确的总页数

内容的提问来源于stack exchange,提问作者Meng888

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 15:16:13