WordPress后台菜单页面无法展示posts表数据的问题求助
WordPress后台菜单页面无法展示posts表数据的问题求助
看起来你遇到了后台自定义菜单页无法正确显示posts表草稿数据的问题,我来帮你分析下可能的原因和解决办法:
先排查基础问题
首先得确认两个关键点:
- ID为5的用户确实存在状态为
draft的文章,可以直接去后台该用户的文章列表里查看,或者直接在数据库里执行查询验证一下 - 开启WordPress的调试模式,看看有没有数据库错误或者PHP警告:在
wp-config.php里添加define('WP_DEBUG', true);,访问菜单页就能看到具体错误提示了
代码里的核心问题
你的代码里用了setup_postdata()和模板函数(the_permalink()、the_title()),但在后台自定义页面的环境下,这些模板函数缺乏正确的上下文支持,导致无法正常输出内容。另外直接写原生SQL语句也存在安全风险,最好遵循WordPress的开发规范来处理。
推荐的解决方案
这里给你两个可行的修改方案,选一个适合你的就行:
方案一:用WP_Query替代直接数据库查询(推荐)
WP_Query是WordPress官方推荐的查询方式,会自动处理post对象的上下文,模板函数也能正常工作:
function my_menu_page(){ $args = array( 'post_type' => 'post', // 如需自定义文章类型,替换成对应的slug 'post_status' => 'draft', 'author' => 5, 'posts_per_page' => -1, // 显示所有符合条件的文章 ); $draft_query = new WP_Query( $args ); echo '<div class="wrap">'; if ( $draft_query->have_posts() ) { echo '<h1>我的草稿文章</h1>'; while ( $draft_query->have_posts() ) { $draft_query->the_post(); ?> <h2> <a href="<?php the_permalink(); ?>" rel="bookmark" title="Permalink: <?php the_title_attribute(); ?>"> <?php the_title(); ?> </a> <span style="margin-left:10px;"> <a href="<?php echo get_edit_post_link(); ?>">编辑文章</a> </span> </h2> <?php } wp_reset_postdata(); // 必须重置post数据,避免影响后续功能 } else { echo '<p>没有找到符合条件的草稿文章</p>'; } echo '</div>'; }
方案二:直接使用$wpdb查询并手动输出内容
如果你坚持用直接数据库查询,那可以跳过模板函数,直接访问查询返回的对象属性,同时加上安全处理:
function my_menu_page(){ global $wpdb; // 用prepare防止SQL注入,这是WordPress开发的最佳实践 $fivesdrafts = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM $wpdb->posts WHERE post_status = %s AND post_author = %d", 'draft', 5 ) ); echo '<div class="wrap">'; if ( $fivesdrafts ) { echo '<h1>我的草稿文章</h1>'; echo '<ul style="list-style-type:disc;margin-left:20px;">'; foreach ( $fivesdrafts as $post ) { // 生成后台编辑链接,比前台链接更实用 $edit_link = get_edit_post_link( $post->ID ); ?> <li style="margin:10px 0;"> <a href="<?php echo esc_url( $edit_link ); ?>" title="编辑: <?php echo esc_attr( $post->post_title ); ?>"> <?php echo esc_html( $post->post_title ); ?> </a> <span style="margin-left:10px;color:#666;"> 发布时间: <?php echo date( 'Y-m-d H:i', strtotime( $post->post_date ) ); ?> </span> </li> <?php } echo '</ul>'; } else { echo '<p>没有找到符合条件的草稿文章</p>'; } echo '</div>'; }
最后提醒
不管用哪个方案,都要记得:
- 加安全处理函数(比如
esc_url、esc_html)防止XSS攻击 - 如果用WP_Query,一定要调用
wp_reset_postdata()重置全局post变量
备注:内容来源于stack exchange,提问作者najubudeendeveloper
相关产品推荐
相关产品推荐

