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' );
说明:
- 替换
is_post_type_archive为is_admin()+$query->get('post_type') === 'my_cpt',确保后台的CPT列表查询被命中 - 使用
current_user_can('administrator')替代直接取roles[0],判断用户权限更严谨 - 设置
no_found_rows为false,强制WordPress查询总条目数,保证WP_List_Table能基于新的每页数量计算正确的总页数
内容的提问来源于stack exchange,提问作者Meng888
相关产品推荐
相关产品推荐

