WordPress Get Post by Slug(post_name)

Categories: Development NotesPHPWordPress; Tagged with: ; @ July 19th, 2010 20:43

需求: 依照Slug获得Post.

解决方案: API只有getPost(by ID), 我们要创建一个getPostBySlug. (Slug具有唯一性, 可参见表wp_posts,post_name 及有关代码)

(more…)

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好长啊

在外部使用WordPress API

Categories: Development NotesWordPress; Tagged with: ; @ July 17th, 2010 23:35

用Wordpress这么久了, 从没看过文档也没用过API. 近期有如此需求, 譬如说我站内已有一个网站, 另有一个Wordpress, 两个都在一个主机上, 我希望在WordPress之外使用其API, 显示文章列表啊什么的.

发现有如下之参考: see: http://www.webopius.com/content/139/using-the-wordpress-api-from-pages-outside-of-wordpress

在php文档一开头就声明:

<?php define('WP_USE_THEMES', false); ?>
<?php require('wp-blog-header.php');?>

此后, WordPress API可用.

的确可用.

但今天在讨论Wordpress读取post的SQL时对qury进行了debug, 发现, 只要include/require了 wp-blog-heard.php就会立马辗转Call一下Classes.query_posts(), 先查询10个post再说.

分析后发现不可引用wp-blog-heard.php, 转而引用:wp-load.php就够.

因此, 如果需要在站外使用API, php声明:

define('WP_USE_THEMES', false);
require 'C:\xampp\htdocs\wp\wp-load.php'; // instead of wp-blog-header.php



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