WordPress API - Get Drafts

时间:2016-09-22 作者:Ronon

我想检查一个帖子是否已经存在。这包括检查帖子是否也作为草稿存在。但我对wordpress API v2有点纠结。http://v2.wp-api.org/reference/posts/
List Posts -> 他们说的状态

将结果集限制为指定了特定状态的帖子
默认值:发布

我试图将该值指定为参数,但得到错误响应:

{“code”:“rest\\u invalid\\u param”,“message”:“invalid parameter:status”,“data”:{“status”:400,“params”:{“status”:“禁止状态”}}}}}}

我还可以指定帖子的标题来检查:

筛选器=帖子标题

那么,如何获得具有草稿状态的帖子呢?我目前正在使用Basic Auth开发?

我也试过了

过滤器[post\\U状态]=草稿

但没有成功。

我安装了以下插件:WP REST API
WP REST API-过滤器字段
JSON基本身份验证

4 个回复
最合适的回答,由SO网友:Jack Lenox 整理而成

我想您想要的post状态查询参数是:

status=draft
如果这样不行,请告诉我。

SO网友:honk31

这是因为draft 是受保护状态。和受保护状态不可通过向url添加属性公开查询。因为这意味着,每个人都可以查询任何wordpress api并查询;“隐藏”;职位。默认情况下,受保护的状态为“未来”、“草稿”和“待定”。

但您仍然可以更改api的行为。。。

以下是一个工作示例,但它仅向登录用户公开草稿:

