web-dev-qa-db-ja.com

カスタムテーブルで$ wpdb-> prefixを使うことは必須ですか?

この質問が簡単な場合は申し訳ありません。私はWordPressでプラグインを開発し始めたところです。

私がこれを見つけたすべてのチュートリアルで:カスタムテーブルを作成する間、$wpdb->prefixが使われます。

例:

$table_name = $wpdb->prefix . "liveshoutbox";

私の質問:

$wpdb->prefixの使用は必須ですか?カスタムテーブルにプレフィックスを使用しないとどうなりますか?

15
newbie

強制されていませんが、必須です。

2つのWordpressサイトが同じデータベースに設定されているシナリオを検討してください。 1つは接頭辞wp_、もう1つはwp2_です。両方のサイトにプレフィックスを付けてプラグインをインストールした場合、作成されるテーブルは最初のサイトの場合はwp_liveshoutbox、2番目のサイトの場合はwp2_liveshoutboxになります。しかし、接頭辞を省略すると、両方のサイトがliveshoutboxという名前の同じテーブルを使用し、全体が分割されます。

21
sakibmoon

次の点を考慮してください。

あなたのプラグインはワードプレスネットワークで使われていて、それはサイトごとに異なるテーブルプレフィックスを使います。あなたのプラグインは、すべて同じデータベース内の836の異なるサイトで同時に実行することができます。 wp_385677_liveshoutboxは完全に合理的なテーブル名です。

あなたのプラグインは何らかのセキュリティの概念を持っているユーザーによってインストールされ、システムにselect * from wp_usersを注入しようとするブロックボットにテーブルプレフィックスを変更しました。たとえ彼らが新しい脆弱性を見つけたとしてもそれは機能しません。

ハードコーディングされたテーブル名のようにショートカットを作成することは、製品を稼働させるための良い方法ですが、リリースするための良い方法ではありません。非常に短い時間で、プラグインはそれに「うまくいかない」コメントの山を持つでしょう、最悪の場合、あなたは他の誰かのサイトを壊すでしょう。

複雑なクエリがあり、'select foo from ' . $wpdb->prefix . '_mytable left join ' . $wpdb->prefix . '_mytablemeta on ' . $wpdb->prefix . '.ID = ' . $wpdb->prefix . '.meta_id ....を書くという苦痛に対処したくないのであれば、代わりのものを使用できます。例えば:

$query = 'select foo from %table% left join %meta% on %table%.ID = %meta%.meta_id ... ';

$change = array (
    '%table%' => $wpdb->prefix . '_mytable',
    '%meta%'  => $wpdb->prefix . '_mytablemeta'
    );


$sql = str_replace( array_keys( $change ), array_values( $change ), $query );

$results = $wpdb->get_results( $sql );

Wordpressは絶えず変化しています。今日「うまくいく」ことは明日はうまくいかないかもしれません。だからこそ、API関数があります。 Wordpressの開発者は、パブリックAPIの動作が一貫していることを確認します(または機能を低下させます)。内部的なメソッド呼び出しを使い始めると、それが「速い」ので、通常あなたに噛み付くようになります。ソフトウェアには、ほんのわずかなショートカットがあります - それらは、必要な作業を今から後で移動させるだけで、クレジットカードの「後で」のように、通常より多くの費用がかかります。

4
paul