WordPress的setup_postdata($post)与PartialObject

Categories: Development NotesWordPress; Tagged with: ; @ July 18th, 2010 0:33

如果谈绿色, 谈低碳, 那我们公司做的, 那叫一个环保集约, 举例来说: 几乎所有的数据load, 都是lazy的(PartialObject). 譬如:

你要显示一个新闻列表, 那数据库发来得只有连接给标题, 没有内容啊 附件啊, 等你要打开显示详情了, 再去load. 出于这么一个环保节约的理念, 今天在研究Wordpress文档时惊讶的发现, 哇, wp也很环保呀, 试看:

Some post-related data is not available to get_posts by default, such as post content through the_content(), or the numeric ID. This is resolved by calling an internal function setup_postdata(), with the $post array as its argument.

我们天真的以为wp也很环保啊, 我英文也不球行, 以为是lazy的, 于是在只想做个新闻列表的时候不想load content. 但是来回翻了几遍代码, 发现没有处理PartialObject的地方!

我们老板比较熟悉PHP, 在qury.php中发现了猫腻, 加了个debug打印, 抓图奉上:

image 

请看仔细: 是Select wp_posts.*, 也就是说, 虽然只想打印一个Recent Posts, 但从数据库load的时候, 你会load他的标题, 作者, 时间, 内容(MySql类型为: longtext) — 当然这只是从数据库load到服务器, 并不一定直接表现在网页上, 但在如果流量极大的情况下, 如此频繁并剧烈的Select, 相比会大大延缓速度.

如果wp一直这样load数据, 那必须得用cache了.

也就是说, 数据是一次load全部的, setup_postdata($post)只是设定值,而不是读取完整的对象,

对于get_posts()后, 取得post Attribute的方法:

文档中要求:

1。 要使用形如get_the_ID(), get_the_title()等方法, 需要先进行setup_postdata($post)

2。 或者直接使用形如: $post->ID, (注意Column名要写对)

从此处推理或从代码中搜索亦可印证: setup_postdata($post)作用只是对数据库读取的值进行处理,以便使用get_the_ID()等方式直接获取Attribute.

 

对于普通用户来讲:

用越多的Recent, Related, Random的Post会成倍增加SELECT的数量与对数据库的压力(当然, 前提是你博客流浪巨大的情况下, 如果只是跟本站一般低迷, 就不需要考虑这么多了)

 

废话一句: qury.php里的method好长啊



// Proudly powered by Apache, PHP, MySQL, WordPress, Bootstrap, etc,.