Deploy WP site

Add DNS in cndns.com #like pmcb.zjueke.com  A record  60.12.107.213

ssh dabaobao@60.12.107.213

mkdir /var/www/html/pmcb

chmod -R 777 /var/www/html/pmcb/

 

# configure apache for pmcb.zjueke.com

cd /etc/apache2/

cd sites-available/

cp www.zjueke.com pmcb.zjueke.com

vim pmcb.zjueke.com (edit its document root and DNS)

a2ensite pmcb.zjueke.com  (apache 2 enable site…)

/etc/init.d/apache2 reload

 

install wordpress and theme:

cd /var/www/html/pmcb/

wget http://cn.wordpress.org/wordpress-3.4.2-zh_CN.tar.gz

tar -zxvf wordpress-3.4.2-zh_CN.tar.gz

cp -r ./wordpress/* ./   (copy all wordpress files to current directory)

 

 

visit pmcb.zjueke.com to install it.

you can visit it now.

 

after installation, delete all the default database, and import your pbcm.sql with “127.0.0.1/pmcb” replaced by “pmcb.zjueke.com”

 

that’s all!

1.3 LOOP循环模块

现在你已经安装了基本的WP系统并且掌握了主题的基本概念,是时候看看系统是如何运行的了。这一章会告诉你什么是loop,loop是个基本的PHP查询用于向WP请求一些输出的。这一章会从一些基本的用法开始讲的,然后是跳转到多重循环(multiple loops)和一些很有效果的漂亮的小技巧。

你需要理解loop才能创建真正的WP网站,就算你不用事无巨细都了解,至少应该明白loop是什么,做什么。这样的话,当你遇到自定义的内容输出问题时,你可以搜索很多可用的函数来解决问题;

[tab:理解Loop]

1、理解WordPress的loop(Understanding the WordPress Loop )

Loop循环是WP的核心, 他就出没在主题的模板文件里。你当然也可以写一个没有loop的主题,但是这会让诸如显示最近的文章或者浏览以前的文章这类原本简单的内容的输出变得十分困难。有个别模板文件,比如404错误页面,根本没有loop循环,但是大部分文件都是有的。如果你想在模板文件中找到它,打开index.php即可,因为这页是你显示文章列表的页面。

一些模板标签只在loop循环模块内部工作,因此你需要能够辨识这些函数,在下一节就会看到他们。

  • 最基本的loop循环

如果你想用WP建站,你必须要理解loop,很幸运,最基本的loop是极其简单的,它以下面的代码开始:

[cce_php]<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>[/cce_php]
以下面的代码结束:
[cce_php]
<?php endwhile; else: ?>
      <p>Some error message or similar.</p>
<?php endif; ?>
[/cce_php]

事实上,你并不需要输出错误的这段代码,但是既然大部分主题里都有这段代码,那么就先写在这里。其实这里可以用一个404错误页面来代替,或者显示一个没有任何搜索结果的页面。

下面的代码是一个完整的loop模块,loop内有着最常用的内容输出函数,你会在大部分主题里找到他们或者极为类似的代码:

[cce_php]
<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?> 
    <div id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
        <h2><a href="<?php the_permalink(); ?>" title="<?php the_title(); ?>"><?php the_title(); ?></a></h2>
        <?php the_content(); ?>
        <?php get_comments(); ?>
    </div>
<?php endwhile; else: ?> 
    <div>
        <h2>Error!</h2>
        <p>Something went wrong! Please try again.</p>
    </div>
<?php endif; ?>
[/cce_php]

当然,你可能想要一个更具有直观性的错误消息而不是上面的文字,不过那不是现在的重点。

最基本的loop检查是否有文章可以返回输出,并且用博客的全局设置来控制输出的样式(比如一页要显示多少文章等)。一个单独的文章页面只会返回一篇特定的文章,而一个分类页面则会列出所有属于这个分类的文章。

如果有文章返回,那么一个while loop就会开始执行,并且只要查询到还有文章可以输出,在全局变量的控制下,文章就会继续的输出并显示。当循环结束(所有应该输出的文章都显示完毕后)的时候,有一个endwhile来结束循环,然后用endif来结束整个loop;

如果没有任何文章符合输出的条件呢,那么else语句就会被调用,而这就是错误消息显示的时候。或者什么都不输出如果没有定义错误消息的话,这之后,loop就全部结束了。

因此,loop事实上总是从数据库里循环输出符合条件(包括博客的全局设置和你的查询条件)的文章,搞懂了吗?其实很简单是不。

关于WP_Query的一些知识

尽管你压根没在基本的loop代码里看到WP_Query,但WP_Query却是loop的核心。这是一个处理loop内部功能的类(Class),你可以在 wp-includes/query.php中找到它如果你乐意深究的话。多数情况下你更会乐意在代码手册(codex.wordpress.org/Function_Reference/WP_Query)找到WP_Query的所有描述性质和方法。

最基本的loop模块使用WP_Query,或者说它使用默认的 $wp_query对象。这就是说,当你使用have_posts()或者the_post()时,你实际上在使用$wp_query->have_posts()和$wp_query->the_post(),换言之,have_posts()之类的函数们默认认为你在使用他们的时候就是想使用$wp_query对象。任何时候当你要跳出$wp_query对象来创建自己的查询语句时,你都必须创建一个用于查询的对象,我们将在多重loops章节和后面的例子中这样做,如下所示:

[cce_php]<?php $brand_new_query = new WP_Query(); ?>[/cce_php]

这里你把所有的数据加载到$brand_new_query里而不是默认的$wp_query,而这就意味着你要做一些主循环loop之外的事情了。

大多数函数都会和WP_Query类连接,包括主题标签和条件语句,如果可能,你应该尽可能用这个,你可以改变WP_Query类内部的事情,不过如果已经有了现成的解决方案就要尽量避免那样做,这算是常识和约定。当然了,你或许有那么一次要跳出这个盒子做点其他事,不过这是后话。
[tab:使用Loop]

2、使用Loop( Using the Loop)

目前你应该已经搞懂了哪里需要loop循环(在文章的列表页面,当然单独的文章页面single.php也算是列表长度为1的列表),并且你可以同时运行几个loop,问题是如何能够更好的使用loop而不仅仅是使用。比如,你可能不想在分类页面展示全部的文章内容,而只是显示摘要。这就要用到模板标签,用到控制内容输出的模板标签。

这一章我们首先快速的浏览一下常用的标签,比如说你要显示文章标题,并且要链接到具体的文章页面。下面这段代码片几乎是每个主题里用来列出文章列表的代码,偶尔也会只列出一篇,比如single.php里:

[cce_php]<h2><a href="<?php the_permalink(); ?>" title="<?php the_title(); ?>"><?php the_title(); ?></a></h2>[/cce_php]

这确实很简单,用这些函数来输出文章的标题(并且在link里的title属性也是文章的标题)。包住title的就是常见的超链接,从the_permalink()中获得链接的值,当然就是我们要求的文章的真实链接了。一切都顺利成章,让我们来输出一些内容吧,你有两个选项,使用下面两个模板标签里的任意一个。

[cce_php]
<?php the_content() ;?>
<?php the_excerpt() ;?>
[/cce_php]

上面第一个输出文章的全文,除非在是在文章的列表页面而且你的文章里用了<!—more—>这个标签,那么第一个才会输出<!—more—>这个标签之前的内容,如果没用这个标签,那么也同样会输出全文。如果你用过Wordpress,你就会知道这些,More按钮就在HTML编辑窗口中,其功能是插入一个read more的链接。如你所料,你也可以以任何一种方式显示这个链接:

[cce_php]<?php the_content('Read more here, mate!') ;?>[/cce_php]

这会用“Read more here, mate!”来替换默认的read more链接。该函数还有一些更多的选项,你甚至可以放入HTML代码(可能用图片来替换文字),不过这不是这里要讲的重点。重点是模板函数the_content()输出文字内容,并且在列表页面输出<!—more—>之前的内容,然后跟一个”read more”链接;

当然了,当你在一个独立的文章页面时,the_content()则总是输出全文而不会有read more链接。

第二个输出内容的模板函数是the_excerpt(),顾名思义,它只输出内容的摘要,默认是文章的前55个字符。所有的HTML内容,不过是图片还是断行符或者视频内容都不会出现在摘要里。因此用这个函数还是要小心起见。不过这里没有什么费解的参数,对吧。你可能以为你应该可以控制输出摘要的长度,不过,这次你错了,真的没有参数控制这个。

图3-1 所有这些内容都是在loop循环中输出。

 

不过,the_excerpt()的确有一个功能,你应该知道在WP后台发布文章的框下面有个填写摘要的文本域(图3-2),如果你在那里写了东西,那么the_excerpt()就会输出你写的东西而不是默认的前55个字。因此一个简单的“你好,这是我的文章”填在摘要区域里,文章的摘要就会输出“你好,这是我的文章”,尽管这比55个字符还要短。

图3-2 WP后台发布文章的摘要区域

那么 the_excerpt()的好处到底是什么呢,有可能你不希望输出全文在列表页面占用太大的空间,比如搜索结果页面和类似归档的页面。

不过,the_excerpt()最明显的用法是用来置顶、推广你的文章,你可能在主页最上方有一个单独的loop用户输出特定标签的文章,你也照常输出他们的标题,而你想用the_excerpt()只输出他们的摘要而不是全文。下面我会展示如何使用。

先来澄清一下the_excerpt()的默认用法:

[cce_php]<?php the_excerpt(); ?>[/cce_php]

记住不要再独立的文章页面例如single.php里使用该函数,那里你需要的是the_content()函数来展示全文。当然了,你可以一起使用它们。

动手尝试:用摘要取代全文

1、打开默认主题(wp-content/themes/default)里的index.php,他的代码如下:

 

[cce_php]
<?php
/**
 * @package WordPress
 * @subpackage Default_Theme
 */
