首页 文章

WordPress Rest API获取所有帖子

提问于
浏览
4

我正在使用以下内容来获取帖子

http://demo.wp-api.org/wp-json/wp/v2/posts

这默认情况下给了我10个帖子,这在文档中提到 .

但我想要所有的帖子,而不必跟踪分页 .

那可能吗?

如果没有,我可以运行JavaScript循环来获取所有帖子吗?

谢谢 .

3 回答

  • 1

    解决这个问题的一种方法是使用RxJS

    我们将构建一个小的Observable流,它将:

    • 输出所有发布数据

    • 不要强迫我们事先知道帖子或页面的总数

    • 不强制在分页的情况下跟踪"where we're at"

    我们将使用的库:

    • Axios(简化HTTP GET,因为它在节点和浏览器环境中都有效)

    • RxJS v6(目前是Alpha版本,但此处的API与RxJS 5相同)

    您的环境和用例会有所不同,对于此示例,我将进入Node环境 .

    /**
     *      This will get all posts from a default WordPress REST API
     *      First we see how many pages there are
     *      Then we make subsequent XHR requests (via Axios)
     *      That paginate through every page of posts
     */
    
    // Importing Axios for simple AJAX request
    const axios = require('axios')
    
    // Importing RxJS @ v6.0.0-alpha.3
    const { Observable, from, range } = require('rxjs')
    const { switchMap, concatMap } = require('rxjs/operators')
    
    const endpoint = 'http://demo.wp-api.org/wp-json/wp/v2/posts'
    
    /**
     *      This sets up the initial request and the Observable stream
     *      In the return from the endpoint, the Axios request headers will have x-wp-totalpages,
     *      which gives us... the total pages of posts ;)
     */
    const posts$ = Rx.Observable.from(axios.get(endpoint))
        /**
         *     We now know the total number of pages,
         *     so we'll switch to a new Observable that is just a range of numbers
         *     We'll start with 1, and end with whatever the total number of pages is
         *     This gives us a stream of 1--n--n--n... (example: 1, 2, 3, 4...)
         */
        .switchMap((
            { headers }, // using ES6 function header destructuring and arrow functions here
        ) => Rx.Observable.range(1, Number(headers['x-wp-totalpages'])))
        /**
         *     We can now paginate through all posts, getting 10/page
         *     concatMap will fire off a request, waits until it completes, and then fire the next one
         *     In each subsequent firing, we ask for the next page of posts
         */
        .concatMap(page =>
            axios.get(endpoint, {
                params: {
                    page,
                },
            }),
        )
        .subscribe(
            // data here is an Array of WordPress Posts, tacking .length shows us how many per page we are getting
            ({ data }) => console.log(data.length),
            err => console.log('Oh no, an error!', err),
        )
    

    资源

  • 0

    您可以使用 wp_remote_retrieve_body($url)wp_remote_post($url) 来获取发布数据而不是其他API使用情况 . wp_remote函数独立于默认分页 .

  • 0

    大型查询可能会损害网站性能,因此per_page的上限为100条记录 . 如果您希望检索超过100条记录,例如构建所有可用类别的客户端列表,您可以发出多个API请求并将结果合并到您的应用程序中 . see this for complet expalin

相关问题