自分の WordPress の functions.php で投稿時通知する簡易 Webhook 対応をするメモ

自分の WordPress の functions.php で投稿時通知する簡易 Webhook 対応をするメモです。

もちろん他にも良い方法があるかもしれませんが、単純な Webhook なのでプラグインで導入する必要はなく、一旦シンプルに送った後のサーバーで、アレコレしようと思っているのでこのような方法に行きつきました。

WordPressの記事投稿/更新時にDiscordへメッセージを送信する – 雑記帳

WordPressの記事投稿/更新時にDiscordへメッセージを送信する

こちらの記事を参考に、 PHP での curl の使い方と WordPress の絡め方が分かったので、自分の WordPress に実装していきます。

参考: PHP: 基本的な curl の使用法 – Manual

functions.php を編集する

自分のブログの WordPress REST API で JP Markdown で編集している素の Markdown データを取得するメモ

こちらの記事で 自分のブログ記事の基本的な記事情報や Markdown データを取得できるようになったので、送るデータ内容はこれを応用します。

image

テーマエディターで functions.php を編集し、以下のようにコードを加えます。<WEBHOOK_URL> の部分は自分の送りたいエンドポイントを指定します。私の場合は Node-RED のサーバーへ送り先を向けました。

function post_webhook($send_datas){
    $jsonData = json_encode($send_datas);
	$ch=curl_init('<WEBHOOK_URL>');
	curl_setopt($ch,CURLOPT_POST,true);
	curl_setopt($ch,CURLOPT_HTTPHEADER,array('Content-Type: application/json'));
	curl_setopt($ch,CURLOPT_POSTFIELDS,$jsonData);
	curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
	curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false);
	$res=curl_exec($ch);
	curl_close($ch);
	return $res;
}

function post_notify($new,$old,$post){
    // 新しい記事が公開以外で。
    $result = array();
    if($new==='publish'){
        $data = get_post_datas($post);
        $result['notify_type'] = 'publish_post_notify';
        $result['new_status'] = $new;
        $result['old_status'] = $old;
        $result['data'] = $data;
        post_webhook($result);
    }
}

function update_notify($new,$old,$post){
    // 公開以降の記事を通知
    $result = array();
    if($post->post_status==='publish'){
		$data = get_post_datas($post);
		$result['notify_type'] = 'update_post_notify';
        $result['new_status'] = $new;
        $result['old_status'] = $old;
        $result['data'] = $data;
        post_webhook($result);
    }
}

add_action('transition_post_status','post_notify',10,3);
add_action('post_updated','update_notify',10,3);

こちらを保存して動作するようにして、記事を公開するデータが送られます。

image

たとえば、こんなデータです。いろいろ利用できそうですね。

ちなみに記事を更新時もデータが送られるようになっているので、記事IDが存在していたら既存を上書きするような運用もできるように書いてみました。

これで、しばらく回してみて、ブラッシュアップしていこうと思います!