WordPressとスプレッドシートを連携して記事を一覧で管理する

WordPressとスプレッドシートを連携して記事を一覧で管理する

WordPressのREST APIを使用して、スプレッドシートに記事の一覧を出力します。WordPressで投稿した記事の管理にはスプレッドシートがオススメです。スプレッドシートに一覧で出力することで分かりやすく管理でき、記事のリライトや投稿状況の把握など、集計や今後のアクションにも繋げやすくなります。
「カワリニ」編集部

フリーランスでエンジニアをしている、ベルトトルトです。

みなさんはWordPressをお使いでしょうか?

ブログを書きたいと思った時に簡単に始められて、本当に便利なサービスだと思います。
僕も、普段WordPressを使って記事を書くことが多いです。

そんなWordPressで書いた記事をスプレッドシートを用いて、効率良く管理する方法を紹介します。

WordPressで記事を投稿すると、投稿しっぱなしになってしまいがち

個人でブログを書いている場合も、法人で数名でブログを書いている場合も、「記事を書いたら終わり」という人も多いかもしれません。

WordPressは便利ですが、投稿画面の一覧は決して見やすいとは言えず、自分が今までにどんな記事を投稿したのか把握するのも一苦労な印象です。

そこで、Googleスプレッドシートを使用することで、自分が見やすい形式の一覧を作成して、投稿した記事の情報を分かりやすく管理できるようにしてみます。

スプレッドシートを作成

以下のように、1行目はヘッダーとして、各列に項目名を入力し、シート名を「記事一覧」としておきます。

スプレッドシート 記事一覧のヘッダー

今回取得する項目は以下の通りです。

  • 記事ID
  • URL
  • パス
  • 投稿者
  • タイトル
  • カテゴリ
  • 公開日
  • 更新日

WordPressの記事を取得するプログラムを作成

「ツール」メニューから「スクリプト エディタ」を選択します。
以下のようにエディタ画面が開きます。

スプレッドシートのスクリプトエディタ

まず、プロジェクト名を設定します。
左上の「無題のプロジェクト」となっている部分をクリックします。

以下のウィンドウが表示されるので、プロジェクト名を入力し、OKボタンをクリックします。

スプレッドシート スクリプトプロジェクト名の入力

記事を取得するプログラム

以下のようにプログラムを定義します。

var SITE = "https://[対象サイトのドメインを入力]";
function getArticles() {
  var sheetArticleList = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('記事一覧');
  
  // WP REST APIでユーザーを取得する
  var users = getUsers();
  // WP REST APIでカテゴリを取得する
  var categories = getCategories();

  // WP REST APIで記事を取得する
  var jsonArticleInfo = UrlFetchApp.fetch(SITE + '/wp-json/wp/v2/posts?order=asc&per_page=100', {'method':'get'});
  var articleInfos = JSON.parse(jsonArticleInfo.getContentText());
  
  // 取得した記事情報から出力するデータを作成
  var output = makeOutputData(articleInfos, users, categories);
  // シートの2行目から出力する
  sheetArticleList.getRange(2, 1, output.length, output[0].length).setValues(output);
}

function getUsers() {
  // WP REST APIでユーザーを取得する
  var jsonUserInfo = UrlFetchApp.fetch(SITE + '/wp-json/wp/v2/users?orderby=id&per_page=100', {'method':'get'}); 
  var userInfos = JSON.parse(jsonUserInfo.getContentText());
  
  var users = [];
  for(var index = 0; index < userInfos.length; index++){
    var userInfo = userInfos[index];
    
    var row = [];
    // ID
    row.push(userInfo["id"]);
    // 名前
    row.push(userInfo["name"]);
    users.push(row);
  }
  return users;
}

function getCategories() {
  // WP REST APIでカテゴリを取得する
  var jsonCategoryInfo = UrlFetchApp.fetch(SITE + '/wp-json/wp/v2/categories?orderby=id&per_page=100', {'method':'get'}); 
  var categoryInfos = JSON.parse(jsonCategoryInfo.getContentText());
  
  var categories = [];
  for(var index = 0; index < categoryInfos.length; index++){
    var categoryInfo = categoryInfos[index];
    
    var row = [];
    // ID
    row.push(categoryInfo["id"]);
    // 名前
    row.push(categoryInfo["name"]);
    categories.push(row);
  }
  return categories;
}

