如何为WP API默认路由添加自定义参数?

时间:2018-04-10 作者:grazianodev

我创建了一个opps 自定义post类型并注册了自定义API字段closed 使用以下代码:

public function get_opp_state() {
    register_rest_field( \'opps\', \'closed\', array(
        \'get_callback\' => array( $this, \'get_opp_state_callback\' ),
        \'update_callback\' => null,
        \'schema\' => null
    ));        
} 

public function get_opp_state_callback( $opp ) {  
    $oppDeadline = get_field( \'deadline\', $opp[ \'id\' ] ); 
    $today = date( \'Ymd\' );
    $isClosed = $oppDeadline < $today; 
    return $isClosed;            
}                               
检索使用opps post类型,我使用此请求:

http://example.com/wp-json/wp/v2/opps

现在,我如何扩展该请求以仅获取opps 具有closed 字段是否等于true?我原本希望以下方法可以奏效,但事实并非如此:

http://example.com/wp-json/wp/v2/opps?closed=true

我知道我可以创建自定义路由,但我确实希望避免这样做,因为默认请求返回的信息包含了我需要的所有信息(除了closed 字段)。那么,没有定制路线,有什么方法可以实现这一点吗?

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

经过大量的挖掘,我似乎自己找到了一个解决方案,一个非常强大的解决方案,它利用了rest_{ post_type }_query 筛选器(将{post\\u type}部分替换为自定义post类型的slug。您可以使用rest_post_query 更改默认值/wp-json/wp/v2/posts 请求):

public function __construct() {  
    // Make sure you add those numbers at the end of the line, or it won\'t work
    add_filter( \'rest_opps_query\', array( $this, \'get_opps_by_state\' ), 10, 2 );  
}  
       
public function get_opps_by_state( $args, $request ) {

    $state = $request->get_param( \'state\' );  

    if( $state == \'open\' ) {
        $args[ \'meta_query\' ] = array(
            \'deadline\' => array(
                \'key\' => \'deadline\',
                \'value\' => date( \'Ymd\' ), 
                \'compare\' => \'>\',
                \'type\' => \'DATE\'
            )
        );
    } elseif ( $state == \'closed\' ) {
        $args[ \'meta_query\' ] = array(
            \'deadline\' => array(
                \'key\' => \'deadline\',
                \'value\' => date( \'Ymd\' ), 
                \'compare\' => \'<\',
                \'type\' => \'DATE\'
            )
        );
    }

    return $args; 

}
因此,现在我可以使用默认的Wordpress API路由来获取自定义帖子:

http://example.com/wp-json/wp/v2/opps

并根据自定义参数筛选结果,status:

http://example.com/wp-json/wp/v2/opps?status=open

http://example.com/wp-json/wp/v2/opps?status=closed

无需自定义路线!

SO网友:Aurovrata

修改REST请求时,您有2 options, - 注册一个字段,就像您所做的那样,只向json对象添加一个键:值对。-注册一个meta,它允许向json对象添加一个自定义meta字段。

当您使用提出自定义请求时,

http://example.com/wp-json/wp/v2/pages?slug=my_page

例如,您实际上是在查询帖子的一个字段,在本例中slug.

当你这样做的时候,

http://example.com/wp-json/wp/v2/opps?closed=true

您正试图查询一个名为closed 它不存在,因为它只是作为键而不是元字段添加到json响应中。

我认为你最好的选择还是custom route

结束

相关推荐

WordPress REST API validation

我想验证发送到终点的数据。https://www.shawnhooper.ca/2017/02/15/wp-rest-secrets-found-reading-core-code/这篇文章引用了未记录的验证选项。我已经得到了我所需要的90%,但现在需要验证一个字符串长度,我似乎无法弄清楚。基本上,我需要说最大长度是X。我尝试了“maxLength”,但这不起作用。有没有人做过这个或者做得更好,还有没有关于这个的文档,我发现的帖子很旧。 \'args\' => array(&#