自定义分类的WordPress REST筛选器将应用于管理区域

时间:2019-04-06 作者:geochanto

我有一个名为collection的自定义分类法,其中包含高级自定义字段。

我使用的是wordpress API,因为我需要根据ACF值过滤API响应,所以我的主题中有这个过滤器functions.php:

 add_filter( \'rest_collection_query\', function( $args ) {
            $ignore = array(\'page\', \'per_page\', \'search\', \'order\', \'orderby\', \'slug\');
            foreach ( $_GET as $key => $value ) {
            if (!in_array($key, $ignore)) {
                $args[\'meta_query\'][] = array(
                \'key\'   => $key,
                \'value\' => $value,
                );
            }
            }
            return $args; 
    });
这非常有效,除了现在在WP admin中,我的分类法复选框列表不再显示它注册到的自定义帖子类型。

我试着把这个街区包起来if(!is_admin()) {}, 但这没有任何效果。是否有我应该使用的特定语法?

注意,我用的是古腾堡。。。这可能是原因吗?

2 个回复
最合适的回答,由SO网友:Sally CJ 整理而成

我在用古腾堡。。。这可能是原因吗?

是的,Gutenberg(或块编辑器)在处理分类术语(以及自定义帖子类型)时使用WordPress REST API。

所以过滤器rest_collection_query (或rest_{taxonomy}_query) 无论是谁/什么人提出了REST API请求,或者是从何处提出的,都将应用该请求(例如,是否通过/wp-admin/ 还是站点前端?)。

我正在使用wordpress API

假设您正在向“集合”分类端点发出手动请求(/wp-json/wp/v2/collection), 您可以通过使用自定义参数来区分请求的来源,如so,其中参数名称为my_key —如果值为1, 然后我们可以过滤$args (即查询参数):

add_filter( \'rest_collection_query\', function( $args, $request ){
    if ( \'1\' === $request->get_param( \'my_key\' ) ) {
        // your code here
    } // else, don\'t filter/modify $args

    return $args;
}, 10, 2 );
然后,例如使用window.fetch() 在JavaScript中,您可以执行以下操作:

window.fetch( \'/wp-json/wp/v2/collection?per_page=2&my_key=1\' )
    .then( res => res.json() )
    .then( terms => console.log( terms ) );

Alternate Solution

Add your own custom endpoint 随心所欲。。

这个Classic Editor 可能会有所帮助,但如果插件或自定义代码对完全相同的“集合”分类端点执行请求,那么您就知道会发生什么情况了。。)

Last but not least..

默认情况下,is_admin() 退货false 在REST API端点/URL上。例如,如果你在http://example.com/wp-json/wp/v2/posts (或者您向该端点发出API请求),然后:

if ( ! is_admin() ) {
    // code here runs
}

SO网友:geochanto

我将在这里回答我自己的问题。它出现了is_admin 使用gutenberg编辑器时不起作用,因为gutenberg还使用API进行查询。

我安装了经典编辑器,问题得到了解决。尽管知道如何对古腾堡进行类似的检查会很好。

相关推荐

可以为一个wp网站创建两个不同的wp-admin吗

我只是想知道是否有可能创建一个网站,例如newwebsite。com并创建两个wp管理员,每个管理员具有不同的url,例如一个具有newwebsite。com/wp admin和一个as newwebsite。com/dashboard或类似的东西,或者我需要为其注册另一个子域。我的目标-我的目标实际上是,我想创建一个网站,其他用户可以在我的网站上做某些事情,比如写帖子,但创建项目,并在我的网站上显示它们,他们将使用新网站。com/仪表板。