一、主题是什么?
Wordpress主题是由官方或其他制作者制作的,能够被轻松套用的wordpress站点样式模板。
二、主题实现原理
一、主题包各文件说明
header.php:这个文件中包含博客的标题(title),描述(description),tag,以及css等信息。
sidebar.php:这个文件控制你侧边栏中的显示方式。
footer.php:控制页面底部的显示,包括ICP,版权声明等信息。
archive.php:被系统调用用于显示用户提交分类,按日期归档,tag等查询后显示的页面。下面代码显示了archive.php内部是如何辨别不同的查询请求的:
<?php if (is_category()) { ?>
<div class=”pagetitle”>‘<?php single_cat_title(); ?>’ 分类下的文章</div>
<!–显示下面是哪个分类下的文章列表,‘ ’ 分别是左右单引号,下同–>
<?php }
elseif( is_tag() ) { ?> <div class=”pagetitle”>‘<?php single_tag_title(); ?>’ 标签下的文章</div>
…………
<?php } elseif (isset($_GET['paged']) && !empty($_GET['paged'])) { ?><div class=”pagetitle”>日志归档</div>
<?php } ?>
search.php:用于显示用户提交搜索后显示的页面。
searchform.php:搜索栏表单,被header.php调用。
single.php:用于全文显示post页面。
page.php:用于全文显示page页面。
function.php:存放自定义的函数,被其他文件包含和调用。
comments.php:留意评论模板,被single.php,page.php等需要评论功能的网页调用。
style.css:整个网站布局和显示模式。
screenshot.jpg:用于在后台选择主题页面里显示这个主题的截图,wordpress会自动在主题目录下寻找screenshot.*文件。
二、从源码看主题的调用过程
当浏览器向apache发送请求要得到博客主页的HTML代码时,./index.php被调用。./index.php中的require(‘./wp-blog-header.php’);调用./wp-blog-header.php。
而./wp-blog-header.php做了一些链接数据库包含头文件等处理,其中有两件事情与主题调用有关:
1、有require_once( dirname(__FILE__) ./wp-includes/functions.php’);
而/wp-includes/functions.php中包含进了./wp-includes/theme.php,这里定义了get_home_template()。
function
get_home_template() {//返回所要加载的主题 $template = ”;
if ( file_exists(TEMPLATEPATH . “/home.php”) )
$template = TEMPLATEPATH . “/home.php”;
elseif ( file_exists(TEMPLATEPATH . “/index.php”) )
$template = TEMPLATEPATH . “/index.php”;
return apply_filters(‘home_template’,
$template); 其中apply_filters()的作用是:将$templateg hook到tag=’home_template’的filters上并返回$template,也就是主题包的路径。
2、有require_once(ABSPATH . WPINC . ‘/template-loader.php’);
调用了./wp-includes/template-loader.php(ABSPATH代表./, WPINC代表/wp-includes)。
而./wp-includes/template-loader.php中有:
else if ( is_home() &&
$template = get_home_template() ) { include($template);
return;
get_home_template()将 主题包路径返回给$template,这里的include($template);语句就把./wp-content/themes/主题名/index.php包含进去了。于是开始执到./wp-content/themes/ade/index.php里面的代码了,接下来就是该主题内部的事情了。
三、主题被调用后,首页的加载过程
各个页面的加载过程大致相同,下面以首页为例说明。显示首页的时候,Wordpress只调用index.php,在index.php定义了要加载那些模板以及其加载顺序。一般情况是:header.php->页面主要内容(index,page,signle等页面都有其自己的定义)->sidebar.php->footer.php
其实对于一个能够提供Theme的程序而言,在程序的构架上必须要实现数据和表现的分离。通常我们所说的MVC(Model、View、Controller)架构就是这个意思。
在WordPress中,是这样来实现数据和实现的分离的。
1. XHTML:用Div等用来表现数据,CSS来描述这些数据的表现形式,用这种方式来实现数据和表现的分离;
2. Template的方式:页面各个部分单独保存为一个一个.php文件(如上面的sidebar.php,footer.php等),页面加载时候调用所需代码。
比如<?php comments_template(); ?>就返回了留言框的所需代码。
在比如index中有:
<?php get_footer(); ?>
<?php get_header(); ?>
“get_header”和”get_footer”分别用来得到该页的Header和Footer,其实就是两个DIV块儿。index的主体同样是一个大的Div(<div id=”content”>),在该Theme的CSS中即可以看到对这个DIV的表现定义,包括字体、背景颜色、边距等等。这里唯一的 id=content来告诉浏览器,这个标签内的内容显示在css中定义的content部分里面。
三、插件是什么?
Wordpress插件,是为开源博客程序WordPress添加各种功能的扩展组件,让WordPress程序可以扩展出各种各样的功能。
四、插件实现原理
一、WordPress读取所有可用的插件
一、WordPress读取所有可用的插件
在文件“/wp-admin/includes/plugin.php”中,函数 get_plugins() 用来从文件系统得到所有的插件。原理很简单,就是读取“wp-content/plugins”目录下的所有PHP文件。这个函数允许一级的子文件夹,也就是说在’wp-content/plugins’下面的PHP文件,以及所以在此目录下的一级子文件夹内部的PHP文件被列作插件的候选,用下面的函数去进一步提取插件信息。这样的好处是方便用户利用文件夹来对插件进行管理和组织。而函数 get_plugin_data() 则用来得到插件的描述(Plugin Descriptor),主要包括插件的版本、名称、作者,等信息,而这些其实是以注释的方式存在的。
二、启用、禁用插件
二、启用、禁用插件
三、如何加载启动的插件到系统中启用(禁用)插件的操作都在Plugins.php中,比如我要Deactive “Hello”这个插件,最后的URL其实是这个样子:
http://localhost/blog/wp-admin/plugins.php?action=deactivate&plugin=hello.php
其中,“Action”表示动作,值为“active”或者“deactivate”,而“Plugin””表示动作的对象插件,此处为“hello.php”。得到动作指令后,首先从数据库中取出当前已经激活的插件。
PHP代码
- <?php $current = get_settings(‘active_plugins’); ?>
然后根据动作,重新生成已激活插件数组,存入数据库,并重新加载此页。加载的时候就需要考虑这些已经激活的插件是怎么工作的了。
BTW:附上数据库的Options表中0插件和只有1个插件的值:
没有插件:a:1:{i:0;s:0:”";}
只有Hello插件:
a:2:{i:0;s:0:”";i:1;s:9:”hello.php”;}
WordPress中的每页都会包含“wp-config.php”文件,而“wp-config.php”中也会自动加载“wp-settings.php”文件。在“wp-settings.php”文件中,可以找到以下与插件相关的代码片断:
PHP代码
- <?php
- if ( get_option(‘active_plugins’) ) {
- $current_plugins = get_option(‘active_plugins’);
- if ( is_array($current_plugins) ) {
- foreach ($current_plugins as $plugin) {
- if ( ” != $plugin && 0 == validate_file($plugin) && file_exists(WP_PLUGIN_DIR . ‘/’ . $plugin) )
- include_once(WP_PLUGIN_DIR . ‘/’ . $plugin);
- }
- }
- }
- ?>
可见,这段代码会取出系统中所有启用的插件,并包含进来。所以在每页加载的时候,都会首先包含这些插件代码。那么,这些插件自己在加载的时候都做了什么呢?
四、插件的加载
插件的加载其实最重要的一个部分就是插件的事件注册机制,WordPress插件中的事件注册其实和Eclipse中的扩展点(Extension-Point)机制非常相像,而这种类似“插销”、“插销座”的软件插拔方式也成为了最近软件组件架构方面应用最多的实践。
事件注册过程中比较重要的几个函数分别是:do_action、add_action、add_filter。WordPress中默认定义了很多扩展点(也可以叫做“钩子”),或者说注册了很多系统事件(WP中的正规叫法应该是“Action Tag”),比如“admin_head”表示Admin页面的Head输出事件,“publish_post”表示发布一篇帖子的事件等等。而插件要做的就是扩展这些扩展点,或者说挂接这些钩子,从而实现系统的扩展功能。add_action就是通常插件扩展某个扩展点用到的函数,而do_action 是扩展点本身开始执行的函数。
刚才说过WordPress中的每一页执行前都会Include所有Active的插件代码,而这些代码通常都会用“add_action”来将自己的函数注册到系统的扩展点中。这样,在扩展点执行的时候,就会找到系统中所有已经挂接到这个扩展点上的插件的函数来执行之,从而扩充系统的功能。
WordPress中的很多功能也都是通过这种插件结构来实现的,默认注册了很多系统事件,都在’default-filter.php’中。比如:
事件注册过程中比较重要的几个函数分别是:do_action、add_action、add_filter。WordPress中默认定义了很多扩展点(也可以叫做“钩子”),或者说注册了很多系统事件(WP中的正规叫法应该是“Action Tag”),比如“admin_head”表示Admin页面的Head输出事件,“publish_post”表示发布一篇帖子的事件等等。而插件要做的就是扩展这些扩展点,或者说挂接这些钩子,从而实现系统的扩展功能。add_action就是通常插件扩展某个扩展点用到的函数,而do_action 是扩展点本身开始执行的函数。
刚才说过WordPress中的每一页执行前都会Include所有Active的插件代码,而这些代码通常都会用“add_action”来将自己的函数注册到系统的扩展点中。这样,在扩展点执行的时候,就会找到系统中所有已经挂接到这个扩展点上的插件的函数来执行之,从而扩充系统的功能。
WordPress中的很多功能也都是通过这种插件结构来实现的,默认注册了很多系统事件,都在’default-filter.php’中。比如:
PHP代码
- <?php add_action(‘publish_post’, ‘generic_ping’); ?>
这个是用来在发布每篇帖子的时候发送XML-RPC Ping的。再比如:
PHP代码
- <?php add_filter(‘the_content’, ‘convert_smilies’); ?>
用来将正文(content)中的笑脸符号转换为图像。
还是举“Hello”插件来说。Hello插件会随机的在Admin Page的右上角显示一段话,它的工作原理是这样的:
在每一个Admin page的前面都有
PHP代码
- <?php require_once(‘admin-header.php’); ?>
而在“admin-head.php”中将会执行扩展点“admin-head”的所有扩展:
PHP代码
- <?php do_action(‘admin_head’, ”); ?>
这样,就会执行所有挂接到admin_head的函数,Admin Page 的 Footer 部分也是类似。
插件实现机制内容均来自https://my.oschina.net/itxti/blog/185745
五、部分插件用途配置说明
一、BackUpWordPress
用途:备份数据库
配置过程:
1.启动插件后即运行,将会在每天的23点左右进行数据库备份,且将最近7天的数据库备份资料储存在/wp-content/backupwordpress-8bf8ec3912-backups。
2.除此之外,也可以点击run now立即备份,页面中将可以下载和 删除备份资料。3.点击setting可对备份时间间隔/储存时间等进行设置。
二、DX login register
用途:优化登录页面
配置过程:(注:本插件无法在wordpress中搜到,需要自行在网络下载并存放至plugin文件夹)
1.启用插件后,即可完成对注册登录页面的优化。2.进入DX注册登录设置界面,可以进行logo、链接、限制词、验证码(验证码已不可用)等的自定义。
三、Hyper Cache
用途:将动态的页面缓存为静态
配置过程:开启即可,具体过程可参照https://www.wpdaxue.com/hyper-cache.html。
四、SMTP mailer
用途:使不能使用mail()发送邮件的服务器发送邮件
配置过程:使用此插件,还需要有一个支持邮件推送服务的服务商,如阿里。详细过程可参考https://www.wpdaxue.com/wordpress-aliyun-smtp.html。
五、PrettyPress
用途:使wordpress文章编辑器支持markdown语法。
配置过程:启用插件后,在设置中enable插件,新建文章,并输入少量内容,保存,再次编辑时,使用右上角的prettypress功能,即可打开markdown编辑器。
六、主题配置说明
在Wordpress管理员后台(多站点模式需切换至网络)进入主题分栏,选择已有主题或进入主题列表下载网络主题,主题应用后,可进入仪表盘,自定义主题站点内容。