eriktorsner / wp-bootstrap
WordPress 安装辅助工具
Requires
- php: >=5.3.9
- pimple/pimple: ~3.0
- symfony/yaml: ^2.8
- vlucas/phpdotenv: ^2.2
Requires (Dev)
- 10up/wp_mock: dev-master
This package is not auto-updated.
Last update: 2024-09-26 00:21:23 UTC
README
Wp-cli 子命令,用于管理 WordPress 安装。自动化安装、配置以及内容导入/导出。
WP Bootstrap 的核心思想是提供一个工具,使其更容易创建一个不错的 WordPress 部署工作流程。WP Bootstrap 允许您使用配置文件和几个命令行命令来安装 WordPress,使用正确的插件和主题进行设置,导入选项以及页面、帖子、菜单等。此外,它还在导入过程中维护 ID 的完整性,以确保导入的网站看起来与导出时相同,即使所有底层帖子 ID 都已更改。
使用预子命令的教程(0.4.0 之前):wpessentials.io 上的教程
安装
要将此包作为本地、项目级依赖项添加到您的项目中,只需将 eriktorsner/wp-bootstrap
依赖项添加到您的项目 composer.json
文件中。以下是一个仅定义 wp-bootstrap 依赖项的 composer.json
文件的示例:
{
"require": {
"eriktorsner/wp-bootstrap": "~0.5.0"
}
}
或从命令行
$ composer require eriktorsner/Wp-bootstrap
安装 WP Bootstrap 后,wp-cli 需要知道它的存在。找到(或创建)您的 wp-cli.yml 配置文件,并添加以下内容:
require:
- vendor/autoload.php
配置文件
WP Bootstrap 使用配置文件来控制 WordPress 以及插件和主题的安装。
快速介绍。使用 WP Bootstrap 安装和设置 WordPress
步骤 1:创建 .env 文件
首先,在项目根目录中创建一个 .env 文件,其中包含与您的本地数据库和 apache/nginx 配置匹配的设置。请注意,由于 WP Bootstrap 在项目根目录中维护设置文件,因此建议在不同的位置(如子目录)安装 WordPress。
# file: .env
wppath=/path/to/target/wordpress
wpurl=www.example.com
dbhost=localhost
dbname=wordpress
dbuser=wordpress
dbpass=secret
wpuser=admin
wppass=anothersecret
可选地,为特定环境(例如“开发”)创建一个“overlay” .env 文件。
# file: .env-development
wppath=/path/to/target/wordpress-dev
wpurl=dev.example.com
dbname=wordpress-dev
使用路径和环境信息更新 wp-cli.yml 文件
$ wp setenv standard
或(如果创建了 .env-development)
$ wp setenv development
步骤 2:创建 appsettings.yml 文件(可选)
创建 appsettings.yml 文件,该文件定义此 WordPress 安装。
# file: appsettings.yml
# set a title for the WordPress site (defaults to '[title]')
title: Testing Bootstrap
# keep default content such as themes, posts, pages etc.
keepDefaultContent: true
# add a few plugins from the repo
plugins:
standard:
- wp-cfm
- disable-comments:1.3
content:
posts:
page: '*'
步骤 3:安装 WordPress
安装 WordPress
$ wp bootstrap Install
...以及安装插件等。
$ wp bootstrap setup
一旦 WordPress 启动并运行,您将通常会反复运行设置命令,因为您将向 appsettings.yml 添加配置。
步骤 4:导出和导入内容
要导出定义的内容
$ wp bootstrap export
...并将它重新导入回来
$ wp bootstrap import
进行快速测试。使用步骤 2 中定义的 appsettings.yml 并执行导出命令。定义的内容(所有页面)将被序列化并存储在项目根目录下的 bootstrap 子目录中。编辑(甚至删除)WordPress 中的默认示例页面,并运行导入命令。页面应完全恢复。
导入和导出内容
WP Bootstrap导出命令将把在appsettings.yml中定义的所有内容序列化到磁盘上。目标文件夹位于项目根目录下的'bootstrap'。这个文件夹应该被Git管理,以便能够轻松地转移到另一个环境。正如您可能注意到的,WordPress安装中的并非所有内容都被导出,实际上恰好相反,尽可能少但足够维持一个运行中的网站。想法是,您只导出您认为属于您应用程序的内容,例如静态首页、菜单结构、各种关于页面和条款条件等内容。当网站部署到生产环境时,将导入相同的内容。
这种方法的优点在您第一次部署网站时可能并不明显。但是,当网站已经运行几周,并且需要重构菜单结构并对“关于我们”页面进行一些更改时,优点将变得更加明显。此时,生产网站可能有大量的新博客文章、更多的评论,甚至可能还有电子商务订单。您不希望从您的开发环境进行完整的数据库迁移,因为这会破坏所有这些其他内容。但通过使用WP Bootstrap,您可以导入并覆盖在appsettings.yml文件中定义的恰好那些内容。目标网站上没有其他内容被触及。
除了导出和导入内容之外,WP Bootstrap还做以下三件事:
- 它跟踪内容的内部完整性。在您的开发环境中ID为10的页面最终可能会在生产环境中变成ID为223。如果您在导出的内容中有一个指向ID为10的页面的菜单,当它导入到生产环境时,该菜单将被修改为指向ID 223。
- 它跟踪父子关系。如果导出的ID为10的页面是ID为45的页面的子页面,则页面45也将包含在导出的内容中,否则父子关系将会断裂。
- 它关注媒体。如果导出的页面使用了特色图像和两个其他图像用于帖子内容,WP Bootstrap会识别这些图像并将它们包含在导出的数据中。
管理WordPress选项
WP Bootstrap与插件WP-CFM紧密集成。使用它不是强制性的,您需要在appsettings.yml中的插件中手动指定WP-CFM。在导出内容时,WP Bootstrap将使用WP-CFM导出名为'wpbootstrap'的WP-CFM包中定义的选项。生成的json文件将复制到bootstrap/config子文件夹,并且应该被git管理。
在导入时,该文件将复制回wp-content期望的位置并推回WordPress数据库。
实际管理要包含哪些选项是在WordPress管理区域的WP-CFM UI中管理的。在此处了解有关WP-CFM的更多信息。
为了帮助您确定要包含哪些选项以及哪些选项已更改,请参阅下面关于optionsnap命令的部分。
可用命令
WP Bootstrap向wp-cli添加以下命令
子命令bootstrap
以下命令是通过以下方式执行的:
$ wp bootstrap <command>
子命令setenv
setenv是一个独立的命令,它使用从.env文件中获取的设置更新wp-cli.yml文件
注意:setenv使用wp --info的输出来确定项目特定wp-cli.yml文件的名字和位置
子命令optionsnap
optionsnap是一个实用程序,它帮助您跟踪WordPress安装中使用的WordPress选项。它本质上是将wp_options表的内容导出到位于子文件夹bootstrap/snapshots的文件中。它主要旨在帮助开发人员了解在两个时间点之间哪些选项值被修改。
以下命令是通过以下方式执行的:
$ wp optionsnap <command> <args>
设置
dotenv文件
特定于WordPress安装环境的设置保存在dotenv文件中。这些设置仅在首次安装WordPress时使用。为了便于在同一物理或虚拟机器上维护多个WordPress安装,一个dotenv文件可以覆盖基本文件。
在执行安装命令时,WP Bootstrap首先查找wp-cli.yml文件来读取当前环境名称。在下一步中,它读取基本dotenv文件(.env)中的变量。在最后一步中,它查找名为.env-的文件,如果该文件存在,它也会被读取并解析。对于在基本和特定于环境的文件中都找到的值,特定于环境的值优先。
应用程序设置
应用程序设置文件appsettings.yml定义了WP Bootstrap在安装插件和主题以及导入导出数据到和从WordPress时的行为。
设置文件包含几个部分
基本参数
- title 指定新WordPress安装的标题/博客名称。在引导安装期间使用
- version(可选)。指定要安装的WordPress核心版本。如果未指定(推荐)则安装最新版本
- keepDefaultContent(可选)。如果未设置或设置为false,则在初始安装后删除所有默认内容和所有主题和插件。要保留默认内容,将此参数设置为true。
插件
部分:插件
本部分由最多三个子部分组成,分别命名为"standard"、"local"和"localcopy"。在每一部分中,都定义了一个插件列表。在"standard"部分中定义了在WordPress插件仓库或通过URL可用的插件。在"local"部分中定义了位于与项目相同的Git仓库中的本地插件,并使用符号链接链接到目标WordPress安装。某些插件作为符号链接表现不佳,需要复制到正确的位置,这些插件在"localcopy"部分中定义。"local"和"localcopy"部分主要用于无法通过标准WordPress仓库安装的付费插件。
三个插件部分的每个部分都定义了一个列表。在其最简单的形式中,列表只是一个字符串,用于标识插件的长短句以及可选版本,如下所示
plugins:
standard:
- akismet
- woocommerce
- google-sitemap-generator:4.0.6
local:
- mycustomplugin
在某些(很少见)情况下,除非已经安装了另一个插件或主题,否则无法安装某个插件。为了处理这种情况,插件列表还可以包含一个包含一些可选额外参数的对象。为了确保在安装另一个插件之前不安装特定插件
plugins:
standard:
- akismet
- woocommerce:
requires:
plugins: ['google-sitemap-generator']
themes: ['mycustomtheme']
- google-sitemap-generator
local:
- mycustomplugin
在此示例中,WooCommerce插件将安装在其他插件Google Sitemap Generator和主题Mycustomthme安装之后。
对于标准插件,slug指的是WordPress仓库中唯一标识符(URL的最后部分)。如果slug是完整URL,则将从该URL安装插件。但是对于本地和localcopy插件,slug指的是插件在本地文件系统中的文件夹名称。上述定义假设项目文件树看起来像这样
.
└── wp-content
├── plugins
│ └── mycustomplugin
│ ├── file1.php
│ └── file2.php
└── themes
└── mycustomtheme
├── functions.php
└── style.css
当将插件定义为对象而不是简单字符串时,对象可以有以下属性
- slug 插件名称/slug(将覆盖列表中使用的键名)
- version 在从官方WordPress仓库安装插件时指定版本
- requires 两个slug列表,标识需要首先安装的其他主题和插件
- plugins 一个字符串数组,定义所需插件
- themes 一个字符串数组,定义所需主题
部分:主题
类似于插件部分,但针对主题。唯一的真正区别是主题部分还有一个参数 'active',用于标识应激活的主题。
- 标准 从官方WordPress仓库获取主题。如果需要特定版本,请使用冒号和版本标识符指定版本,例如 footheme:1.1
- 本地 您本地项目文件夹中的主题列表。预期主题位于项目根目录 wp-content/themes/ 文件夹中。本地主题将作为符号链接放入由 localsettings.json 中的 wppath 指定的 WordPress 安装的 wp-content 文件夹中。
- 本地副本 您本地项目文件夹中的主题列表。预期主题位于项目根目录 wp-content/themes/ 文件夹中。本地主题将被复制到由 localsettings.json 中的 wppath 指定的 WordPress 安装的 wp-content 文件夹中。一些编写不佳的主题和插件需要位于正确的WordPress文件夹中,但请将其视为最后的选择。
- 激活 一个字符串,指定要激活的主题。
部分:设置
一个选项(设置)列表,将使用 wp-cli 命令 "option update %s" 应用到WordPress安装。目前仅支持简单的标量值(字符串和整数)。示例
settings:
admin_email: foobar@example.com
blogname: My first blog
blogdescription: Just anohter blog tagline
大多数情况下,建议使用 WP-CFM 插件来管理选项。WP Bootstrap 内置了对使用 WP-CFM 导入和导出选项的支持。直接在 appsettings.yml 中管理选项可能会很快变得令人不知所措。
部分:内容
本部分定义了在导出和导入数据时如何使用 wp-export 或 wp-import 命令处理内容。
帖子 在导出过程中使用。包含零个或多个键及其关联的数组。键指定 post_type(页面、帖子等),数组包含要包含的每个帖子的 post_name。导出过程还包括任何附加到特定帖子或在帖子内容或帖子元数据中引用的媒体(图像)。
菜单 在导出过程中使用。包含零个或多个键及其关联的数组。键代表菜单名称(如WordPress管理中定义),数组应包含菜单出现的每个 位置。请注意,位置标识符对每个主题都是唯一的。
分类法 在导出过程中使用。包含零个或多个键,其值为字符串或数组。如果想要包含分类法中的所有术语,请使用星号 (*)。如果只想包含特定分类法中的特定术语,请使用术语的 slug 数组。
部分:参考
在导入过程中使用。这是一个结构,描述了包含对页面或分类法术语引用的选项值(wp_option 表中的),该结构可以包含一个 "posts" 和一个 "terms" 对象,描述指向帖子或分类法术语的设置。这些对象中的每一个都包含一个 "options" 成员,该成员指向 wp_options 表(将添加对其他引用的支持)。 "options" 成员包含 wp_option 表中选项名称的数组。有三种引用选项的方式
- 1. 一个简单的字符串,例如 "page_on_front"。这意味着在 wp_options 表中有一个名为 "page_on_front" 的选项,并且该选项是一个引用帖子 ID 的引用。
- 2. 一个包含单个名称-值对的对象,例如 {"mysetting": "[2]"} 或 {"mysetting2":"->page_id"},意味着
- 在 wp_options 表中有一个名为 "mysetting" 的选项
- 该设置是一个数组或对象,其值告诉 wp-bootstrap 如何访问感兴趣的数组元素或成员变量。该值遵循 PHP 语法,因此数组元素通过 "[]" 符号访问,对象成员变量通过 "->" 语法访问。
- 3. 与上面类似,但值是一个字符串数组。
引用解析只会查看您导入集中包含的页面/帖子/术语。导入集中可能包含在 config/wpbootstrap.json 文件中的 "mypage" 选项,该选项指向 post ID=10。在导入集中,还有一个 id=10 的页面。当该页面被导入到目标 WordPress 安装中时,它可能得到另一个 ID,例如 22。通过告诉 wp-bootstrap wp_options 表中的 "mypage" 设置指向一个页面,wp-bootstrap 将在处理过程中将该选项更新为新值 22。
章节:扩展
如果 Wp-Bootstrap 的基本功能无法处理某些情况中的内容,通常可以通过扩展来处理。扩展是一个实现 WordPress 过滤器和动作以响应某些事件的 PHP 类。例如,如果插件使用自定义表,扩展可以连接到 'wp-bootstrap_after_export' 动作,在导出站点时将表序列化到文件。在导入期间,扩展将连接到 'wp-bootstrap_after_import' 动作,将序列化文件重新读入数据库。
扩展可以专门为某个插件或特定网站项目创建。
要使用扩展,WP Bootstrap 必须能够自动加载类。实现这一点的最简单方法是向您的项目 composer.json 文件中添加 PSR4 命名空间。
{
"require": {
"eriktorsner/wp-bootstrap": "~0.4.0"
},
"autoload": {
"psr-4": {
"MyNamespace\\": "src"
}
}
然后将您的扩展放在 "src" 子文件夹中(相对于项目根目录)。任何扩展类将在过程开始时实例化,并调用 "init" 方法。在此方法中,扩展可以添加将在安装/导入过程的各个阶段执行的过滤器和动作。
<?php
namespace MyNamespace;
use Wpbootstrap\Container;
class MyClass
{
public function init()
{
add_action('wp-bootstrap_after_import', [$this, 'AfterImport']);
}
public function AfterImport()
{
// do something useful...note that WordPress is loaded in most
// filters and actions. Go experiment
$options = get_option('FOOBAR', false);
...
}
}
完整的 appsettings.yml 示例
keepDefaultContent: false
version: 4.4.1
title: 'Your WordPress site title'
# section plugins
plugins:
# using yaml list with each value on a separate row
standard:
- google-analyticator
- if-menu:0.2.1
- someplugin:
version: 3.4
slug: jetpack
requires:
themes: [mychildtheme]
plugins: [if-menu]
- woocommerce
# Defining local plugins using a yaml inline list
local: [myplugin]
# section themes
themes:
standard: [twentyfourteen]
local: [mychildtheme]
active: mychildtheme
# section settings
# simple name - value pairs
settings:
blogname: 'New title 2'
blogdescription: 'The next tagline'
# section content
# conists of sub sections: posts, menus and taxonomies
content:
posts:
# A separate section for each post type
# The list contains of post slugs (post_name) to
# uniquely identify the post. Any type of Yaml list works
page: [about, members]
post:
- hello-world
- another
# Instead of specifying a list you can use the
# asterisk to include all posts of post type 'custom'
custom: '*'
# Menus are identified by the menu name and includes
# a list of locations where this menu should be imported
# back
menus:
main:
- primary
- footer
# Taxonomies are similar to posts.
# identify the taxonomies to inlcude as well
# as the individual terms. Optionally, include
# all terms in a taxonomy using the asterisk
taxonomies:
category: '*'
customcat:
- This_term
- That_term
# The reference section is used during import. It identifies
# options (in wp_options) that refer to a post or a term.
# and helps WP Bootstrap maintain data integrity during import
references:
# references to post_id's
posts:
# references in the options table
options:
- some_setting
- { mysettings: '->term_id' }
- { mysettings2: '[2]' }
- { mysettings3: ['->term_id', '->other_term_id']}
# references to term id's
terms:
# references in the options table
options:
- some_term
- { other_term: '->term_id'}
extensions:
- MyNamespace\MyClass
父子引用和自动包含
wp-bootstrap 尽力保留导出 WordPress 对象之间的引用。如果您导出的是一个页面的子页面,父页面将包含在导出数据中,无论该页面是否包含在设置中。同样,如果您导出的是一个指向页面或分类术语的菜单,而该页面或术语未指定,该页面和分类术语也将包含在导出数据中。
导入匹配
在导入到 WordPress 安装中时,wp-bootstrap 将使用 slug 匹配页面、菜单和分类术语。因此,如果要导入的数据集包含一个具有 slug 'foobar' 的页面,则该页面将(a)创建(如果之前不存在)或(b)更新(如果已经存在)。相同的逻辑也适用于帖子(页面、附件、帖子等)、菜单项和分类术语。
注意:分类术语在代码中定义,而不是在数据库中定义。因此,WordPress 安装中存在的确切分类术语是在加载时定义的。内置分类术语始终存在,但某些分类术语是在主题或插件中定义的。为了在 wp-import 处理过程中导入分类术语,定义该分类术语的主题或插件必须存在。
测试
由于 wp-bootstrap 很大程度上依赖于 WordPress,因此有一个使用 Vagrant 进行测试的单独的 Github 存储库。测试存储库可在 https://github.com/eriktorsner/wp-bootstrap-test 找到。
贡献
欢迎贡献。除了代码外,项目还需要更好的文档、更多测试用例、测试流行的主题和插件等等。任何类型的帮助都受欢迎。