WordPress:wpdb::tablesへの自作テーブル追加は必要?

WordPress:wpdb::tablesへの自作テーブル追加は必要?

WordPress で自作テーブルを使う場合に wp-includes/wp-db.php を書き換えたり、wp-content/db.php で上書きする必要があるとの記事がありますが、これって必要ですか?

01wp-includes/wp-db.php は廃止

「wordpress 自作 データベース」などでググってみてください。

2021、22年ごろの記事が多いようですので WordPress のバージョンの違いもあるかもしれませんが、自作データベースの操作に wp-includes/wp-db.php を書き換えたり、wp-content/db.php で上書きする必要はないと思いますがどうなんでしょう。

バージョン 6.6.1 の wp-includes/wp-db.php です。

<?php
/**
 * WordPress database access abstraction class.
 *
 * This file is deprecated, use 'wp-includes/class-wpdb.php' instead.
 *
 * @deprecated 6.1.0
 * @package WordPress
 */

if ( function_exists( '_deprecated_file' ) ) {
	// Note: WPINC may not be defined yet, so 'wp-includes' is used here.
	_deprecated_file( basename( __FILE__ ), '6.1.0', 'wp-includes/class-wpdb.php' );
}

/** wpdb class */
require_once __DIR__ . '/class-wpdb.php';

まず、バージョン 6 から wp-db.php は廃止されて class-wpdb.php に変更されています。

02wp-includes/class-wpdb.php

wp-includes/class-wpdb.php を見てみますと、WordPress でデータベースを扱う際に使われるグローバル変数 $wpdb の定義クラスです。

	/**
	 * List of WordPress per-site tables.
	 *
	 * @since 2.5.0
	 *
	 * @see wpdb::tables()
	 * @var string[]
	 */
	public $tables = array(
		'posts',
		'comments',
		'links',
		'options',
		'postmeta',
		'terms',
		'term_taxonomy',
		'term_relationships',
		'termmeta',
		'commentmeta',
	);

確かに、class-wpdb.php の284行目に WordPress が使っているテーブル名が入った変数 $tables が定義されています。この変数に自作テーブルを追加しろという記事なんですが、ただ、この $tables がデータベース操作に使われている気配ありません。もちろん

<?php
global $wpdb;
print_r($wpdb->tables);

とすれば、テーブル名が配列で表示されます。

この class-wpdb.php 以外を見ていませんので他でどのように使われているかまではわかりませんが、一般的にベータベース操作で使う関数 get_results, get_row, get_var, insert, update, delete などは class wpdb 内の関数であり、そこでこの変数 $tables は使われていません。実際、私はいくつか自作テーブルを使っていますが、そのテーブル名を $tables に追加したことはありませんし、問題なくそのテーブルにアクセスできています。

03SQL インジェクション対策

ところで、データベースを操作する場合は、SQL インジェクション対策としてクエリを prepare 関数を通せということがしきりに言われます。

$wpdb->prepare(
    "SELECT * FROM `table` WHERE `column` = %s AND `field` = %d OR `other_field` LIKE %s",
    array( 'foo', 1337, '%bar' )
);

$wpdb->prepare(
    "SELECT DATE_FORMAT(`field`, '%%c') FROM `table` WHERE `column` = %s",
    'foo'
);

リンク先のサンプルです。たとえば、こういうことです。

で、この際ということで、wp-includes/class-wpdb.php を少し読んでみましたら、insert, update, delete は内部で prepare を通して query に送っています。

get_results, get_row, get_var はクエリをチェックした後すぐに query に送っていますので preapre を通すのは必須ですね。

自作テーブルでググりますと上位に表示される記事に記載がありましたので調べてみました。