アプリを WordPress に接続して Python チョップを磨く
公開: 2022-10-18WordPress は、アプリケーション プログラミング インターフェイス (API) のおかげで、最も使用されているコンテンツ管理システム (CMS) になりました。 WordPress REST API を使用すると、WordPress は Python を含むさまざまな言語で記述された他のアプリケーションと「対話」できます。
Python は、さまざまな用途と人間が読める構文を備えた拡張可能なプログラミング言語であり、WordPress コンテンツをリモートで管理するための強力なツールとなっています。
アプリの WordPress REST API の使用例と、Python を使用してそれらをサポートする方法を次に示します。
- 事前定義されたテンプレートを使用して、アプリで生データを説明付きの書式設定された投稿にすばやく変換できるようにします。
- オブジェクト固有の割引や販売イベントが発生するたびに顧客に期間限定のオファーを表示するバックオフィス アプリケーションを Django と Python で構築します。
- Python スクリプトを統合して WordPress サイト内で実行する
このチュートリアルは、WordPress REST API と通信して操作を実行する単純な Python コンソール アプリケーションを作成するのに役立ちます。 完全なプロジェクト コードも利用できます。
WordPress のインストールと設定
まず、WordPress ウェブサイトを開発マシンにローカルにインストールして実行しましょう。 これは、アカウントを作成したり、Web ホスティング用のドメイン名を購入したりする必要がないため、WordPress を始めるのに最適な方法です。
WordPress をローカルにインストールする前に、Apache Web サーバー、ローカル データベース、WordPress が記述されている PHP 言語など、いくつかのコンポーネントをコンピューターで実行する必要があります。
幸いなことに、すべての主要な OS で利用できる無料のローカル WordPress 開発スイートである DevKinsta を使用できます (Kinsta の顧客でなくても使用できます)。
DevKinsta は Windows、Mac、Linux で利用でき、WordPress とそのすべての依存関係をローカル マシンにインストールします。
DevKinsta をインストールする前に、Docker をローカルで実行する必要があるため、Docker エンジンをダウンロードしてインストールしていない場合はインストールします。
Docker Desktop をインストールすると、OS に適したパッケージを自動的にダウンロードできます。
DevKinsta インストーラーを実行すると、Docker はすぐに初期化を開始します。
次に、[新しいサイトの作成] メニューから [新しい WordPress サイト] を選択します。
DevKinsta インストーラーでは、WordPress 管理者アカウントの資格情報を作成する必要があります。
インストールすると、DevKinsta はスタンドアロン アプリケーションになります。 これで、WordPress サイト ( [サイトを開く] ボタンを使用) と WordPress 管理ダッシュボード ([ WP 管理] ボタン) の両方にアクセスできるようになりました。
次に、Web サイトで SSL と HTTPS を有効にする必要があります。 これにより、SSL 証明書によって Web サイトのセキュリティが向上します。
DevKinsta アプリに移動し、 [サイトを開く] ボタンをクリックします。 新しいブラウザー タブに、WordPress サイトのホームページが表示されます。
これはあなたの WordPress ブログで、ここから書き始めることができます。 ただし、Python が WordPress REST API にアクセスして使用できるようにするには、最初に WordPress 管理者を構成する必要があります。
DevKinsta アプリのWP Adminボタンをクリックし、 WordPress ダッシュボードにアクセスするためのユーザーとパスワードを入力します。
ログインすると、 WordPress ダッシュボードが表示されます。
WordPress は、標準的な方法として Cookie 認証を使用します。 ただし、REST API を使用して制御したい場合は、WordPress REST API へのアクセスを許可する手法で認証する必要があります。
これには、アプリケーション パスワードを使用します。 これらは、WordPress が生成し、Web サイトを管理する権限を持つユーザー プロファイルに関連付ける 24 文字の長い文字列です。
アプリケーション パスワードを使用するには、ダッシュボードの [プラグイン] メニューをクリックし、同じ名前のプラグインを検索します。 次に、アプリケーション パスワード プラグインをインストールして有効にします。
アプリケーション パスワードの作成を開始するには、まず [ユーザー] メニューを展開し、 [すべてのユーザー] をクリックします。
次に、管理者ユーザー名の下にある [編集] をクリックします。
[ユーザーの編集]ページを下にスクロールし、[アプリケーション パスワード] セクションを見つけます。 ここで、アプリケーション パスワードの名前を指定します。これは、後で Python アプリ リクエストを認証し、REST API を使用するために使用します。
Add New Application Password をクリックして、WordPress がランダムな 24 文字のパスワードを生成できるようにします。
次に、このパスワードをコピーして、後で使用できるように安全な場所に保存します。 このページを閉じると、このパスワードを取得できなくなります。
最後に、パーマリンクを構成する必要があります。 WordPress では、パーマリンクとアーカイブ用のカスタム URL 構造を作成できます。 たとえば、「初めての WordPress Web サイト」というタイトルの WordPress 投稿が、直感的な URL https://your-website.local:port/your-first-wordpress-website/ からアクセスできるように変更してみましょう。 このアプローチには、使いやすさや美観の向上など、いくつかの利点があります。
パーマリンクを設定するには、 [設定]セクションを展開し、[パーマリンク] メニューをクリックします。 ここで、 Common SettingsをPost nameに変更します。

