オープンソースのローコード開発ツールのプリザンター(pleasanter)ブログ

オープンソースのローコード開発ツールのプリザンター(pleasanter)のブログとサービス情報サイトです

カテゴリ : お知らせプリザンターとは?使い方スクリプト・スタイル環境構築事例動画

PleasanterとChatGPTとWordPressでWeb記事を半自動生成(後編)

こんにちは。
リーデックス小川です。

今回は、Qiitaで開催されているプリザンターのアドベントカレンダーの12日目の記事「PleasanterとChatGPTとWordPressでWeb記事を半自動生成(前編)」の続きとなります。まだ、前編を読んでない方は、ぜひ前編よりご覧ください。

qiita.com

「PleasanterとChatGPT、WordpressでWeb記事を半自動生成する」と、昨年度に引き続き、生成AIとプリザンターを組み合わせた内容になりました。

なお、このブログは2025年09月26日(金)に開催された「ユーザーミートアップ 10」で発表した内容を元に、再編集した内容です。

システム構成について(再掲)

Qiitaの記事にも掲載していますが、以下の説明で必要となるため再掲します。

PHPプログラム部分について

Qiitaの記事の続きです。

B.ChatGPTでのコンテンツ生成

Aで要約する対象となるHTMLを抽出しましたので、ChatGPTの出番となります。

本文を要約し、要約した本文をもとにChatGPTで本文の要約などとアイキャッチに使用する画像を生成しています。

記事の要約

本文の要約はChatGPTで行っています。

WordPressで記事の属性を定義する「タグ」抽出もGTPのプロンプトによって出力しています。

$prompt = <<< PROMPT
与えられた記事を読み、読み手に魅力を伝える紹介文(introduce)を作成してください。
紹介文はできるだけ生成AIで生成していないような自然な日本語で作成してください。
-----snip-----
#テンプレート
{
"title":"{{タイトル}}"
"en_title":"{{titleの英訳}}"
"author": {{著者名}}
"category": {{カテゴリ名}}
"tags": ["#{{タグ1}}", "#{{タグ2}}", "#{{タグ3}}"],
"introduce":"{{ChatGPTが生成}}"
"point1":"{{記事の主な要点}}",
"point2":"{{読みどころや価値}}",
"point3":"{{補足や実務的なヒント}}"
}
-----
以下、記事となります。

$cleanHtml
PROMPT;

// APIキー
$chagpt_apikey = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX';

// cURLセッションの初期化
$ch = curl_init();

// cURLのオプションを設定
curl_setopt($ch, CURLOPT_URL, 'https://api.openai.com/v1/chat/completions');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Content-Type: application/json',
    'Authorization: Bearer ' . $chagpt_apikey
]);
 
// リクエストのペイロード
$chatgpt_model = 'gpt-4.1-mini';
$data = [
    'model' => $chatgpt_model,  // 使用するモデルを指定
    'messages' => [
        [
            'role' => 'system',
            'content' => 'あなたはプロのITライターです。すべての回答はJSON形式で出力してください。'
        ],
        [
            'role' => 'user',
            'content' => $prompt
        ]
    ],
    'response_format' => ['type' => 'json_object'], // ←これで強制的にJSON形式で返ってくる
];

curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));

// APIからのレスポンスを取得
OgUtil::console_log("Start ChatGPT");
$response = curl_exec($ch);
OgUtil::console_log("End ChatGPT");

// プログラムが続く・・・・・

 

画像の生成

要約した記事をもとに、キービジュアル画像を作成します。

// プロンプト(生成したい画像の説明)
$prompt = <<<EOF
以下のブログ記事の紹介文からイメージできる画像を生成してください。
文字は含めないでください。
-----

EOF;
$prompt .= $introObj['introduce'] . "\n";

// APIエンドポイント
$url = 'https://api.openai.com/v1/images/generations';

// リクエストデータ
$data = [
    'model' => 'gpt-image-1',
    'prompt' => $prompt,
    'size' => '1536x1024',
    'n' => 1
];

// cURLセッションの初期化
$ch = curl_init($url);

// ヘッダーの設定
$headers = [
    'Content-Type: application/json',
    'Authorization: ' . 'Bearer ' . $chagpt_apikey 
];
// プログラムが続く・・・・・
WordPressへの登録

最後に、ChatGPTで生成した本文と画像などをWordPressに登録します。WordPressへの登録はバイブコーディングでライブラリを作成しました。

WordPressへの登録は、「記事の登録→画像の登録→アイキャッチの登録」という順番を踏むことになります。記事の登録、画像の登録、アイキャッチの登録、とそれぞれライブラリを呼び出して登録します。

// Wordpresに投稿するためのライブラリを呼び出す
$wp = new OgWordpress($site_url, $username, $app_pass);
$blog_title = OgUtilHtml::extractTitle($html);
$blog_author = OgUtilHtml::extractAuthor($html) ?: $introObj['author'];
$blog_publish_date = OgUtilHtml::extractPublishDateFromHtml($html);

//-----snip-----

// カスタム投稿タイプに登録
OgUtil::console_log("Start Wordpress");
$createdPost = $wp->createCustomPost('blog_introduce', $postData, 'draft', $acfFields, $metaFields, $taxonomies);
OgUtil::console_log("End Wordpress (ID". $createdPost['id'].")");

//-----snip-----

// 画像をWordPressにアップロード
OgUtil::console_log("Upload Image to Wordpress");
$mediaId = $wp->uploadMedia($fileName);
//echo "メディアID: $mediaId\n";
OgUtil::console_log("メディアID: $mediaId");
OgUtil::console_log("Uploaded Image to Wordpress");

//-----snip-----

