私のプラグインでは、データベースからオプションを取得するために次のコードを使用します。
$options = get_option('my_plugin_options');
プラグインのさまざまな機能でこれを10回使用すると、WordPressはデータベースに対して10回のクエリを実行するのですか、それともHTTPリクエストごとに1回のデータベース呼び出しのみを実行して結果をキャッシュするのですか?
疑問がある場合は、ソースコードを見てください。
get_option()
を掘り下げると、(省略形)が表示されます。
$value = wp_cache_get( $option, 'options' );
if ( false === $value ) {
$row = $wpdb->get_row( $wpdb->prepare( "SELECT option_value FROM $wpdb->options WHERE option_name = %s LIMIT 1", $option ) );
// Has to be get_row instead of get_var because of funkiness with 0, false, null values
if ( is_object( $row ) ) {
$value = $row->option_value;
wp_cache_add( $option, $value, 'options' );
} else { // option does not exist, so we must cache its non-existence
$notoptions[$option] = true;
wp_cache_set( 'notoptions', $notoptions, 'options' );
return apply_filters( 'default_option_' . $option, $default );
}
}
まず、WordPressはすでにメモリにオプションがあるかどうかを確認します。デフォルトでは、wp_cache_get()
はインメモリデータストア(通常は単にPHP変数)から値を取得します。しかし、インストールによっては、データを他の場所に格納する、より高度なオブジェクトキャッシュを使用するものがあります。
どちらの場合でも、WordPressがすでにそれを知っている場合、wp_cache_get()
はあなたのオプション値を返します。
そうでなければ、WordPressはデータベースからそれを取得しようとします。オプションがDBに存在する場合、WordPressはそれをメモリにキャッシュしてから戻し、それ以降の検索を高速にします。
そのオプションがデータベースに存在しない場合、WordPressはそれを内部の「これらのオプションは存在しない」配列にフラグを立てて、後で調べようとせずに代わりにデフォルト値を返します。
それで、あなたの最初の質問に答えるために:
プラグインのさまざまな機能でこれを10回使用すると、WordPressはデータベースに対して10回のクエリを実行するのですか、それともHTTPリクエストごとに1回のデータベース呼び出しのみを実行して結果をキャッシュするのですか?
WordPressはHTTPリクエストごとに1回データベース呼び出しを行い、結果をキャッシュします。
はい、それはキャッシュされています。関数のソースを見てください。バックグラウンドでwp_load_alloptions()
を呼び出してすべてのオプションを取得し、その関数が結果をキャッシュに追加します。
wp_cache_add( 'alloptions', $alloptions, 'options' );
WP_Object_Cache
のクラスwp-includes/cache.php
を見ると、すべてのプラグインがパブリックメソッドflush()
を呼び出すことが可能です。
この場合、オプション値はもうキャッシュされず、get_option()
は新しいデータベース検索を引き起こします。プラグインはこれを行うべきではありませんが、あなたが影響を受けていないことを確実にするために、直接キャッシュを呼び出さず、常にget_option()
のみを使用してください。