WordPress定制API端点-如何使请求更灵活

时间:2020-06-25 作者:cooper33

我正在创建简单的API端点,以获取具有指定类别和标记的自定义post类型项。

function my_awesome_func( $data ) {
  $posts = get_posts( array(
        \'post_type\' => \'faq\',
        \'numberposts\' => 10,
        \'tax_query\' => array(
            \'relation\' => \'AND\',
                array(
                        \'taxonomy\' => \'category\',
                        \'field\' => \'slug\',
                        \'terms\' => array($data[\'cat\']) 
                ),
                array(
                    \'taxonomy\' => \'post_tag\',
                        \'field\' => \'slug\',
                        \'terms\' => array($data[\'tag\']) 
                ),
            )
        )
  );
 
  if ( empty( $posts ) ) {
    return null;
    }

        
        foreach( $posts as $post ) {
            $id = $post->ID; 

            $posts_data[] = (object) array( 
                    \'id\' => $id, 
                    \'title\' => $post->post_title,
                    \'content\' => $post->post_content
            );
        }                  
    
    return $posts_data;
}

add_action( \'rest_api_init\', function () {
  register_rest_route( \'test/v1\', \'/faq/cat=(?P<cat>[a-zA-Z0-9_,]+)/tag=(?P<tag>[a-zA-Z0-9_,]+)\', array(
    \'methods\' => \'GET\',
    \'callback\' => \'my_awesome_func\',
  ) );
} );
它可以很好地处理此请求:...wp-json/test/v1/faq/cat=cars/tag=big但我想通过只添加类别或标签,使其更加灵活...wp-json/test/v1/faq/cat=cars并通过添加多个标记(即用逗号分隔):...wp-json/test/v1/faq/cat=cars/tag=big,blue

提前感谢您的帮助。

1 个回复
SO网友:ScottM

您需要为要覆盖的每个场景(即,cat&tag、just cat或just tag)注册单独的路由,所有这些都在单个add\\u操作调用中完成。您的正则表达式将支持逗号分隔的标记。

接下来要做的是更改设置\'term\' 参数作为\'tax_query\' 数组参数。它需要一个字符串数组,当前传递的是一个由逗号分隔的值组成的字符串(即,\'tag1,tag2\'). 您可以通过使用explode() 将字符串转换为数组。

您还需要围绕设置\'tax_query\' 基于使用的路由的数组参数。