【问题标题】:WordPress Rest API get All PostsWordPress Rest API 获取所有帖子
【发布时间】:2018-01-29 05:07:11
【问题描述】:

我正在使用以下方式获取帖子

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

默认情况下,这给了我 10 个帖子,文档中提到了这一点。

但我希望所有帖子都不需要跟踪分页。

这可能吗?

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

谢谢。

【问题讨论】:

  • 您可以将参数传递给请求 URL。所以以下将返回 50 个帖子; www.mywebsite.com/wp-json/wp/v2/posts?per_page=50 不幸的是 per_page 参数必须介于 1(含)和 100(含)之间。如果您有超过 100 个帖子并且无论如何都需要所有帖子,则必须发送多个请求并正确指定 offset 参数才能检索所有帖子。
  • @Balwant 是的,我阅读了您链接到的帖子。帖子的上限似乎是 100。有没有办法可以获得帖子的总数?所以我会知道要提出多少请求。

标签: wordpress wordpress-rest-api


【解决方案1】:

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

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

  • 输出所有帖子数据
  • 不要强迫我们事先知道帖子总数或页数
  • 不强制在分页上下文中跟踪“我们所处的位置”

我们将使用的库:

  • Axios(为了简化 HTTP GET,因为它适用于 Node 和 Browser 环境)
  • 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),
    )

资源

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      你可以在node.js中使用这个函数

      const getAllPosts = async (wordpressUrl) => {
        const url = `${wordpressUrl}/wp-json/wp/v2/posts?per_page=100`
      
        const maxPages = 50
        let page = 1
        let text
        const responses = []
        while (true) {
          const urlWithPage = `${url}&page=${page}`
          const res = await fetch(urlWithPage)
          text = await res.text()
          text = text.trim()
          if (res.status !== 200) {
            break
          }
          if (text === '[]') {
            break
          }
          if (!text.match(/^\[/) || !text.match(/\]$/)) {
            break
          }
          text = text.replace(/^\[/, '').replace(/\]$/, '')
          responses.push(text)
      
          if (page > maxPages) {
            break
          }
          page++
        }
      
        // get all pages and join them
        if (responses.length) {
          return `[${responses.join(',')}]`
        }
      
        // if didn't get any valid repsonses, send the text received
        return text
      }
      

      【讨论】:

        【解决方案4】:

        大型查询可能会影响网站性能,因此per_page 的记录上限为 100 条。如果您希望检索超过 100 条记录,例如构建所有可用类别的客户端列表,您可以发出多个 API 请求并在应用程序中组合结果。 See this page for a complex explanation

        【讨论】:

          猜你喜欢
          • 2018-04-05
          • 1970-01-01
          • 2016-06-14
          • 2021-04-06
          • 2017-10-12
          • 1970-01-01
          • 2020-08-28
          • 2019-10-25
          • 1970-01-01
          相关资源
          最近更新 更多