composer是一个好东西,类似node中的npm,在接触没多久的时候就一直有个想法,能不能在wordpress中使用composer,因为composer有大量非常好且实用的资源。 在早前的时候我的做法是这样的,先建立一个wordpress项目,在wordpress根目录中建立一个composer.json之后,执行`composer install`来进行包管理。那结果根目录就会像这样。 wp-admin/
wp-content/
wp-include/
vendor/
composer.json
composer.lock
index.php
license.txt
readme.html
wp-activate.php
wp-blog-header.php
wp-comments-post.php
wp-config-sample.php
wp-cron.php
wp-links-opml.php
wp-load.php
wp-login.php
wp-mail.php
wp-settings.php
wp-signup.php
wp-trackback.php
xmlrpc.php 使用过wordpress的朋友应该对这样的结构都不会陌生,他存在以下几个问题: - wordpress核心文件和composer参杂在一起
- 结构不清晰,使用不方便
- 看上去很不友好
最近在网上无意找了些资料,发现有种方法可以使得wordpress更好的搭配composer进行包的依赖管理。最终可以实现如下的目录结构 wp-content/
wp/
vendor/
composer.json
composer.lock
index.php 下面我将个人实践的方法做个简单的记录,和网上搜索到的普遍资料有些不一样,我个人做了一些优化,具体有哪些优化,请继续往下看。 初次安装wordpress的用户1.初次安装需要先配置`composer.json`,我的配置信息如下 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | {
"name" : "乱炖" ,
"description" : "乱炖 - 研究web" ,
"version" : "0.1.1" ,
"license" : "GPL" ,
"homepage" : "http://levi." ,
"authors" : [{
"name" : "Levi" ,
"email" : "cgfeel@gmail.com" ,
"homepage" : "http://levi."
}],
"repositories" : [{
"type" : "composer" ,
"url" : "http://"
}, {
"type" : "package" ,
"package" : {
"name" : "wordpress" ,
"type" : "webroot" ,
"version" : "4.1.1" ,
"dist" : {
"type" : "zip" ,
"url" : "https:///latest.zip"
}
}
}],
"require" : {
"php" : ">=5.3.0" ,
"wordpress" : "4.1.1" ,
"fancyguy/webroot-installer" : "1.0.0" ,
"levi/lv" : "dev-master" ,
"wpackagist-plugin/cnblogs2wp" : "0.6.4" ,
"wpackagist-plugin/wp-patch-levi" : "0.2.9" ,
"wpackagist-theme/twentyfifteen" : "1.0"
},
"extra" : {
"webroot-dir" : "wp" ,
"webroot-package" : "wordpress"
}
}
|
这段composer配置信息大致意思如下: - 配置一个为zip的远程资源(webroot),资源地址就是wordpress安装压缩包的下载地址
- 设置这个webroot资源包安装在`wp/`,这个目录下
2.保存文件后,执行安装 待出现类似下面的提示信息后,就表示资源包已下载到本地了 Loading composer repositories with package information
Installing dependencies (including require-dev)
- Installing fancyguy/webroot-installer (1.0.0)
Downloading: 100%
- Installing wordpress (3.8)
Downloading: 100%
Writing lock file
Generating autoload files 3.通过浏览器访问目录`wp/`,进行安装wordpress,安装步骤省略,这个网上教程太多了,不复杂,如果不了解请自行搜索。 已完成安装wordpress的用户这有两种情况,一种是你之前就已安装过wordpress,但是没有安装使用composer进行包管理;还有一种就是上面提到的,全新安装的用户,这类用户如果按照步骤来的话,看到这里实质上也已完成对wordpress安装了。 所以无论哪种情况,接下来要做的就是划分目录。在网上搜索“将wordpress安装在网站子目录”会有很多相关资料,wordpress官方也有一个,可直接从后台常规设置中找到入口连接。大致上都是千篇一律,如下: - 进入wordpress后台常规设置,将home URL设置为二级域名,将site URL设置为主域名
- 将`index.php`和`wp-content/`放置在根目录下,其余所有文件放置在子目录下
- 修改wp-config.php,配置WP_CONTENT_DIR等相关常量
这样做看上去似乎没错,但是却存在几个问题 首先关于这两个函数`get_option(‘home’)`和`get_option(`siteurl`)`大家能分得清吗?什么地方用`home`,设么地方用`siteurl`?ok,假定你能分得清楚,那能保证其他人能分清楚吗?比如说你使用的主题的作者,或者插件作者?如果分不清,这将直接造成你的博客在后续使用过程中造成URL错乱。 其次,设置了`home`还有`siteurl`,那么就会记录在库中,这次我们要将`wp/`作为二级目录,如果下次我们想修改下二级目录名称为`levi/`,思考下,步骤有多麻烦;而如果是多站点博客,那就更恐怖了,每一个站点都要改一次,噩梦~ 下面我针对这几个问题,做了一次较大的优化,我要让`wordpress`做成“平”的,就算将wordpress放入二级目录,我也让他使用一级目录进行访问。我的做法如下: - 无需后台设置博客URL,你是abc.com你的home、siteurl就都是abc.com
- 将`index.php`和`wp-content/`放置在根目录下,其余所有文件放置在子目录下
- 修改`index.php`,如下:
1 | require ( dirname( __FILE__ ) . '/wp/wp-blog-header.php' );
|
- 修改`wp/wp-config.php`,找到
1 | define( 'ABSPATH' , dirname( __FILE__ ) . '/' );
|
在其下方设置WP_CONTENT_DIR,如下: 1 | define( 'WP_CONTENT_DIR' , dirname(ABSPATH). '/wp-content' );
|
- 配置nginx,如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | rewrite ^/([_0-9a-zA-Z-]+/)?wp-admin$ /$1wp-admin/ permanent;
if (-f $request_filename) {
set $rule_2 1;
}
if (-d $request_filename) {
set $rule_2 1;
}
if ($rule_2 = "1" ) {
#ignored: “-” thing used or unknown variable in regex/rew
}
if ($rule_2 != "1" ) {
rewrite ^ /wp- (.*) /wp/wp- $1 last;
rewrite ^/([_0-9a-zA-Z-]+/)?(wp-(content|admin|includes).*) /$2 last;
rewrite ^/([_0-9a-zA-Z-]+/)?(.*.php)$ /$2 last;
rewrite /. /index .php last;
}
|
关键是这一句,意思是将所有主域下以wp-开头的请求作为二级目录进行解析 1 | rewrite ^ /wp- (.*) /wp/wp- $1 last;
|
至此,如果是全新安装的用户,就已经完成wordpress安装了,而本身已安装wordpress而调整到二级目录的用户,还需要配置composer信息,配置composer信息请参照“全新用户安装”的方法 添加依赖的安装包wordpress安装好了,接下来就是通过composer进行包管理了。网上有很多方法,这里我推荐一个比较简单的方法。打开刚才的配置文件composer.json,其中有这么一段: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | "repositories" : [{
"type" : "composer" ,
"url" : "http://"
}, {
"type" : "package" ,
"package" : {
"name" : "wordpress" ,
"type" : "webroot" ,
"version" : "4.1.1" ,
"dist" : {
"type" : "zip" ,
"url" : "https:///latest.zip"
}
}
}],
"require" : {
"php" : ">=5.3.0" ,
"wordpress" : "4.1.1" ,
"fancyguy/webroot-installer" : "1.0.0" ,
"levi/lv" : "dev-master" ,
"wpackagist-plugin/cnblogs2wp" : "0.6.4" ,
"wpackagist-plugin/wp-patch-levi" : "0.2.9" ,
"wpackagist-theme/twentyfifteen" : "1.0"
},
|
意思是通过http://对包进行管理,并且通过在`require`可以添加package资源、wordpress主题和插件,让其通过composer进行管理(安装、升级)。 您也可以自行添加所需的资源、类库。添加完成后,在根目录输入以下命令进行更新 插个题外话,composer国内使用太慢,composer国内镜像及其不稳定,经常502,不推荐使用,建议大家使用日本镜像,http:/// 使用方法如下: 通过下面命令,查看composer的`home`所谓路径 通过homebrew安装的用户,`home`的位置一般在`~/.composer/`,修改目录下的`config.json`,将下面这段添加进去,保存并退出 1 2 3 4 5 6 7 8 9 | {
"repositories" : [
{ "packagist" : false },
{
"type" : "composer" ,
"url" : "http:///proxy/packagist"
}
]
}
|
在wordpress中使用composer的资源composer的特定之一就是拥有很庞大的PHP资源,通过composer管理wordpress后,如何在wordpress中调用composer下的资源呢? 打开wp/wp-config.php,在下面这段之前 1 | require_once (ABSPATH . 'wp-settings.php' );
|
增加composer提供的自动加载类,如下: 1 | include dirname(ABSPATH). '/vendor/autoload.php' ;
|
这样你仅需在适当的当方通过命名空间,直接使用第三方资源。 优化了wordpress目录结构后,除了wordpress核心文件以外都可以任意修改,他们包含: - index.php
- wp-content/*
- wp/wp-config.php
若擅自修改wordpress核心文件,那你可得小心咯,下次升级时,代码会自动被覆盖哦
使用git来托管项目有经验的朋友也许会说,直接`push`呗。没错,不过可以排除刚才使用composer托管的所有资源,修改`.gitignore`,添加信息如下: 1 2 3 4 5 6 | ###############
# wordpress #
###############
vendor/
wp/
wp-content/
|
完成后进行提交,这个时候git上就只有4个文件了 README.md
index.php
LICENSE
composer.json 之后,我需要在其他环境下部署wordpress,仅仅只要像下面这样就可以构建一套完整的wordpress 1 2 | git pull origin master
composer update
|
结语混沌代码布局,现在总算抽离开了。通过composer来管理wordpress有几个好处 - 干净整洁,简简单单几个文件即可配置出一整套系统来
- 安全,可以将wordpress核心文件的真实路径隐藏起来(包括后台、后台登录)
- 结合composer,可以拥有很多现成的PHP资源包
最后,有什么问题,大家可以给我留言哦,别忘了关注我的博客哦: http://list.qq.com/cgi-bin/qf_invite?id=b6eb34388fd016582957d6e50d005146e24fe6b166ee66c0
|