问题描述

我想添加屏幕选项到我的插件设置页面,如在仪表板中可用的。

我尝试使用 WP_Screen 对象的 add_option 方法,发现它只支持两个选项。 per_pagelayout_columns

有没有人知道使用什么屏幕选项来获取 “仪表板” 页面中的选项?

编辑:

让我解释一下我想要的一点。

我在 Bulk Delete Plugin 中有不同的部分,每个部分让我们根据一些标准 (如类别,标签,自定义分类法等) 删除帖子。我想让用户选择他们想要使用的部分以及他们想要隐藏的部分,类似于 “信息中心” 页面,用户可以在其中选择要查看哪些信息中心小工具以及哪些要隐藏的信息中心。

现在要实现这一点,我想显示一个复选框列表 (每个部分一个),让用户选择要显示哪一个。

要显示复选框列表,我必须调用 WP_Screen 对象的 add_option 方法。当我这样做时,我发现目前的 add_option 功能只支持这两种类型,其他的只是被忽略。

  • per_page

  • layout_columns

但是,仅在仪表板页面复选框中显示。我想知道如何在我的自定义管理页面的屏幕选项部分复制类似的东西。

最佳解决方案

您不需要发明一个新的屏幕选项行。只要使用适当的 metaboxes 。

目前您正在绘制 pseudo-metaboxes:

<!-- Post status start-->
        <div class = "postbox">
            <div class = "handlediv"> <br> </div>
            <h3 class = "hndle"><span><?php _e("By Post Status", 'bulk-delete'); ?></span></h3>
        <div class = "inside">
        <h4><?php _e("Select the posts which you want to delete", 'bulk-delete'); ?></h4>

你应该做这个:

<div id="post-body-content">
    <!-- #post-body-content -->
</div>

<div id="postbox-container-1" class="postbox-container">
    <?php do_meta_boxes('','side',$object); ?>
</div>

<div id="postbox-container-2" class="postbox-container">
    <?php do_meta_boxes('','normal',$object); ?>
    <?php do_meta_boxes('','advanced',$object); ?>
</div>

然后用 add_meta_box()注册自己的 metaboxes 。

Stephen Harris 阅读 Meta Boxes on Custom Pages 的所有细节 (demo on GitHub) 。要点是:您可以免费获得这些盒子的屏幕选项。

当 WordPress 有一天更改 metaboxes 的内部标记时,您的代码可能仍然可以工作,因为您已经使用了 API 。

次佳解决方案

您可以通过在 WP_Screen 类中使用适当的过滤器来实现。只需确保您不会默认切换它:

如何显示或隐藏选项卡

以下过滤器显示如何显示或隐藏选项卡。实际上,由于有一个更好的过滤器,如果您需要强制隐藏该选项卡已存在,则以下方式将更为有用:

add_filter( 'screen_options_show_screen', function( $show, WP_Screen $screen )
{
    // Navigate to the screen of choice and uncomment the following line to find out the 'base' val
    // var_dump( $screen );
    return 'your_screen_id' !== $screen->base
        ? $show
        : true;
}, 10, 2 );

如何显示标签并添加自定义内容

以下显示一个设置选项卡,其中包含一个输入字段,该字段包含您可以以任何方式在您的页面上使用的值 amount(例如限制 $wpdb 查询的结果) 。

/**
 * @param string     $settings
 * @param WP_Screen $screen
 */
add_filter( 'screen_settings', function( $settings, WP_Screen $screen )
{
    if ( 'your_screen_id' !== $screen->base )
        return $settings;

    $amount = isset( $_GET['paged'] )
        ? filter_var(
            absint( $_GET['paged'] ),
            FILTER_SANITIZE_NUMBER_INT,
            FILTER_NULL_ON_FAILURE
        )
        : 1;

    return sprintf(
        '<label for="amount">Amount:</label> '
        .'<input step="1" min="1" max="999" class="screen-per-page" name="amount" val="%d">',
        .get_submit_button( 'Set', 'secondary', 'submit-amount', false ),
        $amount
    );
}, 10, 2 );

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。