WordPress,当初之所以研究这个,目的是在于开发一个多租户系统应用。总的来说,WordPress给了我不少启发和影响。为此,我决定这个研究心得分享出去。
总的来说,这篇文章参考了很多朋友们的博客,同时也包括官方网站。
围绕如下五个大主题进行讨论,其中有些重复了,比如WordPress的安装、插件和主题下载等等,有这方面经验的同学,可以不必细看,直接忽略即可,这篇文章大家可以根据自己感兴趣的来看。
一、WordPress研究..................................................................................................................................... 1
1.wordpress介绍
2.wordpress研究目的
3.wordpress安装
二、WordPress主题..................................................................................................................................... 1
1.主题架构图
2.主题zip包
3.主题上传和下载
4.主题对于Java开发的启示
三、WordPress 插件.................................................................................................................................... 1
1.如何下载和安装插件
2.如何使用插件
3.插件开发带来的好处和弊端
4.wordpress插件开发对于Java开发效率的启示
四、WordPress数据库分析....................................................................................................................... 1
五、WordPress运行原理............................................................................................................................ 1
一、 WordPress研究说明
1.WordPress介绍
WordPress是使用PHP语言开发的博客平台,用户可以在支持PHP和MySQL数据库的服务器上架设属于自己的网站。也可以把 WordPress当作一个内容管理系统(CMS)来使用。
WordPress是一款个人博客系统,并逐步演化成一款内容管理系统软件,它是使用PHP语言和MySQL数据库开发的。用户可以在支持 PHP 和 MySQL数据库的服务器上使用自己的博客。
WordPress有许多第三方开发的免费模板,安装方式简单易用。不过要做一个自己的模板,则需要你有一定的专业知识。比如你至少要懂的标准通用标记语言下的一个应用HTML代码、CSS、PHP等相关知识。
WordPress官方支持中文版,同时有爱好者开发的第三方中文语言包,如wopus中文语言包。WordPress拥有成千上万个各式插件和不计其数的主题模板样式。
2.研究的目的
学习和研究WordPress的运行机制,致力于提高开发效率,节约开发成本和时间,构建一个高效稳定灵活适应变化的web系统。
3.wordpress的安装
要想使用,必先安装,wordpress的安装非常简单,5分钟安装教程。
环境:Linux+Apache+MySQL+PHP(lamp环境)
说明:演示环境为ubuntu16.04,centos7及其以上与此大同小异
安装步骤:
(1) 安装apache
安装命令:apt-get install apache2
(2) 安装MySQL
安装命令:apt-get install mysql-server mysql-client
(3) 安装PHP
a.安装命令:
apt-get install php7.0
apt-get install libapache2-mod-php7.0
apt-get install php7.0-mysql
b.编辑文件
vim /var/www/html/phpinfo.php
内容为: <?php echo phpinfo();?>
b.重启服务并在浏览器输入对应的地址
service apache2 restart
service mysql restart
浏览器输入:http:// IP地址/phpinfo.php,出现PHP版本界面
这样就表示apache+php是没有问题的
(4) 安装PHPMyAdmin
a.安装命令
sudo apt-get install phpmyadmin
安装时:空格选择apache2,enter确定,下一步配置数据库,输入密码。
b.软链接关联
sudo ln -s /usr/share/phpmyadmin /var/www/html
c.启用Apache mod_rewrite模块,后面修改wordpress链接会用到
sudo a2enmod rewrite
d.重启服务
service php7.0-fpm restart
e.配置vim /etc/apache2/apache2.conf
配置文件尾部添加如下内容:
AddType application/x-httpd-php .php .htm .html
AddDefaultCharset UTF-8
说明:这里安装phpmyadmin的目的是便于通过web界面添加对应的数据库和增加用户赋予权限
不安装phpmyadmin也是可以的。不安装通过如下步骤也可以完成这个目的。
步骤如下:
# 登录数据库
mysql -u root -p
# 创建数据库
CREATE DATABASE wordpress;
# 创建数据库用户和密码
CREATE USER wordpressuser@localhost IDENTIFIED BY '123456';
# 设置wordpressuser访问wordpress数据库权限
GRANT ALL PRIVILEGES ON wordpress.* TO wordpressuser@localhost IDENTIFIED BY '123456';
# 刷新数据库设置
FLUSH PRIVILEGES;
# 退出数据库
exit
(1) 安装WordPress
Wordpress中文版路径为: https://cn.wordpress.org/wordpress-4.8-zh_CN.zip
英文版路径: http://wordpress.org/latest.tar.gz
a.下载
wget +url即可
例如:wget https://cn.wordpress.org/wordpress-4.8-zh_CN.zip
b.解压
unzip latest.tar.gz或unzip wordpress-4.8-zh_CN.zip
c.远程批量传输
sudo rsync -avP /home/test/wordpress /var/www/html/wordpress/
d.修改配置
cd /var/www/html/wordpress
cp wp-config-sample.php wp-config.php
vim wp-config.php
修改内容如下:将其修改为通过phpmyadmin添加的数据库名和用户名及其密码或者是通过命令行添加的数据库名和用户名及其密码。
说明:这里的数据库wordpress,将到时生成对应的11张表。
链接可参考: https://jingyan.baidu.com/article/215817f7b865121edb142365.html
二、 WordPress主题
1.主题架构图
上述架构图是许多模板主题共同的地方
2.主题模板zip包
通常主题模板是以zip包的形式存在,解压后如下所示:
从文件名字我们也可以推断出其大致作用,就这个主题而言,从上至下,它们的作用分别是:
- css(文件夹):存放 css 文件
- genericons(文件夹):存放字体文件
- inc(文件夹):存放 php 文件,文件内一般是自定义函数
- js(文件夹):存放 js 文件
- languages(文件夹):存放语言文件
- template-parts(文件夹):为了代码简洁,作者把一些代码(可能重复用到的)分开放到了此文件夹下
- 404.php:出现404错误时使用的文件
- archive.php:分类页面
- comments.php:评论
- footer.php:页脚
- functions.php:定义函数
- header.php:页头
- image.php:图片
- index.php:首页
- page.php:页面(page)
- rtl.css:关于字体的一些样式
- screenshot.php:主题缩略图,在后台显示
- search.php:搜索页面
- searchform.php:搜索框
- sidebar.php:侧边栏
- sidebar-content-bottom.php:侧边栏底部
- single.php:文章(post)页面
- style.css:样式文件
文件执行顺序:
以主页为例,下面有2个文件 home.php 和 index.php,WordPress 程序会从你的主题文件夹中依次查找这两个文件(后台设置首页显示为”最新文章”的前提下):
- 如果找到 home.php,则使用 home.php 作为博客首页模板,即使你的主题文件夹中有 index.php;
- 如果 home.php 未找到,则使用 index.php 作为首页模板;
- 如果 home.php 和 index.php 都找不到,你的主题将不会被 WordPress 识别,等于废物。
3.主题上传或者下载
主题官方下载地址: https://wordpress.org/themes/
主题上传和下载,下载可以就近原则,通过点击后台主菜单外观,进入主题界面,点击添加主题,可通过搜索最近热门或者最新的模板。点击下载即可。不过有一个前提需要通过ftp服务器,遵守文件上传协议,当然也可以通过修改配置文件的方式解决下载主题和插件需要ftp服务器问题。要么ftp,要么服务器配置,主要是指对wp-config.php文件进行修改,不然无法完成下载安装到wp-content下的themes目录下。
4.主题对于Java开发的启示
通过架构图和zip包,简单的概述,与freemarke或者volocity等模板引擎有不谋而合之理,freemarke和volocity是通过事先定义ftl或vm的模板,然后通过前台的配置进行代码生成和页面生成。包括wordpress新增页面或者发布文章等也是一样,可以通过自定义页面进行页面生成和套用主题文章展示模板。
主题就好比模板,面向模板机制开发或套用模板开发。
三、WordPress插件
1.如何下载和安装插件
下载和安装插件非常简单如下图所示:
和上传主题及其下载主题是一样的,都是通过这种安装或者上传zip包的形式。
插件下载官方地址为: https://wordpress.org/plugins/
Wordpress的插件成千上万,近年来,wordpress不只是在博客领域有很多成就,而且在新闻、电商方面也有很多应用,如果没有插件的话,wordpress功能只是单一的,有了插件就意味着有了无限应用可能。
2.如何使用插件
使用插件前,首先必先安装,即拥有该插件,然后点击插件菜单,进入插件列表,可根据自己的需求,决定启动哪个插件。
不同的插件,有不同的使用方法和应用场景,以WordPress导入工具为例:
通过这种方式,你可以将只要在任何博客系统上的导出对应的xml文件进行导入,你便可以获取该博客对应的所有文章内容相关的信息。通常情况下,适用于wordpress相关的。因为数据库方面设计,即便可以将其他博客系统上的文件导入进来,但是表相关的数据可能会丢失或者在导入的时候会失败。
3.插件开发带来的好处和弊端
插件开发带来的实现很多东西的可能性,同时也伴随着许多弊端, 比如性能上,一个wordpress运行插件过多,会导致性能损失,性能损失最大的体现是网站运行过慢,过慢带来的就是用户点击进入这个网站需要加载很长时间,加载过长影响用户体验,对于以网上写作为生或者是其他传播媒介,会造成非常不好的影响,导致用户丢失。当然了,插件还有一个很大的隐患就是病毒潜伏。Wordpress对于xss攻击或者其他web攻击都具有非常良好的防御性,让对方没有可趁之机,但是插件是近年来出现问题最多的地方。利与弊同时兼之。
4.插件开发对于Java开发有何启示
插件于Java而言就好比maven库的jar包,插件有千千万万,jar包同样如此,每个插件具有不同或者相似的功能,jar包也是如此。不同的jar包具有不同的功能,比如以hutool为例,hutool这个jar包主要包含java开发所常用的工具类,这样对于开发者而言,通常常用的加密、日期格式、类型转换、计算、json、I/O等不用自己开发,只需一个依赖即可。而wordpress要想比如第三方微信登录或者支付相关的等,需要安装对应的插件,wordpress又号称插件式开发。wordpress的插件好比maven的依赖,插件可以由专业人员开发,想使用者可进行支付相关费用,而maven有个叫nexus,又叫maven私服。私服,顾名思义,私人仓库,通常作为公司maven仓库。对外提供相关私服路径,需要引用,除了引用私服的路径之外,再加上依赖名称。如下图所示:
私服方面,可以通过配置自己的仓库赋予对应的角色,可达到保护源代码不被查看的效果。Jeesite就是采用这种策略保护自己的核心代码。
Jeecg的开发思路与wordpress有一个共同之处就是插件式开发
Jeecg的插件:
而该插件实质就是maven依赖,就是各种jar包的集合体。
这种思路可以作为借鉴的地方,还是以jeecg为例:
首先jeecg的码云地址为: https://gitee.com/jeecg
上述截图为其开源项目,每个开源项目都是以maven依赖形式存在。
如果要使用,还是跟平时开发使用spring系列那样,引用对应的依赖名称和版本号即可。如果是私服需要引用私服地址,如果是公共仓库,只需如下所示即可:
<dependency>
<groupId>org.jeewx</groupId>
<artifactId>jeewx-api</artifactId>
<version>1.2.0</version>
</dependency>
四、 WordPress数据库
数据库架构图
参考为官方文档地址: https://codex.wordpress.org/File:WP4.4.2-ERD.png
一共为11个表:
wp_commentmeta:存储评论的元数据
wp_comments:存储评论
wp_links:存储友情链接(Blogroll)
wp_options:存储WordPress系统选项和插件、主题配置
wp_postmeta:存储文章(包括页面、上传文件、修订)的元数据
wp_posts:存储文章(包括页面、上传文件、修订)
wp_terms:存储每个目录、标签
wp_term_relationships:存储每个文章、链接和对应分类的关系
wp_term_taxonomy:存储每个目录、标签所对应的分类
wp_usermeta:存储用户的元数据
wp_users:存储用户
表的作用如下:
简要概述:表与平时我们自己设计的其实差别不是特别大,表的设计关系到数据库的I/O及其CPU使用情况,I/O和CPU使用率过高会导致数据库处理数据缓慢,严重甚至卡死。而wordpress表结构设计也称不上非常合理。
五、WordPress工作原理
原理示意图:
根据原理示意图分析结果如下:
第一步:加载index.php
该文件有效源码如下:
define('WP_USE_THEMES', true);
# 定义是否加载主题文件,true为加载;
require('./wp-blog-header.php');
# 加载wp-blog-header.php文件,该文件用于启动WordPress环境及模板;
第二步:加载wp-blog-header.php文件。
if ( !isset($wp_did_header) ) {
$wp_did_header
= true;
require_once( dirname(__FILE__) . '/wp-load.php' );
wp();
require_once( ABSPATH . WPINC . '/template-loader.php'
);
}
解析1:对$wp_did_header进行赋值,这样如果代码块已经执行过,判断就会失败,代码块就不会再执行。这种做法可以确保wp-blog-header.php文件只执行一次(重复执行的话会出现函数名冲突、变量重置等,WordPress会精神分裂的!);
解析2:加载WP根目录下wp-load.php文件,执行初始化工作,如初始化常量、环境、加载类库和核心代码等完成WordPress环境启动工作,如加载wp-includes目录下functions.php(函数库)、class-wp.php(类库)、plugin.php(插件)、pomo目录(语言包)、query.php(数据请求)、theme.php(加载主题文件)、post-template.php(文章模板)、comment.php(评论模板)、rewrite.php(URL重写)等等。
解析3:执行wp()函数,执行内容处理工作,如根据用户的请求调用相关函数获取和处理数据,为前端展示准备数据;
解析4:加载根目录绝对路径下wp-includes目录中template-loader.php文件,执行主题应用工作,如根据用户的请求加载主题模板。
WordPress之所以能将用户请求的页面生成出来,都是最后这三行核心代码起的作用。wp-load.php会完成页面生成所需要的所有环境、变量、API等,相当于做了好准备工作;wp()函数根据用户请求的URL从数据库中取出相应的数据内容备用;template-loader.php把已经准备好的内容用主题所设定的样式展现方式给拼接出来。这三项工作完成,就可以将用户请求的页面展现出来了。我们姑且将这三项工作也认定为三个大步骤,以下将重点分析。
第三步:加载wp-load.php文件(初始化)
该文件初始化常量(如:定义绝对路径、设定功能文件及内容文件路径等)并加载wp-config.php文件,
加载wp-config.php文件:该文件主要用于配置MySQL数据库通信信息、设定数据库表名前缀、设定密钥、设置语言及文件绝对路径等,部分核心代码如下(为省事就直接在代码后加#然后解释含义了)
wp-config中还加载了一个重要的文件:wp-settings.php。
wp-settings.php:主要用于创建和定义常见变量、函数和类的库来为WordPress运行做准备,也就是说WordPress运行过程中使用的大多数变量、函数和类等核心代码都是在这个文件中定义的。这个文件相当于一个总控制器,很多常量定义、函数定义等都是在其他文件中完成,而该文件的作用就是执行那些文件或执行在那些文件中已经定义好的函数。
第四步: 执行wp()函数(内容处理)
在这一阶段,调用wp()函数对数据库内容进行查询,并将查询的内容赋值给一些全局变量,方便在模板中使用模板标签获取相应的数据并展示在前端。
第五步:加载template-loader.php文件(主题应用)
示意图如下:
小结:
虽然现在的博客系统搭建方式有很多种,同时也不得不承认一点,后进者的确比前行者要强,但是有一点不可忽略,那就是站在巨人的肩上,正如当初的牛顿创建了力学三大定律,绝非他一个的功劳而是他善于利用先辈们积累的知识。
WordPress研究心得的更多相关文章
-
Python字符串的encode与decode研究心得——解决乱码问题
转~Python字符串的encode与decode研究心得——解决乱码问题 为什么Python使用过程中会出现各式各样的乱码问题,明明是中文字符却显示成“/xe4/xb8/xad/xe6/x96/x8 ...
-
WordPress企业建站心得
回头聊聊我用WordPress做企业网站的事.说是企业网站,其实就是一个小的企业展示网站.事情要从我爸开了一家自行车店开始说起,自从他开了自行车店,不但开始学着玩起了微信(因为要做微信营销),又想到了 ...
-
Python字符串的encode与decode研究心得乱码问题解决方法
为什么Python使用过程中会出现各式各样的乱码问题,明明是中文字符却显示成“\xe4\xb8\xad\xe6\x96\x87”的形式? 为什么会报错“UnicodeEncodeError: 'asc ...
-
Python字符串的encode与decode研究心得 乱码问题解决方法
以下摘自:http://www.jb51.net/article/17560.htm 为什么Python使用过程中会出现各式各样的乱码问题,明明是中文字符却显示成“\xe4\xb8\xad\xe6\x ...
-
Javascript面向对象研究心得
这段时间正好公司项目须要,须要改动fullcalendar日历插件,有机会深入插件源代码.正好利用这个机会,我也大致学习了下面JS的面向对象编程,感觉收获还是比較多的. 所以写了以下这篇文章希望跟大家 ...
-
【SaltStack】SaltStack研究心得
基础篇 ------------------------------------------------------------------------------------------------ ...
-
Flume研究心得
最近两天,仔细的看了一下Flume*日志系统(版本号:1.3.X),Flume在本人看来,还是一个非常不错的日志收集系统的,其设计理念非常易用,简洁.并且是一个开源项目,基于Java语言开发,可以进 ...
-
Node稳定性的研究心得
目前大部分Web服务器,如Apache,都使用多线程的方式响应多用户请求,即一个线程服务一个用户请求.这种模式其中一个好处是,当某个请求的线程上抛出的异常没被捕获,只会影响当前这个线程,不会影响其他请 ...
-
pdf 转图片,提取图片研究心得
1.pdf 中的数据是有多种编码的,详情请看:http://www.cnblogs.com/zendu/p/7644465.html 2.我的工作场景比较特殊,pdf中全部是图片,所以pdf转图片就有 ...
随机推荐
-
dragsort html拖拽排序
一.Jquery List DragSort 对于有些页面,如首页的定制,需要进行动态的拖拽排序.由于自己实现比较困难,我们一般会使用一些js插件来实现.dragsort 就是帮助我们完成这一需求.通 ...
-
使用github之前的技能准备
Git的导入 介绍 Git属于分散型版本管理系统,是为版本管理而设计的软件.版本管理就是管理更新的历史记录.它为我们提供了一些在软件开发过程中必不可少的功能,例如记录一款软件添加或更改源代码的过程,回 ...
-
css实现水平垂直居中
一.单行文字居中: height: 100px;height: 100px;overflow: hidden; 二.多行内容居中(容器的高度不能固定): padding-top: 24px;paddi ...
-
python 去掉列表(list)中的所有空元素
while '' in listExample: listExample.remove('')
-
JS实现弹出层对话框
点击按钮后,弹出层对话框,可交互,点击关闭后才关闭掉对话框. 效果图: 源码: <!doctype html> <html> <head> <meta cha ...
-
北大ACM(POJ1013-Counterfeit Dollar)
Question:http://poj.org/problem?id=1013 问题点:排除+验证. Memory: 244K Time: 16MS Language: C++ Result: Acc ...
-
开始ubuntu 14.04 的装X模式---终端模式下中文输入,听歌,上irc 开启framebuffer看电影 截图
先上图吧 卡卡的全是在tty1 下的操作,看电影,听歌,截图 ,看图 ,上irc 等等,相当适合在小白面前装屁! 需要安装的软件: 为了能正常显示中文:安装fbterm sudo apt-get i ...
-
Linux性能监控分析命令
vmstat sar iostat top free uptime netstat ps strace lsof
-
python爬虫程序
http://blog.csdn.net/pleasecallmewhy/article/details/8922826 此人的博客关于python爬虫程序分析得很好!
-
windows环境自动获取SVN仓库当前版本
如果我们的软件能够自动引入SVN修订号(仓库版本号),那么我们开发软件的时候就能快速定位bug出自哪个SVN版本.那么如何让软件直接自动生成并引用SVN版本号呢? 我们可以使用SVN info命令,在 ...