¿La función get_option está en caché?

13

En mi complemento, uso el siguiente código para recuperar una opción de la base de datos:

$options = get_option('my_plugin_options');

Si uso esto 10 veces en varias funciones de mi complemento, ¿WordPress realiza 10 consultas a la base de datos, o solo realiza 1 llamada a la base de datos por solicitud HTTP y almacena en caché los resultados?

Ben Miller - Restablece a Monica
fuente

Respuestas:

25

En caso de duda, mire el código fuente.

Profundizando en get_option(), verá (abreviado):

 $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 );
    }
}

Primero, WordPress verifica si ya tiene la opción en la memoria. Por defecto, wp_cache_get()recuperará valores de un almacén de datos en memoria (generalmente solo una variable PHP). Pero algunas instalaciones utilizan un caché de objetos más avanzado que almacena los datos en otro lugar.

En cualquier caso, wp_cache_get()devolverá el valor de su opción si WordPress ya lo sabe.

De lo contrario, WordPress intentará obtenerlo de la base de datos. Si la opción existe en la base de datos, WordPress la almacenará en la memoria caché y luego la devolverá, haciendo que las búsquedas posteriores sean más rápidas.

Si la opción no existe en la base de datos, WordPress la marca en una matriz interna "estas opciones no existen" para que no intente buscarla más tarde y devuelva algún valor predeterminado.

Entonces, para responder a su pregunta original:

Si uso esto 10 veces en varias funciones de mi complemento, ¿WordPress realiza 10 consultas a la base de datos, o solo realiza 1 llamada a la base de datos por solicitud HTTP y almacena en caché los resultados?

WordPress realizará 1 llamada a la base de datos por solicitud HTTP y almacenará en caché los resultados.

EAMann
fuente
2

Sí, está en caché. Mira la fuente de la función. Llama wp_load_alloptions()en segundo plano, para buscar todas las opciones, y esa función agrega el resultado al caché:

wp_cache_add( 'alloptions', $alloptions, 'options' );

Si observa la clase WP_Object_Cacheen wp-includes/cache.php, verá, es posible que cada complemento llame al método público flush().

En este caso, el valor de la opción ya no se almacena en caché y get_option() desencadenará una nueva búsqueda en la base de datos. Los complementos no deberían hacer esto, pero para asegurarse de que no se ve afectado, no llame a la memoria caché directamente, siempre use solo get_option().

fuxia
fuente
Además, las opciones que no se cargan automáticamente se almacenarán en caché después de la primera vez que las busque. Vea mi respuesta para una descripción completa.
EAMann
@EAMann Correcto, lo edité.
fuxia