🔍

WordPressカテゴリの全記事タイトルとURLをGASで一覧取得する方法【プラグイン不要】

に公開

WordPressで記事を管理していると、
「このカテゴリの記事だけを表形式で一覧にして整理したい」という場面、ありますよね。

外注先に記事を共有したいときや、古い記事の移管準備をするときなど、記事タイトルとURLをまとめて取得したいことは多いはず。

私は、WordPressからnoteに記事を移管したいため、以下のようなリストを作成しています。

でも、WordPressの管理画面にはカテゴリ単位で記事リストをCSV出力する機能はありません。
全記事のリストを作ることは可能ですが、カテゴリ単位で欲しいことも多いです。

そこで今回は、Google Apps Script(GAS)を使って、WordPressのカテゴリページから記事タイトルとURLを一覧取得する方法をご紹介します。
プラグインなし、無料で使える方法です。

🔍 スクレイピング準備:CSSセレクタを確認しよう

まずは「記事タイトルとURLがHTMLのどこにあるか」を調べる必要があります。

🔧 デベロッパーツールの使い方

  1. 対象のカテゴリページをブラウザで開く
  2. 記事タイトル部分を右クリック → 「検証(Inspect)」をクリック
  3. <h2>タグに囲まれている文字列が記事タイトルが囲まれていることを確認
  4. <h2 class="post-list-title entry-title"> の中のclass属性を確認
  5. その外側の <a class="post-list-link" href="..."> に記事URLが入っています

私はWordPressテーマのJINを使用していたので、h2タグは<h2 class="post-list-title entry-title">のような文字列でした。

💻 GASコード:WordPressカテゴリページから記事を自動取得

以下のスクリプトを Google スプレッドシートの Apps Script に貼り付けて実行すれば、
カテゴリ内のすべての記事の「タイトル」と「URL」が自動で一覧化されます。

function fetchAllCategoryArticles() {
  const baseUrl = 'https://example.com/category/your-category-slug'; // 対象カテゴリURL
  const sheetName = '記事リスト'; // 出力先シート名
  const titlesAndLinks = [];

  let page = 1;
  let hasNextPage = true;

  while (hasNextPage) {
    let url = baseUrl;
    if (page > 1) {
      url += `/page/${page}/`;
    }

    try {
      const html = UrlFetchApp.fetch(url).getContentText();

      const regex = /<a[^>]*class="post-list-link"[^>]*href="(.*?)"[^>]*>[\s\S]*?<h2[^>]*class="post-list-title entry-title"[^>]*>(.*?)<\/h2>/g;
      let match;
      let foundOnThisPage = false;

      while ((match = regex.exec(html)) !== null) {
        const link = match[1];
        const title = match[2].replace(/&amp;/g, '&').trim();
        titlesAndLinks.push([title, link]);
        foundOnThisPage = true;
      }

      if (!foundOnThisPage) {
        hasNextPage = false;
      } else {
        page++;
      }
    } catch (e) {
      hasNextPage = false;
    }
  }

  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName)
              || SpreadsheetApp.getActiveSpreadsheet().insertSheet(sheetName);

  sheet.clear();
  sheet.appendRow(['タイトル', 'URL']);

  if (titlesAndLinks.length > 0) {
    sheet.getRange(2, 1, titlesAndLinks.length, 2).setValues(titlesAndLinks);
  } else {
    sheet.appendRow(['(記事が見つかりませんでした)']);
  }
}

以下、コードブロックごとに解説します。

① 初期設定

const baseUrl = 'https://example.com/category/your-category-slug'; // 対象カテゴリURL
const sheetName = '記事リスト'; // 出力先シート名
const titlesAndLinks = [];
  • baseUrl:取得対象のカテゴリページのURL(※1ページ目は /page/1/ ではなくこのURL)
  • sheetName:出力したいスプレッドシートのシート名
  • titlesAndLinks:取得した記事タイトルとURLを格納する配列(2次元)

② ページ巡回用のループ設定

let page = 1;
let hasNextPage = true;

while (hasNextPage) {
  • page:現在処理中のページ番号(1ページ目からスタート)
  • hasNextPage:次ページがあるかどうかを制御するフラグ

③ ページURLの構築

let url = baseUrl;
if (page > 1) {
  url += `/page/${page}/`;
}
  • 1ページ目はそのまま baseUrl
  • 2ページ目以降は /page/2/, /page/3/… と続く

④ HTML取得と正規表現によるデータ抽出

const html = UrlFetchApp.fetch(url).getContentText();
  • 対象URLのページHTMLを取得
const regex = /<a[^>]*class="post-list-link"[^>]*href="(.*?)"[^>]*>[\s\S]*?<h2[^>]*class="post-list-title entry-title"[^>]*>(.*?)<\/h2>/g;
  • 記事タイトルとURLのセットを抽出するための正規表現
    • <a class="post-list-link" href="...">href が URL
    • <h2 class="post-list-title entry-title">タイトル</h2> が記事タイトル
while ((match = regex.exec(html)) !== null) {
  const link = match[1];
  const title = match[2].replace(/&amp;/g, '&').trim();
  titlesAndLinks.push([title, link]);
  foundOnThisPage = true;
}
  • 正規表現にマッチした内容から、タイトルとリンクを配列に追加
  • &amp;& に変換し、不要な空白を .trim() で削除

⑤ 次ページの有無を判断

if (!foundOnThisPage) {
  hasNextPage = false;
} else {
  page++;
}
  • 記事が1件も見つからなかった場合、次のページはないと判断して終了
  • 逆に、記事が見つかれば page++ して次ページへ

⑥ 例外処理

} catch (e) {
  hasNextPage = false;
}
  • ページが存在しない、またはネットワークエラー等が発生した場合にループ終了

⑦ スプレッドシート出力処理

const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName)
            || SpreadsheetApp.getActiveSpreadsheet().insertSheet(sheetName);
  • 指定された sheetName のシートを取得。なければ新規作成
sheet.clear();
sheet.appendRow(['タイトル', 'URL']);
  • 既存内容をクリアし、1行目に見出しを追加
if (titlesAndLinks.length > 0) {
  sheet.getRange(2, 1, titlesAndLinks.length, 2).setValues(titlesAndLinks);
} else {
  sheet.appendRow(['(記事が見つかりませんでした)']);
}
  • データが1件以上あれば、2行目以降に一括で書き込み
  • なければ「記事が見つかりませんでした」と表示

🧪 実行手順まとめ

  1. Googleスプレッドシートを開く
  2. メニューの「拡張機能」→「Apps Script」を開く
  3. 上記コードを貼り付けて保存
  4. fetchAllCategoryArticles() を実行
  5. スプレッドシートにタイトルとURLが自動出力されます 🎉

💡 応用ポイント

  • カテゴリを変更したいときは baseUrl の値だけ変えればOK
  • 出力先のシート名も自由にカスタマイズ可能
  • 記事数が多い場合は、6分の実行制限に注意(分割実行を推奨)

🧭 マーケティング業務にまつわるプログラミング情報を発信中

Webマーケティングの業務を自動化したり、効率化する方法をZennにて発信していますので、ぜひフォローをお願いします!

Discussion