get_header(); ?>
<div id="content" role="main"> <?php if (have_posts()) : ?>
  <?php while (have_posts()) : the_post(); ?>
<div <?php post_class() ?> id="post-<?php the_ID(); ?>">
<h2><a href="<?php the_permalink() ?>" rel="bookmark" title="Permanent Link to
<?php the_title_attribute(); ?>"><?php the_title(); ?></a></h2>
<small><?php the_time('F jS, Y') ?> <!-- by <?php the_author() ?> --></small>
<div>
<?php the_content('Read the rest of this entry &raquo;'); ?>
</div>
<p><?php the_tags('Tags: ', ', ', '<br />'); ?> Posted in
<?php the_category(', ') ?> | <?php edit_post_link('Edit', '', ' | '); ?> <?php comments_popup_link('No Comments &#187;', '1 Comment &#187;', '% Comments &#187;'); ?></p>
</div>
  <?php endwhile; ?>
<div>
<div><?php next_posts_link('&laquo; Older Entries') ?></div> <div><?php previous_posts_link('Newer Entries &raquo;') ?></div>
  </div>
 <?php else : ?>
<h2>Not Found</h2>
<p>Sorry, but you are looking for something that isn't here.</p> <?php get_search_form(); ?>
37
<?php endif; ?>
</div>
<?php get_sidebar(); ?>
<?php get_footer(); ?>
[/cce_php]

2、用the_excerpt替换the_content,从而来显示摘要。你会在20行左右找到下面的代码:

[cce_php]<?php the_content('Read the rest of this entry &raquo;'); ?>[/cce_php]

 3、用下面的代码替换第2步里的代码

[cce_php]<?php the_excerpt(); ?>[/cce_php]

4、保存并上传index.php,这样你就可以看到默认的摘要输出(前55个字)而不是全文输出。因为主题都有自己的single.php来输出详细的全文,你不用担心这里只显示了摘要。如果你乐意,记得还可以在图3-2的地方填入自己的摘要,那么填入的文章就会优先输出,而不是输出前55个字。

 

  • 关于文章的置顶

WordPress从2.7版本开始增加了一个叫做sticky post(置顶文章)的东西,经常逛论坛的人应该很熟悉这个词,基本上就是通过置顶将一篇文章一直保持在页面的最顶端(见图3-3)。在文章的编辑界面,你可以通过设置该文章为置顶,从而让文章一直保持页面顶端。如果两篇文章都设置了置顶,那么会按照时间顺序排在页面的最顶端,以此类推。当你从后台撤消了该文章的置顶,那么该文章就会自动与剩余的文章一起正常排序。

图3-3 在首页置顶的文章会一直显示在页面顶部

模板函数里有一个sticky_class()用于输出置顶文章的样式类。不过和post_class()函数比起来则没有太大用处。

[cce_php]<div id="post-<?php the_ID(); ?>" <?php post_class(); ?>>[/cce_php]

可爱的post_class()函数会根据文章的详细设置给文章增加一些css类,这对于设计师来说是十分有用的,因此我们还会在第六章深入讲述post_class();

如果一篇文章被设为置顶,post_class()就会增加一个.sticky的css类,你可以任意修改这个类的样式,比如你想要一个淡灰色的背景,更大的字号等等,只需要将这些样式加入到你的style.css的.sticky类里即可。

