如何检查我是否在管理区域的自定义帖子类型档案上

时间:2015-09-30 作者:joeljoeljoel

我正在尝试更改在自定义帖子类型的管理页面上运行的查询。此页面:/wp管理/编辑。php?post\\U type=我的\\U地点。通常,我会使用is_admin() && is_post_type_archive(\'my_venue\') 在修改查询之前检查我是否在正确的页面上。但是,我已将我的帖子类型注册到\'archive\' => false 所以现在is_post_type_archive() 始终返回false。

仅为此页面修改查询的最佳方式是什么?

register_post_type(
    \'my_venue\',
    [
        \'has_archive\' => false,
    ]
);

add_action(\'pre_get_posts\', \'my_venue_filters\');

function my_venue_filters($query) {
    if (is_admin() && is_post_type_archive(\'my_venue\')) {
        if (!empty($_GET[\'my_venue_ids\'])) {
            $query->set(\'post__in\', $_GET[\'my_venue_ids\']);
        }
    }
}

1 个回复
最合适的回答,由SO网友:birgire 整理而成

以下是三种可能性,基于/wp-admin/admin.php 文件:

方法#1有全局$pagenow$typenow 可用:

    global $pagenow, $typenow;
    if( \'my_venue\' === $typenow && \'edit.php\' === $pagenow )
    {
        // ...
    }
然后是当前屏幕,也在admin.php 使用文件set_current_screen();

    $screen = get_current_screen();
    if( is_a( $screen, \'\\WP_Screen\') && \'edit-myvenue\' === $screen->id );
    {
        // ...
    }
我们使用id 的属性\\WP_Screen 对象

如果我们浏览一下\\WP_Screen 同学们,我们发现current_screen 钩子,可以改用:

add_action( \'current_screen\', function( \\WP_Screen $s )
{
    if( \'edit-myvenue\' === $s->id )
    {
        // ...
    }
} );
方法3然后是load-edit.php 钩子,在pre_get_posts 挂钩:

add_action( \'load-edit.php\', function()
{
    // Check for the post type here.
} );
在这种情况下,通用挂钩是load-$pagenow. 不需要is_admin() 在这里检查。

注意,如果您以主查询为目标,则应添加$query->is_main_query() 在您的pre_get_posts 回调。

还要记住验证$_GET[\'my_venue_ids\'] 部分,它甚至可能不存在于$_GET 大堆

这里没什么新鲜事!我想我们都见过这些方法,以这样或那样的方式,在许多问题中使用;WPSE上的答案;-)