function makeOutputData(articleInfos, users, categories) {
  var output = [];
  for(var index = 0; index < articleInfos.length; index++){
    var articleInfo = articleInfos[index];
    
    var row = [];
    // 記事ID
    row.push(articleInfo["id"]);
    // URL
    row.push(articleInfo["link"]);
    // パス
    row.push(articleInfo["link"].replace(SITE, ""));
    // 投稿者
    for (var userIndex = 0; userIndex < users.length; userIndex++) {
      var user = users[userIndex];
      if (articleInfo["author"] == user[0]) {
        row.push(user[1]);
        break;
      }
    }
    // タイトル
    row.push(articleInfo["title"]["rendered"]);
    // カテゴリ
    var articleCategories = articleInfo["categories"];
    var category = "";
    for (var articleCategoryIndex = 0; articleCategoryIndex < articleCategories.length; articleCategoryIndex++) {
      if (category.length != 0) {
        category += ",";
      }
      category += getCategoryName(categories, articleCategories[articleCategoryIndex]);
    }
    row.push(category);
    // 公開日
    row.push(Utilities.formatDate(new Date(articleInfo["date"]), 'JST', 'yyyy/M/d'));
    // 更新日
    row.push(Utilities.formatDate(new Date(articleInfo["modified"]), 'JST', 'yyyy/M/d'));
    output.push(row);
  }
  return output;
}

function getCategoryName(categories, articleCategoryId) {
  var ret = "";
  for (var index = 0; index < categories.length; index++) {
    var category = categories[index];
    if (articleCategoryId == category[0]) {
      ret = category[1];
      break;
    }
  }
  return ret;
}

プログラムのポイント

WordPressから記事の情報を取得するには、WP REST API というWordPressのAPIを使用します。
バージョン4.7以上では、特に何も設定しなくてもデフォルトの機能として使えるようになりました。

以下にプログラムのポイントを記載します。

  • 1行目:対象サイトのドメインを入力
  • 6行目:ユーザー情報を取得
    WP REST APIで取得できる投稿者の情報はIDとなるため、IDから投稿者の名前を取得するために使用します。
  • 8行目:カテゴリ情報を取得
    WP REST APIで取得できるカテゴリの情報はIDとなるため、IDからカテゴリの名前を取得するために使用します。
  • 11行目:WP REST APIで記事の情報を取得
    パラメータでオプションを指定できます。「order=asc」は昇順で取得(並び替え項目は公開日が初期値)、「per_page=100」は取得する件数を100件(一度に取得できる最大が100件)と指定しています。
    JSON形式で取得できるため、12行目でパースしています。
  • 15行目:スプレッドシートに出力するデータを作成(詳細は後述)

58行目からが取得した記事の情報からスプレッドシートに出力する形式でデータを作成している処理です。
(makeOutputData関数)
取得した記事情報の件数分、繰り返し処理を行っています。

  • 69行目:ルートからのパスを定義
    (例)
    URLが「https://sample.com/1234」という形式の場合、「/1234」を切り出しています。
  • 71行目:投稿者の名前を定義
    WP REST APIで取得できるのは投稿者のIDのため、別途取得しておいたユーザー情報から該当ユーザーの名前を取得しています。
  • 83行目:カテゴリの名前を定義
    WP REST APIで取得できるのはカテゴリのIDのため、別途取得しておいたカテゴリ情報から該当カテゴリの名前を取得しています。
    カテゴリは複数設定することが可能なため、設定されているカテゴリ全てに対して処理を行います。
    (getCategoryName関数)
    複数カテゴリが設定されている場合は、各カテゴリをカンマ区切りで連結しています。

一度に取得できる最大件数100件を超える場合の対応

先ほど、WP REST APIで取得できる最大件数は100件ということを書きました。