[cce_css].sticky { padding: 15px; background: #eee; border: 1px solid #bbb; color: #444; font-size: 18px; }[/cce_css]

上面的css代码会应用到置顶文章里:浅灰的背景和暗边框,18px的字体;

下面是在基本loop循环里的应用:

[cce_php]
<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?> 
    <div id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
        <h2><a href="<?php the_permalink(); ?>" title="<?php the_title(); ?>">
            <?php the_title(); ?></a></h2>
            <?php the_content(); ?>
    </div>
<?php endwhile; else: ?>
    <p>Some error message or similar.</p>
<?php endif; ?>
[/cce_php]

还想对置顶文章做更多的设置?有个条件函数is_sticky()能帮助你做一些事情,或许你真的想特别突出这个置顶的文章,那么为什么不这么做呢:

[cce_php]<?php if (is_sticky()) echo 'Super important post! Read it! Now!'; ?>[/cce_php]

怎么样,页面顶部的一道风景哈? 但是更多时候是用于输出或者更改通知等事情,这取决于你如何使用了。基本的概念是置顶的文章确实足够重要,你想你的读者都看到它,比如在博客上出售你的电子书等等。

[cce_php]<?php if (is_sticky()) echo 'The latest e-book release by yours truly'; ?>[/cce_php]

因为WP之前的版本没有置顶这项功能,所以主题的设计师和用户都经常忘记有这么个功能。千万记得用置顶当你真的要强调重要的内容时。

 

  • 利用query_posts()发挥功能

每个善于使用loop的和雄心勃勃的主题设计师都应该知道强大的query_post()工具。本质上来说,query_post(),就是使得wordpress的默认loop循环里的数据变得具有可操作性,比如你可能想限制输出文章的数量,去除一些不想输出的分类或者改变排序之类的特殊需求。

需要谨慎的是:query_posts()只能用在单个的主循环中,而不是用在多重loop中,虽然也是可以用在多重loops中,但是结果可能会比较怪异,所以最好别再多重loops里用。你会在“多重loops”这一节学到如何创建任意多的loops。

query_posts()的使用方法也很简单,像下面的代码所示,放在你的loop循环之前:

[cce_php]
<?php query_posts(); ?>
<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
 <!— Doing stuff here, styling the posts and so on. —>
<?php endwhile; else: ?>
 <p>Some error message or similar.</p>
<?php endif; ?>
[/cce_php]

当然了,你可以把上面的代码写的更加紧凑,query_posts()前后的PHP的标签没必要单独使用,可以和下面的have_posts()部分写在一起。

那么,这到底对loop做了什么呢?实际上什么也没做,因为你还没有给query_posts()传入任何参数。由于这个函数没有任何默认参数,因此会输出标准的loop结果。query_posts()真正能做的事情就是告诉SQL语句在loop循环之前要满足你的需求。

现在你已经熟悉了query_post()函数,你可以尝试几个例子了。首先,你需要知道有很多使用该函数的方法,它的确有很多的设置,并且和条件函数配合使用可以得到千变万化的组合。

首先,从某个分类下去除所有文章开始做起,可能你在那个分类下你只放了几个短小没意义的文章,你需要先得到该分类的ID,这可以从后台编辑分类的地方得到,ID就隐藏在URL的末尾。

[cce_html]http://25.timepaw.com/wp-admin/categories.php?action=edit&cat_ID=130[/cce_html]

如你所看到的,cat_ID=130告诉你ID就是130.记住,分类的ID或者任何的ID都只是纯粹的数字,没有其他任何关系,文章、分类、标签所有的ID都是混合的,因此你可能前一个分类ID是3后一个就说不定是749。

回到我们的例子里,我们不想在展示ID为130的分类下的文章,codex.wordpress.org/Template_Tags/ query_posts这里的query_posts()代码手册说,你可以使用很多方法来传入分类的信息,使用cat参数,比如IDs。

[cce_php]<?php query_posts('cat=-130'); ?>[/cce_php]

这行代码,如前所述放在loop的前面,会去除属于分类ID为130的文章。请注意这里ID数字前的负号“-”,你必须要有它,如果没有负号,你就会得到恰好相反的结果——只输出分类ID为130的文章。基本上来说,ID前的一个负号都表示你排除了这个ID,因此这是很有用的。

接下来,显示文章标签为blue,green,yellow的文章,很简单,只需要把下面的代码放在loop前面:

[cce_php]<?php query_posts('tag=blue+green+yellow'); ?>[/cce_php]

这里,你显然是使用了tag这个参数,和cat这个参数一样,还有很多类似的参数可以传入。比如你可以通过query_posts()只获得某个作者写的文章,对任何数据做一些基础的查询和排序。你甚至可以抓取自定义字段并且拿他们来做事。你会在稍后建站的时候做很多类似的事情。

有一个问题你可能会疑惑,那就是query_posts()到底返回多少条数据?这仍旧是受WP设置(每页显示的数量)的控制。幸运的是连这个你也可以通过传入参数来控制。比如说,你想你的首页显示5篇文章,而其他分类页面依旧显示10篇文章。你可以通过两种方式处理这个问题,你可以创建一个home.php并且里面使用query_posts()来控制,或者在index.php里使用一个条件语句。第一种方法是最简单干净的,通过传入posts_per_page这个参数来控制显示:

[cce_php]<?php query_posts('posts_per_page=5'); ?>[/cce_php]

把上面的代码放在你home.php的loop前面,就会只显示5篇文章在首页,简单吧!现在,用第二种方法来试试,在index.php里加入条件语句,因为你可能的确不怎么需要一个单独的home.php文件。你需要做的全部就是使用is_home()条件函数来判断当前页面是否是首页,如果不是,一切照旧,如果是,就会先执行query_posts()函数。这样你会得到和前面增加home.php一样的效果:

[cce_php]
<?php
   if (is_home()) {
query_posts('posts_per_page=5'); }
?>
[/cce_php]

既然你已经可以控制要显示文章的数量了,当然你也可以去掉这样的限制。只要讲posts_per_page设为“-1”,你就会列出所有符合条件的文章,如果你有成千上万篇文章,千万别这样做,因为一旦你这样做,该页面会显示你全部的文章,而这对于数据库并不是很好玩的SQL查询。不过,换言之,你可以用这个方法来显示比如作者Admin在2011年发布的全部文章。

[cce_php]<?php query_posts('author_name=Admin&year=2011&posts_per_page=-1'); ?>[/cce_php]

如你所见,query_posts()以查询条件的方式传入参数,这意味着你可以填很多条件进去,只要别太复杂即可。我们往后会经常用query_posts()函数,所以掌握它吧。

[tab:多重Loops]

3、使用多重loops

有时候你可能需要在一个页面使用多重loops,你可能你想多展示一个非常重要的分类的文章,可能你想在侧边显示一下最近的文章,总之当你想在同页面内第二次获取某个文章时就需要使用另一个loop了。这个用法在你想改变博客传统的布局的时候是经常要用到的,因此也是掌握为好。

从简单的多重loop开始——在一个页面内新增一个loop。这里需要靠rewind_posts()函数,该函数会重置先前loop的指针让你再次查询。

[cce_php]
<?php rewind_posts(); ?>
  <?php while (have_posts()) : the_post(); ?>
  <!— And then the basic loop continues... —>
[/cce_php]

当然了,这只会输出和你第一个默认loop输出一样的内容,这看起来即没有必要也没有用处。因此要用rewind_posts()做点有意义的事情,你需要改变一点代码:比如你需要在页面最底部的一个盒子里显示新闻(News)分类中的最后5篇文章。这恰好可以通过前面提到的query_posts来做到:

[cce_php]
<?php rewind_posts(); ?>
<?php query_posts('category_name=news&showposts=5'); ?> 
<?php while (have_posts()) : the_post(); ?>
    <!— And then the basic loop continues.... —>
[/cce_php]

这会从news分类获取最新的5篇文章,正好显示在前面所说的底部的盒子里。

  • 用多重循环显示推荐文章:

多重循环的另一个常用功能是在页面顶部显示特色推荐文章,显示特色文章会打破博客的常规布局,并且正在变得越来越流行,尤其对于杂志型的博客更是如此。

下面是如何使用:首先,你需要一个loop从特色分类里获取一篇文章——比如最新的一篇。然后你需要第二个loop从所有分类里获取最新的文章。为了不让两者冲突,你需要把第一个loop的查询单独存在一个对象里,我们可以调用WP_query函数来存储。WP_query是loop循环的最核心的东西。虽然你没有在基本的loop里看到它,但是其实你一直都在使用have_posts()的时候使用它,比如,对于$wp_query->have_posts();你不需要写全,只要写出have_posts()即可。WP_query很庞大也有点复杂。不过你还是会和WP_query打交道的。

调用query_posts()这个模板函数,用法说明里写到其主要是用于修改主循环,因此你不会在其他loop里使用,取而代之是使用一个新的WP_query(),下面是代码:

[cce_php]
<?php $featured_query = new WP_Query('category_name=featured&showposts=1'); 
while ($featured_query->have_posts()) : $featured_query->the_post(); 
$do_not_duplicate = $post->ID; ?>
    <!— Styling for your featured post —>
<?php endwhile; ?>
    <!— Put whatever you want between the featured post and the normal post listing —>
<?php if (have_posts()) : while (have_posts()) : the_post();
if( $post->ID == $do_not_duplicate ) continue; update_post_caches($posts); ?>
    <!— Your normal loop post styling goes here —>
<?php endwhile; else: ?>
    <p>Some error message or similar.</p>
<?php endif; ?>
[/cce_php]

那么这几行代码究竟起了什么作用?让我们从第一个loop那里一行一行攻克,你用$featured_query来创建一个新的WP_Query的循环,这里和query_post()一样的方式传入参数,也就是说你将循环限制在特色分类里,并且只显示一篇:$featured_query = new WP_Query(‘category_name= featured&showposts=1’);.

然后,程序进入while循环,看起来很像基本的loop循环:while ($featured_query- >have_posts()) : $featured_query->the_post(); 还记得基本loop里的have_ posts()就是 $wp_query->have_posts()吧,这里也是一样,不同的是你没用$wp_query对象而是使用了新建的$featured_query。这就是说我们来做和基本loop里一样的事情,只不过我没用默认的对象,而是创建了新的对象,当然不会对$Wp_query有任何影响。第三行就很简单了,我们把特色文章的ID赋值给$do_not_duplicate参数,这么做的原因是我们要确定特色文章不会重复出现在下面的文章列表里。如果你曾经看到过多重循环的代码,你大概认识上面的代码,在代码手册里也能看到。你会继续使用你的主循环,但是不显示存在$d0_not_duplicate里的文章。当然了,这只在你要显示一条特色文章的时候起作用,如果有多个特色文章,则要用一个数组来存放特色文章的ID了。

这之后,程序进入了典型的文章输出环节,通常会有一个带链接的二号字体的标题,接着是内容或者摘要,你可能还想来点炫的,比如用自定义字段来显示特色图片等。不过目前就先输出内容吧。

继续下去,第8行是一个if语句用户检测当前的文章ID是否是$do_not_duplicate所存储的ID,如果是,我们就跳过,如果不是,就正常输出。

[cce_php]
<?php if (have_posts()) : while (have_posts()) : the_post();
  if( $post->ID == $do_not_duplicate ) continue; update_post_caches($posts); ?>
[/cce_php]

这之后就是基本loop里的那套代码,直到输出完毕。

因此,总结而言,你首先在一个单独的loop里输出特色文章,然后进入常规的loop循环,并且检查文章的ID从而避免特色文章被重复输出。

  • 三个优雅,四个更酷

用你已经掌握的知识,在这一节里尝试用用多重循环。在这个例子里,你会在一个loop里循环三个特色文章,之后连续三栏分别输出三个分类的最新文章。这是常见的非博客的CMS网站布局。根据模板文件的部署,这个文件最好叫做home.php,也就是只在首页才使用该模板页面。
考虑以下代码:
[cce_php]
<?php $featured_query = new WP_Query('category_name=featured&showposts=3'); 
while ($featured_query->have_posts()) : $featured_query->the_post(); 
$do_not_duplicate[] = $post->ID ?>
      <!— Styling for your featured posts —>
  <?php endwhile; ?>
<!— Now begins the first column loop —>
<?php query_posts('category_name=apples&showposts=10'); ?>
<?php while (have_posts()) : the_post(); ?>
if (in_array($post->ID, $do_not_duplicate)) continue; update_post_caches($posts); ?>
      <!— Category Apples post —>
  <?php endwhile; ?>
<!— Now begins the second column loop —>
<?php rewind_posts(); ?>
<?php query_posts('category_name=oranges&showposts=10'); ?>
<?php while (have_posts()) : the_post(); ?>
if (in_array($post->ID, $do_not_duplicate)) continue; update_post_caches($posts); ?>
      <!— Category Oranges post —>
  <?php endwhile; ?>
<!— Now begins the third column loop —>
<?php rewind_posts(); ?>
<?php query_posts('category_name=lemons&showposts=10'); ?>
<?php while (have_posts()) : the_post(); ?>
if (in_array($post->ID, $do_not_duplicate)) continue; update_post_caches($posts); ?>
      <!— Category Lemons post —>
  <?php endwhile; ?>
[/cce_php]

我们来看看工作原理,从三个特色文章开始。这和前面的例子极为相似,只不过这里你要显示三个特色文章,并且不希望他们重复出现,因此要用一个数组变量来存储他们的ID。懂PHP的应该很容易看出来中括号$do_not_duplicate object后的[]是表示数组。如果你不熟悉,简单来讲就是用于存储一系列的ID值,本例中存了3个ID,你在后面的loop里都要检查并跳过这三个ID的文章。

接下来,每一个栏目的循环都包含一个分类,这里都是基本的loop循环,使用query_posts()来限制输出的数量,你会根据前面的例子发现这里是如何排序和限制文章输出数量的。

考虑到你不想在下面的栏目里重复输出特色文章,你需要检查$do_not_duplicate数组变量,你会发现if语句对于数组的检查有一点点变化。

最后,在第一个栏目循环结束的时候,你需要使用rewind_posts()来恢复循环的指针从而在下一个栏目里重新使用query_posts(),然后一切都是重复的。

一个备选的方案是创建四个不同的query对象,就像前面例子里的特色文章的输出,从而取代$WP_query,不过说真的,这里没有多大必要。

下面是上面例子的完整代码,包括输出文章的HTML和CSS代码:

[cce_php]
<div id="featured">
<?php $featured_query = new WP_Query('category_name=featured&showposts=3'); 
while ($featured_query->have_posts()) : $featured_query->the_post(); 
$do_not_duplicate[] = $post->ID ?>
<div id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
<h2><a href="<?php the_permalink(); ?>" title="<?php the_title(); ?>"><?php the_title();
?></a></h2>
<?php the_excerpt(); ?>
        </div>
    <?php endwhile; ?>
</div>
<div class="column left">
<h2>Latest from <span>Apples</span></h2>
<ul>
<!— Now begins the first column loop —>
<?php query_posts('category_name=apples&showposts=10'); ?> <?php while (have_posts()) : the_post();
        if (in_array($post->ID, $do_not_duplicate)) continue; update_post_caches($posts); ?>
        <li>
<h3><a href="<?php the_permalink(); ?>" title="<?php the_title(); ?>"><?php the_title(); ?></a></h3>
            <?php the_excerpt(); ?>
        </li>
<?php endwhile; ?>
</ul>
</div><div class="column left">
      <h2>Latest from <span>Oranges</span></h2>
      <ul>
      <!— Now begins the second column loop —>
      <?php rewind_posts(); ?>
<?php query_posts('category_name=oranges&showposts=10'); ?> <?php while (have_posts()) : the_post();
          if (in_array($post->ID, $do_not_duplicate)) continue; update_post_caches($posts); ?>
          <li>
<h3><a href="<?php the_permalink(); ?>" title="<?php the_title(); ?>"><?php the_title(); ?></a></h3>
              <?php the_excerpt(); ?>
          </li>
      <?php endwhile; ?>
</ul>
</div><div class="column right">
      <h2>Latest from <span>Lemons</span></h2>
      <ul>
      <!— Now begins the third column loop —>
      <?php rewind_posts(); ?>
<?php query_posts('category_name=lemons&showposts=10'); ?> <?php while (have_posts()) : the_post();
if (in_array($post->ID, $do_not_duplicate)) continue; update_post_caches($posts); ?> 49 <li>
<h3><a href="<?php the_permalink(); ?>" title="<?php the_title(); ?>"><?php the_title(); ?></a></h3>
              <?php the_excerpt(); ?>
          </li>
      <?php endwhile; ?>
</ul> </div>
[/cce_php]

上面的代码里,四个循环,其中一个用于特色文章,然后三个循环用户展示三个不同分类里的文章,这些代码可以轻松的在WP主题是实现,不过正常工作起见,你需要修改这里的分类名称为你的博客分类名。

[tab:自定义字段]

4、自定义字段(Custom Fields)

自定义字段经常出现在loop循环里,他们是完全由用户自定义的和文章关联的数据库字段。如果你仔细看过WP后台文章编辑框的下方,应该有一个或几个自定义区域,每个里面有个字段名。如图3-4所示:你可以在这里添加一到多个自定义字段。

图3-4 自定义字段区域

自定义字段总是属于文章的,并且包括字段名和值。你可以在任何时候添加新的自定义字段,用过一次的字段都会在下次显示在下拉框里,这很便于你想起以前加了什么字段并且避免拼写错误。

开始使用自定义字段:极为简单,只要写个文章并且加一些字段即可,然后点击增加自定义字段按钮来保存。这样你就已经保存了自己的自定义字段,不过在你调用它之前它都是隐藏的。

在调用它们之前,我们再来重复一遍,每个自定义字段都包含了一个名字和值,这样是希望在不同的文章之间都能共用这些字段名,不同的是改改数值。

处理自定义字段的模板函数是the_meta(),默认情况下,该函数会输出一个列表包含该文章下的所有自定义字段;如果你只是用自定义字段存储一些例如你今天有多高兴、你正在读的书,或者是文章的评分等一些东西那么这么用会非常ok,ul和li会列出你的每一个自定义字段,并且每一个自定义字段的值的外面都有li包含,li的html代码里都有一个class=”post-meta-key”。

比如你有一个叫做”Actor”的自定义字段,值是”Harrison Ford”,另一个自定义字段叫”Director”,值是”Stephen Spielberg”,最后有个自定义字段叫”Movie Title”,值是”Indiana Jones and the Raiders of the Lost Ark”,这里所有的字段和值都属于一个特定的文章,并且如果你将the_meta()放在了loop里的什么位置,那么这个文章就会将这些字段显示出来,输出的代码应该如下:

[cce_html]
<ul class='post-meta'>
    <li><span class='post-meta-key'>Actor</span> Harrison Ford</li>
    <li><span class='post-meta-key'>Director</span> Stephen Spielberg</li>
    <li><span class='post-meta-key'>Movie</span> Indiana Jones and the Raiders of the Lost Ark</
li> </ul>
[/cce_html]

只要你是想展示这些简单的东西,那么这就足够了,况且你还可以用css来定义输出的样式,当然了,你一定想多学一些,继续吧。

发布文章的特色图片Posting Header Images    

自定义字段最流行的一个用法是给一篇文章附上一个特色图片,用于分隔一篇篇文章,首先你需要决定你的自定义字段叫什么,比如就叫post-image,也比较好记,当你在代码里看到的时候也容易理解,这是好习惯。

接下来,你需要一些数据来实验。用WP的图片上传工具来上传一个图片并复制该图片的url地址,类似于这样:

[cce_html]
http://25.timepaw.com/wp-content/uploads/2012/07/wordpress-essentials-508x293.jpg
[/cce_html]

现在来在发布文章的界面里增加post-image字段。如果你之前的文章里没使用过post-image字段的话就直接在自定义字段输入框里输入post-image,否则就直接选择下拉菜单里的post-image,然后将这个图片的url粘贴到post-image对应的值的输入框里,保存即可。现在你已经将这个图片设为这篇文章的自定义字段了,这意味着你可以用它来作为特色图片了。

在你的文章里找个要输出这个图片的位置,可能是和你的文章一起输出在首页,这取决于你图片的形状,可以是标题左侧的一个缩略图,也可以是一个大图。

本例展示了如何将自定义字段的图片放置在h2的标题上面,一些杂志型主题常常这么做,和loop配合起来就是这样的:

[cce_php]
<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?> 
<div id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
<?php $splashimg = get_post_meta($post->ID, 'post-image', $single = true); ?> 
<?php if($splashimg !== '') { ?>
<img src="<?php echo $splashimg; ?>" alt="<?php { echo the_title(); } ?>" class="splashimg" /> 
<?php } else { echo ''; } ?>
<h2><a href="<?php the_permalink(); ?>" title="<?php the_title(); ?>"><?php the_title(); ?></
    a></h2>
      <?php the_content(); ?>
  </div>
  <?php endwhile; else: ?>
      <p>Some error message or similar.</p>
  <?php endif; ?>
[/cce_php]

第三行代码就是通过get_post_meta()函数来取得自定义字段的值并存储在变量$splashimg里。这和之前的the_meta()函数很像,这里你传入了三个参数分别是:文章的ID,用于告诉WP在哪里输出这个自定义字段,第二个是你想要取得值的自定义字段的名称,这里就是post-image,这和你之前输入的名称要保持一致。最后一个参数是设置$singe=true,是用来告诉WP以字符串的形式传值,否则就会给出一个自定义字段的数组,当然有些时候这样也很有用,不过本例只想要字符串并存入$splashimg里。

第四行代码我们开始检查$splashimg是否有值,如果有则输出一个图片。

这就是你从get_post_meta()里取得的值了,其实就是一个图片的地址。如果$splashimg里没有任何东西,那么就是说你没有存入任何值在post-image里,也就无法输出图片,当然你可以设置个默认的图片,以防万一出现了这种情况。

这之后还是常规的loop,输出标题,内容等等。

[tab:开始coding]

5、开始coding

loop的使用一开始会很奇妙,基本的loop代码一眼就能认出,而且这基本就是你能开始写WP的全部了。随着深入的了解,你会越来越容易的理解这其中的机制,而当你开始创建你自己的WP主题的时候,你会很快发现这点。

如果你看完本文后依旧对loop的理解表示困难,不要太在意,随着你阅读的例子和代码越来越多,理解就会变得越轻松。而这就是接下来我们将要做的,真真切切的开始创建这些东西。首先是主题,随后的三章都是讲解主题的制作,这意味着你将会看到非常多的loop,而同时你也会更深入的钻研模板函数和其他一些WP用于控制输出的工具。

[tab:END]

1.2 WordPress语法

现在为止,你已经完成了你WP的安装和设置,是时候用它做点事情了。当然了,你可以直接下载一个主题和一些你想要的插件,开始修修补补,并且边干边学。可以说这是一个保险的做法,屡试不爽。事实上,这也是我如何开始Wordpress之路的。

然而,既然你看到了这篇文章,你可能已经有了一个不错的开始。这一章全是关于如何让WP工作的。这里并不会深入到系统里的每一个文件讲解,但是却会充当一个“WP如何工作的入门指引”的角色,以便于你可以由学到的东西开始开发一个跑在WP框架上的网站。

从现在开始,如果你懂一点PHP,HTML和CSS将会是有帮助的。如果这些对你来说你陌生的概念,一定要保证至少去查阅一下他们。虽然你不用完全了解他们中的任何一个,但是一定程度的理解的确是需要的。

[tab:WP与PHP]

1、WordPress与PHP

WP使用网络上比较流行的语言PHP所架构。你可能知晓这些,如果你拥有哪怕一点点关于PHP的知识,你会发现你将很容易走进WP的世界,并且熟悉那些插件和主题所提供的函数以及后端的一些事情。也就是说在WP的世界里,你并不用极为高深的PHP知识来解决那些看起来棘手的问题。但是你必须知晓,如果不知道PHP的知识你不可能创建WP的插件,不过你完全可以通过倒腾WP主题里内建的模板标签来完成一些事情,并且那会让你深深痴迷。

codex.wordpress.org所以提供的WordPress Codex(代码手册),是一种维基形式的用户手册,详见图2-1:


图2-1 去习惯使用WP代码手册

当你开始动手编程的时候,代码手册将会十分有用。建议你应该去熟悉该手册,因为在接下来的章节里,无论是从例子里举一反三还是想要了解一个概念,你都会在手册里找到有用的信息。比如模板标签(codex. wordpress.org/Template_Tags/),比如函数参考(codex.wordpress.org/Function_Reference)。

上面的东西听起来很困难么?不要着急,即使你从来没用PHP写过甚至Hello World的程序,你也可以在结束本系列文章之前用WP打造出一个内容驱动的网站。

[tab:主题与模板]

2、主题与模板

在接下来之前,你需要了解一下主题和模板文件,因为接下来我们将要学习这些。简单来讲,主题就是你网站或博客的一张皮肤,主题会连同数据库里的内容呈现出你的全部视觉设计。

然而,仍旧有简单的方法,可以让我们发掘开发主题的可能性。你当然可以用一个基础的主题,或多或少的呈现WP的默认样式,但是你也可以完全改变你网站布局的方式,以任何一种方式欣赏和使用网站,当然如果你想呈现博客的样子,那自然可以。

一个主题包含一个样式表文件style.css, 这个文件包含了所有基础的样式,比如主题名称,数据等。和该文件在一起的是一系列其他PHP文件,一些是绝对必须的,一些是锦上添花的。这些PHP文件叫做模板文件。你会找到index.php,该文件即是模板的主要文件,用于列出首页或搜索的文章列表,以及任何时候没有对应模板的时候都会使用它。其他一些常见的文件包括sidebar.php,该文件包含了侧边栏的内容;comments.php用于评论功能,header.php和footer.php用于展示你的页眉和页脚。你还会有一个single.php文件用于展示单个的文章,以及一个page.php用于展示静态文章页面。有时可能还会有一个专门用于呈现搜索结果的文件(search.php),以及一个呈现分类页面的文件(category.php)等等。增加一些可以用在wp页面的页面模板文件,你会渐渐瞥见Wordpress的灵活与万能。

使用模板,WP函数库,以及插件还有PHP代码,你几乎可以发挥想象的创造任何有意思的站点。不想要评论功能,只需要删除那段代码即可。也许你想要一个看起来完全不同的特殊产品页面,那么创建一个模板,并且赋予它任何你喜欢的样式,如此等等。在稍后的章节里,你会看到如何建立一个看起来和普通博客完全不同的站点。

尽管去把事情做得复杂一点点,没关系,你甚至可以在你的主题里添加更多的功能,functions.php可以提供类似插件的功能,况且我们还没涉足任何小挂件widgets,在这里,你可以从后台丢进很多挂件元素。

最好的学习方法就是使用,模板也一样。在一个测试博客安装一个主题,折腾它,然后浏览一下它包含的模板文件。不要去理会图片,也不要去理会样式表(这只是设计的部分),而是要好好的看一看index.php,以及header.php和footer.php,理解建立他们的方式。本质上他们是不复杂的:首先加载header.php,之后是任何主要的模板文件,比如index.php,single.php等,也可能是sidebar.php文件,再之后就是footer.php。


图2-2 WP管理后台让模板管理变得轻而易举

我们将会在后面慢慢的研究模板,眼前你只要知道,正是模板让wp的世界丰富多彩。你可以在模板文件里找到能够输出你文章的代码,正是由于模板文件的存在,尽管看起来各式各样的样式,也不过都是同样本质的东西。

关于WP内核

和所有优秀的CMS系统一样,他们都会把内核文件单独分开,以免你破坏了系统赖以工作的关键文件,WP也不例外。这里我们要说说WP的内核文件,它几乎就是除了WP-content文件夹的所有东西,而WP-content文件夹就是你放主题、插件和文件上传的地方,这些东西都工作在WP的上层,因此在这个文件夹里操作、修改没有任何破坏系统的风险。

事实上,总的来说,你只有在安装系统和转移系统的时候才会和WP-content文件夹以外的东西打交道。当然了,你也会遇到让你修改.htaccess文件的时候,并且我相信你也会遇到安装某些插件让你修改wp-content之外的事情,当然这些都是允许的,不过还是要小心一点。

[tab:模板标签]

3、使用模板标签(Template Tags)

尽管WP是用PHP架构的,但事实上其本身就是一个框架,你可以用php去修改你的模板和插件,不过多数的函数都是是用模板标签的,随意打开一个模板文件夹里的.php文件,你就会发现类似的模板标签,例如:

[cce lang=”php”]bloginfo(‘name’);[/cce]

这就是一个模板标签,它返回的结果是显示该博客的名字,PHP的部分为以为结尾的地方,开头-结尾的符号告诉WP要处理中间的任何php代码,这里要处理的是模板标签 bloginfo(),在括号里,你可以找到其参数,传入的就是单引号”之间的变量名字,这里的传入参数为’name’,你会多次使用bloginfo()这个模板标签,比如要找到主题所在的路径,如果我们要输出一个在主题根目录下的图片smashing.gif,直接使用下面的代码即可:

[cce lang=”php”]
<img src=”<?php bloginfo(‘template_directory’); ?>/smashing.gif” alt=”” />
[/cce]

显然,你会认出HTMl的标签img,在这里,bloginfo()这个模板标签又有另一个参数:template_directory。这样会输出主题文件夹所在的路径,不过参数叫模板路径不如叫主题路径的来的明确。刚刚你添加了smashing.gif在主题路径的后面,这样你就可以显示一个主题内的图片了,当然了,该图片要确实在你的主题里才能显示。

因此,模板标签是最基本的通过处理参数来实现不同功能的PHP函数。一些有默认参数,一些没有,一些还会有更多的设置。大部分模板标签在你主题的任何位置都会工作,但是有一些必须在LOOP内部。loop则是最基本的输出文章、页面等内容的代码(下一章节讲具体解释loop)。

你当然可以在Codex:codex.wordpress.org/ Template_Tags/找到全部的模板标签,任何时候当你想在主题里做点不寻常的事情或者更改现在的主题,都可以去参阅这个文档。每一个模板标签都会有用法、描述以及示例代码帮助你理解。这就是WP的美,实际上你可以通过复制粘贴的方式实现一个不同的结果,而用不着了解任何的PHP。

[tab:include标签]

4、Include标签(The The Include Tags)

这里是一系列每一个主题都要用到的模板标签,include标签是基本的php include函数,在必要的文件里用于输出内容。换句话说,它是一种更简单的方式去获得你的页头,页脚和侧边。

[cce_php lang=”php”]
get_header();
get_footer();
get_sidebar();
[/cce_php]

一般情况下,你会在你主题里文件里比如index.php找到他们,这些文件会自动的包含header.php, footer.php, 和 sidebar.php。前面两个没有任何参数,但get_sidebar()通过传入不同的参数实际上支持可变的侧边栏,就像这样:

[cce_php]
get_sidebar(‘left’);
[/cce_php]

这会包含sidebar-left.php而不是默认的sidebar.php,当然你也需要先创建那么一个文件。
那你是不是也想包含不同的头部文件呢,你可以使用这个漂亮的PHP代码片。

[cce_php]
include (TEMPLATEPATH . ‘/altheader.php’);
[/cce_php]

这是一个传统的PHP包含语句,它通过TEMPLATEPATH(你的主题文件夹)来告诉PHP从哪里找到这个文件。这也是其他include模板标签所同样做的,他们通过查找你的主题文件夹来包含相应的文件。上面的例子包含了altheader.php这个不一样的头部的代码。你也可以通过这样的方法包含任何其他的文件,所以这很方便。

最后,还有一个关于留言模块的include,任何一个好的主题都包括comments.php,难道不应该有一个留言模块吗?WP的默认主题里都包括了。只需要把comments_template()标签放在你想要评论显示的地方,或者在你不想使用的时候删掉它。

[cce_php]
comments_template();
[/cce_php]

注意,这里你没有传任何参数给comments_template()。
include标签是用来输出不同模板文件的,在这一方面他们是不同于template标签的,因为你要包含的是其他一些文件而不是增加一个特殊的功能或元素。或者直白的说,include标签包含template文件,而template文件包含template标签。

[tab:复合参数]

5、传复合参数给模板标签(Passing Multiple Parameters to a Template Tag)

通过模板标签来输出内容是相当简单的,一些不用传参数,一些传一个参数,比如前一个例子中的bloginfo(),还有一些则会传入多个参数。

至少对于博主而言,两个的确有用的模板标签是 edit_post_link() 和 edit_comment_link(),他们几乎做的是一样的事情,就是在文章或者留言里增加一个链接到后台的编辑链接,当管理员登录的时候,遇到输出显示的问题,通过这些链接会非常方便的将你带入到后台去修改大的错误或者审查让你不爽的留言。

对这些类似edit_post_link()的标签,你需要做的就是把他们放到你主题的文章或留言部分。上述的两个标签都需要放入到loop模块内部,我们会在下一章讨论loop,在这里,你只需要知道edit_post_link()是和输出文章内容的代码放在一起的。

首页,下面就是传入默认参数(即,没有参数)是的标签的样子:

[cce_php]
edit_post_link();
[/cce_php]

如果你把上面的语句放入到你的主题,你就会在你的文章里看到一个“编辑”的的链接。不过,比如说你要让这个链接显示在单独的一行,比如在Admin之后,并且显示的是“编辑这篇文章”,而不是默认的“编辑”,只要简单的用下面的代码替换即可:

[cce_php]
edit_post_link(‘Edit this post’, ‘<p>Admin: ‘, ‘</p>’);
[/cce_php]

你可以看到,edit_post_link()支持三个参数,第一个是链接要显示的文本,这里是Edit this post,第二个参数是显示在链接前面的文本,记住,这里我们想要的是单独一行显示这个链接,并且前面加上'<p>Admin:’的样子,所以第二个参数是'<p>Admin:’,空格是为了不太拥挤。最后一个参数则是链接之后的文本,这里就只是'</p>’,因为你需要闭合

这个标签。换句话说,edit_post_link()可以处理三个参数,以PHP代码的方式写出来即:

[cce_php]
edit_post_link( $link, $before, $after );
[/cce_php]

记住,一般都是通过单引号传入参数,并且多个参数之前用逗号和空格隔开。

并没有那么复杂对吧?你需要知道的就是需要传入的是哪些参数,以及这些参数传入的顺序。顺序是很重要的:假想你把这些弄混了,你可能不仅会得到错误的链接可能还会破坏你的整体设计。现在让我们来一点稍微复杂的:

[cce_php]<?php wp_tag_cloud(); ?>[/cce_php]
这个模板标签会显示最多45个标签的标签云,其中最小的标签有8pt,最大的有22pt。他们会以名字正序排布。你知道这些因为这是默认的参数值,你也会在大部分主题里看到这样的显示。事实上,wp_tag_cloud()可以传入12个参数,如下面所示:

smallest      Smallest tag size;     8 is default
largest         Largest tag size;       22 is default
unit               What font size unit is used;  pt is default
number       How many tags to display at most; 45 is default
format         How to display the tags; flat separated with white space is default
orderby      How to order the tags name is default
order           How to sort the tags; ascending is default
exclude       What tags to exclude; none is default
include       What tags to include; all is default
link               View is default
taxonomy  The basis for the tag cloud; post is default
echo             Whether to show the tag cloud or not; true is default

即使你是个有经验的WP用户,以上的参数对你而言可能也是陌生的,尤其是echo和taxonomy,两者都在WP2.8中有介绍。

现在,如果你把这些值和wp_tag_cloud()的默认输出的描述进行比较,你会发现,这些都是自动传入的参数。
现在让我们来尝试改动一些参数,你要知道,尽管wp_tag_cloud()像常规的查询语句一样的风格传入参数。当你只是想改变字体的大小,你必须要传入这里的所有的12个参数,这显得并不是很有用户友好度,不过你可以这样简单的处理:
[cce_php]
wp_tag_cloud(‘unit=px’);
[/cce_php]

自然的,我以前并不知道px是字体单位的选项,我是在这个模板标签(codex.wordpress.org/Template_Tags/wp_tag_cloud)的描述里找到的。其他的一些字体单位的选项为em, %, 当然还有默认选项pt。

如果你想传入更多的参数,只需要在参数之间加上’与(&)’符号即可,不需要空格。比如要改变标签云的排序为count(标签出现的次数):

[cce_php]
wp_tag_cloud(‘unit=px&orderby=count’);
[/cce_php]

你可以通过在模板标签里加入更多的‘与’符号来传入更多的参数,下面我们将标签云的顺序随机,改变最小的标签大小为10px,(因为默认的8pt略小)并且最大的字体为24px:

[cce_php]
wp_tag_cloud(‘smallest=10&largest=24unit=px&orderby=count&order=RAND’);
[/cce_php]

这里顺序的值为RAND,是大写的哦,这是必须的。这就是你如何传值给order(其他的选项为ASC正序的,DESC为倒序的)。你可能也注意到两个最大最小字体的参数都在unit之前,你最好把参数按照默认的顺序传入,这样你会在需要修改代码的时候更容易找到他们。

关于参数的那些事…

因为你需要经常和模板标签打交道,理解参数还是至关重要的。正如我们所接触的,模板标签有三种形式。第一种是没有参数的模板标签,第二种通过单引号传入一到多个参数,第三种是一种叫做查询类型的,通过‘&’符号传入多个参数。

自然的,不传参数就意味着当你需要用的时候只管用,问题是当你需要修改默认输出的时候,就需要用到参数了。

在之前的例子里,我们已经都做到了这些。记住,我们只是往模板标签bloginfo()传入了包含一点信息的参数:

[cce_php]bloginfo(‘name’);[/cce_php]
然后我们以PHP函数的方式,在edit_post_link()模板标签里传入了一个参数。这里,我们告诉模板标签链接是什么,链接前后是什么,参数之间以逗号分开,参数放在”内部传入:
[cce_php]edit_post_link(‘Edit this post’, ‘<p>Admin: ‘, ‘</p>’);[/cce_php]
最后,我们通过“查询方式”为wp_tag_cloud()传入多个选项来输出一个标签云,这个方法通过’&’符号将参数分开,并且可以让你通过改变选项来改变输出样式。
[cce_php]wp_tag_cloud(‘smallest=10&largest=24unit=px&orderby=count&order=RAND’);[/cce_php]
至此,这个章节有了一点点技术性了,有三种传值给模板标签的方式,尽管模板标签的定义告诉了你如何传值,但是了解背后的原理还是好一点的。你不能随意拣一个,你需要找到这个模板标签到底需要什么。首先,你要知道字符串(string),bloginfo(‘name’)的例子里就是一个字符串,因为你告诉了模板标签’name’是参数,字符串一般在单引号和双引号之间,单引号可能更常见,本书的例子中也是用单引号。

Integers(整型)就是一些数字,比如55900或者-3。乐意的话你可以在引号之间传入他们,不过其实你不需要引号。当你需要得到一些有ID的数据,你就会用到整形,其实这是个很常见的事。

最后,还有一种参数是布尔型,布尔型表示参数是真或者假,你可以以大写的(TRUE or FALSE)传入,也可以以小写的(true or false)或者以数字(1为真,0为假)传入。但是,你不能在引号里传入布尔值,因为引号里的参数只代表引号里的字符,与真假无关。比如get_calendar()模板标签只有一个参数,就是是否显示完整的日期,或者只有一个首字母的缩写。True是默认的参数,用于显示星期的首字母(比如,M代表Monday),因此如果你要想显示Monday而不是M,你需要设置get_calendar()的参数为false:

[cce_php]get_calendar(FALSE);[/cce_php]
可以看到,这里不需要任何引号,只要文本的FALSE,你也可以小写或者传一个0;

另一个布尔型结构的模板标签的例子是the_date(),这个模板标签用于在文章里输出日期。你或许可以,比如,在PHP里使用这个函数,但是什么都不会输出。阅读一下这个模板标签的描述你会发现,你可以改变日期输出的格式(第一个参数)、日期前面输出的字符(第二个参数)、日期后面输出的字符(第三个参数),最后一个参数是布尔值用于告诉系统是否输出(true是默认)。比如你想输出一个 年-月-日 格式的日期(Y-m-d是PHP手册里对于date函数的定义,WP也可以照搬过来。),代码如下:

[cce_php]the_date(‘Y-m-d’, ‘<p>’, ‘</p>’);[/cce_php]
不过,如果你想在PHP里面用这个函数,输出空白,你可以设置最后一个参数为false,因为是布尔参数,因此你不用把false放入引号内,如下所示:
[cce_php]<?php the_date(‘Y-m-d’, ‘<p>’, ‘</p>’, FALSE); ?>[/cce_php]
用year-month-day也会给出同样的结果——空白输出。因此如果你要这么用,你必然要在PHP里做一点恶心的东西,你确定吗?

最好这样记住:字符串是引号里的东西,整型就是整数,布尔值是没有引号的True或者false,牢记这些,会更容易理解稍后你要建站时用到的模板标签。

[tab:条件语句]

条件语句(Conditional Tags)

条件语句非常方便使用,你会在你的主题文件里用到他们,顾名思义,他们是用来设置多种条件的。换言之,你可以用他们来根据不同的条件显示不同的东西,

[cce_php]
if (is_home())
{
echo ‘<p>Hey you, welcome to the site. I love new visitors!</p>’;
}
[/cce_php]
以上会输出一段样式类为welcome的文字,进一步观察,你会发现这是一个简单的if语句判断当前页面是否是首页,如果是则输出这段话,非常简单。让我们来尝试些其他的:比如你需要在一些特殊的文章分类下使用不同的侧边栏。你可以用模板标签is_category()来检查,然后决定是否输出另一个侧边栏。当是其他页面的时候,则依旧使用get_sidebar()来获得侧边。

当模板文件满足条件的时候,这段代码会替换get_sidebar(),这些文件可能包括index.php, category.php, single.php等等。

[cce_php]
if (is_category('very-special'))
{
    get_sidebar('special');
} else
{
    get_sidebar();
}
[/cce_php]

上面的代码是你在判断当前分类是否是特殊分类(very-special),very-special是分类的别名(slug)。你也可以通过分类ID或者分类名称来判断,并且ID可能是相当简单保险的,不过如果你使用别名,代码会更易读的。因此如果当前分类的slug是very-special,那么就会使用include函数get_sidebar(‘special’),这里的special是一个参数用于告诉系统想要包含的是sidebar-special.php。如果你乐意,你还可以写一个传统的PHP的include,通过TEMPLATEPATH选项来找到你要包含的文件(参加本文前面的The Include Tags),但是get_sidebar()足以了,因此就用这个吧。

继续看,如果当前分类的slug不是very-special,那么就会执行else语句告诉系统你要用普通的get_sidebar()标签,也就是说你要使用sidebar.php.

这些都是简单的东西,但是已经清楚的表明了如何使用条件语句来创建动态的页面,我们将在后面用它做些更有意思的事情。

[tab:END]

1.1 WordPress安装之一二三

安装Wordpress(后文简称WP)既不困难也不复杂,wordpress.org的官方指导完全可以教会你基本的安装,换言之,如果你想安装一个更完美的WP,你还需要知道一些不那么显而易见的事情。因此这个章节就是用来告诉你一个更进一步的安装和开发,我们得承认,WP是一个极为强大的发布工具;

你可以通过主题和插件来高屋建瓴的掌管WP,主题和插件基本上就是基于WP建站的全部了,因此了解最基本的权利才能更高层的掌控WP,WP只是砖瓦,主题和插件才是精髓。

另外需要提及的是,后文的WP都是特指官方提供的单用户版本,不要和多用户版本“WP-MU”搞混淆,并且主要适用于WP2.8以后至WP3.4。

[tab:基本安装]

基本安装过程

你可能知道,安装WP是小菜一碟,在博客圈,著名的“五分钟”安装被口耳相传,事实上,需要花去这么长时间的主要是上传安装文件的时间,由于网络或服务器的质量可能会让上传耗时一些,很有可能你已经亲自安装过许多个WP,下面我会简单的谈论此事。

首先,你需要确定你的系统满足WP最小的需求,该最小需求可以在wordpress.org/about/requirements/中找到。如果你的主机支持PHP4.3+并且运行着Mysql4.0+, 那么应该就很不错了。然而考虑到链接的优美,你还是要确定你的主机安装了mod_rewrite模块。


图1-1 安装wordpress

安装之前,你需要准备如下:

  • wordpress.org/download/下载最新的wordpress
  • 一个拥有写权限的Mysql数据库(询问你的主机商)
  • 你用得顺手的FTP工具

解压下载的文件到你想要安装的服务器的位置,然后打开wp-config-sample.php找到数据库部分填写你的数据库,用户名,密码等信息,下面是该文件的示例:

[cce lang=”php”]
define(‘DB_NAME’, ‘putyourdbnamehere’); // The name of the database define(‘DB_USER’, ‘usernamehere’); // Your MySQL username
define(‘DB_PASSWORD’, ‘yourpasswordhere’); // …and password
define(‘DB_HOST’, ‘localhost’); // 99% chance you won’t need to change this value
[/cce]

WP3.4.1已经有个更好的安装界面,你只需要保证你的服务器具有可写权限,即可通过下图1-1-2的方式安装:

图1-1-2:图形安装界面

接下来,还在wp-config-sample.php中找到秘钥部分,这部分一个名为“Authentication Unique Keys”的标题开始,紧接着有4行如下所示的需要你来填写秘钥。这是一种让你安装更安全的方法,你只需要添加这些秘钥一次,当然他们也可以在任何时候手动填写,官方网站有一个在线生成器会在每次载入的时候帮你生成一串字符。你只要将这个链接(api.wordpress.org/secret-key/1.1/)拷贝到生成器,并用浏览器打开就会得到一个包含如下代码的页面:

[cce lang=”php”]
define(‘AUTH_KEY’, ‘PSmO59sFXB*XDwQ!&lt;uj)h=vv#Kle’)dBE0M:0oBzj’V(qd0.nP2|BT~T$a(;6-&amp;!’);
define(‘SECURE_AUTH_KEY’, ‘o&gt;p3K{TD.tJoM74.Oy5?B@=dF_lcmlB6jm6D|gXnlJ#Z4K,M&gt;E;[ +,22O?Lnarb’);
define(‘LOGGED_IN_KEY’, ‘c}gR{389F*IG@/V+hg1 45J*H+9i_^HaF;$q(S[5Er[:DVOUjmS@(20E~t0-C*II’);
define(‘NONCE_KEY’, ‘gz2D:n52|5wRvh)es:8OO|O ufZL@C|G.-w/H-E*}K:ygp4wI*.QHO-mUV_PR|6M’);
[/cce]

从生成器页面复制以上内容,并替换wp-config-sample. php中的如下内容:

[cce lang=”php”]
define(‘AUTH_KEY’, ”);
define(‘SECURE_AUTH_KEY’, ”);
define(‘LOGGED_IN_KEY’, ”);
define(‘NONCE_KEY’, ”);
[/cce]

通过替换以上这些看起来不爽的代码,你就可以令你的安装更加安全。

最后一个你想在配置文件中修改的可能就是语言选项,WP默认为US English,而如果你是中国人你自然希望用汉语来建站。要更改语言你需要一个语言文件(.mo文件),你可以在codex.wordpress.org/WordPress_in_Your_Language这里找到大部分国家的语言。同时你需要在wp-config-sample.php通知WP你所使用的语言,如下代码:

[cce lang=”php”]
define (‘WPLANG’, ”);
[/cce]

你需要做的是添加上语言代码,这里和你的语言文件一样,只是不带后缀而已。因此如果你真的使用汉语,那么你需要下载cn_ZH.mo,上传到wp-content/languages/中,然后更改wp-config-sample.php如下

[cce lang=”php”]
define (‘WPLANG’, ‘cn_ZH’);
[/cce]

这不会让你的主题和插件也显示这个语言,但是WP自己会显示,我们会在第6章讲解更多的本地化话题;

这就是安装的全部工作了,把改好的wp-config-sample.php 重命名为 wp-config.php,并在浏览器里输入你安装的地址,然后就会出现一个对话框询问你的博客标题和email,选择是否让你的博客出现在搜索引擎中。这些之后你就可以使用admin和你自己设定的密码登录wordpress;

没有很复杂,对吗,最新的版本更为简单,相信我!

使用一个外部的数据库服务器

一个常见的安装失败的问题是Mysql服务器在另外一个服务器上,如果你遇到了数据库连接错误,而且你确定用户名密码权限等都是正确的,那么最可能是这个情况了:

如何解决呢,只要找到wp-config.php中的这行代码,更改localhost为你的数据库服务器(比如mysql32.wang.com,这取决于你的数据库服务器域名)

[cce lang=”php”]
define(‘DB_HOST’, ‘localhost’);
[/cce]

更改之后尝试再次安装!通常,如果你不知道你的数据库服务地址,你需要联系的主机商。

其他的数据库设置

你可能还想在安装之前考虑更多的数据库选项.

首先,数据库有编码格式,这是告诉WP使用什么格式的编码存储数据,其实永远使用UTF-8就不会错啦,这也是默认设置,如果你真的要改,那么找这句代码:

[cce lang=”php”]
define(‘DB_CHARSET’, ‘utf8’);[/cce]

[tab:转移WP]

转移WP到新的目录

如果你像我一样,不喜欢服务器繁杂的路径。换言之,所有的WP文件的文件夹放在你的根目录下令人极其恶心。尽管将所有的文件放在服务器不同用户他们自己的根目录下可能便于你的管理,但是问题在于如果你想在根目录下安装一个其他网站,你要在所有的文件中找到WP的文件可能不那么容易。如果不是纯粹的WP系统,那么你就凌乱了。。

安装在一个子文件夹里和安装在根目录是一个问题,我不会讲这个。下面的重点是我要讲WP安装在根目录但是却表现的像安装在根目录一样优美,同时保持服务器根目录的整洁。你可以直接将WP安装在子目录,或者从根目录将所有的WP文件转移到子目录,要怎么做由你,反正都很简单。

你应该先设置好永久链接选项,以便于他们正确的工作,你可以在“设置->永久链接”找到该项:

你需要做的第一件事是建立一个子目录文件夹,然后去常规设置里讲WP的安装地址表单填写到你想要转移的目录,参见附图1-2:

图1-2

然后点击更新按钮,并且移动除了index.php和.htaccess的所有文件到你想要安装的子目录,当转移成功后,打开index.php并且更改下面的代码,告诉WP你的安装地址:

[cce lang=”php”]
require(‘./wp-blog-header.php’);
[/cce]

这是一个相对链接,包含了wp-blog-header.php文件,这正是WP魔力开始的地方,你只要更改这个为你更新后的地址,例如./blog/wp-blog-header.php

然后登录你的WP再次更新永久链接使得他们指向新的地址:

一个例子可能是需要的,比如我将25.timepaw.com从根目录更改到子目录blog里,我首先要做如图1-2的更改,然后更新设置(此时不要惊讶可能的错误),只管去移动原来的那些文件到blog目录里,然后打开index.php更新上面的一行代码为如下的代码:

[cce lang=”php”]
require(‘./blog/wp-blog-header’ );
[/cce]

如你所见,这个代码表示WP系统包含了blog文件夹,并且指向了wp-blog-header.php文件,登录WP管理后台(这时应该是25.timepaw.com/blog/wp-admin/)更新你的永久链接,至此你就成功的转移了wordpress并且保持了根目录的清洁(只有index.php文件)。

[tab:入侵数据库]

操作WP的数据库

大多数时候,你不用担心数据库,WP会自动做这些工作。数据库版本的更新都是自动完成,你不需要做任何事情。

这就是说,如果出现了系统方面的问题,你才会做一些跟数据库相关的事情去修复事故,常见的就是重置密码、转移网站时更改域名和首页URL,以及一些令人头疼的小模块问题。

在接下去之前,你首先应该记住一点:对数据库的更改都是严肃的事情,这里面可没有撤销的可能,删除就是删除。尽管你知道你在做什么我还是建议你在更改之前备份一下数据库。如果你还不了解MYsql数据库和phpMyadmin,那么最好在你需要之前不要动他们,否则你会坏事的。

这就是数据库的一切:

在WP数据库里找到头绪是相当简单的,这一共有十张表,每张表都充满信息;不过只要浏览一下这些数据表基本上就能回答你大部分的问题,然后你就可以动手修改数据库了,如果你知道你在干什么。自然的,在官方网站上(codex.wordpress.org/Database_Description)有一张数据库的描述文档,你可以在遇到问题的任何时候查阅这份文档。

10个主要的表如下:

■ wp_comments: 包含所有的评论内容
■ wp_links: 包含所有的链接内容
■ wp_options: 博客的配置选项
■ wp_postmeta: 文章的元数据
■ wp_posts: 所有发布的文章的内容
■ wp_terms: 分类和标签
■ wp_term_relationships: 文章和标签、分类的关系
■ wp_term_taxonomy: 分类和标签的描述
■ wp_usermeta:用户的元数据
■ wp_users: 用户数据

当然所有的这些表都非常重要,但是如果你要更改什么的话,基本上就会在wp_options(网站设置,比如url等),wp_posts(修改文章相关的内容),wp_users(修改密码等)这三个表里。

通过数据库来解决问题

一个最常见的问题就是WP升级的时候遇到的widgets问题,有时候仅仅输出一张空白的页面。虽然今天的WP已经很少有这种现象了,不过升级指导还是建议你首先停用所有的插件然后升级后在恢复他们。如果你这样做了,基本上就不会遇到空白页这种现象了。

然后,如果你还是遇到空白页这种问题,基本上很可能就是widget的问题了,一个可能的解决方案就是清楚数据库里的所有widgets,他们藏在wp_options表里。你要做的具体事情和你所用的具体插件相关,所以要十分小心。一般而言,这些数据都命名得和你用的插件有很强的逻辑关联性。所以应该很轻松可以找到他们。

另一个问题你会用数据库解决的常见问题是帮助一个用户更改或重置密码。当然,你并不能直接从数据库读取到用户的密码,因为这是经过加密的,但是你可以更改之。只需要记着一点:你的密码需要经过md5算法加密,这个过程可以通过phpMyAdmin或者Mysql工具来完成。事实上,你要做的就是以文本方式输入密码,然后选择MD5加密,最后你会得到一串看不懂的字符串,将这个字符串更新到你的数据库里即可更新密码。再说一次,如果你对这些感到很陌生或者无从下手,请不要轻易改动你的数据库。

最后,你可能会想要批量编辑你的文章,比如你更新了域名,并且想要更新以前数据库里所有图片的源地址,比如从olddomain.com/wp-content/ image.jpg 更改到 newdomain.com/wp-content/image.jpg。比如,有很多插件可以帮助做到这一点,所以我们应该先确认是否有插件可以帮助。如果你对数据库很熟悉,你可以运行一个sql查询得到所有的元素并批量替换为新的地址,看起来如下所示:

UPDATE wp_posts SET post_content = REPLACE ( post_content,
‘olddomain.com/wp-content/’, ‘newdomain.com/wp-content/’);

上面的查询会搜索wp_posts表里任何提到olddomain.com/wp-content/的条目并且替换为newdomain.com/wp-content/,这样就会解决所有图片链接更新的问题。简单而有效的sql可以很方便的帮助你批量编辑,但是请记住,这里没有撤销,做了就是做了,所以请确定你做甚至是想这些事情之前都要做一份最新的数据库备份。

[tab:备份数据库]

备份

任何一个在电脑硬盘里丢失过数据的家伙都知道备份的重要性,更不用说,备份本身也提供了你线上的内容。备份WP数据实际上只有两步,因为你的博客只包含了数据库(所有的数据内容)和静态文件(上传的图片和其他附件)。你的主题,你的插件、等等,你虽然也没有改变过他们,但是你并不想丢掉他们,毕竟如果丢掉意味着你要重新搜集一遍这些东西。事实上,因为WP后台自带的自动更新功能,备份这些东西显得更为重要。

只有一样东西如果丢掉你不用太担心的就是WP的核心文件,这些文件你总是可以重新下载到的,虽然如此,你最好还是复制一份wp-config.php到安全的地方。出于你数据库备份的需要,有几个事情是要做的。最显然的就是去用一个拥有网络界面的程序比如PhpMyAdmin,或者直接下载一份包含了数据的存档。PhpMyAdmin或者类似的管理界面并不是用户体验最好的管理数据库工具,不过我们中的大多数都不会遇到极为棘手的数据库问题。

在众多的WP插件世界里,有一款叫做“wp-db-backup”.我们将会在第十一章介绍这款插件,届时会让你设置各种各样的数据库备份规则,并在一定的时间内在服务器上备份一份,或者发送备份到你的邮箱或者其他方式备份。

以上是数据库内容的备份,下面讲述静态文件的备份。这非常简单:只要保持对wp-content文件夹的备份即可。这个文件夹包含了所有你上传的(图片视频和其他文章的附件文件)文件以及你的主题和插件。事实上,如果不算 wp-config.php,.htaccess 文件, 和可能需要修改的index.php 这些文件,wp-content文件夹就是你需要面对和处理的所有内容。只要你没有改过设置使得存储的文件在wp-content之外,那么备份wp-content将保存你所有的静态文件,主题,插件等等。

那么如何备份你的wp-content文件夹呢,很不幸,最简单的方法却依赖于你的记忆力。。并且备份当然是通过FTP程序下载下来。一些网络主机比如亚马逊的S3服务可以通过一些内建的脚本帮你自动备份到外面的地方,的确,这可能是一种最低成本的方法保证你的静态文件的安全,因此你应该真的去看看这个服务,不要再靠记忆力,想起来的时候才备份下载。事实上,这些内建的方案通常还可以管理你的数据库,所以你可以连同数据库一起备份了。毕竟,安全总比遗憾好。

换句话说,保证你可以有一份自己的备份方案用来替换。我希望你永远不会用到,但是一旦用到,你会很欣慰你从一开始就做好了准备。

[tab:END]

wordpress凯旋之歌——超越博客的经典

首先感谢wordpress开发社区和参考文献:SMASHING-WordPress: BEYOND THE BLOG
本系列文章为根据wordpress最新版本3.4.1和上述参考文献的综合产物。
!献给我喜爱的wordpress!
目录:
  1. WordPress  主题本质
  2. 子主题的概念
  3. 主题的高级用法
第三部分:让博客如虎添翼——Wordpress插件开发
第四部分:超越博客的飞翔——万变不离其宗
第五部分:Wordpress——工具箱