LoginSignup
1

More than 5 years have passed since last update.

WordPressの記事をWP APIから取得してElasticsearchに突っ込むサンプル

Posted at

途中でめんどくさくなったので、コードだけ。

package.json

{
  "name": "wpapi-elastic",
  "version": "1.0.0",
  "description": "",
  "main": "handler.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "local": "./node_modules/serverless/bin/serverless invoke local -f hello",
  },
  "keywords": [],
  "author": "",
  "license": "MIT",
  "dependencies": {
    "lodash": "^4.17.4",
    "striptags": "^3.0.1",
    "superagent": "^3.5.2",
    "wpapi": "^1.1.2"
  },
  "devDependencies": {
    "serverless": "^1.19.0"
  }
}

serverless.yml

service: oreyome-elastic

provider:
  name: aws
  runtime: nodejs6.10

functions:
  hello:
    handler: handler.hello

handler.js

configの値を適当に変えて使ってください。

'use strict';
const _ = require('lodash');
const WPAPI = require('wpapi');
const striptags = require('striptags');
const request = require('superagent');
const config = {
  site: 'example-com',
  url: 'https://example.com/',
  esUrl: 'https://example.us-east-1.es.amazonaws.com',
};

function put(url, body = {}) {
  return new Promise((resolve, reject) => {
    return request.put(url)
      .send(body)
      .end((err, response) => {
        if (err) {
          console.log(err);
          reject(err);
        } else if (response.status > 299) {
          reject(response);
        } else {
          resolve(response);
        }
      });
  });
}

function doPost(post) {
  const url = `${config.esUrl}/${config.site}/${post.type}/${post.id}`;
  return put(url, post);
}

module.exports.hello = (event, context, callback) => {
  const apiPromise = WPAPI.discover(config.url);
  apiPromise.then(function( site ) {
    return site.posts().perPage( 100 )
  }).then(function( posts ) {
    const parsed = _.map(posts, function (value, key) {
      const content = value.content.rendered.split('<!-- Begin Yuzo -->');
      value.content.rendered = content[0];
      const data = {
        title: striptags(value.title.rendered),
        content: striptags(content[0]),
        id: value.id,
        date: value.date,
        type: value.type
      }
      return data;
    });
    return parsed;
  }).then(function(posts) {
    return Promise.all(posts.map(doPost))
  }).then(function(json) {
    callback(null, json);
  }).catch ((err) => {
    callback(err);
  });
};

やるつもりだったこと

  • WordPressのコンテンツの分析 -> kibanaでのビジュアライズ方法がよくわからなかった
  • Serverless Frameworkでのバッチインポート -> kibanaでめげたから後回し
  • config系をserverless.ymlにうつす -> kibanaでめげたから後回し

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1