記事を画面表示する時と同じように、一度にたくさんの記事を取得することでレスポンス低下に繋がってしまうので、制限が掛かっています。

画面表示する時はページングを用いて、複数ページに渡り表示しますが、APIで取得する場合も同様の考え方で取得する必要があります。

100件を超えて取得できるように処理を追加したプログラムを記載します。

var SITE = "https://[対象サイトのドメインを入力]";
function getArticles() {
  var sheetArticleList = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('記事一覧');
  
  // WP REST APIでユーザーを取得する
  var users = getUsers();
  // WP REST APIでカテゴリを取得する
  var categories = getCategories();

  // WP REST APIで記事を取得する
  var jsonArticleInfo = UrlFetchApp.fetch(SITE + '/wp-json/wp/v2/posts?order=asc&per_page=100', {'method':'get'});
  var articleInfos = JSON.parse(jsonArticleInfo.getContentText());

  // 総ページ数
  var totalPages = jsonArticleInfo.getHeaders()["x-wp-totalpages"];
  
  // 取得した記事情報から出力するデータを作成
  var output = makeOutputData(articleInfos, users, categories);
  // シートの2行目から出力する
  sheetArticleList.getRange(2, 1, output.length, output[0].length).setValues(output);
  
  // 記事数が2ページ以上ある場合は、総ページ数分、繰り返し処理する
  if (totalPages > 1) {
    for (var index = 2; index <= totalPages; index++) {
      // 最終行
      var lastRow = sheetArticleList.getRange('A:A').getValues().filter(String).length;

      // WP REST APIで記事を取得する
      jsonArticleInfo = UrlFetchApp.fetch(SITE + '/wp-json/wp/v2/posts?order=asc&per_page=100&page=' + index, {'method':'get'});
      articleInfos = JSON.parse(jsonArticleInfo.getContentText());
      
      // 取得した記事情報から出力するデータを作成
      output = makeOutputData(articleInfos, users, categories);
      // シート最終行の次の行から出力する
      sheetArticleList.getRange(lastRow+1, 1, output.length, output[0].length).setValues(output);
    }
  }
}

function getUsers() {
  // WP REST APIでユーザーを取得する
  var jsonUserInfo = UrlFetchApp.fetch(SITE + '/wp-json/wp/v2/users?orderby=id&per_page=100', {'method':'get'}); 
  var userInfos = JSON.parse(jsonUserInfo.getContentText());
  
  var users = [];
  for(var index = 0; index < userInfos.length; index++){
    var userInfo = userInfos[index];
    
    var row = [];
    // ID
    row.push(userInfo["id"]);
    // 名前
    row.push(userInfo["name"]);
    users.push(row);
  }
  return users;
}

function getCategories() {
  // WP REST APIでカテゴリを取得する
  var jsonCategoryInfo = UrlFetchApp.fetch(SITE + '/wp-json/wp/v2/categories?orderby=id&per_page=100', {'method':'get'}); 
  var categoryInfos = JSON.parse(jsonCategoryInfo.getContentText());
  
  var categories = [];
  for(var index = 0; index < categoryInfos.length; index++){
    var categoryInfo = categoryInfos[index];
    
    var row = [];
    // ID
    row.push(categoryInfo["id"]);
    // 名前
    row.push(categoryInfo["name"]);
    categories.push(row);
  }
  return categories;
}

function makeOutputData(articleInfos, users, categories) {
  var output = [];
  for(var index = 0; index < articleInfos.length; index++){
    var articleInfo = articleInfos[index];
    
    var row = [];
    // 記事ID
    row.push(articleInfo["id"]);
    // URL
    row.push(articleInfo["link"]);
    // パス
    row.push(articleInfo["link"].replace(SITE, ""));
    // 投稿者
    for (var userIndex = 0; userIndex < users.length; userIndex++) {
      var user = users[userIndex];
      if (articleInfo["author"] == user[0]) {
        row.push(user[1]);
        break;
      }
    }
    // タイトル
    row.push(articleInfo["title"]["rendered"]);
    // カテゴリ
    var articleCategories = articleInfo["categories"];
    var category = "";
    for (var articleCategoryIndex = 0; articleCategoryIndex < articleCategories.length; articleCategoryIndex++) {
      if (category.length != 0) {
        category += ",";
      }
      category += getCategoryName(categories, articleCategories[articleCategoryIndex]);
    }
    row.push(category);
    // 公開日
    row.push(Utilities.formatDate(new Date(articleInfo["date"]), 'JST', 'yyyy/M/d'));
    // 更新日
    row.push(Utilities.formatDate(new Date(articleInfo["modified"]), 'JST', 'yyyy/M/d'));
    output.push(row);
  }
  return output;
}

