├── .gitignore ├── README.md ├── SUMMARY.md ├── author.md ├── chapter1 ├── README.md ├── img │ ├── install_succeed.png │ ├── login.png │ ├── logo.png │ ├── test.png │ ├── update.png │ ├── update_ftp.png │ ├── update_succeed.png │ └── update_updating.png ├── install.md └── introduce.md ├── chapter2 ├── 1 │ ├── README.md │ ├── css.md │ ├── html.md │ ├── img │ │ └── test.png │ ├── js.md │ └── php.md ├── 2 │ ├── README.md │ ├── img │ │ ├── rccoder_post-format1.jpg │ │ ├── rccoder_post-format2.jpg │ │ ├── yujiangshui_postType1.png │ │ ├── yujiangshui_postType2.png │ │ ├── yujiangshui_postType3.png │ │ ├── yujiangshui_postType4.png │ │ ├── yujiangshui_postType5.png │ │ ├── yujiangshui_postType6.png │ │ ├── yujiangshui_postType7.png │ │ └── yujiangshui_templeintro1.png │ ├── judge.md │ ├── post-format.md │ ├── post-type.md │ └── templeintro.md ├── 3 │ └── README.md └── README.md └── chapter3 └── README.md /.gitignore: -------------------------------------------------------------------------------- 1 | ## Ignore some temp files and backup files 2 | *.log 3 | *.bak 4 | *.tmp 5 | 6 | ## For Ubuntu user 7 | *~ 8 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 《WordPress的进阶之路》 2 | === 3 | 这是一本聚集众多人的心血产生的书,所有内容面向互联网免费开放。 4 | 5 | 发起原因 6 | === 7 | WordPress无论在国外还是国内一直是一个比较火的博客软件,或者说是一个CMS软件。有关WordPress的教程在网上是多之又多,于此同时也避免不了鱼龙混杂的状况,很多教程只是死板的粘贴复制,没有讲透彻他的道理,导致WordPress的使用者越来越困惑。 8 | 9 | 偶然间看到GitBook能利用Markdown免费快速的制作精美的书籍,一时间便诞生了这个想法。 10 | 11 | 希望正如大家所希望的一样,这本书能在一年之内由大家一起完成他的出版,然后免费发布在互联网上。 12 | 13 | 时间 14 | === 15 | 2015年7月5号开始,截至日期不定(这是一本活书,而不是一本死书) 16 | 17 | 协作方式 18 | === 19 | 通过GitHub进行协作,文章格式采用Markdown。最后托管在gitbook平台,可转化为Epub/PDF/mobi等多种格式。 20 | 21 | 参与协作的朋友只需撰写更新Markdown文件内容,我会将内容转化成页面更新到gitbook平台与github的gh-pages分支。 22 | 23 | 如何参与 24 | === 25 | 1. fork 这个项目 26 | * 把fork过去的项目(也就是你的GitHub下面的那个项目)克隆到本地 27 | * 运行 ```git remote add upstream https://github.com/rccoder/Learn-WordPress```把我的仓库添加为远程仓库 28 | * 运行 ```git remote update```进行更新 29 | * 运行 ```git fetch upstream master```拉取我的库到本地 30 | * 运行 ```git rebase upstream/master``` 拉取我的更新合并到你的分支 31 | * 修改你的文件 32 | * 运行```git add .```添加到缓冲区 33 | * 运行```git commit -m "说明"``` 34 | * 运行```git push -u origin master```提交到你的仓库 35 | * 登录网页,发送Pull Request 36 | 37 | 38 | 这只是一个初始化的流程,只需要做一遍就行,之后一直在你的分支进行修改,add,commit即可。 39 | 40 | 如果我的库有了更新,请重复5-11步。 41 | 42 | **或者你可以查看这篇文章:[同步一个 fork](http://gaohaoyang.github.io/2015/04/12/Syncing-a-fork/)** 43 | 44 | 一些约定 45 | === 46 | * 所有文本均采用Markdown进行编辑,请在编辑的过程中使用相关的Markdown编辑器,并且在最后commit之前进行本地预览(linux推荐retext,os x推荐mou,windows推荐cmd)。 47 | * SUMMARY.md 为在gitbook上发布时的目录页面,比较重要,建议不要对其进行大面积的修改,只进行自己编辑内容标题的添加。 48 | * 对于转载等非原创的文章,请确定其内容的正确性并且在最后注明原文地址; 对于翻译的文章同样需注明原文地址。 49 | * commit之前请记得及时review,确保错别字等低级错误的出现率尽可能的减小。 50 | * 对于每一章节出现的插图,请在相应的章节下面建立统一的img文件夹进行图片的存放。命名为:**昵称_文章名数字.png**。例如:rccoder_REAME1.png。 51 | * 每节完成后,建议使用[doctoc](https://github.com/thlorenz/doctoc)为其添加索引文件。 52 | 53 | 可贡献内容 54 | === 55 | * 原创精品文章以及国外文章的翻译作品或者是其他高精华的文章 56 | * 错别字/措辞/图文修饰 - 直接发送pull request 57 | * 相关建议直接进行review或者在issues提交问题 58 | 59 | 作者 60 | === 61 | …… -------------------------------------------------------------------------------- /SUMMARY.md: -------------------------------------------------------------------------------- 1 | 目录 2 | == 3 | * [简介](./README.md) 4 | * [目录](./SUMMARY.md) 5 | * [作者简介](./author.md) 6 | * [使用篇](./chapter1/README.md) 7 | + [WordPress介绍](./chapter1/introduce.md) 8 | + [服务器的选择与配置](./chapter1/choose.md) 9 | + [五分钟安装wordpress](./chapter1/install.md) 10 | + [快速的开始你的第一篇文章](./chapter1/write.md) 11 | + [主题插件的安装](./chapter1/themes-plugin.md) 12 | + [WordPress升级的几点陷阱](./chapter1/update.md) 13 | + [WordPress搬家](./chapter1/go.md) 14 | + [评论发送邮件的几点注意事项](./chapter1/mail.md) 15 | + [数据的备份](./chapter1/copy.md) 16 | + [常用插件推荐](./chapter1/plugin-intro.md) 17 | + [开启多站点和多站点的管理](./chapter1/multisite.md) 18 | 19 | * [开发篇](./chapter2/README.md) 20 | - [基础预备篇](./chapter2/1/README.md) 21 | + [HTML准备](./chapter2/1/html.md) 22 | + [CSS准备](./chapter2/1/css.md) 23 | + [PHP准备](./chapter2/1/php.md) 24 | + [JS/JQ准备](./chapter2/1/js.md) 25 | - [主题篇](./chapter2/2/README.md) 26 | + [WordPress模板层次介绍](./chapter2/2/templeintro.md) 27 | + [从0开始第一个WordPress主题](./chapter2/2/start.md) 28 | + [常用函数介绍](./chapter2/2/simple-function.md) 29 | + [几大循环函数的使用](./chapter2/2/while-function.md) 30 | + [WordPress条件判断标签及其相关用法](./chapter2/2/judge.md) 31 | + [add_action与add_filter的使用](./chapter2/2/action-filter.md) 32 | + [Post Formats的使用](./chapter2/2/post-format.md) 33 | + [Custom Post Type的使用](./chapter2/2/post-type.md) 34 | - [插件篇](./chapter2/3/README.md) 35 | + [从0开始第一个WordPress插件](./chapter2/3/start.md) 36 | * [F & Q](./chapter3/README.md) 37 | -------------------------------------------------------------------------------- /author.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rccoder/Learn-WordPress/5da3dfcaadf9b54517ac23c599f9fa5f337b6c0d/author.md -------------------------------------------------------------------------------- /chapter1/README.md: -------------------------------------------------------------------------------- 1 | 第一章:使用篇 2 | === 3 | 本章主要介绍了一下WordPress使用时的一些必备技巧,便于WordPress爱好者更好的使用WordPress这个开源博客框架(更是一种简单的cms框架)。 4 | 5 | 目录: 6 | --- 7 | * WordPress介绍 8 | * 服务器的选择与配置 9 | * 五分钟安装WordPress 10 | * 快速开始你的第一篇文章 11 | * 主题插件的安装 12 | * WordPress升级的几点陷阱 13 | * WordPress搬家 14 | * 评论发送邮件的几点注意事项 15 | * 数据的备份 16 | * 常用插件推荐 -------------------------------------------------------------------------------- /chapter1/img/install_succeed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rccoder/Learn-WordPress/5da3dfcaadf9b54517ac23c599f9fa5f337b6c0d/chapter1/img/install_succeed.png -------------------------------------------------------------------------------- /chapter1/img/login.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rccoder/Learn-WordPress/5da3dfcaadf9b54517ac23c599f9fa5f337b6c0d/chapter1/img/login.png -------------------------------------------------------------------------------- /chapter1/img/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rccoder/Learn-WordPress/5da3dfcaadf9b54517ac23c599f9fa5f337b6c0d/chapter1/img/logo.png -------------------------------------------------------------------------------- /chapter1/img/test.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rccoder/Learn-WordPress/5da3dfcaadf9b54517ac23c599f9fa5f337b6c0d/chapter1/img/test.png -------------------------------------------------------------------------------- /chapter1/img/update.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rccoder/Learn-WordPress/5da3dfcaadf9b54517ac23c599f9fa5f337b6c0d/chapter1/img/update.png -------------------------------------------------------------------------------- /chapter1/img/update_ftp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rccoder/Learn-WordPress/5da3dfcaadf9b54517ac23c599f9fa5f337b6c0d/chapter1/img/update_ftp.png -------------------------------------------------------------------------------- /chapter1/img/update_succeed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rccoder/Learn-WordPress/5da3dfcaadf9b54517ac23c599f9fa5f337b6c0d/chapter1/img/update_succeed.png -------------------------------------------------------------------------------- /chapter1/img/update_updating.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rccoder/Learn-WordPress/5da3dfcaadf9b54517ac23c599f9fa5f337b6c0d/chapter1/img/update_updating.png -------------------------------------------------------------------------------- /chapter1/install.md: -------------------------------------------------------------------------------- 1 | WordPress的安装 2 | === 3 | 4 | 一、 全新安装篇 5 | --- 6 | 7 | Wordpress的安装其实很简单。 8 | 9 | 1. 到[Wordpress中文官方网站](http://cn.wordpress.org/)上面下载最新版Wordpress。 10 | 2. 将WordPress压缩包解压至一个空文件夹。 11 | 3. 将解压缩后的文件上传到您的服务器。 12 | 4. 在服务器上的mysql数据库中,创建一个数据库。 13 | 注:本例中,数据库为`learn_wordpress`,用户名为`root`,密码为`password`。 14 | 5. 编辑配置文件: 15 | * __方法一:在线自动配置(推荐)__ 16 | 1. 在浏览器内直接输入您的域名,或者`wp-admin/install.php`,进入“调整配置文件”页面。 17 | 2. 点击“现在就开始”。 18 | 3. 填入“数据库名字”、数据库的“用户名”和“密码”字段 19 | 本例中分别为`learn_wordpress`、`root`、`password` 20 | 4. 填入“数据库主机”字段。 21 | 如果wordpress程序和数据库同时存在在同一台服务器上,建议填写为`localhost`或者`127.0.0.1`。 22 | 如果不是,请按照实际情况进行填写。 23 | 5. 填入“表前缀”字段。 24 | 这个字段的作用有两个:一是防止其他人暴力猜解您的数据库,二是通过不同的表前缀,可以在一个数据库内安装多个Wordpress程序,适合于只有一个数据库却想安装多个站点的情况。在本例中,取默认值`wp_`。 25 | 6. 点击“提交”,会出现如下三种结果之一: 26 | * __成功__ 27 | 直接点击“现在开始安装”即可开始安装过程。 28 | * __数据库连接错误__ 29 | 请点击“重试”,检查刚才的填写是否正确。 30 | * __您的文件系统中没有足够的权限写入wp-config.php文件__ 31 | 这个问题是由于权限问题引起的。Wordpress没有足够的权限来创建、删除文件。 32 | 请手动创建`wp-config.php`文件,并将文本框中的信息__全部__复制进去,保存、上传。 33 | 另一个解决方法是,赋予Wordpress足够的权限。例如,将Wordpress的拥有者改为Wordpress的`www-data`,或者将Wordpress所在的文件夹的权限设置为`777`(但是__十分不推荐这样做__!) 34 | 35 | * __方法二:手工配置__ 36 | 注意:替换的内容如果外面有引号,请保留引号,只替换引号内的文字。 37 | 1. 复制`wp-config-sample.php`,重命名为`wp-config.php`,并打开此文件。 38 | 2. 找到`WordPress数据库的名称`、`MySQL数据库用户名`、`MySQL数据库密码`、`WordPress数据表前缀`,将下面的`database_name_here`、`username_here`、`password_here`、`wp_`分别替换为您的数据库名称、MySQL用户名、MySQL数据库密码、Wordpress表前缀。(本例中分别为`learn_wordpress`、`root`、`password`、`wp_`) 39 | 3. [可选] “身份认证密钥与盐”内,将`put your unique phrase here`替换为任意文字。或者,您也可以访问 https://api.wordpress.org/secret-key/1.1/salt/ WordPress.org密钥生成服务生成一个随机密钥。 40 | 4. 保存并上传此文件到Wordpress的目录下。 41 | 5. 在浏览器内直接输入您的域名,或者`wp-admin/install.php`,会出现如下结果之一: 42 | * __安装界面__ 43 | 恭喜,您刚才的配置无误。可以进行安装。 44 | * __数据库连接错误__ 45 | 请检查你刚才的配置,修改后再次上传。 46 | 6. 在配置文件就绪之后,WordPress会自动尝试建立数据库表。若发生错误,请检查wp-config.php文件中填写的信息是否准确,然后再试。若问题依然存在,请访问中文支持论坛寻求帮助。 47 | 7. 安装 48 | 根据提示信息进行安装即可。不需要担心填写错误,因为这些设置在安装完毕后都可以进行修改。 49 | 若您__不设置密码__,请牢记生成的__随机密码__。 50 | 若您__不输入用户名__,用户名将是__admin__。 51 | 8. 完成后,安装向导会带您到登录页面。用刚刚设置的用户名和密码登录。 52 | 若您使用随机密码,在登录后可以按照页面提示修改密码。 53 | 54 | 二、 重新安装篇 55 | --- 56 | 57 | 若您想重新安装Wordpress,请清空您的数据库中的所有表,然后访问`wp-admin/install.php`进行安装。您会直接从第7步开始。 58 | 59 | 三、 搬家篇 60 | --- 61 | 62 | 有时候您可能会遇到这样的情况:域名到期,需要换域名,或者需要将本地的Wordpress部署到远程服务器上,或者需要将远程服务器上的Wordpress拉取到本地进行调试。这时候,您不必从头再来,只需要做一点简单的设置,Wordpress就会继续任劳任怨地为你服务。 63 | 64 | 在这里,为了简化起见,我们做如下约定: 65 | 66 | * 使用默认表前缀`wp_`。 67 | * 如果是网站搬家,“旧地址”为`http://www.old.com`,“新地址”为`http://www.new.com` 68 | * 如果是本地迁往服务器,“旧地址”为`localhost`,“新地址”为`http://www.new.com` 69 | * 如果是服务器迁往本地,“旧地址”为`http://www.old.com`,“新地址”为`localhost` 70 | 71 | 步骤: 72 | 73 | 1. 上传您的Wordpress程序。 74 | 2. 上传您的数据库。 75 | 3. 使用phpMyAdmin之类的工具进入您的数据库并执行如下操作: 76 | 1. 进入`wp_options`表。 77 | 2. 查看所有的`option_value`列,将所有的旧地址替换成新地址。 78 | 4. 编辑您的`.htaccess`文件,将所有的旧地址替换成新地址 79 | -------------------------------------------------------------------------------- /chapter1/introduce.md: -------------------------------------------------------------------------------- 1 | WordPress介绍 2 | === 3 |  4 | ##简介 5 | WordPress 是一个用 PHP 和 MySQL 开发的开源博客平台,可以在任何安装了 PHP 和 MySQL 的服务器上使用,并且最重要的一点是他是完全开放的自由软件(GNU软件),这也就意味着你可以随意的去改造他,并且不需要为之付出任何代价。在全世界前百名博客中有一半都在使用 WordPress,同时 WordPress 也是世界上使用人数最多的博客系统。由此可见 WordPress 的实用之处和强大影响力。 6 | 7 | 简单点说,WordPress 是一套在全世界都免费的建站系统,这套系统因易用性、易扩展性(插件、模板、二次开发)、功能强大、美观、搜索引擎友好等而全世界著名。其大量的插件系统足以使其变成论坛、门户等各种类型的网站,其中 WordPress 以建设个人博客型网站为特长 。(趣闻,南非政府花约 2300W 人民币向一个公司定制了一套政府网站系统,该系统却是用免费的 WordPress 和价值 320 元人民币的模板组成,贻笑大方) 8 | 9 | 截至2015-07-23,WordPress 最新版本为 4.2.3 ,运行环境要求:PHP 5.2.4 或更新版本;MySQL 5.0 或更新版本。 10 | 11 | WordPress 中文:[http://cn.wordpress.org/](http://cn.wordpress.org/) 12 | 13 | WordPress Codex:[http://codex.wordpress.org/](http://codex.wordpress.org/) 14 | 15 | ##优缺点 16 | ###优点 17 | * 简单易用,可以让一个连基础 HTML 都不懂的人在短时间内建立一个自己的网站。 18 | * 有丰富的模板,插件。再也不怕自己的网站和别人的频繁撞衫了。 19 | * 默认提供基础的文章发布,评论,RSS聚合等功能。 20 | * 支持让主题直接重写WP的内核文件,增加了低成本自定义化的强度。 21 | * 支持 Trackback 和 Pingback. 22 | * 支持会员注册。 23 | * 使用者较多,可以利用搜索引擎解决绝大多数平时遇到的问题。 24 | ###缺点 25 | * 代码风格不是很好,PHP 和 HTML 嵌套使用。 26 | * 数据库查询较为累赘。 27 | 28 | ## 正在使用 WordPress 的站点 29 | 30 | 1. 纽约时报博客 31 | 32 | 纽约时报是美国规模最大、最受人推崇的报纸,其网络博客质量较高并受到读者追捧,同时博客也与纽约时报的各方面得到极好地结合。技术、体育、政治等各领域的众多知名专栏作家、写手,知名人士,行业专家以及网络名人,在遵守由纽约时报规定的严格标准下,在博客上发表各自的看法。纽约时报拥有50多个WordPress博客。 33 | 34 | 2. Techcrunch 35 | 36 | 在Technorati的排行榜上,Techcrunch总排名第二,在信息技术类排名第一。Techcrunch的雏形是一个硅谷及其周边地区的博客介绍互联网公司,之后逐渐成长为一个技术型站点网络,提供各种内容与新型媒体。Techcrunch订阅人数超过400万,网络从美国延伸到欧洲、法国和日本,并且其crunch博客涉及技术范围内的所有领域——从移动设施到各种机械装置甚至社交媒体。 37 | 38 | 3. CNN博客 39 | 40 | CNN是全球最大的新闻网络,依靠来自全世界各地通讯员与其他各种新闻来源,其下属博客随时提供新鲜及时、内容可靠、信息含量高的内容。CNN博客的内容涉及各种头条新闻和奇闻轶事,方便读者评论。 41 | 42 | 4. 连线杂志 43 | 44 | 作为美国长盛不衰的杂志的在线期刊,连线杂志报道各种技术问题与文化经济影响。在过去的时间里,连线杂志得以扬名并与时俱进,推出连线的iPad tablet程序,连续五天保持iTunes付费下载第一位的下载量。连线杂志的在线网站由WordPress驱动,其鲜艳的杂志类风格遵循了当下正流行的设计标准。 45 | 46 | 5. 路透社博客 47 | 48 | 似乎全球最大的新闻社都应该有自己的WordPress博客网络,路透社也有40多个WordPress站点,每一个都提供以时事政治为重点的分析与观点。 49 | 50 | 6. 华尔街日报博客 51 | 52 | 一直保持同样程式的新闻报道方式是华尔街日报大受欢迎的原因,其博客提供由特邀外场专家的全天候即时新闻报道和分析,日报员工会修改专家的即时报道让它们更清晰准确。 53 | 54 | 7. 中国数字时代 55 | 56 | 中国数字时代是一个致力于报道中国社会、政治与全球角色的协作性双语新闻站点,它集合了互联网上最新每分钟发布的关于中国的新闻,同时也允许独立报道与观点。 57 | 58 | 8. IBN Live 59 | 60 | IBN Live是Global Broadcast News(GBN,全球广播新闻,印度一媒体公司)的在线网络,也是印度的24小时英文新闻平道,由Rajdeep Sardesai领头,作为CNN国际与GBN印度的合资。集合了这片次大陆所有角落的高质量新闻与相关的全球新闻,IBN Live的互动平台涵盖了各种多媒体内容,背后依靠的是1000多位新闻专业人员。 61 | 62 | 9.Cultura Digital 63 | 64 | Cultura Digital是由巴西文化部运营的一家巴西社会网络,旨在通过整合公共民众、政府机构、国家企业、民间团体和市场的力量创造数字文化,提升社交媒体意识。Cultura充分利用WordPress社交网络插件BuddyPress,为爱好数字文化的巴西民众提供了一个高度互动的网站。 65 | 66 | 10. Thought Leader 67 | 68 | Thought Leader是南非最受欢迎的WordPress网站,它综合了各种观点犀利的文章和发人深省的内容,从而引发的激烈的语言碰撞存在于新闻编辑室、公众甚至统治领域(?)。Thought Leader不仅是南非一些公认名人和贡献者的平台,也是新秀写手们的家园。 69 | -------------------------------------------------------------------------------- /chapter2/1/README.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rccoder/Learn-WordPress/5da3dfcaadf9b54517ac23c599f9fa5f337b6c0d/chapter2/1/README.md -------------------------------------------------------------------------------- /chapter2/1/css.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rccoder/Learn-WordPress/5da3dfcaadf9b54517ac23c599f9fa5f337b6c0d/chapter2/1/css.md -------------------------------------------------------------------------------- /chapter2/1/html.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rccoder/Learn-WordPress/5da3dfcaadf9b54517ac23c599f9fa5f337b6c0d/chapter2/1/html.md -------------------------------------------------------------------------------- /chapter2/1/img/test.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rccoder/Learn-WordPress/5da3dfcaadf9b54517ac23c599f9fa5f337b6c0d/chapter2/1/img/test.png -------------------------------------------------------------------------------- /chapter2/1/js.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rccoder/Learn-WordPress/5da3dfcaadf9b54517ac23c599f9fa5f337b6c0d/chapter2/1/js.md -------------------------------------------------------------------------------- /chapter2/1/php.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rccoder/Learn-WordPress/5da3dfcaadf9b54517ac23c599f9fa5f337b6c0d/chapter2/1/php.md -------------------------------------------------------------------------------- /chapter2/2/README.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rccoder/Learn-WordPress/5da3dfcaadf9b54517ac23c599f9fa5f337b6c0d/chapter2/2/README.md -------------------------------------------------------------------------------- /chapter2/2/img/rccoder_post-format1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rccoder/Learn-WordPress/5da3dfcaadf9b54517ac23c599f9fa5f337b6c0d/chapter2/2/img/rccoder_post-format1.jpg -------------------------------------------------------------------------------- /chapter2/2/img/rccoder_post-format2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rccoder/Learn-WordPress/5da3dfcaadf9b54517ac23c599f9fa5f337b6c0d/chapter2/2/img/rccoder_post-format2.jpg -------------------------------------------------------------------------------- /chapter2/2/img/yujiangshui_postType1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rccoder/Learn-WordPress/5da3dfcaadf9b54517ac23c599f9fa5f337b6c0d/chapter2/2/img/yujiangshui_postType1.png -------------------------------------------------------------------------------- /chapter2/2/img/yujiangshui_postType2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rccoder/Learn-WordPress/5da3dfcaadf9b54517ac23c599f9fa5f337b6c0d/chapter2/2/img/yujiangshui_postType2.png -------------------------------------------------------------------------------- /chapter2/2/img/yujiangshui_postType3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rccoder/Learn-WordPress/5da3dfcaadf9b54517ac23c599f9fa5f337b6c0d/chapter2/2/img/yujiangshui_postType3.png -------------------------------------------------------------------------------- /chapter2/2/img/yujiangshui_postType4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rccoder/Learn-WordPress/5da3dfcaadf9b54517ac23c599f9fa5f337b6c0d/chapter2/2/img/yujiangshui_postType4.png -------------------------------------------------------------------------------- /chapter2/2/img/yujiangshui_postType5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rccoder/Learn-WordPress/5da3dfcaadf9b54517ac23c599f9fa5f337b6c0d/chapter2/2/img/yujiangshui_postType5.png -------------------------------------------------------------------------------- /chapter2/2/img/yujiangshui_postType6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rccoder/Learn-WordPress/5da3dfcaadf9b54517ac23c599f9fa5f337b6c0d/chapter2/2/img/yujiangshui_postType6.png -------------------------------------------------------------------------------- /chapter2/2/img/yujiangshui_postType7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rccoder/Learn-WordPress/5da3dfcaadf9b54517ac23c599f9fa5f337b6c0d/chapter2/2/img/yujiangshui_postType7.png -------------------------------------------------------------------------------- /chapter2/2/img/yujiangshui_templeintro1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rccoder/Learn-WordPress/5da3dfcaadf9b54517ac23c599f9fa5f337b6c0d/chapter2/2/img/yujiangshui_templeintro1.png -------------------------------------------------------------------------------- /chapter2/2/judge.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | **Table of Contents** *generated with [DocToc](https://github.com/thlorenz/doctoc)* 4 | 5 | - [WordPress 条件判断标签及用法大全](#wordpress-%E6%9D%A1%E4%BB%B6%E5%88%A4%E6%96%AD%E6%A0%87%E7%AD%BE%E5%8F%8A%E7%94%A8%E6%B3%95%E5%A4%A7%E5%85%A8) 6 | - [所有的条件判断标签](#%E6%89%80%E6%9C%89%E7%9A%84%E6%9D%A1%E4%BB%B6%E5%88%A4%E6%96%AD%E6%A0%87%E7%AD%BE) 7 | - [主页面(Main)](#%E4%B8%BB%E9%A1%B5%E9%9D%A2%EF%BC%88main%EF%BC%89) 8 | - [首页(Front)](#%E9%A6%96%E9%A1%B5%EF%BC%88front%EF%BC%89) 9 | - [后台控制面板(Administration Panels)](#%E5%90%8E%E5%8F%B0%E6%8E%A7%E5%88%B6%E9%9D%A2%E6%9D%BF%EF%BC%88administration-panels%EF%BC%89) 10 | - [文章页面(Single Post)](#%E6%96%87%E7%AB%A0%E9%A1%B5%E9%9D%A2%EF%BC%88single-post%EF%BC%89) 11 | - [置顶文章(Sticky Post)](#%E7%BD%AE%E9%A1%B6%E6%96%87%E7%AB%A0%EF%BC%88sticky-post%EF%BC%89) 12 | - [文章类型(Post Type)](#%E6%96%87%E7%AB%A0%E7%B1%BB%E5%9E%8B%EF%BC%88post-type%EF%BC%89) 13 | - [评论相关(Comments)](#%E8%AF%84%E8%AE%BA%E7%9B%B8%E5%85%B3%EF%BC%88comments%EF%BC%89) 14 | - [判断页面(Page)](#%E5%88%A4%E6%96%AD%E9%A1%B5%E9%9D%A2%EF%BC%88page%EF%BC%89) 15 | - [判断子页面(sub-Pages)](#%E5%88%A4%E6%96%AD%E5%AD%90%E9%A1%B5%E9%9D%A2%EF%BC%88sub-pages%EF%BC%89) 16 | - [判断页面模版(Page Template)](#%E5%88%A4%E6%96%AD%E9%A1%B5%E9%9D%A2%E6%A8%A1%E7%89%88%EF%BC%88page-template%EF%BC%89) 17 | - [判断分类页面(Category)](#%E5%88%A4%E6%96%AD%E5%88%86%E7%B1%BB%E9%A1%B5%E9%9D%A2%EF%BC%88category%EF%BC%89) 18 | - [判断标签页面(Tag)](#%E5%88%A4%E6%96%AD%E6%A0%87%E7%AD%BE%E9%A1%B5%E9%9D%A2%EF%BC%88tag%EF%BC%89) 19 | - [判断自定义分类页面(Taxonomy)](#%E5%88%A4%E6%96%AD%E8%87%AA%E5%AE%9A%E4%B9%89%E5%88%86%E7%B1%BB%E9%A1%B5%E9%9D%A2%EF%BC%88taxonomy%EF%BC%89) 20 | - [判断作者页面(Author)](#%E5%88%A4%E6%96%AD%E4%BD%9C%E8%80%85%E9%A1%B5%E9%9D%A2%EF%BC%88author%EF%BC%89) 21 | - [判断是否为日期存档页面(Date Page)](#%E5%88%A4%E6%96%AD%E6%98%AF%E5%90%A6%E4%B8%BA%E6%97%A5%E6%9C%9F%E5%AD%98%E6%A1%A3%E9%A1%B5%E9%9D%A2%EF%BC%88date-page%EF%BC%89) 22 | - [判断任意存档页面(Any Archive Page)](#%E5%88%A4%E6%96%AD%E4%BB%BB%E6%84%8F%E5%AD%98%E6%A1%A3%E9%A1%B5%E9%9D%A2%EF%BC%88any-archive-page%EF%BC%89) 23 | - [判断搜索结果页面(Search Result Page)](#%E5%88%A4%E6%96%AD%E6%90%9C%E7%B4%A2%E7%BB%93%E6%9E%9C%E9%A1%B5%E9%9D%A2%EF%BC%88search-result-page%EF%BC%89) 24 | - [判断是否为 404 页面(404 Not Found Page)](#%E5%88%A4%E6%96%AD%E6%98%AF%E5%90%A6%E4%B8%BA-404-%E9%A1%B5%E9%9D%A2%EF%BC%88404-not-found-page%EF%BC%89) 25 | - [判断被分页页面(Paged Page)](#%E5%88%A4%E6%96%AD%E8%A2%AB%E5%88%86%E9%A1%B5%E9%A1%B5%E9%9D%A2%EF%BC%88paged-page%EF%BC%89) 26 | - [判断是否为附件页面(Attachment)](#%E5%88%A4%E6%96%AD%E6%98%AF%E5%90%A6%E4%B8%BA%E9%99%84%E4%BB%B6%E9%A1%B5%E9%9D%A2%EF%BC%88attachment%EF%BC%89) 27 | - [判断单页面、文章页面或者附件页面](#%E5%88%A4%E6%96%AD%E5%8D%95%E9%A1%B5%E9%9D%A2%E3%80%81%E6%96%87%E7%AB%A0%E9%A1%B5%E9%9D%A2%E6%88%96%E8%80%85%E9%99%84%E4%BB%B6%E9%A1%B5%E9%9D%A2) 28 | - [判断订阅页面](#%E5%88%A4%E6%96%AD%E8%AE%A2%E9%98%85%E9%A1%B5%E9%9D%A2) 29 | - [判断引用通告(Trackback)](#%E5%88%A4%E6%96%AD%E5%BC%95%E7%94%A8%E9%80%9A%E5%91%8A%EF%BC%88trackback%EF%BC%89) 30 | - [判断预览页面](#%E5%88%A4%E6%96%AD%E9%A2%84%E8%A7%88%E9%A1%B5%E9%9D%A2) 31 | - [判断是否有摘要](#%E5%88%A4%E6%96%AD%E6%98%AF%E5%90%A6%E6%9C%89%E6%91%98%E8%A6%81) 32 | - [判断是否在主循环中](#%E5%88%A4%E6%96%AD%E6%98%AF%E5%90%A6%E5%9C%A8%E4%B8%BB%E5%BE%AA%E7%8E%AF%E4%B8%AD) 33 | - [判断边栏是否已经激活可用](#%E5%88%A4%E6%96%AD%E8%BE%B9%E6%A0%8F%E6%98%AF%E5%90%A6%E5%B7%B2%E7%BB%8F%E6%BF%80%E6%B4%BB%E5%8F%AF%E7%94%A8) 34 | - [判断是否是网站的一部分(对于多站点网站)](#%E5%88%A4%E6%96%AD%E6%98%AF%E5%90%A6%E6%98%AF%E7%BD%91%E7%AB%99%E7%9A%84%E4%B8%80%E9%83%A8%E5%88%86%EF%BC%88%E5%AF%B9%E4%BA%8E%E5%A4%9A%E7%AB%99%E7%82%B9%E7%BD%91%E7%AB%99%EF%BC%89) 35 | - [判断是否是主站点(对于多站点网站)](#%E5%88%A4%E6%96%AD%E6%98%AF%E5%90%A6%E6%98%AF%E4%B8%BB%E7%AB%99%E7%82%B9%EF%BC%88%E5%AF%B9%E4%BA%8E%E5%A4%9A%E7%AB%99%E7%82%B9%E7%BD%91%E7%AB%99%EF%BC%89) 36 | - [判断网站的 Admin (对于多站点网站)](#%E5%88%A4%E6%96%AD%E7%BD%91%E7%AB%99%E7%9A%84-admin-%EF%BC%88%E5%AF%B9%E4%BA%8E%E5%A4%9A%E7%AB%99%E7%82%B9%E7%BD%91%E7%AB%99%EF%BC%89) 37 | - [判断插件是否激活](#%E5%88%A4%E6%96%AD%E6%8F%92%E4%BB%B6%E6%98%AF%E5%90%A6%E6%BF%80%E6%B4%BB) 38 | - [判断子主题](#%E5%88%A4%E6%96%AD%E5%AD%90%E4%B8%BB%E9%A2%98) 39 | - [判断当前主题功能](#%E5%88%A4%E6%96%AD%E5%BD%93%E5%89%8D%E4%B8%BB%E9%A2%98%E5%8A%9F%E8%83%BD) 40 | 41 | 42 | 43 | WordPress 条件判断标签及用法大全 44 | === 45 | 46 | 在 WordPress 主题和插件开发中,条件判断标签(Conditional Tags)是非常重要的,通过条件判断标签,我们可以判断各种情况,从而使用对应的代码等。例如在顶部导航条中有一个“首页”选项,在首页的时候需要设置成高亮,我们可以在头部导航模板文件(header.php)中使用条件判断标签 is_home() 来判断当前页面是不是首页,然后再输出高亮的 class。 47 | 48 | 这类的条件判断标签一般会返回一个布尔值,这样我们就可以使用 if 语句判断不同的页面不同的情况而分别使用不同的代码。 49 | 50 | ## 所有的条件判断标签 51 | 52 | 所有的条件判断标签都会判断某个条件是否成立,然后返回 True 或者 False 。此外有些条件判断标签还可以使用一些参数进一步的判断,下面是所有的 WordPress 条件判断标签: 53 | 54 | ### 主页面(Main) 55 | 56 | ``` 57 | is_home() 58 | ``` 59 | 60 | 判断当前页面是否是博客主页面。主页面通常是显示博客内容列表的首页,但是如果你在“后台”->“设置”->“阅读”中设置了静态首页和文章索引页面的话,当访问文章索引页面是返回 True。 61 | 62 | ### 首页(Front) 63 | 64 | ``` 65 | is_front_page() 66 | ``` 67 | 68 | 判断当前页面是否是博客首页。首页和上面的主页面不同,首页可以是文章索引页面,也可以是你在“后台”->“设置”->“阅读”中设置的静态首页。 69 | 70 | ### 后台控制面板(Administration Panels) 71 | 72 | ``` 73 | is_admin() 74 | ``` 75 | 76 | 判断当前页面是否是后台的控制面板(Dashboard)。 77 | 78 | ### 文章页面(Single Post) 79 | 80 | ``` 81 | is_single() 82 | ``` 83 | 84 | 判断当前页面是否是一篇文章或者是附件页面或者自定义文章类型页面。注意,WordPress 中文章(Single)和页面(Page)是不同的概念。这个条件判断标签可以附加参数。 85 | 86 | ``` 87 | is_single( '17' ) 88 | ``` 89 | 90 | 判断当前文章是否是 id 为 17 的文章。 91 | 92 | ``` 93 | is_single( 'Irish Stew' ) 94 | ``` 95 | 96 | 判断当前文章的标题是否是 “Irish Stew”。 97 | 98 | ``` 99 | is_single( 'beef-stew' ) 100 | ``` 101 | 102 | 判断当前文章的别名(Slug)是否为 “beef-stew”。 103 | 104 | ``` 105 | is_single( array( 17, 'beef-stew', 'Irish Stew' ) ) 106 | ``` 107 | 108 | 传递多个参数需要使用数组。上面条件判断标签判断满足 id 为 17 、别名为 beef-stew、标题为 Irish Stew 任意一个条件文章被访问时返回 True。 109 | 110 | ``` 111 | is_single( array( 17, 19, 1, 11 ) ) 112 | ``` 113 | 114 | 判断多个文章的 id,用法同上。 115 | 116 | ``` 117 | is_single( array( 'beef-stew', 'pea-soup', 'chili' ) ) 118 | ``` 119 | 120 | 判断多个文章的别名,用法同上。 121 | 122 | ``` 123 | is_single( array( 'Beef Stew', 'Pea Soup', 'Chili' ) ) 124 | ``` 125 | 126 | 判断多个文章的标题,用法同上。 127 | 128 | **注意:这个函数对于传递的参数,并无法很明确的判断参数究竟是 id、文章标题或者是文章别名,如果参数为 17,当 id 为 17 的文章会返回 True,当 Slug 为 17 的文章也会返回 True。** 129 | 130 | ### 置顶文章(Sticky Post) 131 | 132 | ``` 133 | is_sticky() 134 | ``` 135 | 136 | WordPress 带有置顶文章的功能,使用这个标签判断是否为置顶文章,需要传递一个参数(通常为文章 id,用法同上)。如果不想传递参数,需要用在主循环(Loop)中,由主循环提供。通常的用法是在主循环输出文章索引列表的时候,使用 is_sticky() 判断当前文章是否为置顶文章,然后在置顶文章的 title 前面输出 “[置顶]” 之类的标志。 137 | 138 | ### 文章类型(Post Type) 139 | 140 | ``` 141 | get_post_type() 142 | ``` 143 | 144 | 严格意义上,这并不是一个条件判断标签,它会返回当前文章注册的文章类型,并且可以通过类似 if ( 'book' == get_post_type() ) ... 来实现判断文章类型的功能。 145 | 146 | ``` 147 | is_singular() 148 | ``` 149 | 150 | 判断是否满足 is_single、is_page 和 is_attachment 的任意一个条件,满足返回 True。可以测试所有的文章类型。 151 | 152 | ``` 153 | post_type_exists() 154 | ``` 155 | 156 | 判断某个文章类型是否被注册了,需要传递一个文章类型参数。它并不是测试某文章是否属于某个文章类型。 157 | 158 | ``` 159 | is_post_type_hierarchical( $post_type ) 160 | ``` 161 | 162 | 如果 $post_type 在注册的时候设置了支持层次( hierarchical support )返回 True。例如:is_post_type_hierarchical( 'book' ) 。 163 | 164 | ``` 165 | is_post_type_archive() 166 | ``` 167 | 168 | 判断是否在任何的自定义文章类型存档页面(post type archive)。 169 | 170 | ``` 171 | is_post_type_archive( $post_type ) 172 | ``` 173 | 174 | 判断是否在 $post_type 中符合条件的文章类型存档页面,$post_type 可以是一个单一的文章类型或者是一个文章类型数组。提示:如果想要应用文章类型存档功能,需要在注册文章类型的时候,将 has_archive 参数设置为 True。 175 | 176 | ### 评论相关(Comments) 177 | 178 | ``` 179 | is_comments_popup() 180 | ``` 181 | 182 | 判断是否在评论弹出框的窗口中。 183 | 184 | ``` 185 | comments_open() 186 | ``` 187 | 188 | 判断评论功能是否开启,必须用在主循环中。 189 | 190 | ``` 191 | pings_open() 192 | ``` 193 | 194 | 判断文章 ping 功能是否开启,必须用在主循环中。 195 | ### 判断页面(Page) 196 | 197 | WordPress 中内置的有两种内容形式,一种是文章(Post)另一种是页面(Page),这里要判断的是页面,而不是指你网站的某个网页。 198 | 199 | ``` 200 | is_page() 201 | 202 | ``` 203 | 判断当前页面是否为“页面”。 204 | 205 | ``` 206 | is_page( 42 ) 207 | 208 | ``` 209 | 判断当前页面是否是一个 ID 为 42 的页面。 210 | 211 | ``` 212 | is_page( 'About Me And Joe' ) 213 | ``` 214 | 215 | 判断当前页面是否是一个标题为 “About Me And Joe” 的页面。 216 | 217 | ``` 218 | is_page( 'about-me' ) 219 | ``` 220 | 221 | 判断当前页面是否是一个别名为 “about-me” 的页面。 222 | 223 | ``` 224 | is_page( array( 42, 'about-me', 'Aout Me And Joe' ) ) 225 | ``` 226 | 227 | 一次包含多种情况的判断,需要使用数组传递,用法同上。 228 | 判断内容分页 229 | 230 | 在文章和页面中,有时候内容很多,在文章中插入 标签可以将内容分隔开分成不同的页面,并通过对应的函数获取分页的列表。下面的例子,可以判断当前是在第几个页面中,这样你就可以在某个页面中输出一些特别的信息(例如在第一个页面中,输出一个提示)。 231 | 232 | 例子1: 233 | 234 | ```php 235 | get( 'page' ); 237 | 238 | if ( ! $paged || $paged < 2 ) { 239 | // 这里是不带有分页或者是带有分页页面的第一页 240 | } else { 241 | // 这里是带有分页的其他页面。 242 | } 243 | ?> 244 | ``` 245 | 246 | 例子2: 247 | 248 | ```php 249 | 257 | ``` 258 | 259 | ### 判断子页面(sub-Pages) 260 | 261 | WordPress 中的页面(page)是有父子级关系的,判断是否为子页面时,没有内置 is_subpage() 这样的函数,但是你可以使用下面的方法来判断。 262 | 263 | 方法1: 264 | 265 | ```php 266 | post_parent ) { 270 | // 这是一个子页面 271 | } else { 272 | // 这不是一个子页面 273 | } 274 | ?> 275 | ``` 276 | 277 | 建议将下面的方法2加入你的 functions.php 文件中,下面的 is_subpage() 函数的原理与方法1类似,但是可以返回当前页面父页面的 ID 或者是 false。 278 | 279 | 方法2: 280 | 281 | ```php 282 | post_parent ) { // 判断是否有父页面 286 | return $post->post_parent; // 如果有返回父页面的 ID 287 | } else { 288 | return false; // 如果没有返回 false 289 | } 290 | } 291 | ?> 292 | ``` 293 | 294 | 如果你经常需要判断子页面,强烈建议使用方法2。 295 | 296 | 如果需要判断父页面是否为某个特定的页面,可以使用方法3的代码。方法3代码会判断的更加详细,从而更加便于自定义和个性化(例如加一些图片)。 297 | 298 | 方法3: 299 | 300 | ```php 301 | post_parent ) { 303 | // 这个页面是“about”页面,或者它的父页面是“about” 304 | $bannerimg = 'about.jpg'; 305 | } elseif ( is_page( 'learning' ) || '56' == $post->post_parent ) { 306 | $bannerimg = 'teaching.jpg'; 307 | } elseif ( is_page( 'admissions' ) || '15' == $post->post_parent ) { 308 | $bannerimg = 'admissions.jpg'; 309 | } else { 310 | $bannerimg = 'home.jpg'; // 如果都不满足的话,就用这个图片 311 | } 312 | ?> 313 | ``` 314 | 315 | 方法4是一个函数可以让你更容易的实现判断,只需要传递参数即可,如果正在访问对应页面,将会返回 True。 316 | 317 | 方法4: 318 | 319 | ```php 320 | ID ); 328 | foreach ( $anc as $ancestor ) { 329 | if( is_page() && $ancestor == $pid ) { 330 | return true; 331 | } 332 | } 333 | 334 | return false; // 没有在当前页面,并且这个页面没有子页面 335 | } 336 | ?> 337 | ``` 338 | 339 | 可以将这个函数添加进 functions.php 中,调用 is_tree( 'id' ) 就可以判断当前页面是否是指定页面或者是这个页面的子页面。相比较方法3 is_tree( '2' ) 的功能和 is_page( 'about' ) || '2' == $post->post_parent 是一样的。 340 | 341 | 注意,如果页面乘此多于一级,那么父级页面指的是上一层页面,不是这个页面层次关系最顶层的页面。 342 | 343 | ### 判断页面模版(Page Template) 344 | 345 | 判断当前页面是否由某个页面模版生成的,关于页面模版请看我爱水煮鱼上的:WordPress 教程:自定义页面(Page)的模板样式。 346 | 347 | ``` 348 | is_page_template() 349 | ``` 350 | 351 | 判断是否使用了一个页面模版。 352 | 353 | ``` 354 | is_page_template( 'about.php' ) 355 | ``` 356 | 357 | 判断应用的页面模版是否是 “about” 这个模板。注意,这个参数与其他参数不同,如果你想判断是否是由某个页面模版声称的,你需要将那个页面模版的文件名填上去,包括后面的 .php 后缀。 358 | 359 | ### 判断分类页面(Category) 360 | 361 | ``` 362 | is_category() 363 | ``` 364 | 365 | 判断当前页面是否为分类目录或者存档(archive)页面。 366 | 367 | ``` 368 | is_category( '9' ) 369 | ``` 370 | 371 | 判断当前分类页面的 ID 是否为 9。 372 | 373 | ``` 374 | is_category( 'Stinky Cheeses' ) 375 | ``` 376 | 377 | 判断当前分类页面的名字是否为“Stinky Cheeses”。 378 | 379 | ``` 380 | is_category( 'blue-cheese' ) 381 | ``` 382 | 383 | 判断当前分类页面的别名是否为“blue-cheese”。 384 | 385 | ``` 386 | is_category( array( 9, 'blue-cheese', 'Stinky cheeses' ) ) 387 | ``` 388 | 389 | 同上,你懂的。 390 | 391 | ``` 392 | in_category( '5' ) 393 | ``` 394 | 395 | 判断当前文章是否属于某个特定分类目录(id 为 5),返回 True。注意,这里是 in 而不是 is,与上面的不同。 396 | 397 | ``` 398 | in_category( array( 1,2,3 ) ) 399 | ``` 400 | 401 | 判断当前文章是否属于某些特定的分类目录。 402 | ### 判断标签页面(Tag) 403 | 404 | ``` 405 | is_tag() 406 | ``` 407 | 判断当前页面是否为标签页面。 408 | 409 | ``` 410 | is_tag( 'mild' ) 411 | ``` 412 | 413 | 判断当前标签页面的别名是否为 “mild”。 414 | 415 | ``` 416 | is_tag( array( 'sharp', 'mild', 'extreme' ) ) 417 | ``` 418 | 419 | 判断当前标签页面的别名是否是 “sharp”、“mild”或者“extreme”中的某个。 420 | 421 | ``` 422 | has_tag() 423 | ``` 424 | 425 | 判断当前文章是否有一个标签,必须用在主循环中。 426 | 427 | ``` 428 | has_tag( 'mild' ) 429 | ``` 430 | 431 | 判断当前文章是否有标签 “mild”。 432 | 433 | ``` 434 | has_tag( array( 'sharp', 'mild', 'extreme' ) ) 435 | ``` 436 | 437 | 判断当前文章是否有数组里的那些标签。 438 | 439 | ### 判断自定义分类页面(Taxonomy) 440 | 441 | 自定义分类页面并非是上面的 category 那种分类页面,而是指 WordPress 分类系统页面。在 WordPress 默认内置了两种分类系统:category 和 tag,同时支持开发者自定义分类系统。 442 | 443 | ``` 444 | is_tax() 445 | ``` 446 | 447 | 判断当前页面是否为一个分类系统的存档页面。 448 | 449 | ``` 450 | is_tax( 'flavor' ) 451 | ``` 452 | 453 | 判断当前页面是否为一个名为 flavor 自定义分类的存档页面。 454 | 455 | ``` 456 | is_tax( 'flavor', 'mild' ) 457 | ``` 458 | 459 | 判断当前自定义分类 flavor 页面的别名是否为 mild。 460 | 461 | ``` 462 | is_tax( 'flavor', array( 'sharp', 'mild', 'extreme' ) ) 463 | ``` 464 | 465 | 判断当前自定义分类 flavor 页面的页面是否为 sharp、mild、extreme 中的一个。 466 | 467 | ``` 468 | has_term() 469 | ``` 470 | 471 | 判断当前页面是否带有自定义分类。 472 | 473 | ``` 474 | has_term( 'green', 'color' ) 475 | ``` 476 | 477 | 判断当前页面是否是否带有别名为 green 的自定义分类 color。 478 | 479 | ``` 480 | has_term( array( 'green', 'orange', 'blue' ), 'color' ) 481 | ``` 482 | 483 | 判断当前页面是否是否带有数组中的自定义分类 color。 484 | ### 判断作者页面(Author) 485 | 486 | ``` 487 | is_author() 488 | ``` 489 | 490 | 判断当前页面是否是一个作者存档页面。 491 | 492 | ``` 493 | is_author( '4' ) 494 | ``` 495 | 496 | 判断当前页面是否为 id 为 4 的作者页面。 497 | 498 | ``` 499 | is_author( 'Vivian' ) 500 | ``` 501 | 502 | 判断当前存档页面是否是 Vivian(Nickname) 的作者存档页面。 503 | 504 | ``` 505 | is_author( array( 4, 'john-jones', 'Vivian' ) ) 506 | ``` 507 | 508 | 判断当前存档页面是否属于 id 为 4,或者名字为 “john-jones”、“Vivian” 的作者存档页面。 509 | 510 | ``` 511 | is_multi_author() 512 | ``` 513 | 判断当前博客是否有超过一个作者发表过文章。WordPress 3.2 以上版本可用。 514 | ### 判断是否为日期存档页面(Date Page) 515 | 516 | ``` 517 | is_date() 518 | ``` 519 | 520 | 判断当前页面是否为任何的按时间存档的页面。 521 | 522 | ``` 523 | is_year() 524 | ``` 525 | 526 | 判断当前页面是否为按年份存档的页面。 527 | 528 | ``` 529 | is_month() 530 | ``` 531 | 532 | 判断当前页面是否为按月份存档的页面。 533 | 534 | ``` 535 | is_day() 536 | ``` 537 | 538 | 判断当前页面是否为按日期存档的页面。 539 | 540 | ``` 541 | is_time() 542 | ``` 543 | 544 | 判断当前页面是否为按照小时、分钟、秒存档的页面。 545 | 546 | ``` 547 | is_new_day() 548 | ``` 549 | 550 | 判断当前页面是否为文章日期的新的一天,必须用在主循环中。 551 | ### 判断任意存档页面(Any Archive Page) 552 | 553 | ``` 554 | is_archive() 555 | ``` 556 | 557 | 判断当前页面是否为一个存档页面,包括:分类、标签、作者页面、日期存档页面等。 558 | ### 判断搜索结果页面(Search Result Page) 559 | 560 | ``` 561 | is_search() 562 | ``` 563 | 564 | 判断当前页面是否为一个搜索结果页面。 565 | 566 | ### 判断是否为 404 页面(404 Not Found Page) 567 | 568 | ``` 569 | is_404() 570 | ``` 571 | 572 | 判断当前页面是否带有 “HTTP 404:Not Found” 错误。 573 | 574 | ### 判断被分页页面(Paged Page) 575 | 576 | ``` 577 | is_paged() 578 | ``` 579 | 580 | 这里的分页指的是存档页面,如果一个日志或者静态页面的内容通过通过 拆分成多个页面,这些不能算为 paged page 581 | 582 | ### 判断是否为附件页面(Attachment) 583 | 584 | ``` 585 | is_attachment() 586 | ``` 587 | 588 | 判断当前页面是否为一个附件页面。附件页面通常为一个图片或者是一些其他文件,可以在编辑文章上传文件那里进行设置。 589 | 590 | ### 判断单页面、文章页面或者附件页面 591 | 592 | ``` 593 | is_singular() 594 | ``` 595 | 596 | 只要 is_single()、is_page()、is_attachment() 返回 True,此函数返回 True。 597 | 598 | ``` 599 | is_singular( 'book' ) 600 | ``` 601 | 602 | 判断当前文章是否属于自定义文章类型(Custom Post Types)“book”。 603 | 604 | ``` 605 | is_singular( array( 'newspaper', 'book' ) ) 606 | ``` 607 | 608 | 判断当前文章是否属于数组中某个自定义文章类型。 609 | 610 | ### 判断订阅页面 611 | 612 | ``` 613 | is_feed() 614 | ``` 615 | 616 | 判断是否在订阅输出的页面。这个判断标签是为插件开发者提供的。 617 | 618 | ### 判断引用通告(Trackback) 619 | 620 | ``` 621 | is_trackback() 622 | ``` 623 | 624 | 判断当前 WordPress 主题是否开启了 Trackback 功能。这个判断标签是为开发者提供的。 625 | 626 | ### 判断预览页面 627 | 628 | ``` 629 | is_preview() 630 | ``` 631 | 632 | 判断一篇文章是否在预览(文章本身处于草稿状态)。 633 | 634 | ### 判断是否有摘要 635 | 636 | ``` 637 | has_excerpt() 638 | ``` 639 | 640 | 判断当前文章是否有摘要内容。 641 | 642 | ``` 643 | has_excerpt( 42 ) 644 | ``` 645 | 646 | 判断文章 ID 为 42 的文章是否有摘要内容。 647 | 648 | 还可以使用下面代码来实现: 649 | 650 | ```php 651 | post_excerpt ) ) { 656 | // 如果文章没有摘要执行这块代码 657 | } else { 658 | // 如果文章带有摘要执行这块代码 659 | } 660 | ?> 661 | ``` 662 | 663 | 如果你想在文章没有摘要的时候,显示空内容: 664 | 665 | ```php 666 | 2 | 3 | **Table of Contents** *generated with [DocToc](https://github.com/thlorenz/doctoc)* 4 | 5 | - [Post Formats的使用](#post-formats%E7%9A%84%E4%BD%BF%E7%94%A8) 6 | - [Post Formats能用来干什么](#post-formats%E8%83%BD%E7%94%A8%E6%9D%A5%E5%B9%B2%E4%BB%80%E4%B9%88) 7 | - [如何使用Post Formats](#%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8post-formats) 8 | - [注册Post Formats](#%E6%B3%A8%E5%86%8Cpost-formats) 9 | - [使用Post Formats](#%E4%BD%BF%E7%94%A8post-formats) 10 | - [增强Post Formats](#%E5%A2%9E%E5%BC%BApost-formats) 11 | 12 | 13 | 14 | Post Formats的使用 15 | === 16 | 17 | Post Formats 是 wordpress 3.1 发布时添加的内容,如果你说你不知道是用来干什么的,那么你肯定见过这个区域。 18 |  19 | 20 | ##Post Formats能用来干什么 21 | 22 | 最简单最直观的,我们在发布文章的时候可以选择不同的文章形式,然后不同形式的文章以不同的形式展现出现。最典型的就是可以在博客中插入“说说”或者是“碎碎念”之类的东西。 23 | 24 | ##如何使用Post Formats 25 | 26 | ###注册Post Formats 27 | 28 | 在wordpress中内置了10种类型,并且默认是选择关闭的,你需要在functions.php里面添加这段代码,让他呈现在你的眼前. 29 | ```php 30 | add_theme_support( 'post-formats', array('status','image','quote','video','audio') ); 31 | ``` 32 | 其十种形式分别是 aside audio chat gallery image link quote status video。 33 | 34 | ###使用Post Formats 35 | 36 | ```php 37 | 40 | 43 | ``` 44 | 简单的使用就是上面的代码段,不难看出核心就是has_post_format。 45 | 46 | 这样我们就可以简单的判断这个文章是什么类型,然后针对他采用不同的样式。 47 | 48 | ##增强Post Formats 49 | 50 | wordpress官方并没有给出什么API可以让我们去创建新的Post Formats。唯一可以做的也许只有下面的方法: 51 | 52 | ```php 53 | function rename_post_formats( $safe_text ) { 54 | if ( $safe_text == '状态' ) 55 | return '自定义名字1'; 56 | if ( $safe_text == '链接' ) 57 | return '自定义名字2'; 58 | if ( $safe_text == '引语' ) 59 | return '自定义名字3'; 60 | return $safe_text; 61 | } 62 | add_filter( 'esc_html', 'rename_post_formats' ); 63 | ``` 64 | 65 |  66 | 67 | 我们只是简单的修改了要呈现的文本,并没有修改任何的调用。虽然看着比较难看,但勉强能够完成我们所要的东西。 -------------------------------------------------------------------------------- /chapter2/2/post-type.md: -------------------------------------------------------------------------------- 1 | Custom Post Type的使用 2 | === 3 | ##什么是Post Type 4 | WordPress 里面内置了两种常用的 Post Type :Post(文章)、Page(页面),分别用来展示两种类型的内容,一种是相对动态的文章,另一种是相对固定的页面。 5 | 6 | 除此之外,WordPress 还内置了其他几种 Post Type 用来展示不同类型的内容。但如果是一个比较复杂的网站或者需求自定义程度比较高,这时候就可以手动自己创建一个 Post Type 来展示某类信息。 7 | 8 | 比如大型杂志网站,可以为每个杂志类型创建不同的 Post Type 来进行管理;大型企业网站,可以为每个产品类型创建不同的 Post Type 来展示。 9 | 10 | 本节以创建一个 Movies Post Type 为例,介绍一系列与 Post Type 有关的事情。创建之后,我们可以新建 Movie 介绍,每一篇 Movie 可以自己添加 导演 等信息,还可以创建单独的电影列表等。 11 | 12 | 使用的主题是官方的 twentyfourteen,建议边看边在本地服务器修改测试。、 13 | 14 | ##创建一个Post Type 15 | 创建一个新的 Post Type 需要使用 register_post_type 函数来注册一下。需要在你主题的 functions.php 文件下调用该函数: 16 | ``` 17 | register_post_type( $post_type, $args ); 18 | ``` 19 | $post_type 参数就是你自定义 Post Type 的名称,Post Type 可以自定义的功能非常多,所以这个函数里面的 $args 参数会很多,所以我们可以这样来注册post type: 20 | ``` 21 | function my_custom_post_product() { 22 | $args = array(); 23 | register_post_type( 'product', $args ); 24 | } 25 | add_action( 'init', 'my_custom_post_product' ); 26 | ``` 27 | 包裹在一个函数中,定义一个数组,然后挂靠到 init 这个 action 上。这样 WordPress 在初始化的时候,就会执行这个函数注册一个自定义 Post Type,因为调用 register_post_type() 的时候,必须要在** admin_menu action** 之前,在 after_setup_theme action 之后,所以这里最好挂靠到 init action 上(这里我们就用到了前面讲过的add_action这个钩子去增加新的功能)。 28 | 29 | 因此,在我们的这个例子中,这段代码大体上是这样写的: 30 | ``` 31 | function my_custom_post_movie() { 32 | $labels = array( 33 | 'name' => _x( 'Movies', 'post type 名称' ), 34 | 'singular_name' => _x( 'Movie', 'post type 单个 item 时的名称,因为英文有复数' ), 35 | 'add_new' => _x( '新建电影', '添加新内容的链接名称' ), 36 | 'add_new_item' => __( '新建一个电影' ), 37 | 'edit_item' => __( '编辑电影' ), 38 | 'new_item' => __( '新电影' ), 39 | 'all_items' => __( '所有电影' ), 40 | 'view_item' => __( '查看电影' ), 41 | 'search_items' => __( '搜索电影' ), 42 | 'not_found' => __( '没有找到有关电影' ), 43 | 'not_found_in_trash' => __( '回收站里面没有相关电影' ), 44 | 'parent_item_colon' => '', 45 | 'menu_name' => 'Movies' 46 | ); 47 | $args = array( 48 | 'labels' => $labels, 49 | 'description' => '我们网站的电影信息', 50 | 'public' => true, 51 | 'menu_position' => 5, 52 | 'supports' => array( 'title', 'editor', 'thumbnail', 'excerpt', 'comments' ), 53 | 'has_archive' => true 54 | ); 55 | register_post_type( 'movie', $args ); 56 | } 57 | add_action( 'init', 'my_custom_post_movie' ); 58 | ``` 59 | *在这段代码中,我们出现了很多的中文,虽然这种方法是没有太大的问题的,但是更加优雅的做法应该是写成英文,然后用相关的本地化函数翻译成中文。* 60 | 61 | 从上面代码可以看到 $args 数组里面有一个 labels 配置项,用来配置显示文案有关的内容,为了清晰所以单独拿出来创建了一个数组。其他配置项看下英文也能猜出大体意思,如果想要详细了解,可以看下官方文档:[register_post_type](http://codex.wordpress.org/Function_Reference/register_post_type) 。 62 | 63 | 将上面代码加到主题 functions.php 的最下面,进入后台你会发现多出了 Movies 选项,这样表示注册成功: 64 | 65 |  66 | 67 | 这时候我们可以新建 Movie 发表一篇电影类型的文章了。但是这样与文章类型基本相同,我们需要更多的自定义来完善我们的 Movie 类型。 68 | 69 | ##为Post Type添加分类功能 70 | 71 | 就电影来说,可以分为科幻、动作、战争等类别,那么我们就为自定义的 Movie 添加分类功能,这样就可以编辑新分类以及归类我们的电影了。这个分类跟文章里面的分类性质是一样的。 72 | 73 | 添加分类功能需要使用函数 [register_taxonomy](http://codex.wordpress.org/Function_Reference/register_taxonomy),使用方法也很简单,跟注册 Post Type 函数类似,只不过多了一个参数用来指定对应的 Post Type : 74 | ``` 75 | register_taxonomy( $taxonomy, $object_type, $args ); 76 | 77 | ``` 78 | $taxonomy就是你自定的这个分类反而名称,$object_type就是这个分类所对应的Post Type名称,$args依然有很多的参数。 79 | 80 | 就本例而言,可以配置如下常用参数: 81 | ``` 82 | function my_taxonomies_movie() { 83 | $labels = array( 84 | 'name' => _x( '电影分类', 'taxonomy 名称' ), 85 | 'singular_name' => _x( '电影分类', 'taxonomy 单数名称' ), 86 | 'search_items' => __( '搜索电影分类' ), 87 | 'all_items' => __( '所有电影分类' ), 88 | 'parent_item' => __( '该电影分类的上级分类' ), 89 | 'parent_item_colon' => __( '该电影分类的上级分类:' ), 90 | 'edit_item' => __( '编辑电影分类' ), 91 | 'update_item' => __( '更新电影分类' ), 92 | 'add_new_item' => __( '添加新的电影分类' ), 93 | 'new_item_name' => __( '新电影分类' ), 94 | 'menu_name' => __( '电影分类' ), 95 | ); 96 | $args = array( 97 | 'labels' => $labels, 98 | 'hierarchical' => true, 99 | ); 100 | register_taxonomy( 'movie_category', 'movie', $args ); 101 | } 102 | add_action( 'init', 'my_taxonomies_movie', 0 ); 103 | 104 | ``` 105 |  106 | 107 | 为 Post Type 添加自定义 Meta Box 108 | === 109 | 我们想要添加的电影类型不能仅仅只有正文内容,我们还需要额外添加一些 导演 之类的有关内容。那么就需要添加自定义 Meta Box,Meta Box 可以在文章发表页面中添加自定义的表单,编写文章的时候可以填写额外的信息然后在前端调用出来。 110 | 111 | 自定义 Meta Box 需要用到 [add_meta_box](http://codex.wordpress.org/Function_Reference/add_meta_box) 函数: 112 | ``` 113 | add_meta_box( $id, $title, $callback, $post_type, $context,$priority, $callback_args ); 114 | ``` 115 | 老规矩,具体参数内容查看官方文档,这里只介绍常用用法。我们注册一个 Meta Box : 116 | ``` 117 | function movie_director() { 118 | add_meta_box( 119 | 'movie_director', 120 | '电影导演', 121 | 'movie_director_meta_box', 122 | 'movie', 123 | 'side', 124 | 'low' 125 | ); 126 | } 127 | add_action( 'add_meta_boxes', 'movie_director' ); 128 | ``` 129 | 然后在配置参数里面指定了回调函数 movie_director_meta_box(第三个参数),我们需要在这个函数里面创建表单: 130 | 131 | ``` 132 | function movie_director_meta_box($post) { 133 | 134 | // 创建临时隐藏表单,为了安全 135 | wp_nonce_field( 'movie_director_meta_box', 'movie_director_meta_box_nonce' ); 136 | // 获取之前存储的值 137 | $value = get_post_meta( $post->ID, '_movie_director', true ); 138 | 139 | ?> 140 | 141 | 142 | 143 | 144 | ID, '_movie_director', true ); 201 | break; 202 | } 203 | } 204 | function movie_edit_columns($columns){ 205 | 206 | $columns['movie_director'] = '导演'; 207 | 208 | return $columns; 209 | } 210 | 211 | add_action("manage_posts_custom_column", "movie_custom_columns"); 212 | add_filter("manage_edit-movie_columns", "movie_edit_columns"); 213 | ``` 214 | 即添加了列导演字段,并从每篇文章中读取出来。这样我们的列表就变成了: 215 | 216 |  217 | 218 | OK,我们的后端部分就这样愉快的完成了。打开生成好的链接看下,咦,Not Found?是这样的,如果你的网站设置了固定连接,当你新建了 Post Type 之后,你必须要在后台更新一下固定连接设置才行。找到后台固定连接,再点击一下下面的“保存设置”,之后就可以正常访问了。 219 | 220 | ##展示Post Type的内容 221 | 222 | 单纯创建 Post Type 只是可以让你输入内容,没有什么意义,我们还需要在前台输出自定义 Post Type 的内容。 223 | 224 | ##自定义 Post Type 的模板和样式 225 | 226 | 根据 WordPress 的模板调用规则 我们可以得知,我们只需要创建 archive-[post_type].php 和 single-[post_type].php 就可以实现该 Post Type 的列表自定义和文章自定义。当访问 Post Type,WordPress 会优先调用这些模板来渲染。 227 | 228 | 需要注意的是,你需要在注册 Post Type 的时候设置 'has_archive' => true 才会有列表。 229 | 230 | 现在我们就把主题里自带的 archive.php 和 single.php 文件复制一份命名为 archive-movie.php 和 single-movie.php,为了演示,这里我不做很多自定义,只是输出导演信息表示一下。 231 | 232 | 我们分别在 L.56 和 L.23 附近的合适位置输出 Meta Box 信息: 233 | 234 | ``` 235 | echo '导演:'.get_post_meta( get_the_ID(), '_movie_director', true ); 236 | ``` 237 | 238 | 然后刷新访问电影列表和具体的电影就可以看到输出的导演信息了。 239 | 240 | ##调用 WP_Query 高度自定义调用 Post Type 的内容 241 | 242 | 上面操作依赖模板,如果需要高度自定义或者在页面的某个模块中调用列表,就需要用到 WP_Query 类来调用: 243 | 244 | ``` 245 | $args = array( 'post_type' => 'movie', 'posts_per_page' => 10 ); 246 | $loop = new WP_Query( $args ); 247 | while ( $loop->have_posts() ) : $loop->the_post(); 248 | the_title(); 249 | echo '