JSON 形式を使用して Python コードで後で投稿を取得できるようにするため、投稿名構造を使用してパーマリンク構造を設定することも必要です。 そうしないと、JSON デコード エラーがスローされます。
Python から WordPress を制御する方法
WordPress は PHP で書かれていますが、他のプログラミング言語、サイト、アプリがそのコンテンツを利用できるようにする REST API があります。 WordPress コンテンツを REST アーキテクチャで公開すると、JSON 形式で利用できるようになります。 したがって、他のサービスを WordPress と統合して、作成、読み取り、更新、および削除 (CRUD) 操作を実行できます。ローカルに WordPress をインストールする必要はありません。
次に、単純な Python アプリを作成して、WordPress REST API を使用して投稿を作成、取得、更新、および削除する方法を確認します。
新しい単純な Python プロジェクト用に新しいディレクトリを作成し、 PythonWordPress
のような名前を付けます。
../PythonWordPress
ここで、プロジェクトの仮想環境を作成します。これにより、インストールされた Python パッケージの独立したセットを維持し、それらをシステム ディレクトリから分離し、バージョンの競合を回避できます。 venv
コマンドを実行して仮想環境を作成します。
python3 -m venv .venv
次に、コマンドを実行して.venv仮想環境をアクティブにします。 このコマンドは OS によって異なります。
- Windows:
.venvScriptsactivate
- Mac/Linux:
.venv/bin/activate
次に、WordPress アカウントに関連する構成を保存します。 アプリの構成を Python コードから分離するには、プロジェクト ディレクトリに.envファイルを作成し、次の環境変数をファイルに追加します。
WEBSITE_URL="<>" API_USERNAME="<>" API_PASSWORD="<>"
幸いなことに、Python アプリから上記のデータを読み取るのは簡単です。 アプリケーションが.envファイルから構成を読み取れるように、 Python-dotenvパッケージをインストールできます。
pip install python-dotenv
次に、Python の非同期 HTTP クライアント/サーバーであるaiohttpをインストールします。
pip install aiohttp
次に、次のコードを含む app.pyという名前のファイルを追加します。
import asyncio menu_options = { 1: 'List Posts', 2: 'Retrieve a Post' } def print_menu(): for key in menu_options.keys(): print (key, '--', menu_options[key] ) async def main(): while(True): print_menu() option = input_number('Enter your choice: ') #Check what choice was entered and act accordingly if option == 1: print('Listing posts...') elif option == 2: print('Retrieving a post...') else: print('Invalid option. Please enter a number between 1 and 5.') def input_number(prompt): while True: try: value = int(input(prompt)) except ValueError: print('Wrong input. Please enter a number ...') continue if value < 0: print("Sorry, your response must not be negative.") else: break return value def input_text(prompt): while True: text = input(prompt) if len(text) == 0: print("Text is required.") continue else: break return text if __name__=='__main__': asyncio.run(main())
上記のコードは、コンソール メニューを表示し、オプションを選択するために番号を入力するよう求めます。 次に、このプロジェクトを展開し、すべての投稿を一覧表示し、投稿 ID を使用して特定の投稿を取得できるようにするコードを実装します。

