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]

2 Replies to “1.2 WordPress语法”

  1. 不过,是不是在评论下边加一个“有新回复的时候邮件提醒”的复选框,是不是能够跟读者更好的互动?或者加一个订阅博客的按钮

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注