wordpress webアプリ python

WordPress Webアプリ開発におけるPythonの活用方法

本記事では、WordPressのWebアプリケーション開発においてPythonをどのように活用できるかについて解説します。Pythonの強力なライブラリやフレームワークを用いて、WordPressサイトの拡張性や機能を向上させる方法を探ります。

この記事では、WordPress REST APIとPythonを使ってWordPressサイトを操作する方法を学び、Pythonスキルを向上させることを目指します。Pythonを使ってWordPressの投稿を取得、作成、更新、削除する方法をステップバイステップで解説し、サンプルコードも提供します。

WordPressのインストールと設定

WordPressとPythonの連携を学ぶ前に、まずはWordPressのローカル環境を構築する必要があります。ここでは、DevKinstaという便利なツールを使って、WordPressを簡単にインストールし、必要な設定を行う手順を説明します。

DevKinstaとは

DevKinstaは、Kinstaが提供する無料のローカルWordPress開発スイートです。Dockerをベースに構築されており、Windows、Mac、Linuxで利用できます。DevKinstaを使うことで、サーバーのアカウント作成やドメインの購入といった手間をかけずに、WordPressサイトをローカル環境に構築できます。

DevKinstaのインストール

  1. Docker Engineをダウンロードし、インストールします。

  2. DevKinstaの公式サイトから、お使いのOSに対応したパッケージをダウンロードします。

  3. ダウンロードしたインストーラを実行し、画面の指示に従ってインストールを進めます。

WordPressサイトの作成

DevKinstaのインストールが完了したら、WordPressサイトを作成しましょう。

  1. DevKinstaを起動し、「新規サイト作成」メニューから「新規WordPressサイト」を選択します。

  2. WordPress管理者アカウントのユーザー名、パスワード、メールアドレスを設定します。

  3. 「サイトの作成」ボタンをクリックすると、WordPressサイトが作成されます。

SSL/HTTPSの有効化

セキュリティ強化のため、ウェブサイトのSSL/HTTPSを有効化しましょう。

  1. DevKinstaのサイト情報パネルから、「SSLとHTTPS」タブを選択します。

  2. 「HTTPSを有効にする」ボタンをクリックします。

パーマリンクの設定

パーマリンクは、WordPressの投稿や固定ページにアクセスするためのURLです。ここでは、Pythonで投稿を取得する際にエラーが発生しないよう、パーマリンクの設定を変更します。

  1. WordPress管理画面にログインします。

  2. 「設定」>「パーマリンク設定」をクリックします。

  3. 「共通設定」を「投稿名」に変更し、「変更を保存」ボタンをクリックします。

Application Passwordsの設定

WordPress REST APIにアクセスするには、認証情報が必要です。ここでは、Application Passwordsを使って、PythonアプリからWordPress REST APIにアクセスするためのパスワードを生成します。

  1. WordPress管理画面で、「プラグイン」>「新規追加」をクリックします。

  2. 検索窓に「Application Passwords」と入力し、Enterキーを押します。

  3. 「Application Passwords」プラグインをインストールし、有効化します。

  4. 「ユーザー」>「ユーザー一覧」をクリックします。

  5. 管理者ユーザーの「編集」をクリックします。

  6. プロフィールページをスクロールダウンし、「Application Passwords」セクションを見つけます。

  7. アプリケーションパスワードの名前を入力し、「Add New Application Password」ボタンをクリックします。

  8. 生成されたパスワードをコピーし、安全な場所に保存します。

Pythonを使ってWordPressサイトを操作する方法

WordPressのローカル環境が構築できたら、Pythonを使ってWordPressサイトを操作するための準備を行いましょう。

Python仮想環境の作成

プロジェクトごとに独立したPython環境を作るために、仮想環境を作成します。

  1. プロジェクト用のディレクトリを作成します(例:PythonWordPress)。

  2. ターミナルで、作成したディレクトリに移動します。

  3. 以下のコマンドを実行して、仮想環境を作成します。\

python3 -m venv .venv

仮想環境の有効化

作成した仮想環境を有効化します。

  • Windows:

.venv\Scripts\activate
  • Mac/Linux:

source .venv/bin/activate

必要なパッケージのインストール

WordPress REST APIとやり取りするために必要なパッケージをインストールします。

pip install python-dotenv aiohttp

  • python-dotenv: .envファイルから環境変数を読み込むために使用します。

  • aiohttp: 非同期HTTPクライアント/サーバーライブラリです。

環境変数の設定

WordPressのURL、APIユーザー名、APIパスワードを環境変数として設定します。プロジェクトディレクトリに.envファイルを作成し、以下の内容を記述します。

WEBSITE_URL="http://your-website.local:8080"  # DevKinstaで表示されるURLに置き換えてください
API_USERNAME="your_username"  # WordPressのユーザー名に置き換えてください
API_PASSWORD="your_password"  # 生成したApplication Passwordに置き換えてください

基本的なPythonコード

コンソールメニューを表示し、ユーザーからの入力を受け付けるためのPythonコードを作成します。app.pyというファイルを作成し、以下のコードを記述します。

import asyncio

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',
}

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...')
            await get_all_posts()
        elif option == 2:
            print('Retrieving a post...')
            id = input_number('Enter the post id: ')
            await get_post(id)
        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}")
        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}")
        elif option == 5:
            print('Deleting a post...')
            id = input_number('Enter the post id: ')
            await delete_post(id)
        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())

コードで投稿を取得する

Pythonを使ってWordPressの投稿を取得する方法を学びましょう。

wordpress_api_helper.pyの作成

WordPress REST APIとのやり取りを行うためのヘルパー関数を作成します。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("=====================================")

