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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.22 10:17:57