多くの開発者が、PythonとNoSQLデータベースであるRedisを組み合わせ活用しています。また、WordPressにおいても、バックエンドのデータアクセス高速化のために永続オブジェクトキャッシュが必要な時には、Redisがよく使われます。

PythonアプリケーションでWordPressのコンテンツを操作する際には、この2つの構造を組み合わせることができます。

今回の記事では、redis-pyライブラリを使用したPythonアプリを構築することで、Redisに直接コンテンツを投稿する方法と、WordPress REST APIを介して投稿を行う方法をご紹介します。

Redisとは

Redis(Remote Dictionary Server)は、Salvatore Sanfilippo氏によって開発され、Redis Ltd.(旧Redi Labs)によって保守されている高速NoSQLデータベースおよびインメモリキャッシュです。Redisのオープンソースリリースは、バークレーソフトウェアディストリビューション(BSD)ライセンス下で利用可能であり、Redis Ltd.は商用エンタープライズ版とクラウド版も提供しています。

Redisは、そのデータ格納メカニズムによって他のNoSQLデータベースと一線を画します。文字列、集合、リスト、辞書(またはハッシュ)など、多くのプログラミング言語で見られるのと同じデータ型でデータを保存するため、通常データ構造ストアと呼ばれます。Redisは単純な構造をサポートするだけでなく、ジオロケーションやストリーム処理のようなタスクのための高度なデータ構造もサポートしています。

Pythonアプリの前提条件

アプリの作成を開始する前に、以下の3つのものをローカル環境にインストールする必要があります。

ヒント:KinstaのWordPress対応DevKinstaパッケージをインストールすることで、Docker内でこの開発環境を簡単に作成できます。

前提条件を満たしたら、いよいよ本題です。ユーザーのWordPressの投稿を辞書形式で受け取り、Redisキャッシュに保存するPythonアプリを作成します。

Redisキャッシュに投稿を保存するPythonアプリの構築

Redisキャッシュはウェブサイトの効率的なキャッシュメカニズムです。頻繁にリクエストされる情報を保存して、素早く便利にアクセスできるようにします。キャッシュではキーバリューのデータ構造で情報が保存されます。

python-redisというプロジェクト用フォルダを作成することから始めましょう。その後、コマンドターミナルを起動し、cd python-redisにアクセスし、以下のコマンドを実行してredis-pyをインストールします。

pip install redis

インストールが完了したら、python-redisディレクトリにmain.pyというファイルを作成します。

インストールしたredis-pyライブラリをインポートし、Redisのホストとポートのアドレスを設定します。

import redis
redis_host = 'localhost'
redis_port = 6379

次に、WordPressの投稿の値を辞書のキーと値のペアとして定義します。以下がその例です。

post = {
    'ID': 1,
    'post_author': 1,
    'post_date': '2024-02-05 00:00:00',
    'post_date_gmt': '2024-02-05 00:00:00',
    'post_content': 'Test Post <br/><a href="http://www.my-site.com/">related blog post</a>',
    'post_title': 'My first post',
    'post_excerpt': 'In this post, I will...',
    'post_status': 'publish',
    'comment_status': 'open',
    'ping_status': 'open',
    'post_password': 'my-post-pwd',
    'post_name': 'my-first-post',    
}

)実際のアプリケーションでは、投稿内容はおそらくHTML入力フォームから来ることになるはずです。

redis_dict()関数をコードに追加します。この関数は、ローカルのRedisサーバーに接続し、上記の投稿をRedisキャッシュに保存し、作成された値をコンソールに出力します。

def redis_dict():
    try:
        r = redis.StrictRedis(host = redis_host, port = redis_port, decode_responses=True)
        r.hset("newPostOne", mapping=post)
        msg = r.hgetall("newPostOne")
        print(msg)
    except Exception as e:
        print(f"Something went wrong {e}")

# 関数を実行:
if __name__ == "__main__":
    redis_dict()

Docker内でRedisを起動した場合を除き、以下のコマンドでRedisのコマンドラインインターフェースを起動します。

redis-cli

Pythonスクリプトを実行します。

python main.py

スクリプトを実行すると、投稿がRedisのキーバリューストアに追加されます。ターミナルのコンソールに以下のようなレスポンスが表示されるはずです。

ターミナルのスクリーンショット(Python経由でRedisデータベースに追加された投稿データを示す)
PythonアプリのpostがRedisストレージに追加されたことを示すコンソールでの出力

これでローカルのRedisデータベースに投稿が格納されました。

それでは、WordPress REST APIを使ってWordPressサイトにこの投稿をアップロードしてみましょう。

REST APIを使ってWordPressに投稿をアップロードする

WordPress REST APIには、WordPressとやりとりするためにアプリから呼び出すことのできるエンドポイントが用意されています。ここでは、WordPressに投稿を作成するためにpostエンドポイントを使用します。

ステップ 1. WordPress でアプリケーションパスワードを設定する

WordPress APIでは、アプリがWordPressサイトからデータにアクセスするのを許可するために、アプリケーションパスワードが必要です。パスワードは24文字のシークレットキーで、REST APIへのすべてのリクエストに使用する必要があります。

WordPress管理画面の「ユーザー」ページでアプリケーションパスワードを生成します。各アプリケーションパスワードには、わかりやすいように名前を割り当てることができますが、生成後はパスワード自体を表示することはできません(そのため、忘れずにコピーしてください)。

スクリーンショット(WordPressのAPIパスワード生成インターフェース)
WordPress管理画面でアプリケーションパスワードを生成する

ステップ2. PythonアプリでWordPressに投稿する