// 投稿にアイキャッチ画像を設定
OgUtil::console_log("Update EyeCatch to Wordpress");
$postData = ['featured_media' => $mediaId];
$response = $wp->updateCustomPost('blog_introduce', $createdPost['id'], $postData);

// プログラムが続く・・・・・

これらをまとめたバッチファイルを実行すると、下記のようなログが表示され、WordPressに記事が登録されます。下記は単独でバッチプログラムを実行していますが、運用ではPleasanterのAPIよりURLを取得する別のプログラムがあり、そのURLをバッチプログラムの引数で指定し実行します。

$ php contents.php https://hogehoge.com
2025/12/06 11:06:18 [info]Start https://hogehoge.com
2025/12/06 11:06:18 [info]Start PhantomJs Cloud
2025/12/06 11:06:18 [info]Start PhantomJs Cloud
2025/12/06 11:06:26 [info]End PhantomJs Cloud
2025/12/06 11:06:26 [info]Start ChatGPT
2025/12/06 11:06:39 [info]End ChatGPT
2025/12/06 11:06:42 [info]Start Wordpress
2025/12/06 11:06:42 [info]End Wordpress (ID843)
2025/12/06 11:06:42 [info]Start Make Image
2025/12/06 11:07:29 [info]画像を保存しました: image/keyimage_20251206110729.png
2025/12/06 11:07:29 [info]End Make Image
2025/12/06 11:07:29 [info]Upload Image to Wordpress
201
2025/12/06 11:07:34 [info]メディアID: 844
2025/12/06 11:07:34 [info]Uploaded Image to Wordpress
2025/12/06 11:07:34 [info]Update EyeCatch to Wordpress
2025/12/06 11:07:35 [info]Updated EyeCatch to Wordpress

なお、PHPプログラムは、VSCodeでCopilotを使用した「バイブコーディング」で実装しています。

詳細は割愛しますが、勝手にソースコードが生成されるのは、なかなか爽快です(ただし修正するところも多いですが)。

WordPress

WordPressは、さまざまなプラグインやカスタマイズをしていますのですべては書ききれませんが、連携にかかわるところを重点的に解説します。

項目の拡張

WordPress側にも、要約前の情報などを残しておくためのフィールドを簡単に追加しておきたかったため、AFC(Advanced Custom Fields)CPT(Custom Post Type)UIを利用して、項目を拡張しています。

Advanced Custom Fields(ACF) は、WordPressに任意の入力項目を自由に追加できる強力なプラグインです。通常の投稿画面には存在しないカスタムフィールドを、管理画面から簡単に作成・配置でき、テキスト、画像、日付、選択肢など多様な入力形式を扱えます。構造化されたデータ管理が可能になるため、業務システム的な使い方や外部連携にも適しています。

 

Custom Post Type UI(CPT UI) は、WordPressの「カスタム投稿タイプ」や「カスタムタクソノミー(分類)」をコード不要で作成できるプラグインです。独自の投稿種別(例:ニュース、製品情報、事例紹介など)を簡単に追加でき、ACFと組み合わせることでデータベースとしての柔軟性が大きく向上します。

 

これらを使って、通常の投稿の項目に加えて、記事タイトル(オリジナル)や記事タイトル(ChatGPT生成)、紹介コメント(要約)などの項目を追加しました。

 

バッチプログラムの実行結果

先ほどのバッチプログラムを実行し、項目が連携されると、下書き状態で保存されます。

 

下書き状態をコンテンツの内容を確認し、問題ないようであれば公開します。

要約のサンプル

連携した段階で公開することも可能ですが、一度人の目を通したほうが安心です。 試しに弊社ブログ「[ノーコードでどこまで行ける?プリザンター標準機能の実力とカスタマイズ判断のポイント](https://pleasanter.hatenablog.jp/entry/20251126_nocode_customize)」を要約してみましたが、なかなか良い感じのコンテンツとなりました。

考察

開発していて躓いたこと、考えたことなどをまとめておきます。

生成AIのスコープについて

当初、ChatGPTのAPIでURLを指定して要約まで実行していたのですが、APIの使用する費用が高く、テストでデバッグしながら作っていたところ、デポジットがかなり速いスピードで消費されてしまったため、要約部分と画像生成のみChatGPTに担当させました。Geminiや他の生成AIのAPIだともう少し安くなる可能性がありますが、要約対象となるコンテンツをプログラムで制御することができるのはメリットが大きいと感じました。

クローリングについて

「PhantomJS API」と同じようなWebサービスや無料で使えるツールもあり、特に「firecrawl」はDockerでインストールすると無料で使えますので、利用してもよいかと思います。

linuxなどでは「wget」コマンドでも代替できそうですが、javascriptの動的生成されているコンテンツも取得できないことがありますので注意が必要です。

PHPプログラムのワークフロー自動化ツールでの代替

今回はバイブコーディング練習を兼ねていたためPHP(Pythonで書けばよかった…)で実装しましたが、ワークフロー自動化ツールで実現すると、より簡単に実行できそうです。

たとえば、オープンソースの「n8n」であれば、無料で多彩なワークフローを組むことができるため、今回のシステムとの親和性が高そうです。

まとめ

今回は、PleasanterとChatGPTとWordpressでWeb記事を半自動生成するプログラムについてご紹介しました。

いろいろと応用が効きそうですのでご参考いただき、この仕組みを使ってサービスをしたい方はぜひお問い合わせください。

弊社では、プリザンターのスクリプトやスタイルを利用したカスタマイズにも対応しています。 「スクリプトについて相談したい」「業務改善のために実現したい機能がある」「本記事や過去の記事のスクリプトを応用したい」といった場合も、お気軽にお問い合わせください。

それでは、今回はこの辺で。 最後までご覧いただき、ありがとうございました。