分享

使用composer来管理wordpress | 乱炖

 看见就非常 2015-05-06

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.保存文件后,执行安装

1
composer install

待出现类似下面的提示信息后,就表示资源包已下载到本地了

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官方也有一个,可直接从后台常规设置中找到入口连接。大致上都是千篇一律,如下:

  1. 进入wordpress后台常规设置,将home URL设置为二级域名,将site URL设置为主域名
  2. 将`index.php`和`wp-content/`放置在根目录下,其余所有文件放置在子目录下
  3. 修改wp-config.php,配置WP_CONTENT_DIR等相关常量

这样做看上去似乎没错,但是却存在几个问题

首先关于这两个函数`get_option(‘home’)`和`get_option(`siteurl`)`大家能分得清吗?什么地方用`home`,设么地方用`siteurl`?ok,假定你能分得清楚,那能保证其他人能分清楚吗?比如说你使用的主题的作者,或者插件作者?如果分不清,这将直接造成你的博客在后续使用过程中造成URL错乱。

其次,设置了`home`还有`siteurl`,那么就会记录在库中,这次我们要将`wp/`作为二级目录,如果下次我们想修改下二级目录名称为`levi/`,思考下,步骤有多麻烦;而如果是多站点博客,那就更恐怖了,每一个站点都要改一次,噩梦~

下面我针对这几个问题,做了一次较大的优化,我要让`wordpress`做成“平”的,就算将wordpress放入二级目录,我也让他使用一级目录进行访问。我的做法如下:

  1. 无需后台设置博客URL,你是abc.com你的home、siteurl就都是abc.com
  2. 将`index.php`和`wp-content/`放置在根目录下,其余所有文件放置在子目录下
  3. 修改`index.php`,如下:
    1
    require( dirname( __FILE__ ) . '/wp/wp-blog-header.php' );
  4. 修改`wp/wp-config.php`,找到
    1
    define('ABSPATH', dirname(__FILE__) . '/');

    在其下方设置WP_CONTENT_DIR,如下:

    1
    define('WP_CONTENT_DIR', dirname(ABSPATH).'/wp-content');
  5. 配置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进行管理(安装、升级)。

您也可以自行添加所需的资源、类库。添加完成后,在根目录输入以下命令进行更新

1
composer update

插个题外话,composer国内使用太慢,composer国内镜像及其不稳定,经常502,不推荐使用,建议大家使用日本镜像,http:///

使用方法如下:

通过下面命令,查看composer的`home`所谓路径

1
composer config -g -e

通过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有几个好处

  1. 干净整洁,简简单单几个文件即可配置出一整套系统来
  2. 安全,可以将wordpress核心文件的真实路径隐藏起来(包括后台、后台登录)
  3. 结合composer,可以拥有很多现成的PHP资源包

最后,有什么问题,大家可以给我留言哦,别忘了关注我的博客哦:

http://list.qq.com/cgi-bin/qf_invite?id=b6eb34388fd016582957d6e50d005146e24fe6b166ee66c0

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多