Wordpress REST API V2返回所有帖子

时间:2016-03-01 17:03:35

标签: wordpress rest

我错过了使用

获取所有帖子(或CPT)的功能
example.com/wp-json/wp/v2/country/?per_page=-1

或任何类似的。文档提供了与此相同的信息:

  

per_page:结果集中要返回的最大项目数。

     

默认值:10

在关于per_page的another question中,我们了解到允许的范围是1到100。

在我的情况下,我需要获得的帖子数量有限,但它将在200-300左右。除了每页抓取所有页面并将其拼接在一起之外,是否有任何变通方法可以获得它们?

附加信息是否重要:我正在使用angular.js

12 个答案:

答案 0 :(得分:6)

尝试使用此选项进行分页。它会返回我网站上的所有帖子。

http://example.com/wp-json/wp/v2/posts/?filter[category_name]=country&filter[posts_per_page]=-1

当我这样输入时,我得到100以上的回报,并且可以将它们限制在111等。 http://example.com/wp-json/wp/v2/posts/?filter[category_name]=country&filter[posts_per_page]=111

对于现代WP场景,以下功能将允许您提供超过99的回报。

add_filter( 'rest_post_collection_params', 'big_json_change_post_per_page', 10, 1 );
function big_json_change_post_per_page( $params ) {
    if ( isset( $params['per_page'] ) ) {
        $params['per_page']['maximum'] = 200;
    }
    return $params;
}

答案 1 :(得分:5)

从WP 4.7开始,您可以通过挂钩到以下过滤器来增加WP REST API请求的上限:

rest_{$this->post_type}_collection_params

此代码段应该可以解决帖子

的问题
add_filter( 'rest_post_query', 'se35728943_change_post_per_page', 10, 2 );

function se35728943_change_post_per_page( $args, $request ) {
    $max = max( (int) $request->get_param( 'custom_per_page' ), 200 );
    $args['posts_per_page'] = $max;    
    return $args;
}

注意:您不能在请求中使用标准per_page参数(值大于100) - wp api将立即响应错误(因此挂钩无效)。上面代码中的内容即使用custom_per_page(您可以使用任何其他字词)。

分类的类似过滤器:rest_{$this->taxonomy}_query

示例:

add_filter( 'rest_tags_query', 'se35728943_change_terms_per_page', 2, 10 );

function se35728943_change_terms_per_page( $prepared_args, $request ){
    $max = max( 200, (int) $request->get_param( 'custom_per_page' ) );

    $prepared_args['number'] = $max;
    return $prepared_args;
}

答案 2 :(得分:4)

使用该语法无法获得超过10个。尝试了http://example.com/wp-json/wp/v2/posts?per_page=100并且努力达到了100个。

答案 3 :(得分:2)

波纹管方法为我工作。我能够从具有79 246个帖子的站点检索帖子。我使用了pagination parameters。在一个循环中,从1到TotalPages可用。请参阅文档链接。

http://mydomain/wp-json/wp/v2/posts?_embed&per_page=100&page=793

每页 = 100:表示每页最多可检索100个帖子

页面 = 793:意味着我有793页,每页100个帖子。最后一页只有46个帖子

然后可以使用您选择的语言来使用循环。

答案 4 :(得分:1)

This solution和javascript对我有用。

答案 5 :(得分:0)

如果您计划使用其他参数执行此操作,您也可以添加类别等。 EG:

https://www.website.com/wp-json/wp/v2/posts?categories=61&per_page=100

答案 6 :(得分:0)

在WordPress 4.9.6中,我不得不使用rest_{$this->post_type}_query

/* change amount of posts returned by REST API to 100 */
function rest_posts_per_page( $args, $request ) {
    $max = max( (int)$request->get_param( 'per_page' ), 100 );
    $args['posts_per_page'] = $max;
    return $args;
}
add_filter( 'rest_post_query', 'rest_posts_per_page', 10, 2 );

答案 7 :(得分:0)

一种更简单的符合协议的方法是依次收集所有个响应, 并执行 single setState()调用。如下:(为便于阅读,省略了错误处理)

