在WordPress后台子菜单中按自定义字段展示特定文章
在WordPress后台添加带特定自定义字段的文章列表子菜单
我来一步步教你实现这个需求,核心其实就两个部分:注册后台独立子菜单,以及在菜单页面里查询并展示符合条件的文章。
第一步:注册后台子菜单
首先我们要借助WordPress的admin_menu钩子,给仪表盘添加一个专属子菜单(如果你想把它挂在「文章」这类主菜单下也可以,这里按你要求的仪表盘独立子菜单来做)。
把下面这段代码加到你的主题functions.php里,或者自定义插件文件中:
add_action('admin_menu', 'add_custom_pending_articles_menu'); function add_custom_pending_articles_menu() { // 添加仪表盘子菜单,参数依次是:父菜单slug、菜单显示标题、页面标题、访问权限、菜单唯一标识、页面渲染回调 add_dashboard_page( '待审核编辑文章', // 页面顶部显示的标题 '待审核编辑', // 仪表盘菜单里显示的名称 'edit_posts', // 访问权限(设置成能编辑文章的用户即可) 'pending-edited-articles', // 菜单的唯一slug,别和其他菜单重复 'render_pending_articles_page' // 负责渲染页面内容的函数 ); }
第二步:编写页面渲染函数,查询并展示目标文章
接下来要实现上面提到的render_pending_articles_page函数——它的作用就是查询带有edited_pending_done自定义字段的文章,然后用和后台默认文章列表风格一致的表格展示出来,用户看着也习惯。
继续添加这段代码:
function render_pending_articles_page() { // 先做权限校验,防止未授权用户直接访问 if (!current_user_can('edit_posts')) { wp_die(__('你没有权限访问此页面。')); } // 构建WP_Query查询参数,精准定位目标文章 $args = array( 'post_type' => 'post', // 要查询的文章类型,默认是post,自定义文章类型可以改这里 'post_status' => 'any', // 可选publish/draft等状态,这里设为any表示所有状态都包含 'meta_key' => 'edited_pending_done', // 指定要匹配的自定义字段key 'meta_compare' => 'EXISTS', // 只要存在这个字段的文章都显示,如果要匹配特定值可以用'='+meta_value 'posts_per_page' => -1, // 显示所有符合条件的文章,也可以设为固定数字比如10 'orderby' => 'date', // 按发布日期排序 'order' => 'DESC' ); $pending_articles = new WP_Query($args); // 页面头部结构 echo '<div class="wrap">'; echo '<h1>' . get_admin_page_title() . '</h1>'; // 如果查询到文章,就渲染表格 if ($pending_articles->have_posts()) { ?> <table class="wp-list-table widefat fixed striped posts"> <thead> <tr> <th>文章标题</th> <th>发布日期</th> <th>自定义字段值</th> <th>操作</th> </tr> </thead> <tbody> <?php while ($pending_articles->have_posts()) : $pending_articles->the_post(); ?> <tr> <td> <strong><a href="<?php echo get_edit_post_link(); ?>" target="_blank"><?php the_title(); ?></a></strong> <div class="row-actions"> <span class="view"><a href="<?php echo get_permalink(); ?>" target="_blank">查看</a> | </span> <span class="edit"><a href="<?php echo get_edit_post_link(); ?>">编辑</a></span> </div> </td> <td><?php echo get_the_date(); ?></td> <td><?php echo get_post_meta(get_the_ID(), 'edited_pending_done', true); ?></td> <td> <a href="<?php echo get_edit_post_link(); ?>" class="button button-primary">编辑文章</a> </td> </tr> <?php endwhile; ?> </tbody> </table> <?php } else { // 没有符合条件的文章时显示提示 echo '<p>暂无带有"edited_pending_done"字段的文章。</p>'; } // 重置查询,避免影响后续全局查询 wp_reset_postdata(); echo '</div>'; }
第三步:按需自定义调整(可选)
- 如果你只想展示
edited_pending_done字段值为特定内容的文章(比如值为yes),可以修改$args参数:$args = array( // ...其他参数不变 'meta_key' => 'edited_pending_done', 'meta_value' => 'yes', 'meta_compare' => '=' ); - 要是想把这个子菜单挂在「文章」主菜单下,把
add_dashboard_page换成add_submenu_page,参数调整成这样:add_submenu_page( 'edit.php', // 父菜单slug(文章主菜单的slug是edit.php) '待审核编辑文章', '待审核编辑', 'edit_posts', 'pending-edited-articles', 'render_pending_articles_page' ); - 还可以根据需求增加表格列,比如文章作者、分类标签等,只需要在
<thead>和<tbody>里添加对应的<th>和<td>就行。
完成这些操作后,你就能在WordPress后台仪表盘看到「待审核编辑」的子菜单,点击进去就是所有带有edited_pending_done自定义字段的文章列表了。
内容的提问来源于stack exchange,提问作者Peyman Naeimi
相关产品推荐
相关产品推荐