/**
* make drafts public for logged in users
*/
function so240254_init()
{
    if (is_user_logged_in()) :
        global $wp_post_statuses;

        $wp_post_statuses[\'draft\']->public = true;
        $wp_post_statuses[\'draft\']->exclude_from_search = false;
        $wp_post_statuses[\'draft\']->publicly_queryable = true;
    endif;
}
add_action(\'init\', \'so240254_init\');

/*
* expose drafts to api for logged in users
*/
function so240254_rest_post_query($args)
{
    if (is_user_logged_in()) :
        $args[\'post_status\'] = [\'publish\', \'draft\'];
    endif;

    return $args;
}
add_filter(\'rest_post_query\', \'so240254_rest_post_query\');
现在,当您登录并调用rest api时,您将得到发布和草稿帖子(不需要查询参数!)。如果没有,您只能获得已发布的帖子。

你可以把is_user_logged_in() 方法,如果您确实希望将草稿公开给所有查询,无论当前用户状态如何。。。

SO网友:TARKUS

最近经历了一个类似的问题,并学会了解决它,我想我应该分享一下我的学习经验。

我们了解到,任何人都可以通过status=publish. 如果出现以下或类似错误,则应开始考虑身份验证或权限方面的问题:

stdClass Object
(
    [code] => rest_invalid_param
    [message] => Invalid parameter(s): status
    [data] => stdClass Object
        (
            [status] => 400
            [params] => stdClass Object
                (
                    [status] => Status is forbidden.
                )

            [details] => stdClass Object
                (
                    [status] => stdClass Object
                        (
                            [code] => rest_forbidden_status
                            [message] => Status is forbidden.
                            [data] => stdClass Object
                                (
                                    [status] => 401
                                )

                        )

                )

        )

    )
。。。或

stdClass Object
(
    [code] => jwt_auth_invalid_token
    [message] => Wrong number of segments
    [data] => stdClass Object
        (
            [status] => 403
        )

)
。。。如果您是以管理员身份登录的,那么您应该有查看草稿帖子的权限。因此,您的API调用可能出于某种原因没有进行身份验证。

我测试的第一件事是代币。我碰巧在用JWT Authentication for WP-API 插件,其实很容易实现。安装/激活JWT Auth后,转到要分配使用API调用的用户,在用户配置文件的底部,您将看到:

Application Account name

为应用程序命名,添加新的,然后会弹出一个新的应用程序密码。它将如下所示:

Application password

复制整个密码,保留空格就可以了。

我使用的是PHP和cURL,因此我的get-token代码如下所示:

private function getAuthHeader(){
    $JWTtoken = json_decode($this->getJWTToken());
    $token = $JWTtoken->token;
    $header = array(
        "Content-type: application/json", 
        "Authorization: Bearer " . $token
    );
    return $header;
}

public function getJWTToken(){
    /*
    Request: POST http://basic/wp-json/api/v1/token
    Body:
    username = <wordpress username>
    password = <wordpress password>
    */
    
    $url = $this->baseurl . "jwt-auth/v1/token";

    $params = array(
                        \'requesttype\' => \'POST\',
                        \'url\' => $url,
                        \'post\' => array(\'username\' => \'admin\', \'password\' => \'esmA UJom vxAG LFKU q8oN DSGK\')
                    );
    $ch = curl_init();
    CURL_SETOPT($ch, CURLOPT_RETURNTRANSFER, 1);
    CURL_SETOPT($ch, CURLOPT_URL, $params[\'url\']);
    CURL_SETOPT($ch, CURLOPT_POST, TRUE);
    CURL_SETOPT($ch, CURLOPT_POSTFIELDS, http_build_query($params[\'post\']));
    CURL_SETOPT($ch, CURLOPT_SSL_VERIFYPEER, false);
    $response = curl_exec($ch);
    curl_close($ch);
    return $response;
}
。。。您将在$params中看到我设置用户名/密码的方式。用户名为;管理员“;,因为这就是我为其设置新应用程序密码的用户,密码是esmA UJom vxAG LFKU q8oN DSGK. 注意,我没有使用管理员的WordPress密码。

您的头成为一个数组,它应该如下所示,其中包括一个loooong标记字符串:

Array ( [0] => Content-type: application/json [1] => Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwOlwvXC9iYXNpYyIsImlhdCI6MTYyMzI2NjUyNSwibmJmIjoxNjIzMjY2NTI1LCJleHAiOjE2MjM4NzEzMjUsImRhdGEiOnsidXNlciI6eyJpZCI6IjEifX19.YX1UvJ5nlbG2MIlheI2NzTTzaQKBZ8I9WQOr70CE1Tk ) 
最后,使用cURL发出请求的函数如下所示:

public function getResponse($params){

    $auth_header = $this->getAuthHeader();

    $ch = curl_init();
    CURL_SETOPT($ch, CURLOPT_RETURNTRANSFER, 1);
    CURL_SETOPT($ch, CURLOPT_URL, $params[\'url\']);
    if( isset($params[\'requesttype\']) && $params[\'requesttype\'] == "POST" ){ //additional code to detect whether I\'m making a GET, POST, or PUT request.
        CURL_SETOPT($ch, CURLOPT_POST, TRUE);
    }
    else if( isset($params[\'requesttype\']) && $params[\'requesttype\'] == "PUT"){
        CURL_SETOPT($ch, CURLOPT_CUSTOMREQUEST, "PUT");
    }
    if(isset($params[\'post\'])){
        CURL_SETOPT($ch, CURLOPT_POSTFIELDS, http_build_query($params[\'post\']));
    }
    CURL_SETOPT($ch, CURLOPT_SSL_VERIFYPEER, false);
    CURL_SETOPT($ch, CURLOPT_HTTPHEADER, $auth_header);
    $response = curl_exec($ch);
    curl_close($ch);
    return $response;
}
请注意,在执行cURL之前,我希望通过调用getAuthHeader函数来获取带有新标记的标头:

$auth_header = $this->getAuthHeader();
请注意,我必须将包含新令牌的标头传递给web服务:

CURL_SETOPT($ch, CURLOPT_HTTPHEADER, $auth_header);
除非有任何拼写错误,这一直是我的问题,否则应该返回状态为草稿的帖子:

    public function getPosts($params){
        // I passed $params[\'status\'] = "draft";
        $url = $this->baseurl . "wp/v2/posts/?status=" . $params[\'status\'] . "";
        $data = array(
                        \'requesttype\' => \'GET\',
                        \'url\' => $url
                     );
        return $this->getResponse($data);
    }

SO网友:Govar Jabar

这对我来说也是工作

add_action(\'init\', function ()
{
    if (is_user_logged_in()) :
        global $wp_post_statuses;

        $wp_post_statuses[\'draft\']->public = true;
        $wp_post_statuses[\'draft\']->exclude_from_search = false;
        $wp_post_statuses[\'draft\']->publicly_queryable = true;
    endif;
});

add_filter(\'rest_post_query\', function ($args)
{
        $args[\'post_status\'] = [\'publish\', \'draft\'];
    return $args;
});