WordPress如何仅当get_posts返回结果时才添加仪表盘metabox
解决方案
实现逻辑
你不需要调整add_action的挂载时机,只要把数据查询逻辑提前到小部件注册函数内做判断即可:
- 正常挂载
wp_dashboard_setup钩子触发小部件注册逻辑 - 注册函数内优先查询是否存在使用了对应Gutenberg区块的文章/页面
- 仅当查询结果不为空时,才调用
add_meta_box创建仪表盘元框,没有符合条件的内容时不会生成多余的空小部件
修改后完整代码
/** * Pardot Widget for Dashboard */ function pardot_dashboard_widget() { // 提前执行数据查询 $args = [ 's' => '<!-- wp:acf/pardot-form ', 'sentence' => 1, 'post_type' => [ 'post', 'page' ], 'posts_per_page' => 1, // 只需要判断是否存在,查1条即可提升性能 'no_found_rows' => true, // 关闭分页计算进一步优化性能 ]; $pardot_form_query = get_posts($args); // 仅当有符合条件的内容时才注册元框 if ($pardot_form_query) { add_meta_box( 'pardot_dashboard_meta_box', esc_html__( 'Pardot Form Locations', 'wporg' ), 'pardot_dashboard_stats', 'dashboard', 'side', 'high' ); } } add_action('wp_dashboard_setup', 'pardot_dashboard_widget'); function pardot_dashboard_stats() { // 这里再执行完整查询输出内容即可,不需要再处理空状态 $args = [ 's' => '<!-- wp:acf/pardot-form ', 'sentence' => 1, 'post_type' => [ 'post', 'page' ], ]; $pardot_form_query = get_posts($args); // 输出内容逻辑示例:遍历展示所有符合条件的文章 foreach ($pardot_form_query as $post) { echo '<p><a href="'. get_edit_post_link($post->ID) .'">'. esc_html($post->post_title) .'</a></p>'; } }
如果需要进一步优化性能,也可以把第一次查询的结果存到全局变量或者静态变量中,避免二次查询。
内容的提问来源于stack exchange,提问作者user16645285
相关产品推荐
相关产品推荐