function getCategoryName(categories, articleCategoryId) {
  var ret = "";
  for (var index = 0; index < categories.length; index++) {
    var category = categories[index];
    if (articleCategoryId == category[0]) {
      ret = category[1];
      break;
    }
  }
  return ret;
}

追加したのは以下の処理です。

  • 15行目:総ページ数を取得する処理を追加
    最初に記事を取得した時に総ページ数も一緒に取得できます。
    総ページ数を元に、各ページ分の記事を取得する処理を記載します。
  • 23行目:2ページ以上ある場合、総ページ数分、繰り返す
    1ページずつ(100件ずつ)繰り返して記事を取得します。
  • 26行目:スプレッドシートに出力している記事情報の最終行を取得
    最終行を取得する処理はgetLastRowという関数があるのですが、これは空白行も含むため、値が入っているセルのみ対象となるようにしています。
  • 29行目:記事情報を取得
    取得処理は先ほどと同様ですが、パラメータが異なります。
    「page」というパラメータで取得対象のページを指定します。

このように、繰り返し処理を行うことで100件を超えても全件取得する処理が定義できます。

プログラムを実行する

プログラムを実行するには、ツールバーで実行する関数「getArticles」を選択して、実行ボタン(▶)をクリックします。

スプレッドシート スクリプトを実行

実行する許可の確認ウィンドウが表示されるので、「許可を確認」ボタンをクリックします。

スプレッドシート スクリプト実行の許可の確認

アカウントの選択画面が表示されるので、該当のアカウントをクリックします。

スプレッドシート スクリプトを実行するアカウントの選択

「このアプリは確認されていません」と警告が表示されるので、許可を行います。
左下の詳細をクリックします。

このアプリは確認されていません

「プロジェクト名(安全ではないページ)に移動」をクリックします。
※セキュリティ強化のため、安全ではないページと表示されますが、この場合は自分で作成したプロジェクトで安全が確認できているのでクリックしても問題ありません

安全ではないページに移動

アクセス許可の最終確認が表示されるので、内容を確認のうえ、「許可」ボタンをクリックします。

Googleアカウントへのアクセスをリクエストしています

ここまででアクセス許可が完了し、プログラムが実行されます。
シートを見ると、以下のように記事の内容が出力されています。

スプレッドシートの記事一覧

WordPressの記事の内容をスプレッドシートに出力することで一覧化して見やすくできる

WordPressから記事の情報を取得するプログラムを作成して、スプレッドシートに一覧形式で出力してみました。

WordPress投稿画面の一覧だと見づらいですが、スプレッドシートに出力することで見やすくなりました。
また、スプレッドシートの機能を用いて、フィルタを掛けて投稿者を絞ったり、並び替えをしたり、ということも可能になります。

記事は書いて終わりではなく、PVなどの数字を管理してリライトを行ったりという、記事を書いた後の施策が重要になってきます。

PVなどの数字の管理は以下の記事をご覧ください。

スプレッドシートでGoogleアナリティクスのデータを自動で毎日取得する

 

 

ギルドプロジェクトではシステム、サービスの導入や、サービス間を連携するプログラムの作成などを通して業務効率化を行っており、様々な効率化事例から業務効率化を代行する「カワリニ」というサービスを展開しています。

お問い合わせは無料で対応させていただいていますので、専門の方がいらっしゃず、どうしたら良いか分からないなどお困りの場合は、お気軽にお問い合わせください。

カワリニに相談する