get_all_posts関数

get_all_posts関数は、WordPressのすべての投稿を取得します。

  • aiohttp.ClientSessionを使って、HTTPセッションを開始します。

  • session.getメソッドを使って、/wp-json/wp/v2/postsエンドポイントにGETリクエストを送信します。

  • レスポンスのステータスコードと本文を表示します。

  • レスポンス本文をJSONとしてパースし、投稿のリストを取得します。

  • 各投稿のIDとタイトルを表示します。

get_post関数

get_post関数は、指定されたIDの投稿を取得します。

  • aiohttp.ClientSessionを使って、HTTPセッションを開始します。

  • session.getメソッドを使って、/wp-json/wp/v2/posts/{id}エンドポイントにGETリクエストを送信します。

  • レスポンスのステータスコードと本文を表示します。

  • レスポンス本文をJSONとしてパースし、投稿データを取得します。

  • 投稿のID、タイトル、コンテンツを表示します。

投稿の取得

app.pyを実行し、メニューから「List Posts」または「Retrieve a Post」を選択することで、投稿を取得できます。

コードで投稿を作成する

Pythonを使ってWordPressに新しい投稿を作成する方法を学びましょう。

create_post関数の追加

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}')

create_post関数の解説

  • aiohttp.ClientSessionを使って、HTTPセッションを開始します。

  • session.postメソッドを使って、/wp-json/wp/v2/postsエンドポイントにPOSTリクエストを送信します。

  • authパラメータにaiohttp.BasicAuthオブジェクトを渡し、認証情報を設定します。

  • contenttitleパラメータに、投稿のコンテンツとタイトルを設定します。

  • statusパラメータをpublishに設定することで、投稿を公開状態にします。

  • レスポンスのステータスコードと本文を表示します。

  • レスポンス本文をJSONとしてパースし、新規作成された投稿のIDを取得します。

  • 新規作成された投稿のIDを表示します。

投稿の作成

app.pyを実行し、メニューから「Create a Post」を選択することで、新しい投稿を作成できます。

コードで投稿を更新する

Pythonを使って既存のWordPress投稿を更新する方法を学びましょう。

update_post関数の追加

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'Post with id {post_id} updated successfully.')

update_post関数の解説

  • aiohttp.ClientSessionを使って、HTTPセッションを開始します。

  • session.postメソッドを使って、/wp-json/wp/v2/posts/{id}エンドポイントにPOSTリクエストを送信します。

  • authパラメータにaiohttp.BasicAuthオブジェクトを渡し、認証情報を設定します。

  • contenttitleパラメータに、更新後の投稿のコンテンツとタイトルを設定します。

  • statusパラメータをpublishに設定することで、投稿を公開状態にします。

  • レスポンスのステータスコードと本文を表示します。

  • レスポンス本文をJSONとしてパースし、更新された投稿のIDを取得します。

  • 更新された投稿のIDを表示します。

投稿の更新

app.pyを実行し、メニューから「Update a Post」を選択することで、既存の投稿を更新できます。

コードで投稿を削除する

Pythonを使ってWordPressの投稿を削除する方法を学びましょう。

delete_post関数の追加

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.')

delete_post関数の解説

  • aiohttp.ClientSessionを使って、HTTPセッションを開始します。

  • session.deleteメソッドを使って、/wp-json/wp/v2/posts/{id}エンドポイントにDELETEリクエストを送信します。

  • authパラメータにaiohttp.BasicAuthオブジェクトを渡し、認証情報を設定します。

  • レスポンスのステータスコードと本文を表示します。

  • レスポンス本文をJSONとしてパースし、削除された投稿のIDを取得します。

  • 削除された投稿のIDを表示します。

投稿の削除

app.pyを実行し、メニューから「Delete a Post」を選択することで、投稿を削除できます。

まとめ

この記事では、WordPress REST APIとPythonを使って、WordPressサイトを操作する方法を学びました。Pythonを使って投稿を取得、作成、更新、削除する方法を理解し、サンプルコードを通して実践的なスキルを習得できたはずです。

WordPress REST APIとPythonを組み合わせることで、WordPressサイトの自動化や外部アプリとの連携など、様々な可能性が広がります。ぜひ、これらの知識を活かして、WordPressを使ったWebサイト制作やアプリケーション開発に挑戦してみてください。

DevKinstaについて

DevKinstaは、WordPressのローカル環境構築を簡単にするだけでなく、テーマやプラグインの開発にも役立つツールです。Dockerベースの自己完結型のインストールモデルを採用しており、デプロイメントも容易です。WordPress開発を効率化したい方は、ぜひDevKinstaを試してみてください。

PythonとWordPressの連携について

PythonとWordPressを組み合わせた経験はありますか?コメント欄でぜひ共有してください。

Pythonとは何か?

Pythonは使いやすく、読みやすいプログラミング言語であり、さまざまなアプリケーションの開発において広く利用されています。特にデータサイエンスやWeb開発、機械学習分野での人気が高いです。

参考文献: Real Python - Python Web Apps with Flask

よくある質問

Q1: Pythonを使うとどのようなメリットがありますか?

A1: Pythonはシンプルで強力な言語であり、データ解析や自動化に適しているため、WordPressの拡張性を高めることができます。

Q2: WordPressとPythonの連携は簡単ですか?

A2: はい、WordPressはREST APIを提供しており、PythonからHTTPリクエストを送信することで簡単に連携できます。

Q3: プラグイン開発にはどのような知識が必要ですか?

A3: PHPの知識が必要ですが、Pythonスクリプトを呼び出す方法を使えば、Pythonを活用することができます。

その他の参考記事:wordpress プログラミング