查询大量帖子的WordPress WP-API(使用promises!)

问题描述 投票:1回答:1

我正在开发一个Node.js应用程序,它使用WordPress JSON API作为一种无头CMS。当应用程序旋转时,我们向WP数据库查询并提取我们需要的信息(使用Axios),操纵它并临时存储它。

很简单 - 但CMS中的一个帖子类别有相当多的条目。出于一些令人遗憾的原因,WordPress一次将API请求限制限制为最多99个帖子,并要求我们编写一个可以发送并发API请求的循环,直到所有数据都被提取为止。

例如,如果我们有250个某些给定类型的帖子,我需要分三次点击该路由,指定每次我想要的特定数据“页面”。

根据文档,https://developer.wordpress.org/rest-api/using-the-rest-api/pagination/,我可以访问?page=查询字符串,我可以使用它来同时发送这些请求。 (即...&page=2

我还可以访问header对象中的X-WP-Total,它给出了给定类别中的帖子总数。

但是,这些API调用是嵌套的promise链的一部分,整个过程需要返回一个我可以继续链接的promise。

我们的想法是让它变得动态,因此它总是会提取所有数据,并将其作为一个巨大的帖子返回。这就是我的功能:

const request = require('axios');

module.exports = (request_url) => new Promise((resolve, reject) => {

  // START WITH SMALL ARBITRARY REQUEST TO GET TOTAL NUMBER OF POSTS FAST
  request.get(request_url + '&per_page=1').then(
    (apiData) => {

      // SETUP FOR PROMISE.ALL()
      let promiseArray = [];

      // COMPUTE HOW MANY REQUESTS WE NEED
      // ALWAYS ROUND TOTAL NUMBER OF PAGES UP TO GET ALL THE DATA
      const totalPages = Math.ceil(apiData.headers['x-wp-total']/99);

      for (let i = 1; i <= totalPages; i++) {
        promiseArray.push( request.get(`${request_url}&per_page=99&page=${i}`) )
      };

      resolve(
        Promise.all(promiseArray)
               .then((resolvedArray) => {

                 // PUSH IT ALL INTO A SINGLE ARRAY
                 let compiledPosts = [];

                 resolvedArray.forEach((axios_response) => {
                   // AXIOS MAKES US ACCESS W/RES.DATA
                   axios_response.data.forEach((post) => {
                     compiledPosts.push(post);
                   })
                 });

                 // RETURN AN ARRAY OF ALL POSTS REGARDLESS OF LENGTH
                 return compiledPosts;
               }).catch((e) => { console.log('ERROR'); reject(e);})
       )
    }
  ).catch((e) => { console.log('ERROR'); reject(e);})
})

任何创造性的想法,以使这种模式更好?

node.js wordpress promise axios wp-api
1个回答
0
投票

我有完全相同的问题。在我的情况下,我使用Vue资源:

this.$resource('wp/v2/media').query().then((response) => {   

  let pagesNumber = Math.ceil(response.headers.get('X-WP-TotalPages'));

  for(let i=1; i <= pagesNumber; i++) {
       this.$resource('wp/v2/media?page='+ i).query().then((response) => {
           this.medias.push(response.data);
           this.medias = _.flatten(this.medias);
           console.log(this.medias);
       });
}

我很确定有更好的解决方法来实现这一目标。

© www.soinside.com 2019 - 2024. All rights reserved.