2026年6月23日

2026年6月23日

WordPressのwpdbクラスを使ってSQLを実行する方法

はじめに

WordPressのカスタマイズや機能拡張を行う際、標準で提供されているAPIだけでは実現できないことがしばしばあります。そのような場合、wpdbクラスを利用して直接データベースにSQL文を発行することが有効です。この記事では、wpdbクラスを使用してSQL文を実行する方法と、その際に注意すべき点について詳しく解説します。

症状・背景

このテーマが必要になる主な場面:

  • 特定のテーブルに対して複雑なクエリを実行したい場合
  • WordPress標準のAPIではカバーできないデータ操作を行う必要がある場合
  • カスタムプラグインやテーマ内で高度なデータベース処理を実装する必要がある場合

手順・設定方法

ステップ1: プロジェクトのセットアップとwpdbオブジェクト取得

# WordPressの初期化が完了した後、wpdbクラスを使用可能にする
global $wpdb;

ステップ2: SQLクエリの実行

基本的なSELECTクエリの実行

# カスタムテーブルからデータを取得するSQL文を作成し、実行結果を格納します。
$results = $wpdb->get_results( "SELECT * FROM wp_my_table" );

INSERT文を使用したレコード追加

# 新しいレコードをカスタムテーブルに挿入するためのSQL文を作成し、実行結果を格納します。
$wpdb->insert(
    'wp_my_table', // テーブル名
    array( 
        'column1' => $value1,
        'column2' => $value2
    ), 
    array( '%s', '%d' ) // データの型(文字列と整数)
);

UPDATE文を使用したレコード更新

# カスタムテーブル内の特定のレコードを更新するためのSQL文を作成し、実行結果を格納します。
$wpdb->update(
    'wp_my_table', // テーブル名
    array( 
        'column1' => $new_value1,
        'column2' => $new_value2
    ), 
    array( 'id' => $record_id ) // 更新対象の条件(主キーなど)
);

ステップ3: セキュリティとパフォーマンスを考慮したSQLクエリの構築

プレースホルダーを使用したセキュアなSQL文作成

# クライアントからの入力値を安全に扱うために、プレースホルダーとパラメータ配列を使用します。
$wpdb->prepare(
    "SELECT * FROM wp_my_table WHERE column1 = %s AND column2 = %d",
    $value1,
    $value2
);

パフォーマンス向上のためのインデックス作成

# カスタムテーブルに対して効率的なクエリを可能にするために、必要なカラムにインデックスを作成します。
$wpdb->query( "CREATE INDEX idx_column1 ON wp_my_table (column1)" );

ステップ4: 失敗時のハンドリングとログ出力

# SQL実行エラーが発生した場合、例外をキャッチし、適切なエラーメッセージを記録します。
try {
    $wpdb->query( "INSERT INTO wp_my_table VALUES(...)" );
} catch (Exception $e) {
    error_log("Failed to execute query: " . $e->getMessage());
}

注意事項

  • <実践的な注意点1>: SQL文の実行前に必ずデータベーススキーマを確認し、必要に応じて適切な型指定を行うこと。
  • <実践的な注意点2>: データの取り扱いには十分注意し、特にDELETEやUPDATEクエリでは対象レコードを間違って削除したり更新したりしないようにすること。
  • <セキュリティ上の注意>: ユーザーからの入力値は必ずプレースホルダーを使用して安全に処理すること。SQLインジェクションなどのセキュリティリスクに対応します。
  • <パフォーマンス/運用上の注意>: 長時間実行されるような複雑なクエリを定期的に実行すると、データベースの負荷が高まる可能性があるため、適切に監視し最適化すること。

まとめ

1. SQL文の直接実行: WordPressではwpdbクラスを使用することで、直接SQL文を発行してカスタムテーブルや標準テーブルとやりとりすることができます。

2. セキュリティ対策: SQLインジェクションなどの攻撃からサイトを守るためには、プレースホルダーの使用が不可欠です。

3. パフォーマンス最適化: インデックスや最適なSQL文の使用により、データベース操作の速度を向上させることが可能です。

4. エラーハンドリングとログ記録: SQL実行時の問題を迅速に対処するためには、例外ハンドリングと適切なエラー情報の出力が重要です。

関連記事:

お気軽にご相談ください

お見積りへ お問い合わせへ