コードで投稿を取得する
WordPress REST API を操作するには、新しい Python ファイルを作成する必要があります。 次の内容でwordpress_api_helper.pyという名前のファイルを作成します。
import aiohttp import base64 import os import json from dotenv import load_dotenv load_dotenv() user=os.getenv("API_USERNAME") password=os.getenv("API_PASSWORD") async def get_all_posts(): async with aiohttp.ClientSession(os.getenv("WEBSITE_URL")) as session: async with session.get("/wp-json/wp/v2/posts") as response: print("Status:", response.status) text = await response.text() wp_posts = json.loads(text) sorted_wp_posts = sorted(wp_posts, key=lambda p: p['id']) print("=====================================") for wp_post in sorted_wp_posts: print("id:", wp_post['id']) print("title:", wp_post['title']['rendered']) print("=====================================") async def get_post(id): async with aiohttp.ClientSession(os.getenv("WEBSITE_URL")) as session: async with session.get(f"/wp-json/wp/v2/posts/{id}") as response: print("Status:", response.status) text = await response.text() wp_post = json.loads(text) print("=====================================") print("Post") print(" id:", wp_post['id']) print(" title:", wp_post['title']['rendered']) print(" content:", wp_post['content']['rendered']) print("=====================================")
上記のaiohttpライブラリの使用に注意してください。 最新の言語は、非同期プログラミングを可能にする構文とツールを提供します。 これにより、プログラムが Web 要求、データベース操作、ディスク I/O などの操作と並行してタスクを実行できるようになるため、アプリケーションの応答性が向上します。 Python は非同期プログラミング フレームワークの基盤として asyncio を提供し、aiohttp ライブラリはasyncioの上に構築され、Python で作成された HTTP クライアント/サーバー操作への非同期アクセスをもたらします。
上記のClientSession
関数は非同期で実行され、プログラムが/wp-json/wp/v2/posts
エンドポイントに対して HTTP GET 操作を実行するために使用するsession
オブジェクトを返します。 すべての投稿を取得するリクエストと特定の投稿のリクエストの唯一の違いは、この最後のリクエストが URL ルートでpost id
パラメータを渡すことです: /wp-json/wp/v2/posts/{id}
。
ここで、 app.pyファイルを開き、 import
ステートメントを追加します。
from wordpress_api_helper import get_all_posts, get_post
次に、 main
関数を変更して、 get_all_posts
およびget_post
関数を呼び出します。
if option == 1: print('Listing posts...') await get_all_posts() elif option == 2: print('Retrieving a post...') id = input_number('Enter the post id: ') await get_post(id)
次に、アプリを実行します。
python app.py
次に、アプリケーション メニューが表示されます。
次に、オプション 1 を試して Python アプリが取得する投稿のリストを表示し、オプション 2 で投稿を選択します。
コードで投稿を作成する
Python で WordPress 投稿を作成するには、まずwordpress_api_helper.pyファイルを開き、 create_post
関数を追加します。
async def create_post(title, content): async with aiohttp.ClientSession(os.getenv("WEBSITE_URL")) as session: async with session.post( f"/wp-json/wp/v2/posts?content={content}&title={title}&status=publish" , auth=aiohttp.BasicAuth(user, password)) as response: print("Status:", response.status) text = await response.text() wp_post = json.loads(text) post_id = wp_post['id'] print(f'New post created with id: {post_id}')
このコードは、REST API エンドポイント URL の横にあるauth
パラメーターを渡して、 session
オブジェクトのpost
関数を呼び出します。 auth
オブジェクトには、WordPress ユーザーと、アプリケーション パスワードを使用して作成したパスワードが含まれるようになりました。 app.pyファイルを開き、 create_post
とメニューをインポートするコードを追加します。
from wordpress_api_helper import get_all_posts, get_post, create_post menu_options = { 1: 'List Posts', 2: 'Retrieve a Post', 3: 'Create a Post' }
次に、3 番目のメニュー オプションを追加します。
elif option == 3: print('Creating a post...') title = input_text('Enter the post title: ') content = input_text('Enter the post content: ') await create_post(title, f"{content}")
次に、アプリを実行してオプション 3 を試し、タイトルとコンテンツを渡して WordPress で新しい投稿を作成します。
オプション 1 をもう一度選択すると、新しく追加された投稿の ID とタイトルが返されます。
WordPress Web サイトを開いて、新しい投稿を表示することもできます。
コードで投稿を更新する
wordpress_api_helper.pyファイルを開き、 update_post
関数を追加します。
async def update_post(id, title, content): async with aiohttp.ClientSession(os.getenv("WEBSITE_URL")) as session: async with session.post( f"/wp-json/wp/v2/posts/{id}?content={content}&title={title}&status=publish" , auth=aiohttp.BasicAuth(user, password)) as response: print("Status:", response.status) text = await response.text() wp_post = json.loads(text) post_id = wp_post['id'] print(f'New post created with id: {post_id}')
次に、 app.pyファイルを開き、 update_post
とメニューをインポートするコードを追加します。
from wordpress_api_helper import get_all_posts, get_post, create_post, update_post menu_options = { 1: 'List Posts', 2: 'Retrieve a Post', 3: 'Create a Post', 4: 'Update a Post' }
次に、4 番目のメニュー オプションを追加します。
elif option == 4: print('Updating a post...') id = input_number('Enter the post id: ') title = input_text('Enter the post title: ') content = input_text('Enter the post content: ') await update_post(id, title, f"{content}")
次に、アプリを実行してオプション 4 を試し、投稿 ID、タイトル、コンテンツを渡して既存の投稿を更新します。
オプション 2 を選択し、更新された投稿 ID を渡すと、新しく追加された投稿の詳細が返されます。
コードで投稿を削除する
投稿 ID を REST API に渡して、投稿を削除できます。
wordpress_api_helper.pyファイルを開き、 delete_post
関数を追加します。
async def delete_post(id): async with aiohttp.ClientSession(os.getenv("WEBSITE_URL")) as session: async with session.delete( f"/wp-json/wp/v2/posts/{id}" , auth=aiohttp.BasicAuth(user, password)) as response: print("Status:", response.status) text = await response.text() wp_post = json.loads(text) post_id = wp_post['id'] print(f'Post with id {post_id} deleted successfully.')
app.pyファイルを開き、 delete_post
とメニューをインポートするコードを追加します。
from wordpress_api_helper import get_all_posts, get_post, create_post, update_post, delete_post menu_options = { 1: 'List Posts', 2: 'Retrieve a Post', 3: 'Create a Post', 4: 'Update a Post', 5: 'Delete a Post', }
次に、5 番目のメニュー オプションを追加します。
elif option == 5: print('Deleting a post...') id = input_number('Enter the post id: ') await delete_post(id)
アプリを実行し、オプション 5 を試して、ID を渡して WordPress の既存の投稿を削除します。
注: [投稿を一覧表示] オプションを実行すると、削除された投稿が引き続き表示される場合があります。
投稿を削除したことを確認するには、数秒待ってから [投稿の一覧] オプションをもう一度試してください。 以上です!
概要
WordPress REST API と Python の HTTP クライアント ライブラリのおかげで、Python アプリと WordPress は連携して相互に通信できます。 REST API の利点は、WordPress を Python アプリからリモートで操作できることです。Python の強力な言語により、目的の構造と頻度に従う自動コンテンツ作成が可能になります。
DevKinsta を使用すると、ローカルの WordPress サイトをすばやく簡単に作成および開発できます。 WordPress のテーマとプラグインを開発するためのローカル環境を提供し、Docker ベースの自己完結型インストール モデルのおかげで簡素化された展開モデルを提供します。
Python と WordPress を使った経験は何ですか?
その経験を拡張する準備ができたら、WordPress REST API の基本の完全なガイドを読んで、他の可能性を探ることができます。