まず、WordPress APIにHTTPリクエストを行うためのPython requestsライブラリをインストールします。これを行うには、ターミナルで以下のコマンドを実行してください。

pip install requests

次に、python-redisフォルダの中に、app.pyという名前のファイルを作成し、そのファイルをテキストエディタで開いてください。

まず、requests,jsonbase64モジュールを以下のようにインポートします。

import requests
import json
import base64

次にAPIベースURL、WordPressユーザー名とパスワードを定義します。password変数には、WordPressで生成したアプリケーションパスワードを使用してください。

url = 'http://localhost/wp-json/wp/v2'
user = '<Your username here>'
password = '<Your application password here>'

ここで、userpasswordを結合し、結果をエンコードしてリクエストヘッダーに渡します。

creds = user + ":" + password
token = base64.b64encode(creds.encode())
header = {'Authorization': 'Basic ' + token.decode('utf-8')}

以下が投稿本文です。

post = {    
    'author': 1,
    'date': '2024-02-05 00:00:00',
    'date_gmt': '2024-02-05 00:00:00',
    'content': 'Test Post <br/><a href="http://www.my-site.com/">related blog post</a>',
    'title': 'My second post',
    'excerpt': 'In this post, I will...',
    'status': 'publish',
    'comment_status': 'open',
    'ping_status': 'open',
    'password': 'my-post-pwd',
    'slug': 'my-second-post',    
}

APIへのPOSTリクエストと、レスポンスステータスを表示するコマンドを以下のように設定します。

r = requests.post(url + '/posts', headers=header, json=post)
print(r)

ターミナルで次のコマンドを使ってスクリプトを実行します。

python app.py

201レスポンス(”Created”)が表示されたら、リソースが無事に追加されたことが確認できます。

ターミナルのスクリーンショット(Python経由でWordPressに投稿後、201レスポンスコードを取得)
201レスポンスコード(正常に投稿されたことを示す)

WordPress管理画面またはサイトのMySQL/MariaDBデータベースで結果を確認できます。

WordPressでRedisキャッシュを直接使用する

WordPressサイトでは、Redisキャッシュを使用して、投稿、固定ページ、ユーザーなどのオブジェクトを一時的に保存することができます。その後、必要なときにキャッシュからオブジェクトにアクセス可能です。この方法により、手間と待ち時間を削減しながら、サイトをスケーリングしたり、多くのトラフィックをさばいたりすることができます。

KinstaとRedis

高速表示と快適なユーザーエクスペリエンスはもはや不可欠です。パフォーマンスに妥協は許されません。Kinstaでは、そんな思いからプレミアムアドオンとしてRedisを提供しています。

Redisアドオンをご希望であれば、Kinstaのサポートにご連絡ください。エンジニアがインストールとセットアップを承ります。

Redisプラグインのインストール

Kinsta以外のホスティングサービスやサーバーをお使いであれば、WordPressサイトに専用のプラグインをインストールする方法があります。

例えば、Redis Object CacheプラグインをローカルのWordPressサイトにインストールしてみましょう。

WordPressにインストールするRedis Object Cacheプラグインを選択
Redis Object Cacheというプラグイン

テキストエディタでwp-config.phpファイルを開き、カスタム設定変数のセクションに以下のコードを追加します。

define('WP_REDIS_CLIENT', 'predis');
define('WP_REDIS_HOST', 'localhost');
define('WP_REDIS_PORT', '6379');

)Redisホストのアドレスは、サーバーの構成により異なります。

WordPress管理画面の「設定」>「Redis」に移動します。するとこのようなものが表示されるはずです。

スクリーンショット(WordPressのRedis Object Cacheプラグインの設定ページ)
Redis Object Cacheプラグイン(「設定」タブ内から移動)

これで、MySQLデータベースがRedisキャッシュに置き換えられていることが確認できます。

さらに、フロントエンドのWordPressサイトはバックエンドのPythonアプリケーションと同じキャッシュを使用します。ターミナルを開き、以下のコマンドを実行しテストできます。

redis-cli monitor

サイトを移動すると、ウェブサイトのリクエストがコマンドプロンプトに出力されます。

ターミナル内のRedisサーバーへのリクエストを示すスクリーンショット
ターミナルでredis-cliを使ってサーバーリクエストを監視する

これでフロントエンドとバックエンドが同期したので、Pythonアプリを使ってREST API経由でWordPressに投稿を追加することができます。

これを行うには、app.pyのPOSTオブジェクトを新規投稿を含むように変更し、python app.pyを実行し投稿をキャッシュに追加します。

まとめ

今回の記事では、Redis Pythonクライアントを使用してRedisデータベースをPythonアプリケーションに接続する方法をご紹介しました。このクライアントはリスト、セット、辞書、その他コマンドデータ型といったRedisデータストアの複数の形式をサポートしています。

また、REST APIとRedis Object Cacheプラグインを使ってRedisをWordPressサイトに統合する方法もご紹介しました。

インメモリキャッシュをサイトに利用することで、Redisは強力かつ柔軟な開発ツールとなります。Redisはデータベースのクエリ速度、サイトのパフォーマンス、そして全体的なユーザーエクスペリエンスを引き上げるのに効果的です。

Kinstaでは、サポートエンジニアにWordPressサイトへのRedisインストールをお任せいただけます。さらに、KinstaのマネージドデータベースホスティングサービスでRedisをスタンドアロンとして実装する選択肢もあります。

Steve Bonisteel Kinsta

Kinstaのテクニカルエディター。救急車や消防車を追いかける記者としてキャリアをスタート。1990年代後半からインターネット関連の技術情報を担当している。