wordpress rest api v2如何列出分类术语?

时间:2017-02-25 22:12:45

标签: wordpress wordpress-rest-api

我是v2的新手,我长时间使用v1,目前升级到v2,我尝试将所有条款都归属于特定的自定义分类。

在v1中,我可以这样做以获得条款 /分类/ location_category /术语

但在v2中我试试 /分类/条款 它返回json错误“code”:“rest_no_route”,“message”:“找不到匹配URL和请求方法的路由”,“data”:{“status” :404}}

如果只是/ taxonomies / location_category /它没有显示任何属于分类法的术语。

我在谷歌搜索问题几个小时没有显示任何结果,任何人都可以帮助,谢谢

7 个答案:

答案 0 :(得分:7)

最终在这里编写自定义代码

向functions.php添加点击代码

  class all_terms
{
    public function __construct()
    {
        $version = '2';
        $namespace = 'wp/v' . $version;
        $base = 'all-terms';
        register_rest_route($namespace, '/' . $base, array(
            'methods' => 'GET',
            'callback' => array($this, 'get_all_terms'),
        ));
    }

    public function get_all_terms($object)
    {
        $return = array();
        // $return['categories'] = get_terms('category');
 //        $return['tags'] = get_terms('post_tag');
        // Get taxonomies
        $args = array(
            'public' => true,
            '_builtin' => false
        );
        $output = 'names'; // or objects
        $operator = 'and'; // 'and' or 'or'
        $taxonomies = get_taxonomies($args, $output, $operator);
        foreach ($taxonomies as $key => $taxonomy_name) {
            if($taxonomy_name = $_GET['term']){
            $return = get_terms($taxonomy_name);
        }
        }
        return new WP_REST_Response($return, 200);
    }
}

add_action('rest_api_init', function () {
    $all_terms = new all_terms;
});

并输入网址http://youdomain.com/wp-json/wp/v2/all-terms?term=you_taxonomy

所以term = you_taxonomy,将获得属于job_category的条款。

答案 1 :(得分:4)

对于自定义分类,post

register_taxonomy()调用也是您可以设置'rest_base'参数的地方(默认情况下将是您的示例中的分类名称/location_category/)。

答案 2 :(得分:2)

分类学术语简称为:

https://yoursite.com/wp-json/wp/v2/the-taxonomy-slug

例如,回答您的问题:

https://yoursite.com/wp-json/wp/v2/location_category

从终端:

curl -X GET -i http://www.example.com/wp-json/wp/v2/location_category

答案 3 :(得分:2)

TLDR

在注册分类法时使用标志 show_in_rest。仅此而已。

详情

列出所有可用的分类法

所有默认分类法均可通过 REST API 获得。使用以下端点获取所有可用分类法的列表:

https://exmaple.org/wp-json/wp/v2/taxonomies

它会告诉您 wp:items 标签中每个分类法的正确端点,例如

..., "wp:items":[{"href":"https://example.com/wp-json/wp/v2/categories"}], ...
..., "wp:items":[{"href":"https://example.com/wp-json/wp/v2/tags"}], ...

向 REST 端点添加新的分类法

如果您的分类法未在此分类法概述中列出,您需要在调用 register_taxonomy 时启用 REST 端点。您可以通过添加参数 'show_in_rest' => true:

<php
register_taxonomy( 'location_category', 'post', [
    // ...
    'show_in_rest' => true, // ← make sure you have this line in the taxonomy args!
] );

注意:如果您不使用 show_in_rest,则该分类在块编辑器(“Gutenberg”)中不可用。


我强烈建议不要创建自定义 REST 端点来复制内置逻辑。
IE。不要做thisthis

答案 4 :(得分:0)

被接受的答案大部分对我有用。这就是我得到的

<?php
// your_theme/functions.php
/**
 * how to list all taxonomy terms
 */
class all_terms
{   
    public function __construct()
    {   
        $version = '2';
        $namespace = 'wp/v' . $version;
        $base = 'all-terms';
        register_rest_route($namespace, '/' . $base, array(
            'methods' => 'GET',
            'callback' => array($this, 'get_all_terms'),
        )); 
    }   
    public function get_all_terms($object)
    {   
        $args = array(
            'public' => true,
            '_builtin' => false
        );  
        $output = 'names'; // or objects
        $operator = 'and'; // 'and' or 'or' 
        $taxonomies = get_taxonomies($args, $output, $operator);
        foreach ($taxonomies as $key => $taxonomy_name) {
            if ($taxonomy_name = $_GET['term']) {
                $return[] = get_terms(array(
                    'taxonomy' => $taxonomy_name,
                    'hide_empty' => false,
                )); 
            }   
        }   
        return new WP_REST_Response($return, 200);
    }   
}
add_action( 'rest_api_init', get_all_terms);
?>

更紧密地匹配文档https://developer.wordpress.org/reference/functions/get_terms/

答案 5 :(得分:0)

如果将来有人在阅读,我会遇到一个问题,默认的WP类别为每个术语对象输出0、1、2等的父键,这本身就是一个问题,但更大的问题当自定义分类法在对象上不具有此父值时

要解决此问题,请在已打勾的示例中添加以下内容:

    foreach ($taxonomies as $key => $taxonomy_name) {
        if($taxonomy_name = $_GET['term']){
            $return = get_terms( array( 
                'taxonomy' => $taxonomy_name,
                'hide_empty' => false,
            ));
        }
    }

答案 6 :(得分:0)

对于某些开发者甚至对我来说似乎都有些困惑。

正确的网址是 https://example.com/wp-json/wp/v2/{your_taxonomy}

不是 https://example.com/wp-json/wp/v2/taxonomies/{your_taxonomy}

"/taxonomies" 不需要