IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    使用composer来管理wordpress

    李惟发表于 2015-04-05 20:42:50
    love 0

    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`,我的配置信息如下

    {
        "name" :            "乱炖",
        "description" :     "乱炖 - 研究web",
        "version" :         "0.1.1",
        "license" :         "GPL",
        "homepage" :        "http://levi.yii.so",
        "authors" : [{
            "name" :        "Levi",
            "email" :       "cgfeel@gmail.com",
            "homepage" :    "http://levi.yii.so"
        }],
        "repositories" : [{
            "type": "composer",
            "url": "http://wpackagist.org"
        }, {
            "type" :        "package",
            "package": {
                "name":     "wordpress",
                "type":     "webroot",
                "version":  "4.1.1",
                "dist": {
                    "type": "zip",
                    "url":  "https://wordpress.org/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.保存文件后,执行安装

    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`,如下:
      require( dirname( __FILE__ ) . '/wp/wp-blog-header.php' );
    4. 修改`wp/wp-config.php`,找到
      define('ABSPATH', dirname(__FILE__) . '/');

      在其下方设置WP_CONTENT_DIR,如下:

      define('WP_CONTENT_DIR', dirname(ABSPATH).'/wp-content');
    5. 配置nginx,如下
          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-开头的请求作为二级目录进行解析

      rewrite ^/wp-(.*) /wp/wp-$1 last;

    至此,如果是全新安装的用户,就已经完成wordpress安装了,而本身已安装wordpress而调整到二级目录的用户,还需要配置composer信息,配置composer信息请参照“全新用户安装”的方法

    添加依赖的安装包

    wordpress安装好了,接下来就是通过composer进行包管理了。网上有很多方法,这里我推荐一个比较简单的方法。打开刚才的配置文件composer.json,其中有这么一段:

        "repositories" : [{
            "type": "composer",
            "url": "http://wpackagist.org"
        }, {
            "type" :        "package",
            "package": {
                "name":     "wordpress",
                "type":     "webroot",
                "version":  "4.1.1",
                "dist": {
                    "type": "zip",
                    "url":  "https://wordpress.org/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://wpackagist.org对包进行管理,并且通过在`require`可以添加package资源、wordpress主题和插件,让其通过composer进行管理(安装、升级)。

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

    composer update

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

    使用方法如下:

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

    composer config -g -e

    通过homebrew安装的用户,`home`的位置一般在`~/.composer/`,修改目录下的`config.json`,将下面这段添加进去,保存并退出

    {
        "repositories": [
            { "packagist": false },
            {
                "type": "composer",
                "url": "http://composer-proxy.jp/proxy/packagist"
            }
        ]
    }

    在wordpress中使用composer的资源

    composer的特定之一就是拥有很庞大的PHP资源,通过composer管理wordpress后,如何在wordpress中调用composer下的资源呢?

    打开wp/wp-config.php,在下面这段之前

    require_once(ABSPATH . 'wp-settings.php');

    增加composer提供的自动加载类,如下:

    include dirname(ABSPATH).'/vendor/autoload.php';

    这样你仅需在适当的当方通过命名空间,直接使用第三方资源。

    优化了wordpress目录结构后,除了wordpress核心文件以外都可以任意修改,他们包含:

    • index.php
    • wp-content/*
    • wp/wp-config.php

    若擅自修改wordpress核心文件,那你可得小心咯,下次升级时,代码会自动被覆盖哦

    使用git来托管项目

    有经验的朋友也许会说,直接`push`呗。没错,不过可以排除刚才使用composer托管的所有资源,修改`.gitignore`,添加信息如下:

    ###############
    #  wordpress  #
    ###############
    vendor/
    wp/
    wp-content/

    完成后进行提交,这个时候git上就只有4个文件了

    README.md
    index.php
    LICENSE
    composer.json

    之后,我需要在其他环境下部署wordpress,仅仅只要像下面这样就可以构建一套完整的wordpress

    git pull origin master
    composer update

    结语

    混沌代码布局,现在总算抽离开了。通过composer来管理wordpress有几个好处

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

    使用CloudFlare提升网站的访问体验和安全性

    linux使用crontab实现PHP执行定时任务

    WEB前端底层知识--浏览器是如何工作的

    初识 jQuery Deferred

    Node.js开发指南——第3章安装Node.js快速入门(一)
    无觅


沪ICP备19023445号-2号
友情链接