循环中的get_the_foo()-它是否执行另一个查询?

时间:2015-02-19 作者:Ben

我不清楚get_the_foo() 例如,函数的样式get_the_permalink().

我的主要问题是:在循环中执行此操作时,是否会执行另一个SQL查询(除了原始SQL查询之外WP_Query())?

但是:如果自己执行,例如。get_the_permalink($someId), 执行查询,对吗?

2 个回复
最合适的回答,由SO网友:Milo 整理而成

帖子、术语和元数据的查询结果将放置在缓存中。如果调用的函数访问同一请求中以前查询的对象中的数据(或者您使用的是跨请求维护数据的持久缓存机制),它将不会触发另一个查询,而是从缓存中提取数据。

SO网友:Howdy_McGee

似乎是的,这取决于它是否创建新查询。正如米洛在回答中指出的那样,WordPress使用的是缓存系统。函数堆栈如下所示:

get_the_permlink() 呼叫get_permalink() 呼叫get_post() 当给帖子ID时,它会执行以下操作:

$_post = WP_Post::get_instance( $post ); 看起来像:

/**
 * 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 );
}
在这个get_instance() 函数检查是否可以找到$post_idposts 缓存,如果有,则does not 需要实际查询数据库。但我不确定这是否算作次要查询或主要查询。

有时你可以在get_{$field}() 通过访问对象本身来实现函数,但我认为使用它们不会带来巨大的性能差异。MYSQL的速度很快,功能也很强大,所以我不会认为它是一件坏事或是一件值得远离的事情。

结束

相关推荐

为什么全局$wp_Query没有被挂钩?

我有一个插件,可以帮助我在自定义帖子类型的帖子上进行延迟加载。其想法是向template\\u redirect/init添加一个操作,并从全局$wp\\u查询中获取数据,以使jquery了解需要进行多少加载插件php文件如下所示:function pbd_alp_init() { global $wp_query; // Add code to index pages. if( !is_singular() ) { // can i select