componentDidMount(){

var uri = "http://your-server";
var totalPages = 0;
var allResults = [];

fetch(uri)
.then(response => {
  totalPages = response.headers.get('X-WP-TotalPages');
  return response.json()})
.then(results => {
  allResults = results;
  //console.log('Got results from server', results.length); 
  for (let i = 2; i <= totalPages ; i++){
    fetch(uri + "?page=" + i)
    .then(response => {return response.json()})
    .then( moreresults => {
      allResults = allResults.concat( moreresults ); 
     });
  }
  this.setState({responses: allResults });
});

}

答案 8 :(得分:0)

真的有可能获得100多个帖子或术语(标签,类别)。
您应该使用rest_{$this->post_type}_query钩子(用于帖子)或rest_{$this->taxonomy}_query钩子作为术语。
但是您必须知道,不可能在您的per_page请求中传递GET arg值超过100的参数。 WP API将立即引发错误(该钩子无济于事):per_page must be between 1 (inclusive) and 100 (inclusive)(具有400个http状态)。
要解决此问题,您应该在另一个per page参数中传递一个get值。然后在您的钩子中跟踪此值。
所以代码是:

对于帖子

add_filter( 'rest_post_query', 's976_rest_post_per_page', 2, 10 );
function s976_rest_post_per_page( array $args, WP_REST_Request $request ) {
    $post_per_page = $request->get_param('s976_per_page') ? $request->get_param('s976_per_page') : 10;
    $args['posts_per_page'] = $post_per_page;
    return $args;
}

条款

add_filter( 'rest_category_query', 's976_rest_cats_per_page', 2, 10 );
function s976_rest_cats_per_page( array $prepared_args, WP_REST_Request $request ){
    $cats_per_page = $request->get_param('s976_per_page') ? $request->get_param('s976_per_page') : 10;
    $prepared_args['number'] = $cats_per_page;
    return $prepared_args;
}

当然,要使此方法有效,您必须在s976_per_page请求中传递GET参数(具有500、99999等值)。

答案 9 :(得分:0)


非常感谢,我一直在成功使用此's976_per_page'代码,但是它只返回带有'publish'标签的帖子,..
如何获取所有状态,或者只能获取状态的一组/子集
非常感谢
JMB

答案 10 :(得分:0)

根据文档,最多可以获取 100 个。如果您想要更多,请使用偏移量和多个请求。示例:

$i              = 0;
$check_for_more = true;

while ( $check_for_more ) {
    $offset  = $i * 100;
    $url     = network_site_url( "/wp-json/wp/v2/office?order=asc&orderby=title&per_page=100&offset={$offset}" );
    $offices = json_decode( wp_remote_retrieve_body( wp_remote_get( $url ) ) );

    if ( $offices ) {
        if ( count( $offices ) < 100 ) {
            $check_for_more = false;
        }
        foreach ( $offices as $key => $office ) {
            // Do what you want
        }
    } else {
        $check_for_more = false;
    }
    $i ++;
}

答案 11 :(得分:0)

我希望这会有所帮助,我正在使用 axios 但其他的也是一样的

private fun saveImage(bitmap: Bitmap, name: String) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
        val resolver = contentResolver
        val contentValues = ContentValues()
        contentValues.put(MediaStore.MediaColumns.DISPLAY_NAME, name)
        contentValues.put(MediaStore.MediaColumns.MIME_TYPE, "image/png")
        contentValues.put(MediaStore.MediaColumns.RELATIVE_PATH, "DCIM/" + "YOUR_FOLDER")
        val imageUri =
            resolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues)
        val fos = resolver.openOutputStream(imageUri!!)
        bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos)
        fos!!.flush()
        fos.close()

        toast("Saved to gallery")

    } else {
        if (isPermissionGranted(Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
            val imagesDir = Environment.getExternalStoragePublicDirectory(
                Environment.DIRECTORY_DCIM
            ).toString() + File.separator + "YOUR_FOLDER"
            if (!file.exists()) {
                file.mkdir()
            }
            val image = File(imagesDir, "$name.png")

            val fos = FileOutputStream(image)
            bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos)
            fos.flush()
            fos.close()

        } else {
            // ask for permission
        }
    }
}