<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>WP CEO</title>
	<atom:link href="http://wpceo.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://wpceo.com</link>
	<description>强力驱动WordPress</description>
	<lastBuildDate>Tue, 07 Feb 2012 09:54:13 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>解决Youtube Shortcode无法使用问题</title>
		<link>http://wpceo.com/youtube-shortcode/</link>
		<comments>http://wpceo.com/youtube-shortcode/#comments</comments>
		<pubDate>Tue, 07 Feb 2012 09:53:45 +0000</pubDate>
		<dc:creator>neekey</dc:creator>
				<category><![CDATA[WordPress开发]]></category>
		<category><![CDATA[embed]]></category>
		<category><![CDATA[Youtube]]></category>
		<category><![CDATA[视频]]></category>

		<guid isPermaLink="false">http://wpceo.com/?p=226</guid>
		<description><![CDATA[WordPress在2.9以后的版本支持 embed 功能，例如直接在编辑器里输入Youtube或者Flickr的URL（不要给URL加上链接），WordPress能在页面直接生成控件调用Youtube视频播放器。但是实际使用中发现了一些问题。 <a href="http://wpceo.com/youtube-shortcode/">【阅读全文...】</a>]]></description>
			<content:encoded><![CDATA[<p>WordPress在2.9以后的版本支持 <code>embed</code> 功能，例如直接在编辑器里输入Youtube或者Flickr的URL（不要给URL加上链接），WordPress能在页面直接生成控件调用Youtube视频播放器。以往这样的功能需要依靠插件实现，由于WordPress内置功能的出现，其他同类没有特色特殊功能的插件就可以下岗了。</p>
<p>但是在实践中我发现，在本地测试时，在编辑器中输入Youtube的URL以后，发布后的页面里面依然是文本形式的URL，而没有显示Youtube的播放器，这让我感到很疑惑。根据WordPress文档的说法，可以直接在URL前后加入 <code>embed</code> 标签，我尝试着加入 <code>embed</code> 标签后，在显示时变成了加上链接的URL，WordPress依然没有将Youtube的URL转化为播放器。</p>
<p>与此不同的是在生产环境中，我在位于美国的数个WordPress网站中加入Youtube的URL，均能在页面中显示Youtube控件。难道WordPress还能根据所在地区自动判断是否解析Youtube的URL转化为播放器？</p>
<p>经过对WordPress源文件的分析，得出了答案：WordPress在解析这个Youtube的URL时，会向Youtube请求获取该视频的宽度和高度、缩略图等信息，如果获取不成功，则不识别为Youtube播放器，自然就无法在页面中显示了。所以我在本地搭建的实验环境中自然无法识别Youtube的URL了，同理，国内的WordPress也都无法使用WordPress自带的简易方式直接添加Youtube视频。</p>
<p>有如下几种解决方法：</p>
<ul>
<li>放弃Youtube，使用国内的优酷、土豆等。（<a href="http://fairyfish.net/project/wpjam-video/">建议配合我爱水煮鱼的WPJAM Video插件使用</a>）</li>
<li>使用第三方Youtube插件</li>
<li>将网站放到能访问Youtube的地方，如<a href="http://wpceo.com/go/linode/">Linode</a> VPS（日本/美国）</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://wpceo.com/youtube-shortcode/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>使用代码禁用WordPress Admin Bar（续）</title>
		<link>http://wpceo.com/wordpress-31-disable-admin-bar-2/</link>
		<comments>http://wpceo.com/wordpress-31-disable-admin-bar-2/#comments</comments>
		<pubDate>Mon, 19 Sep 2011 12:04:03 +0000</pubDate>
		<dc:creator>neekey</dc:creator>
				<category><![CDATA[WordPress开发]]></category>
		<category><![CDATA[Admin Bar]]></category>
		<category><![CDATA[filter]]></category>
		<category><![CDATA[hook]]></category>
		<category><![CDATA[函数]]></category>

		<guid isPermaLink="false">http://wpceo.com/?p=218</guid>
		<description><![CDATA[本站先前提到了使用Filter关闭Admin bar功能，网上也有范例通过禁止调用JS Script来达到禁用Admin bar的功能。实际上，WordPress已经提供了更为直接的方法禁用Admin bar功能。 <a href="http://wpceo.com/wordpress-31-disable-admin-bar-2/">【阅读全文...】</a>]]></description>
			<content:encoded><![CDATA[<p>WordPress 3.1新增的Admin Bar确实是一项不怎么受欢迎的新功能，以至于我在做WordPress项目的时候，首先要做的就是禁用这个功能。</p>
<p>本站先前提到了<a href="http://wpceo.com/wordpress-31-disable-admin-bar/">使用Filter关闭Admin bar功能</a>，网上也有范例通过禁止调用JS Script来达到禁用Admin bar的功能。实际上，WordPress已经提供了更为直接的方法。</p>
<pre>show_admin_bar( false );</pre>
<p>该代码可以任意在插件中或主题的<code>functions.php</code>文件中加入。</p>
]]></content:encoded>
			<wfw:commentRss>http://wpceo.com/wordpress-31-disable-admin-bar-2/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>轻量级MySQL Web端管理工具Adminer</title>
		<link>http://wpceo.com/adminer-mysql-web-application/</link>
		<comments>http://wpceo.com/adminer-mysql-web-application/#comments</comments>
		<pubDate>Sun, 24 Apr 2011 15:58:59 +0000</pubDate>
		<dc:creator>neekey</dc:creator>
				<category><![CDATA[Web开发应用]]></category>
		<category><![CDATA[Adminer]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[phpMyAdmin]]></category>
		<category><![CDATA[数据库]]></category>

		<guid isPermaLink="false">http://wpceo.com/?p=212</guid>
		<description><![CDATA[在开发过程中经常会遇到需要给用户配置MySQL的情况，如果服务器没有配置phpMyAdmin，可以尝试Adminer这款小工具，整个程序只有一个文件，最小仅有154kB，并且完全可以取代phpMyAdmin。 <a href="http://wpceo.com/adminer-mysql-web-application/">【阅读全文...】</a>]]></description>
			<content:encoded><![CDATA[<p>我在开发过程中经常会遇到需要给用户配置MySQL的情况，由于学艺不精，我一般通过Web端管理工具进行操作，如果客户机上安装了phpMyAdmin，整个过程还是非常容易的。</p>
<p>如果服务器没有配置phpMyAdmin，我就头疼了，有两种可能，如果服务器是美国的，在安装了WordPress之后，我选择通过WordPress后台直接安装<a href="http://wordpress.org/extend/plugins/portable-phpmyadmin/">Portable phpMyAdmin</a>或<a href="http://wordpress.org/extend/plugins/wp-phpmyadmin/">WP-phpMyAdmin</a>插件，实现在WordPress后台直接操作phpMyAdmin；如果服务器在国内，怎么办？phpMyAdmin文件约10M左右大小，以国内的网速安装phpMyAdmin几乎是非常复杂的任务。</p>
<p>偶然间发现了<a href="http://www.adminer.org/">Adminer</a>这款小工具，它是一款和phpMyAdmin作用相同的Web端MySQL管理工具。除了MySQL，Adminer还支持MS SQL、PostgreSQL、SQLite等主流数据库。Adminer最大的特点就是极其简单，整个程序只有一个文件，英文版为154kB，多语言版也仅仅300多kB。</p>
<p><img src="http://www.adminer.org/static/screenshots/db.png" alt="" width="550" /></p>
<p>Adminer主要支持查询、插入、更新、删除列、创建、删除表等常见操作，在操作界面、操作习惯上和phpMyAdmin没有多大区别。熟悉phpMyAdmin的用户可以很快转移到Adminer上来，这里可以看一下<a href="http://adminer.sourceforge.net/adminer.php?username=">Adminer界面预览</a>。</p>
<p><a href="http://www.adminer.org/en/#download">Adminer下载链接»</a></p>
]]></content:encoded>
			<wfw:commentRss>http://wpceo.com/adminer-mysql-web-application/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>禁用WordPress 3.1的Admin Bar</title>
		<link>http://wpceo.com/wordpress-31-disable-admin-bar/</link>
		<comments>http://wpceo.com/wordpress-31-disable-admin-bar/#comments</comments>
		<pubDate>Thu, 31 Mar 2011 06:07:25 +0000</pubDate>
		<dc:creator>neekey</dc:creator>
				<category><![CDATA[WordPress开发]]></category>
		<category><![CDATA[Admin Bar]]></category>
		<category><![CDATA[filter]]></category>
		<category><![CDATA[hook]]></category>

		<guid isPermaLink="false">http://wpceo.com/?p=205</guid>
		<description><![CDATA[WordPress 3.1中新增了许多功能，WordPress进一步向CMS（内容管理系统）方向发展，网友对其褒贬不一，其中Admin bar广为诟病。 这里介绍一种简单的方法去除管理条。 <a href="http://wpceo.com/wordpress-31-disable-admin-bar/">【阅读全文...】</a>]]></description>
			<content:encoded><![CDATA[<p>WordPress 3.1中新增了许多功能，WordPress进一步向CMS（内容管理系统）方向发展，网友对其褒贬不一，其中WordPress前端的Admin Bar功能广为诟病。</p>
<p>禁用Admin Bar的方法非常简单，增加一句语句就可以了。</p>
<pre>add_filter( 'show_admin_bar', '__return_false' );</pre>
<p>这里还是用到了Filter的知识点，在<code>show_admin_bar</code>这个Filter上返回false就可以了，即不显示 Admin Bar。<code>__return_false</code> 是WordPress内置的函数，它返回布尔值false，同样道理， <code>__return_true</code> 这个函数返回布尔值 true。</p>
<p>把上述代码加入到主题的<code>functions.php</code>中即可在主题中禁用Admin Bar，也有网友制作了该功能的插件<a href="http://wordpress.org/extend/plugins/disable-admin-bar/">Disable Admin Bar</a>，可以直接在WordPress后台安装，适用于任何情况。</p>
]]></content:encoded>
			<wfw:commentRss>http://wpceo.com/wordpress-31-disable-admin-bar/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Ping应用与拓展——No Self Pings</title>
		<link>http://wpceo.com/ping-and-no-self-pings/</link>
		<comments>http://wpceo.com/ping-and-no-self-pings/#comments</comments>
		<pubDate>Mon, 14 Feb 2011 17:44:55 +0000</pubDate>
		<dc:creator>neekey</dc:creator>
				<category><![CDATA[WordPress开发]]></category>
		<category><![CDATA[filter]]></category>
		<category><![CDATA[hook]]></category>
		<category><![CDATA[Ping]]></category>
		<category><![CDATA[社会化网络]]></category>

		<guid isPermaLink="false">http://wpceo.com/?p=197</guid>
		<description><![CDATA[Ping，除了指Windows系统中检查网络连接的工具，在Web2.0和WordPress系统中，Ping常用来通知被引用的内容来源或通知搜索引擎文章的更新。本文介绍关于Ping的概况和WordPress系统中Ping的延伸。 <a href="http://wpceo.com/ping-and-no-self-pings/">【阅读全文...】</a>]]></description>
			<content:encoded><![CDATA[<h2>Ping应用与历史</h2>
<p>Ping，除了指Windows系统中检查网络连接的工具，在Web2.0中，Ping常用来通知被引用的内容来源或通知搜索引擎文章的更新。例如WPCEO先发布了一篇文章《Ping应用与拓展——No Self Pings》，某位网友想引用其中的内容，则可以在WordPress中发送trackback给WPCEO，WPCEO就知道这位网友引用了这篇文章的内容了。</p>
<p>有时候，我可能需要引用本博客以前发过的某篇文章，WordPress也会发Ping给该文章，而trackback会以评论的形式存在在评论列表中，这往往不是我们需要的效果。</p>
<h2>Ping拓展——No Self Pings</h2>
<p>结合WordPress强大的Filter功能，我们可以让WordPress在发送Ping通知时，不再通知本站的文章。<a href="http://wordpress.org/extend/plugins/no-self-ping/">No Self Pings</a>是一个简单的WordPress插件，它可以达到这样的效果。</p>
<pre>function no_self_ping( &amp;$links ) {
	$home = get_option( 'home' );
	foreach ( $links as $l =&gt; $link )
		if ( 0 === strpos( $link, $home ) )
			unset($links[$l]);
}

add_action( 'pre_ping', 'no_self_ping' );</pre>
<p>以上是这个插件的全部PHP代码。我们可以从中分析得出，在<code>pre_ping</code>这个Hook中，加入自己的过滤函数<code>no_self_ping</code>，通过<code>no_self_ping</code>函数，对需要Ping的每个连接，通过PHP函数<code>strpos</code>判断与本站的首页即<code>$home = get_option( 'home' );</code>与需要Ping的URL开头是否相同，从而判断是否属于本站链接。如果为本站链接，则从待Ping列表中删除。</p>
]]></content:encoded>
			<wfw:commentRss>http://wpceo.com/ping-and-no-self-pings/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>WordPress数据库各表结构介绍</title>
		<link>http://wpceo.com/wordpress-database-table-construct/</link>
		<comments>http://wpceo.com/wordpress-database-table-construct/#comments</comments>
		<pubDate>Sun, 16 Jan 2011 17:16:08 +0000</pubDate>
		<dc:creator>neekey</dc:creator>
				<category><![CDATA[WordPress开发]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[数据存储]]></category>
		<category><![CDATA[数据库]]></category>

		<guid isPermaLink="false">http://wpceo.com/?p=177</guid>
		<description><![CDATA[本文介绍了WordPress数据库中每个表里的字段构成及其代表的意义，是WordPress数据库开发、操作必备的参考资料。 <a href="http://wpceo.com/wordpress-database-table-construct/">【阅读全文...】</a>]]></description>
			<content:encoded><![CDATA[<p>在<a href="http://wpceo.com/wordpress-database-construct/">上文</a>中我们已经介绍了WordPress数据库中各个表的作用，本文将继续介绍每个表中每个列的作用。<a href="http://codex.wordpress.org/Database_Description#Table_Overview">WordPress官方文档</a>已经有比较详细的表格，本文仅对常用数据进行介绍。</p>
<h3>wp_commentmeta</h3>
<ul>
<li><code>meta_id</code>：自增唯一ID</li>
<li><code>comment_id</code>：对应评论ID</li>
<li><code>meta_key</code>：键名</li>
<li><code>meta_value</code>：键值</li>
</ul>
<h3>wp_comments</h3>
<ul>
<li><code>comment_ID</code>：自增唯一ID</li>
<li><code>comment_post_ID</code>：对应文章ID</li>
<li><code>comment_author</code>：评论者</li>
<li><code>comment_author_email</code>：评论者邮箱</li>
<li><code>comment_author_url</code>：评论者网址</li>
<li><code>comment_author_IP</code>：评论者IP</li>
<li><code>comment_date</code>：评论时间</li>
<li><code>comment_date_gmt</code>：评论时间（GMT+0时间）</li>
<li><code>comment_content</code>：评论正文</li>
<li><code>comment_karma</code>：未知</li>
<li><code>comment_approved</code>：评论是否被批准</li>
<li><code>comment_agent</code>：评论者的USER AGENT</li>
<li><code>comment_type</code>：评论类型(pingback/普通)</li>
<li><code>comment_parent</code>：父评论ID</li>
<li><code>user_id</code>：评论者用户ID（不一定存在）</li>
</ul>
<h3>wp_links</h3>
<ul>
<li><code>link_id</code>：自增唯一ID</li>
<li><code>link_url</code>：链接URL</li>
<li><code>link_name</code>：链接标题</li>
<li><code>link_image</code>：链接图片</li>
<li><code>link_target</code>：链接打开方式</li>
<li><code>link_description</code>：链接描述</li>
<li><code>link_visible</code>：是否可见（Y/N）</li>
<li><code>link_owner</code>：添加者用户ID</li>
<li><code>link_rating</code>：评分等级</li>
<li><code>link_updated</code>：未知</li>
<li><code>link_rel</code>：XFN关系</li>
<li><code>link_notes</code>：XFN注释</li>
<li><code>link_rss</code>：链接RSS地址</li>
</ul>
<h3>wp_options</h3>
<ul>
<li><code>option_id</code>：自增唯一ID</li>
<li><code>blog_id</code>：博客ID，用于多用户博客，默认0</li>
<li><code>option_name</code>：键名</li>
<li><code>option_value</code>：键值</li>
<li><code>autoload</code>：在WordPress载入时自动载入（yes/no）</li>
</ul>
<h3>wp_postmeta</h3>
<ul>
<li><code>meta_id</code>：自增唯一ID</li>
<li><code>post_id</code>：对应文章ID</li>
<li><code>meta_key</code>：键名</li>
<li><code>meta_value</code>：键值</li>
</ul>
<h3>wp_posts</h3>
<ul>
<li><code>ID</code>：自增唯一ID</li>
<li><code>post_author</code>：对应作者ID</li>
<li><code>post_date</code>：发布时间</li>
<li><code>post_date_gmt</code>：发布时间（GMT+0时间）</li>
<li><code>post_content</code>：正文</li>
<li><code>post_title</code>：标题</li>
<li><code>post_excerpt</code>：摘录</li>
<li><code>post_status</code>：文章状态（publish/auto-draft/inherit等）</li>
<li><code>comment_status</code>：评论状态（open/closed）</li>
<li><code>ping_status</code>：PING状态（open/closed）</li>
<li><code>post_password</code>：文章密码</li>
<li><code>post_name</code>：文章缩略名</li>
<li><code>to_ping</code>：未知</li>
<li><code>pinged</code>：已经PING过的链接</li>
<li><code>post_modified</code>：修改时间</li>
<li><code>post_modified_gmt</code>：修改时间（GMT+0时间）</li>
<li><code>post_content_filtered</code>：未知</li>
<li><code>post_parent</code>：父文章，主要用于PAGE</li>
<li><code>guid</code>：未知</li>
<li><code>menu_order</code>：排序ID</li>
<li><code>post_type</code>：文章类型（post/page等）</li>
<li><code>post_mime_type</code>：MIME类型</li>
<li><code>comment_count</code>：评论总数</li>
</ul>
<h3>wp_terms</h3>
<ul>
<li><code>term_id</code>：分类ID</li>
<li><code>name</code>：分类名</li>
<li><code>slug</code>：缩略名</li>
<li><code>term_group</code>：未知</li>
</ul>
<h3>wp_term_relationships</h3>
<ul>
<li><code>object_id</code>：对应文章ID/链接ID</li>
<li><code>term_taxonomy_id</code>：对应分类方法ID</li>
<li><code>term_order</code>：排序</li>
</ul>
<h3>wp_term_taxonomy</h3>
<ul>
<li><code>term_taxonomy_id</code>：分类方法ID</li>
<li><code>term_id</code>：</li>
<li><code>taxonomy</code>：分类方法(category/post_tag)</li>
<li><code>description</code>：未知</li>
<li><code>parent</code>：所属父分类方法ID</li>
<li><code>count</code>：文章数统计</li>
</ul>
<h3>wp_usermeta</h3>
<ul>
<li><code>umeta_id</code>：自增唯一ID</li>
<li><code>user_id</code>：对应用户ID</li>
<li><code>meta_key</code>：键名</li>
<li><code>meta_value</code>：键值</li>
</ul>
<h3>wp_users</h3>
<ul>
<li><code>ID</code>：自增唯一ID</li>
<li><code>user_login</code>：登录名</li>
<li><code>user_pass</code>：密码</li>
<li><code>user_nicename</code>：昵称</li>
<li><code>user_email</code>：Email</li>
<li><code>user_url</code>：网址</li>
<li><code>user_registered</code>：注册时间</li>
<li><code>user_activation_key</code>：激活码</li>
<li><code>user_status</code>：用户状态</li>
<li><code>display_name</code>：显示名称</li>
</ul>
<p>关于WordPress中数据库的操作方法，我们将在下篇文章中介绍，敬请关注。</p>
]]></content:encoded>
			<wfw:commentRss>http://wpceo.com/wordpress-database-table-construct/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>WordPress数据库结构介绍</title>
		<link>http://wpceo.com/wordpress-database-construct/</link>
		<comments>http://wpceo.com/wordpress-database-construct/#comments</comments>
		<pubDate>Sat, 01 Jan 2011 14:14:54 +0000</pubDate>
		<dc:creator>neekey</dc:creator>
				<category><![CDATA[WordPress开发]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[数据存储]]></category>
		<category><![CDATA[数据库]]></category>

		<guid isPermaLink="false">http://wpceo.com/?p=157</guid>
		<description><![CDATA[数据库作为WordPress的基本组成部分，我们有必要了解WordPress数据库的基本构造，本文简要地介绍了每个表的存储信息和特点。 <a href="http://wpceo.com/wordpress-database-construct/">【阅读全文...】</a>]]></description>
			<content:encoded><![CDATA[<p>WordPress使用MySQL数据库。作为一个开发者，我们有必要掌握<a href="http://codex.wordpress.org/Database_Description">WordPress数据库</a>的基本构造，并在自己的插件或主题中使用他们。</p>
<p>截至WordPress3.0，WordPress一共有以下11个表。这里加上了默认的表前缀 <code>wp_</code> 。</p>
<ul>
<li><code>wp_commentmeta</code>：存储评论的元数据</li>
<li><code>wp_comments</code>：存储评论</li>
<li><code>wp_links</code>：存储友情链接（Blogroll）</li>
<li><code>wp_options</code>：存储WordPress系统选项和插件、主题配置</li>
<li><code>wp_postmeta</code>：存储文章（包括页面、上传文件、修订）的元数据</li>
<li><code>wp_posts</code>：存储文章（包括页面、上传文件、修订）</li>
<li><code>wp_terms</code>：存储每个目录、标签</li>
<li><code>wp_term_relationships</code>：存储每个文章、链接和对应分类的关系</li>
<li><code>wp_term_taxonomy</code>：存储每个目录、标签所对应的分类</li>
<li><code>wp_usermeta</code>：存储用户的元数据</li>
<li><code>wp_users</code>：存储用户</li>
</ul>
<p>在WordPress的数据库结构中，存储系统选项和插件配置的<code>wp_options</code>表是比较独立的结构，在<a href="http://wpceo.com/wordpress-options-api/">后文</a>中会提到，它采用了key-value模式存储，这样做的好处是易于拓展，各个插件都可以轻松地在这里存储自己的配置。</p>
<p>post，comment，user 则是三个基本表加上拓展表的组合。以<code>wp_users</code>为例， <code>wp_users</code>已经存储了每个用户会用到的基本信息，比如 login_name、display_name、 password、email等常用信息，但如果我们还要存储一些不常用的数据，最好的做法不是去在表后加上一列，去破坏默认的表结构，而是将数据存在<code>wp_usermeta</code>中。<code>wp_usermeta</code>这个拓展表和<code>wp_options</code>表有类似的结构，我们可以在这里存储每个用户的QQ号码、手机号码、登录WordPress后台的主题选项等等。</p>
<p>比较难以理解的是term，即<code>wp_terms</code>、<code>wp_term_relationships</code>、<code>wp_term_taxonomy</code>。在WordPress的系统里，我们常见的分类有文章的分类、链接的分类，实际上还有TAG，它也是一种特殊的分类方式，我们甚至还可以创建自己的分类方法。WordPress将所有的分类及分类方法、对应结构都记录在这三个表中。<code>wp_terms</code>记录了每个分类的名字以及基本信息，如本站分为“WordPress开发”、“WPCEO插件”等，这里的分类指广义上的分类，所以每个TAG也是一个“分类”。<code>wp_term_taxonomy</code>记录了每个分类所归属的分类方法，如“WordPress开发”、“WPCEO插件”是文章分类（<code>category</code>），放置友情链接的“我的朋友”、“我的同事”分类属于友情链接分类（<code>link_category</code>）。<code>wp_term_relationships</code>记录了每个文章（或链接）所对应的分类方法。</p>
<p>庆幸的是，关于term的使用，WordPress中相关函数的使用方法还是比较清晰明了，我们就没必要纠结于它的构造了。</p>
<p>在下一篇文章中，WPCEO将介绍每个表中的具体信息，请持续关注WPCEO。</p>
]]></content:encoded>
			<wfw:commentRss>http://wpceo.com/wordpress-database-construct/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>本地WordPress下载安装全教程</title>
		<link>http://wpceo.com/install-wordpress-with-xampp/</link>
		<comments>http://wpceo.com/install-wordpress-with-xampp/#comments</comments>
		<pubDate>Fri, 24 Dec 2010 06:27:40 +0000</pubDate>
		<dc:creator>neekey</dc:creator>
				<category><![CDATA[主机和域名]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[XAMPP]]></category>
		<category><![CDATA[安装]]></category>

		<guid isPermaLink="false">http://wpceo.com/?p=112</guid>
		<description><![CDATA[很多对WordPress感兴趣的朋友都希望搭建自己的博客或开发插件、主题，WPCEO在这里介绍如何使用XAMPP软件快速搭建本地WordPress测试环境及下载安装WordPress。 <a href="http://wpceo.com/install-wordpress-with-xampp/">【阅读全文...】</a>]]></description>
			<content:encoded><![CDATA[<p>很多对WordPress感兴趣的朋友都希望搭建自己的博客或开发插件、主题，无奈苦于缺乏对搭建服务器相关知识的缺乏，网上找了一堆教程又是七拼八凑起来的，太繁琐。WPCEO在这里介绍如何快速搭建本地WordPress测试环境。</p>
<p>WordPress基于PHP+MySQL开发，相信对WordPress有点初步了解的朋友都懂了。搭建一个能够运行PHP+MySQL的环境实在有点复杂，需要安装PHP、MySQL以及Apache或IIS、Nginx这样的HTTP服务器软件，安装了程序以后还要进行复杂的配置。</p>
<p>既然是本地测试，我们强烈推荐一键安装软件XAMPP，它能一键安装Apache、PHP、MySQL、phpMyAdmin等常用和不常用软件、组件，能够快速搭建一个本地测试需要的开发环境。</p>
<p>本文将分为两部分介绍搭建WordPress的方法，第一部分介绍本地搭建Apache+PHP+MySQL环境的XAMPP软件（如果你使用虚拟空间搭建，则可以跳过该部分），第二部分介绍下载安装WordPress的方法。</p>
<h2>XAMPP安装教程</h2>
<h3>下载XAMPP</h3>
<blockquote><p>XAMPP下载首页：<a href="http://sourceforge.net/projects/xampp/">http://sourceforge.net/projects/xampp/</a></p></blockquote>
<p>从列表中选择适合自己操作系统的XAMPP EXE执行程序（我这里选的是<a href="http://sourceforge.net/projects/xampp/files/XAMPP%20Windows/1.7.3/xampp-win32-1.7.3.exe/download">xampp-win32-1.7.3.exe</a>，安装包大约50多M），下载到本地。</p>
<h3>安装XAMPP</h3>
<p>执行 xampp-win32-1.7.3.exe 文件，第一步选择盘符。为了以后方便起见，建议把XAMPP直接装在根目录，程序会自动创建/xampp目录，PHP、MySQL等程序都位于这个文件夹下。</p>
<div id="attachment_115" class="wp-caption alignnone" style="width: 538px"><a href="http://wpceo.com/wp-content/uploads/2010/12/xampp-install-1.png"><img class="size-full wp-image-115" title="XAMPP 安装第一步" src="http://wpceo.com/wp-content/uploads/2010/12/xampp-install-1.png" alt="XAMPP 安装" width="528" height="396" /></a><p class="wp-caption-text">XAMPP 安装第一步：选择安装位置</p></div>
<p>选择妥当即可开始安装。</p>
<div id="attachment_120" class="wp-caption alignnone" style="width: 477px"><a href="http://wpceo.com/wp-content/uploads/2010/12/xampp-install-2.png"><img class="size-full wp-image-120" title="XAMPP 安装第二步" src="http://wpceo.com/wp-content/uploads/2010/12/xampp-install-2.png" alt="XAMPP 安装" width="467" height="173" /></a><p class="wp-caption-text">XAMPP 安装第二步：简单设置</p></div>
<p>整个安装过程需要约3分钟，进程条读取完后弹出如图所示，提问是否在桌面添加快捷方式以及其他几个问题，根据自己的需要选择，如果你对这些配置不是很了解，建议使用推荐设置即可。</p>
<p>关闭迅雷等可能占用80端口的软件，打开XAMPP软件，并start PHP和MySQL服务，如图：</p>
<div id="attachment_121" class="wp-caption alignnone" style="width: 449px"><a href="http://wpceo.com/wp-content/uploads/2010/12/xampp-install-3.png"><img class="size-full wp-image-121" title="XAMPP 安装第三步" src="http://wpceo.com/wp-content/uploads/2010/12/xampp-install-3.png" alt="XAMPP 安装" width="439" height="351" /></a><p class="wp-caption-text">安装XAMPP成功，启动PHP和MySQL服务</p></div>
<p>启动成功以后，在浏览器中输入 <a href="http://localhost/">http://localhost/</a> ，显示如下页面，表示XAMPP已经成功安装并启动。</p>
<div id="attachment_123" class="wp-caption alignnone" style="width: 403px"><a href="http://wpceo.com/wp-content/uploads/2010/12/xampp-install-4.png"><img class="size-full wp-image-123" title="XAMPP 安装成功" src="http://wpceo.com/wp-content/uploads/2010/12/xampp-install-4.png" alt="XAMPP 安装成功" width="393" height="187" /></a><p class="wp-caption-text">XAMPP 安装成功</p></div>
<h2>WordPress安装教程</h2>
<h3>创建WordPress数据库</h3>
<p>访问 http://localhost/phpmyadmin/ ，进入MySQL的Web管理端phpMyAdmin。 通过phpMyAdmin，我们可以直接方便地管理MySQL数据库和执行SQL。</p>
<div id="attachment_131" class="wp-caption alignnone" style="width: 451px"><a href="http://wpceo.com/wp-content/uploads/2010/12/wordpress-install-1.png"><img class="size-full wp-image-131" title="创建数据库" src="http://wpceo.com/wp-content/uploads/2010/12/wordpress-install-1.png" alt="创建数据库" width="441" height="119" /></a><p class="wp-caption-text">创建数据库</p></div>
<p>在phpMyAdmin首页新建数据库，名字任意，如 <code>my_wordpress</code>。并在“整理”和“MySQL 连接校对”都选择 <code>utf8_general_ci</code>字符集，创建成功后先搁着。</p>
<h3>下载WordPress</h3>
<blockquote><p>WordPress官方下载：<a href="http://wordpress.org/download/">http://wordpress.org/download/</a><br />
WordPress官方中文下载：<a href="http://cn.wordpress.org/">http://cn.wordpress.org/</a><br />
WordPress中文团队（非官方）<a href="http://wfans.org/blog/">http://wfans.org/blog/</a></p></blockquote>
<p>从以上任意网站下载最新的WordPress安装包，并解压安装包，得到 <code>wordpress</code> 文件夹，文件夹内即为WordPress程序。</p>
<p>将该文件夹移动到 <code>X:\xampp\htdocs\</code> （X为安装XAMPP所在的盘符）。 <code>X:\xampp\htdocs\</code> 即为HTTP服务器的根目录，如果我们不希望以 http://localhost/wordpress/ 访问WordPress程序，则需要把 htdocs 目录内的原文件删除，再把 wordpress 目录中的文件全部复制到 htdocs 中，即可用 http://localhost/ 直接访问WordPress。</p>
<h3>安装WordPress</h3>
<p>WordPress有引以为豪的五分钟快速安装法。只需访问 WordPress 的首页 http://localhost/wordpress/ ，按照提示下一步即可。</p>
<div id="attachment_133" class="wp-caption alignnone" style="width: 372px"><a href="http://wpceo.com/wp-content/uploads/2010/12/wordpress-install-2.png"><img class="size-full wp-image-133" title="安装WordPress：填写数据库信息" src="http://wpceo.com/wp-content/uploads/2010/12/wordpress-install-2.png" alt="安装WordPress：填写数据库信息" width="362" height="404" /></a><p class="wp-caption-text">安装WordPress：填写数据库信息</p></div>
<p>在这里，数据库名就填写我们刚才创建的 <code>my_wordpress</code>，用户名使用XAMPP默认的 <code>root</code> ，密码为空，数据库主机即 <code>localhost</code>。表名前缀采用默认的 <code>wp_</code> 即可，如果需要在同一个数据库中安装多个WordPress，则需要填写不同的表前缀，如 <code>wp1_</code> ，<code>wp2_</code>，这种情况可能多见于使用虚拟空间，而主机商限制了能创建的MySQL数据库的数量。</p>
<p>如果你是在虚拟空间上创建WordPress，一定要向主机商询问清楚MySQL数据库的用户名和密码等信息。</p>
<div id="attachment_135" class="wp-caption alignnone" style="width: 411px"><a href="http://wpceo.com/wp-content/uploads/2010/12/wordpress-install-3.png"><img class="size-full wp-image-135" title="填写WordPress信息" src="http://wpceo.com/wp-content/uploads/2010/12/wordpress-install-3.png" alt="填写WordPress信息" width="401" height="585" /></a><p class="wp-caption-text">填写WordPress信息</p></div>
<p>在上一步的数据库信息填写成功后，即可填写WordPress的基本信息，包括网站名、管理员用户密码和邮件地址。安装成功后，除了管理员的用户名修改比较麻烦，其他信息均可从后台修改。</p>
<p>提交成功后，就可以按照网页中提示的链接登录管理后台了。</p>
<div id="attachment_136" class="wp-caption alignnone" style="width: 419px"><a href="http://wpceo.com/wp-content/uploads/2010/12/wordpress-install-4.png"><img class="size-full wp-image-136" title="WordPress管理后台" src="http://wpceo.com/wp-content/uploads/2010/12/wordpress-install-4.png" alt="WordPress管理后台" width="409" height="341" /></a><p class="wp-caption-text">WordPress管理后台</p></div>
<p>现在就可以开始你的WordPress之旅啦！</p>
]]></content:encoded>
			<wfw:commentRss>http://wpceo.com/install-wordpress-with-xampp/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>WordPress插件开发之Filter Reference</title>
		<link>http://wpceo.com/wordpress-filter-reference/</link>
		<comments>http://wpceo.com/wordpress-filter-reference/#comments</comments>
		<pubDate>Tue, 21 Dec 2010 16:38:17 +0000</pubDate>
		<dc:creator>neekey</dc:creator>
				<category><![CDATA[WordPress开发]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[filter]]></category>
		<category><![CDATA[hook]]></category>

		<guid isPermaLink="false">http://wpceo.com/?p=101</guid>
		<description><![CDATA[在WordPress中，Filter则能将WordPress程序产生的数据进行“过滤”，达到“偷梁换柱”的目的。与Action类似，在这里将详细介绍Filter的基础知识。 <a href="http://wpceo.com/wordpress-filter-reference/">【阅读全文...】</a>]]></description>
			<content:encoded><![CDATA[<p>在WordPress中，<a href="http://wpceo.com/wordpress-action-reference/">Action</a>能在指定位置执行指定的动作，而<a href="http://codex.wordpress.org/Plugin_API/Filter_Reference">Filter</a>则能将WordPress程序产生的数据进行“过滤”，达到“偷梁换柱”的目的。</p>
<h2>简单范例</h2>
<p>WordPress的登录页面相信大家并不陌生（<a href="http://wpceo.com/wp-login.php">见此</a>）。中间一个WordPress Logo，链接指向 <a href="http://wordpress.org/">http://wordpress.org/</a> ，但对于一个商业应用的站点来说，我们可能希望点击它以后链接至自己的首页，如 <a href="http://wpceo.com/">http://wpceo.com/</a>。对于一般的程序，我们可能要去改动它的源代码（也就是hook）才能修改为自己所需的样式，而WordPress提供了简单的Filter，只要在Filter中加入自己的替换函数，就能替换WordPress原有的输出结果。</p>
<pre>add_filter('login_headerurl','my_login_headerurl');
function my_login_headerurl($url){
 return get_bloginfo('wpurl').'/';
}</pre>
<p>通过这几句代码，我们就可以将登录界面的LOGO的链接地址指向为自己的博客首页，是不是很神奇呢？add_filter函数在login_headerurl这个Filter上执行自己的my_login_headerurl函数。my_login_headerurl的参数是原URL，由login_headerurl这个Filter提供（每个Filter都提供自己独特的参数），而我们的函数需要在这个函数结束时返回一个匹配值。在这里，我们将默认的wordpress.org的链接“偷换”为wpceo.com的链接了。</p>
<h2>Filter接口函数解析</h2>
<pre>add_filter('filter_name','my_filter',$priority=10,$accepted_args=1);</pre>
<p>Filter与Action的参数比较类似，filter_name 为系统提供的Filter，my_filter为自己的过滤函数，$priority为权重，$accepted_args为接受的参数。</p>
<pre>remove_filter('filter_name','my_filter',$priority=10,$accepted_args=1);</pre>
<p>删除该Filter。这里不做过多解释，请<a href="http://wpceo.com/wordpress-action-reference/">参见关于Action的详细说明</a>。</p>
<pre>apply_filters('filter_name',$arg);</pre>
<p>执行某个Filter，$arg为需要传入的参数，可以为数个。</p>
<h2>Filter与Action对比</h2>
<p>Action是一种动作，这个动作不受太多的WordPress系统限制，你可以在这个Action上加载任何适当的函数。而Filter是根据插件需要，对WordPress系统进行修改，比如前文的范例，我们需要对一个URL进行修改，而修改后的结果也应当为一个URL。</p>
<pre>$new_value = apply_filters('filter_this_value',$original_value);
do_action('do_something_here');</pre>
<p>Action不需要返回值，也不一定需要传入参数，而Filter则必不可少，所以Filter应该格外需要注意Filter传入的参数个数以及原始参数值，并及时返回参数。</p>
<h2>常见的Filter及简单应用</h2>
<ul>
<li>the_content：在single页面输出文章全文，可以应用格式化函数对其进行过滤。</li>
<li>the_excerpt：输出文章摘要，可以加入字数控制的Filter。</li>
<li>the_content_rss：在RSS输出中的全文，可以加入版权信息等。</li>
<li>the_title：HTML页面标题，可以对当前页面的title进行重写，达到SEO功效。</li>
</ul>
<p>更多的常见Filter我们将在遇到具体问题时具体解析，也欢迎大家继续关注WPCEO的后续文章。</p>
]]></content:encoded>
			<wfw:commentRss>http://wpceo.com/wordpress-filter-reference/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WordPress插件开发之Action Reference</title>
		<link>http://wpceo.com/wordpress-action-reference/</link>
		<comments>http://wpceo.com/wordpress-action-reference/#comments</comments>
		<pubDate>Sat, 18 Dec 2010 13:48:42 +0000</pubDate>
		<dc:creator>neekey</dc:creator>
				<category><![CDATA[WordPress开发]]></category>
		<category><![CDATA[action]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[hook]]></category>

		<guid isPermaLink="false">http://wpceo.com/?p=80</guid>
		<description><![CDATA[作为WordPress开发的核心，我们必须掌握Action的使用方法，本文从实例入手，比较具体地描述了WordPress Action的基本使用方法及常见的Action。 <a href="http://wpceo.com/wordpress-action-reference/">【阅读全文...】</a>]]></description>
			<content:encoded><![CDATA[<p>进行WordPress开发的前提条件是了解WordPress的各种插件接口，其中WordPress最重要的两种接口是<a href="http://codex.wordpress.org/Plugin_API/Action_Reference">Action</a>和<a href="http://codex.wordpress.org/Plugin_API/Filter_Reference">Filter</a>。本文将就其中之一Action进行讲解，以便大家掌握WordPress的基本开发方法。</p>
<p>Action即动作，WordPress作为开放性和拓展性最强的Blog/CMS程序，在其自身执行过程中会额外执行由插件插入的函数，以实现插件的目的，这个允许插件开发者自定义在某点执行函数的接口即Action。当一个用户访问WordPress任意页面后，WordPress将按顺序执行每一行代码，并在一定条件下激发Action，执行挂在该Action上的函数。</p>
<h2>简单范例</h2>
<p>当访客访问<a href="http://wpceo.com/">wpceo.com</a>后，执行的是index.php，即WordPress的入口程序。index.php先后载入一些基本参数（如数据库信息、默认语言），进行一些必要的检查（如WordPress是否已经安装），然后载入我们的插件，当然，前提是这个插件已经启用。在插件中，我们输入以下代码：</p>
<pre>add_action('wp_head','print_my_feed');
function print_my_feed(){
 //do something
 echo '&lt;link rel="alternate" type="application/rss+xml"
          title="WP CEO" href="http://wpceo.com/feed/" /&gt;';
}</pre>
<p>如代码所示，wp_head就是一个Action名，当WordPress执行到wp_head这个Action时，它将执行我们插入的print_my_feed函数。这里的函数既可以做某些后台的操作，如update_option，也可以用于前台的输出，如echo，做一些适合在该Action发生的动作。</p>
<p>在这里，print_my_feed函数执行的是输出WPCEO的Feed链接。如果用户使用了Firefox浏览器或新版的IE，在地址栏附近应该能看到一个醒目的订阅图标，提现用户可以订阅该网站。</p>
<h2>WordPress常用Action接口</h2>
<p>以下是一个普通前台页面的Action执行过程。</p>
<ol>
<li>muplugins_loaded</li>
<li>plugins_loaded</li>
<li>load_textdomain</li>
<li>set_current_user</li>
<li>init</li>
<li>wp_loaded</li>
<li>parse_request</li>
<li>send_headers</li>
<li>parse_query</li>
<li>pre_get_posts</li>
<li>posts_selection</li>
<li>wp</li>
<li>template_redirect</li>
<li>get_header</li>
<li>wp_head</li>
<li>wp_enqueue_scripts</li>
<li>wp_print_styles</li>
<li>wp_print_scripts</li>
<li>loop_start</li>
<li>the_post</li>
<li>loop_end</li>
<li>get_sidebar</li>
<li>dynamic_sidebar</li>
<li>wp_meta</li>
<li>get_footer</li>
<li>wp_footer</li>
<li>shutdown</li>
</ol>
<p>对于我们的插件来说，什么时候执行这个动作尤为重要。例如一个需要发送Cookie的函数，它应当在template_redirect之前完成输出Cookie的行为（否则可能会引起PHP错误）；一个需要改变默认获取Post文章的Hook，就应当在pre_get_posts这个Action上做出修改；如果我们需要在HTML代码中自行加入样式表，就需要在wp_head这个Action中添加。</p>
<p>除了前台，后台开发也是WordPress插件开发的重点，以下是后台管理界面的普通执行流程。</p>
<ol>
<li>muplugins_loaded</li>
<li>plugins_loaded</li>
<li>load_textdomain</li>
<li>auth_cookie_valid</li>
<li>set_current_user</li>
<li>init</li>
<li>wp_loaded</li>
<li>auth_redirect</li>
<li>admin_menu</li>
<li>admin_init</li>
<li>parse_request</li>
<li>send_headers</li>
<li>wp</li>
<li>admin_head</li>
<li>adminmenu</li>
<li>admin_notices</li>
<li>admin_footer</li>
<li>shutdown</li>
</ol>
<p>相比于前台，后台的运行流程中有一些后台独有的Action，如auth_redirect，重定向未登录用户到登录界面；admin_menu是初始化WordPress后台的管理菜单。</p>
<h2>Action接口函数解析</h2>
<p>在之前我们已经学习了add_action这个函数的基本使用方法，现在来介绍一下它的具体使用方法和其他Action函数的使用方法。</p>
<pre>add_action('action_name','my_function_name',$priority=10,$accepted_args=1);</pre>
<p>前两个参数即要插入的Action和需要插入的函数，$priority为载入顺序，例如同样是wp_head这个Action，可能有数个插件都需要在这里加载自己的CSS或JavaScript文件，WordPress载入时会按照从小到大的顺序载入。同一个Action下，$priority越小越早执行。$accepted_args 为接受的参数，默认为一个，如果某Action提供了多个参数，则需要修改这个数值。</p>
<pre>remove_action('action_name','my_function_name',$priority=10,$accepted_args=1);</pre>
<p>有添加就需要有删除，remove_action就是删除挂载在Action上的函数。</p>
<pre>do_action('action_name', $arg );</pre>
<p>执行Action，除了系统会执行固定的Action，我们在插件中也能创建自己的Action。$arg为传入的参数，这里的参数可以为数个。</p>
<h2>小结</h2>
<p>本文比较具体地描述了Action的使用方法，并将在其他文章中结合具体实例，进一步扩展本文。</p>
]]></content:encoded>
			<wfw:commentRss>http://wpceo.com/wordpress-action-reference/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

