WP REST APIカスタムエンドポイントでPythonからデータを登録する方法

WordPress

前回まで数回にわたって、財務データを表示するアプリをWordPressで構築する方法を紹介しました。

今回は、関連して、そこで作成したデータベースにPythonからカスタムエンドポイントでデータを追加する方法を紹介します。

概要

PythonからWordPressにデータを登録する処理にはAPIが使用できます。
大きくAPIにはXMLRPCとREST APIがあります。

今回は、REST APIを使って、カスタムエンドポイントを作成し、データベースにデータを登録する方法を紹介します。

XMLRPCの場合は、以下の記事で紹介しています。

認証方法

REST APIにはいくつかの認証方法があります。
今回は、JWTに対応したコードを書きます。

認証については、詳しくは以下を確認して、トークンを取得してください。

WordPressでの設定

まずは、WordPress側でカスタムエンドポイントを作成する必要があります。

functions.phpに以下を追加します。

function register_financial_data_endpoint() {
    register_rest_route('financial/v1', '/add/', array(
        'methods' => 'POST',
        'callback' => 'add_financial_data',
        'permission_callback' => function () {
            return current_user_can('manage_options'); // 管理者のみが利用可能
        },
    ));
}
add_action('rest_api_init', 'register_financial_data_endpoint');

function add_financial_data(WP_REST_Request $request) {
    global $wpdb;
    $table_name = $wpdb->prefix . 'financial_data';

    $data = $request->get_json_params();

    $wpdb->insert(
        $table_name,
        array(
            'docID' => $data['docID'],
            'date' => $data['date'],
            'secCode' => $data['secCode'],
            'filerName' => $data['filerName'],
            'EndDate' => $data['EndDate'],
            'sales' => $data['sales'],
            'gross_profit_loss' => $data['gross_profit_loss'],
            'operating_income_loss' => $data['operating_income_loss'],
            'ordinary_income_loss' => $data['ordinary_income_loss'],
            'net_income_loss' => $data['net_income_loss'],
            'parent_net_income_loss' => $data['parent_net_income_loss'],
            'operating_cf' => $data['operating_cf'],
            'investing_cf' => $data['investing_cf'],
            'financing_cf' => $data['financing_cf'],
            'assets' => $data['assets'],
            'liabilities' => $data['liabilities'],
            'current_assets' => $data['current_assets'],
            'current_liabilities' => $data['current_liabilities'],
            'net_assets' => $data['net_assets'],
            'shareholders_equity' => $data['shareholders_equity'],
            'retained_earnings' => $data['retained_earnings'],
            'short_term_debt' => $data['short_term_debt'],
            'long_term_debt' => $data['long_term_debt'],
            'corporate_taxes' => $data['corporate_taxes'],
            'sg_and_a' => $data['sg_and_a'],
            'depreciation' => $data['depreciation'],
            'interest_income_dividends' => $data['interest_income_dividends'],
            'interest_expenses' => $data['interest_expenses'],
            'per' => $data['per'],
            'shares_outstanding' => $data['shares_outstanding'],
            'dividend_per_share' => $data['dividend_per_share']
        ),
        array(
            '%s', '%s', '%s', '%s', '%s',
            '%f', '%f', '%f', '%f', '%f',
            '%f', '%f', '%f', '%f', '%f',
            '%f', '%f', '%f', '%f', '%f',
            '%f', '%f', '%f', '%f', '%f',
            '%f', '%f', '%f', '%f'
        )
    );

    return new WP_REST_Response('Data added successfully.', 200);
}

このコードは、カスタムエンドポイントを作成し、そのエンドポイントに渡されたデータをDBに登録するようになっています。

Pythonからカスタムエンドポイントを使用

作成したカスタムエンドポイントにPythonからアクセスします。
JWTのトークン取得が必要な場合はトークン取得します。(すでにJWTの設定は終わっている前提です。未設定の場合は、認証のところで紹介した記事を確認してください)

import requests

# トークンを取得
token_url = 'https://yourdomain.com/wp-json/jwt-auth/v1/token'
token_data = {
    'username': 'user',
    'password': 'pass'
}
token_response = requests.post(token_url, data=token_data)
token = token_response.json().get('token')
print(token)

token = 'JWTのトークン'
base_url = 'https://finance.yourdomain.com'
# データを追加する
api_url = f'{base_url}/wp-json/financial/v1/add/'
headers = {
    'Authorization': f'Bearer {token}',
    'Content-Type': 'application/json'
}

data = {
    'docID': '123',
    'date': '2024-08-30',
    'secCode': 'XYZ',
    'filerName': 'Company Name',
    'EndDate': '2024-12-31',
    'sales': 1000000.0,
    'gross_profit_loss': 500000.0,
    'operating_income_loss': 200000.0,
    'ordinary_income_loss': 150000.0,
    'net_income_loss': 100000.0,
    'parent_net_income_loss': 80000.0,
    'operating_cf': 120000.0,
    'investing_cf': -30000.0,
    'financing_cf': 20000.0,
    'assets': 2000000.0,
    'liabilities': 500000.0,
    'current_assets': 300000.0,
    'current_liabilities': 100000.0,
    'net_assets': 1500000.0,
    'shareholders_equity': 1200000.0,
    'retained_earnings': 500000.0,
    'short_term_debt': 50000.0,
    'long_term_debt': 150000.0,
    'corporate_taxes': 20000.0,
    'sg_and_a': 70000.0,
    'depreciation': 30000.0,
    'interest_income_dividends': 10000.0,
    'interest_expenses': 5000.0,
    'per': 15.0,
    'shares_outstanding': 100000.0,
    'dividend_per_share': 2.0
}

response = requests.post(api_url, json=data, headers=headers)

if response.status_code == 200:
    print('Data added successfully.')
else:
    print(f'Error adding data: {response.json()}')

これで登録が確認されれば成功です。phpMyadminなどで確認してください。

タイトルとURLをコピーしました