get_the_foo () en el bucle - ¿realiza otra consulta?

2

No tengo claro el estilo de funciones get_the_foo() , por ejemplo, get_the_permalink() .

Mi pregunta principal es: cuando esto se realiza en The Loop, ¿se ejecuta otra consulta SQL (además del WP_Query() original)?

Pero: si se realiza por sí mismo, por ejemplo. get_the_permalink($someId) , se ejecuta una consulta , ¿correcto?

    
pregunta Ben 19.02.2015 - 20:59

2 respuestas

3

Los resultados de la consulta para las publicaciones, los términos y los metadatos se colocan en el caché. Si se llama a una función que accede a datos de objetos consultados previamente dentro de la misma solicitud (o si está usando un mecanismo de caché persistente que mantiene los datos en todas las solicitudes), no activará otra consulta y en su lugar recuperará los datos de la caché.

    
respondido por el Milo 19.02.2015 - 22:11
3

Parece que sí depende de si crea una nueva consulta o no. Como Milo ha señalado en su respuesta, WordPress utiliza un sistema de almacenamiento en caché. La pila de funciones se ve así:

get_the_permlink() llama a get_permalink() llama a get_post() que, cuando se le da una publicación ID hace esto:

$_post = WP_Post::get_instance( $post ); que se ve así:

/**
 * Retrieve WP_Post instance.
 *
 * @static
 * @access public
 *
 * @param int $post_id Post ID.
 * @return WP_Post|bool Post object, false otherwise.
 */
public static function get_instance( $post_id ) {
        global $wpdb;
        $post_id = (int) $post_id;
        if ( ! $post_id )
                return false;
        $_post = wp_cache_get( $post_id, 'posts' );
        if ( ! $_post ) {
                $_post = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM $wpdb->posts WHERE ID = %d LIMIT 1", $post_id ) );
                if ( ! $_post )
                        return false;
                $_post = sanitize_post( $_post, 'raw' );
                wp_cache_add( $_post->ID, $_post, 'posts' );
        } elseif ( empty( $_post->filter ) ) {
                $_post = sanitize_post( $_post, 'raw' );
        }
        return new WP_Post( $_post );
}

En esta función get_instance() verifica si puede encontrar $post_id en el caché posts , si lo hace, no necesita consultar la base de datos. No estoy seguro si esto cuenta para consultas secundarias o consultas principales sin embargo.

A veces, puedes sortear algunas de las funciones get_{$field}() accediendo al objeto en sí, pero creo que nunca verás una gran diferencia de rendimiento al usarlas. MYSQL es bastante rápido y poderoso, por lo que no los consideraría una cosa mala o algo de lo que me mantenga alejado.

    
respondido por el Howdy_McGee 19.02.2015 - 21:35

Lea otras preguntas en las etiquetas