アプリを WordPress に接続して Python チョップを磨く

公開: 2022-10-18

WordPress は、アプリケーション プログラミング インターフェイス (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のダウンロードページのスクリーンショット。
DevKinsta インストール ページ。

DevKinsta インストーラーを実行すると、Docker はすぐに初期化を開始します。

DevKinsta の Docker 起動画面。
DevKinsta は Docker をローカルで起動します。

次に、[新しいサイトの作成] メニューから [新しい WordPress サイト] を選択します。

DevKinstaのWordPressサイトの新規作成画面。
DevKinsta の Create New Site メニュー。

DevKinsta インストーラーでは、WordPress 管理者アカウントの資格情報を作成する必要があります。

DevKinstaの新しいWordPressサイト作成画面。
新しいWordPressサイトフォームを表示しているDevKinsta。

インストールすると、DevKinsta はスタンドアロン アプリケーションになります。 これで、WordPress サイト ( [サイトを開く] ボタンを使用) と WordPress 管理ダッシュボード ([ WP 管理] ボタン) の両方にアクセスできるようになりました。

DevKinsta の WordPress サイト情報画面。
DevKinsta のサイト情報パネル。

次に、Web サイトで SSL と HTTPS を有効にする必要があります。 これにより、SSL 証明書によって Web サイトのセキュリティが向上します。

DevKinsta の SSL および HTTPS オプションを有効にします。
DevKinsta の「SSL および HTTPS」オプション。

DevKinsta アプリに移動し、 [サイトを開く] ボタンをクリックします。 新しいブラウザー タブに、WordPress サイトのホームページが表示されます。

ローカルの WordPress サイトのホームページ。
ワードプレスのホームページ。

これはあなたの WordPress ブログで、ここから書き始めることができます。 ただし、Python が WordPress REST API にアクセスして使用できるようにするには、最初に WordPress 管理者を構成する必要があります。

DevKinsta アプリのWP Adminボタンをクリックし、 WordPress ダッシュボードにアクセスするためのユーザーとパスワードを入力します。

WordPress 管理ダッシュボードのログイン画面。
ワードプレスのログインフォーム。

ログインすると、 WordPress ダッシュボードが表示されます。

WordPress 管理画面へようこそ。
WordPress ダッシュボード ページ。

WordPress は、標準的な方法として Cookie 認証を使用します。 ただし、REST API を使用して制御したい場合は、WordPress REST API へのアクセスを許可する手法で認証する必要があります。

これには、アプリケーション パスワードを使用します。 これらは、WordPress が生成し、Web サイトを管理する権限を持つユーザー プロファイルに関連付ける 24 文字の長い文字列です。

アプリケーション パスワードを使用するには、ダッシュボードの [プラグイン] メニューをクリックし、同じ名前のプラグインを検索します。 次に、アプリケーション パスワード プラグインをインストールして有効にします。

WordPress アプリケーション パスワード プラグインのインストールと有効化。
WordPress のアプリケーション パスワード プラグイン。

アプリケーション パスワードの作成を開始するには、まず [ユーザー] メニューを展開し、 [すべてのユーザー] をクリックします。

拡張されたユーザー WordPress メニュー。
ユーザーメニューを拡張しました。

次に、管理者ユーザー名の下にある [編集] をクリックします。

[ユーザー] メニューの下の WordPress ユーザーの下にある [編集] ボタンをクリックします。
WP-Admin WordPress インターフェース。

[ユーザーの編集]ページを下にスクロールし、[アプリケーション パスワード] セクションを見つけます。 ここで、アプリケーション パスワードの名前を指定します。これは、後で Python アプリ リクエストを認証し、REST API を使用するために使用します。

アプリケーション パスワード プラグイン ダッシュボード。
アプリケーション パスワード ページ。

Add New Application Password をクリックして、WordPress がランダムな 24 文字のパスワードを生成できるようにします。

Application Passwords プラグインによって生成された新しいパスワード。
新しいアプリケーション パスワード ページ。

次に、このパスワードをコピーして、後で使用できるように安全な場所に保存します。 このページを閉じると、このパスワードを取得できなくなります。

最後に、パーマリンクを構成する必要があります。 WordPress では、パーマリンクとアーカイブ用のカスタム URL 構造を作成できます。 たとえば、「初めての WordPress Web サイト」というタイトルの WordPress 投稿が、直感的な URL https://your-website.local:port/your-first-wordpress-website/ からアクセスできるように変更してみましょう。 このアプローチには、使いやすさや美観の向上など、いくつかの利点があります。

パーマリンクを設定するには、 [設定]セクションを展開し、[パーマリンク] メニューをクリックします。 ここで、 Common SettingsPost nameに変更します。

WordPress のパーマリンク設定を変更します。

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

次に、アプリケーション メニューが表示されます。

WordPress に接続された Python アプリを起動します。
Python アプリケーション メニュー。

次に、オプション 1 を試して Python アプリが取得する投稿のリストを表示し、オプション 2 で投稿を選択します。

オプション 1 を試して Python アプリが取得する投稿のリストを表示し、オプション 2 を試して投稿を選択してください。
投稿リストとユーザーが選択した単一の投稿を表示する Python アプリ。

コードで投稿を作成する

Python で WordPress 投稿を作成するには、まずwordpress_api_helper.pyファイルを開き、 create_post関数を追加します。

ダウンタイムや WordPress の問題に悩まされていませんか? Kinstaは、時間を節約するために設計されたホスティングソリューションです! 私たちの機能をチェックしてください
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 で新しい投稿を作成します。

Python で WordPress 投稿を作成する。
新しく作成された WordPress 投稿を表示する Python アプリ。

オプション 1 をもう一度選択すると、新しく追加された投稿の ID とタイトルが返されます。

新しく追加された投稿の ID とタイトルを返します。
新しい投稿のタイトルと ID を返す Python アプリ。

WordPress Web サイトを開いて、新しい投稿を表示することもできます。

ブラウザーで新しく作成された投稿。
新しい WordPress 投稿のブラウザー画像。

コードで投稿を更新する

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、タイトル、コンテンツを渡して既存の投稿を更新します。

WordPress の投稿を更新しています。
更新されたメニューを表示する Python アプリ。

オプション 2 を選択し、更新された投稿 ID を渡すと、新しく追加された投稿の詳細が返されます。

新しく更新された投稿の詳細を返します。
更新された投稿を表示する Python アプリ。

コードで投稿を削除する

投稿 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 の既存の投稿を削除します。

Python アプリで WordPress の投稿を削除する。
選択した投稿の削除を示す Python アプリ。

注: [投稿を一覧表示] オプションを実行すると、削除された投稿が引き続き表示される場合があります。

Python アプリのリストの投稿。
元の投稿リストを表示する Python アプリ。

投稿を削除したことを確認するには、数秒待ってから [投稿の一覧] オプションをもう一度試してください。 以上です!

概要

WordPress REST API と Python の HTTP クライアント ライブラリのおかげで、Python アプリと WordPress は連携して相互に通信できます。 REST API の利点は、WordPress を Python アプリからリモートで操作できることです。Python の強力な言語により、目的の構造と頻度に従う自動コンテンツ作成が可能になります。

DevKinsta を使用すると、ローカルの WordPress サイトをすばやく簡単に作成および開発できます。 WordPress のテーマとプラグインを開発するためのローカル環境を提供し、Docker ベースの自己完結型インストール モデルのおかげで簡素化された展開モデルを提供します。

Python と WordPress を使った経験は何ですか?

その経験を拡張する準備ができたら、WordPress REST API の基本の完全なガイドを読んで、他の可能性を探ることができます。