# WordPress 高级管理手册

WordPress 高级管理手册，面向主机与站点运维场景。

# 高级管理手册

欢迎查阅 **WordPress 高级管理手册**！这里汇集了 WordPress 的高级技术文档。请使用左侧的“目录”菜单浏览相关主题。

## 为何需要高级管理？

并非所有使用 WordPress 的用户都需要了解技术知识，因此其文档中也不应出现过于技术化的内容，而开发者也无需掌握某些高级系统配置。

基于这一理念，所有技术复杂度较高的文档都被收录于此，以便不同技术背景的人员都能使用。

## 如何参与贡献？

文档团队在 WordPress Slack 的 [#docs](https://wordpress.slack.com/archives/docs/) 频道进行交流。讨论语言为英语。请查看 [WordPress 会议日历](https://make.wordpress.org/meetings#docs)了解当前日程安排。

## 高级管理手册负责人

本文档由 [@javiercasares](https://profiles.wordpress.org/javiercasares/)、[@lucp](https://profiles.wordpress.org/lucp/) 和 [@milana_cap](https://profiles.wordpress.org/milana_cap/) 共同管理。同时，[文档团队](https://make.wordpress.org/docs/) 和 [托管团队](https://make.wordpress.org/hosting/) 也参与其中。

[info]如果您有兴趣改进本手册，请查看 [Github 手册仓库](https://github.com/WordPress/WordPress-Advanced-administration-handbook)、[文档问题追踪](https://github.com/WordPress/Documentation-Issue-Tracker/labels/advanced%20administration)，或在 [WordPress Slack](https://make.wordpress.org/chat/) 的 [#hosting-community 频道](https://wordpress.slack.com/archives/hosting-community/) 留言。[/info]

# 为 WordPress 创建数据库

如果您要在自己的 Web 服务器上安装 WordPress，请按照以下说明之一创建 WordPress 数据库和用户账户。

## 使用 phpMyAdmin

如果您的 Web 服务器安装了 [phpMyAdmin](https://wordpress.org/documentation/article/wordpress-glossary/#phpMyAdmin)，您可以按照这些说明创建 WordPress 用户名和数据库。如果您在自己的计算机上操作，在大多数 Linux 发行版上可以自动安装 PhpMyAdmin。

_**注意：** 这些说明是针对 phpMyAdmin 4.4 编写的；不同版本的 phpMyAdmin 用户界面可能略有不同。_

如果左侧的**数据库**下拉列表中尚不存在与 WordPress 相关的数据库，请创建一个：

为您的 WordPress 数据库选择一个名称：'wordpress' 或 'blog' 是不错的选择，但大多数托管服务（尤其是共享托管）会要求名称以您的用户名和下划线开头。因此，即使您在自己的计算机上操作，我们也建议您检查托管服务的要求，以便在自己的服务器上遵循这些要求，并能够无需修改地迁移数据库。在**创建数据库**字段中输入选定的数据库名称，并为您的语言和编码选择最佳的排序规则。在大多数情况下，最好在 "utf8_" 系列中选择，如果找不到您的语言，请选择 "utf8mb4_general_ci"（参考：[\[1\]](https://make.wordpress.org/core/2015/04/02/the-utf8mb4-upgrade/)）。

[![phpMyAdmin 语言编码下拉菜单，选中了 utf8mb4_general_ci](https://i1.wp.com/wordpress.org/support/files/2018/11/phpMyAdmin_create_database_4.4.jpg?fit=688%2C411&ssl=1)](https://i1.wp.com/wordpress.org/support/files/2018/11/phpMyAdmin_create_database_4.4.jpg?fit=688%2C411&ssl=1)

phpMyAdmin 语言编码下拉菜单

点击左上角的 **phpMyAdmin** 图标返回主页，然后点击 **用户** 选项卡。如果用户列表中尚不存在与 WordPress 相关的用户，请创建一个：

[![phpMyAdmin 用户选项卡被选中](https://wordpress.org/documentation/files/2018/11/users-768x500.jpg)](https://wordpress.org/documentation/files/2018/11/users-768x500.jpg)

phpMyAdmin 用户选项卡

1. 点击 **添加用户**。
2. 为 WordPress 选择一个用户名（推荐使用 'wordpress'）并填入 **用户名** 字段。（确保从下拉菜单中选择了 **使用文本字段：**）
3. 选择一个安全的密码（最好包含大小写字母、数字和符号的组合），并填入 **密码** 字段。（确保从下拉菜单中选择了 **使用文本字段：**）在 **重新输入** 字段中再次输入密码。
4. 记下您选择的用户名和密码。
5. 保持 **全局权限** 下的所有选项为默认设置。
6. 点击 **执行**。
7. 返回 **用户** 屏幕，点击您为 WordPress 刚创建的用户旁边的 **编辑权限** 图标。
8. 在 **数据库特定权限** 部分，从 **为以下数据库添加权限** 下拉菜单中选择您为 WordPress 刚创建的数据库，然后点击 **执行**。
9. 页面将刷新并显示该数据库的权限。点击 **全选** 以选择所有权限，然后点击 **执行**。
10. 在结果页面上，记下页面顶部 **服务器：** 后列出的主机名。（通常为 **localhost**。）

[![数据库服务器选择显示 'localhost'](https://i1.wp.com/wordpress.org/support/files/2018/11/phpMyAdmin_server_info_4.4.jpg?fit=682%2C107&ssl=1)](https://i1.wp.com/wordpress.org/support/files/2018/11/phpMyAdmin_server_info_4.4.jpg?fit=682%2C107&ssl=1)

## 使用 MySQL 客户端

您可以通过在 shell 中运行 mysql 来快速轻松地创建 MySQL 用户和数据库。语法如下所示，美元符号是命令提示符：

```
$ mysql -u adminusername -p  
输入密码：  
欢迎使用 MySQL 监视器。命令以 ; 或 \\g 结尾。  
您的 MySQL 连接 id 是 5340，服务器版本：3.23.54  
  
输入 'help;' 或 '\\h' 获取帮助。输入 '\\c' 清除缓冲区。  
  
mysql> CREATE DATABASE databasename;  
查询成功，1 行受影响 (0.00 秒)

mysql> CREATE USER "wordpressusername"@"hostname" IDENTIFIED BY "password";
mysql> GRANT ALL PRIVILEGES ON databasename.* TO "wordpressusername"@"hostname";
查询成功，0 行受影响 (0.00 秒)

mysql> FLUSH PRIVILEGES;  
查询成功，0 行受影响 (0.01 秒)   
  
mysql> EXIT  
再见  
```

示例显示：

*   root 也是 _adminusername_。更安全的做法是选择一个所谓的“普通”账户作为您的 mysql 管理员，这样您就不会以系统 root 用户的身份输入“mysql”命令。（任何时候避免以 root 身份操作都能降低被利用的风险。）您使用的名称取决于您使用 mysqladmin 分配的数据库管理员名称。
*   wordpress 或 blog 是 _databasename_ 的良好选择。
*   wordpress 是 _wordpressusername_ 的良好选择，但您应该意识到，既然这里使用了它，全世界也会知道它。
*   _hostname_ 通常是 localhost。如果您不知道这个值应该是什么，如果您不是 WordPress 主机的管理员，请咨询您的系统管理员。如果您是系统管理员，请考虑使用非 root 账户来管理您的数据库。
*   _password_ 应该是一个难以猜测的密码，最好包含大小写字母、数字和符号的组合。避免使用字典中单词的一个好方法是使用您容易记住的短语中每个单词的首字母。

如果您需要将这些值记录在某个地方，请避免将它们写在包含受其保护内容的系统中。您需要记住用于 _databasename_、_wordpressusername_、_hostname_ 和 _password_ 的值。当然，既然它们已经（或即将）在您的 wp-config.php 文件中，就没有必要再把它们放在其他地方了。

## 使用 Plesk

如果您的托管服务提供商提供 [Plesk](https://www.plesk.com/) 托管控制面板，并且您想手动安装 WordPress，请按照以下说明创建数据库：

1.  登录 Plesk。
2.  在"网站与域名"页面上，找到您网站的"自定义网站"区域，点击 **数据库**：

[![Plesk 面板截图，高亮显示了自定义网站区域中的数据库按钮](https://wordpress.org/documentation/files/2018/11/plesk-db-768x558.png)](https://wordpress.org/documentation/files/2018/11/plesk-db-768x558.png)

Plesk 自定义网站数据库

3.  点击 **添加新数据库**，如果需要可以更改数据库名称，通过提供凭据创建数据库用户，然后点击 **确定**。完成！

## 使用 cPanel

如果您的托管服务提供商提供 [cPanel](https://wordpress.org/documentation/article/wordpress-glossary/#cPanel) 主机控制面板，您可以按照以下简单说明来创建您的 WordPress 用户名和数据库。关于使用 cPanel 创建数据库和用户的更完整说明集，可以在 [使用 cPanel](https://wordpress.org/documentation/article/using-cpanel/) 中找到。

1.  登录您的 [cPanel](https://wordpress.org/documentation/article/wordpress-glossary/#cPanel)。
2.  在“数据库”部分下，点击 **MySQL 数据库向导** 图标。
3.  在 **步骤 1. 创建数据库** 中输入数据库名称，然后点击下一步。
4.  在 **步骤 2. 创建数据库用户** 中输入数据库用户名和密码。请务必使用强密码。点击创建用户。
5.  在 **步骤 3. 将用户添加到数据库** 中，勾选“所有权限”复选框，然后点击下一步。
6.  在 **步骤 4. 完成任务** 中，记下数据库名称和用户。请写下 _主机名_、_用户名_、_数据库名_ 以及您选择的密码的值。（请注意，_主机名_ 通常为 **localhost**。）

## 使用 DirectAdmin

如果您是单站点虚拟主机账户的普通用户，可以正常登录。然后点击 **MySQL 管理**。（如果此选项不易见，可能需要您的主机商修改您的“套餐”以激活 MySQL。）接着按照下面的“c”部分操作。

经销商账户或管理员账户可能需要点击 **用户级别**。如果相关域名是经销商的主域名，他们必须首先以经销商身份登录……如果域名不是经销商的主域名，则以用户身份登录。如果是经销商的主域名，那么以经销商身份登录后，直接点击 **用户级别**。但如果相关域名不是经销商的主域名，则必须以用户身份登录。然后点击 **MySQL 管理**。（如果不易见，可能需要返回经销商或管理员级别，修改“管理用户套餐”或“管理经销商套餐”以启用 MySQL。）

在 MySQL 管理中，点击小字：**创建新数据库**。此处需要提交数据库及其用户名的两个后缀。为获得最高安全性，请使用两组不同的 4-6 位随机字符。密码字段有一个随机按钮，可生成 8 位密码。您也可以为获得最高安全性而添加更多字符。点击 **创建**。下一个屏幕将汇总数据库、用户名、密码和主机名。请务必将这些信息复制粘贴到文本文件中以备将来参考。

# 运行 WordPress 开发副本

拥有一个 WordPress 开发实例是在不中断线上版本的情况下更新、开发和修改网站的好方法。设置 WordPress 开发副本有多种方式，本文将介绍基础知识、最佳实践、技巧以及一些工具，让运行 WordPress 开发副本变得更加容易。

## Installing WordPress on your computer

Use these instructions to set up a local server environment for testing and development.

Installing WordPress locally is usually meant for development. Those interested in development can follow the instructions below to download and install WordPress locally.
- [wp-env](https://developer.wordpress.org/block-editor/reference-guides/packages/packages-env/) - a free, open-source development environment maintained by the WordPress core developer community.
- [VVV or Varying Vagrant Vagrants](https://varyingvagrantvagrants.org/) - free, open-source local development environment maintained by members of the WordPress community.
- [XAMPP](https://www.apachefriends.org/) - free and open-source local development environment maintained by Apache Friends
- [MAMP](https://www.mamp.info/en/mac/) - free local development environment that everything you need to install WordPress locally.
- [DDEV](https://ddev.readthedocs.io/en/stable/users/quickstart/#wordpress) - free, open-source, development environment. Seamlessly share local sites over public domains, includes a database editor, Xdebug, and other performance profiling tools.
- [Lando](https://lando.dev/) – free, open-source development environment that offers a [plugin to install WordPress locally](https://docs.lando.dev/plugins/wordpress/).
- [AMPPS](https://ampps.com/downloads/) – free WAMP/MAMP/LAMP stack with Softaculous Installer built in. It can 1-click install and upgrade WordPress and others as well.
- [Bitnami package for WordPress](https://bitnami.com/stack/wordpress) and [Bitnami package for WordPress Multisite](https://bitnami.com/stack/wordpress-multisite) - Bitnami packages for WordPress that provide a one-click install solution for WordPress or WordPress Multisite on your local computer or in the cloud.
- [Instant WordPress](https://instantwp.com/) - free, standalone, portable WordPress development environment for Windows that will run from a USB key.
- [WordPress Studio](https://developer.wordpress.com/studio/) - free, open-source app to install and manage multiple WordPress sites locally.

### 软件设备 - 开箱即用

您可能会发现，使用预集成的[软件设备](https://en.wikipedia.org/wiki/Software_appliance)是快速启动并运行 WordPress 的绝佳方式，尤其是在与虚拟机软件（如 VMWare、VirtualBox、Xen HVM、KVM）结合使用时。

Parallels 是另一款可用的软件。与虚拟机软件不同，它需要付费。它允许您在计算机上同时运行 Mac 和 Windows 系统。

软件设备让用户无需手动安装 WordPress 及其依赖项，而是可以在几分钟内部署一个自包含的系统，几乎无需设置。

- [TurnKey WordPress 设备](https://www.turnkeylinux.org/wordpress)：一个基于 Debian 的免费设备，即开即用。它捆绑了一系列流行的 WordPress 插件，具有占用空间小、自动安全更新、SSL 支持和 Web 管理界面等特点。提供 ISO、虚拟机镜像格式，或可在云端直接启动。

### 在 Ubuntu Server 16.04 LTS 上无人值守/自动化安装 WordPress

## 使用一个数据库的两个 WordPress 安装

**注意：** 如果您计划进行数据库开发，则**不推荐**使用此方法。

运行您实时站点的本地副本的一个流行方法是使用相同的本地和实时数据库。使用相同的数据库将允许您在本地副本上工作，并将更改从本地推送到生产环境，而不会中断正常运行时间。

**本地副本的设置**

一旦您设置好本地文件，您必须修改本地安装根目录中的 wp-config.php 文件。

```
define('WP_HOME',  "https://{$_SERVER['HTTP_HOST']}");
define('WP_SITEURL', "https://{$_SERVER['HTTP_HOST']}");

ob_start( 'ob_replace_home_url' );
function ob_replace_home_url( $content ) {
    $home_urls = array(
        'https://site.testing.example.com',
        'https://site.example.com',
        'https://site.authoring.testing.example.com',
        'https://site.authoring.example.com',
    );

    $content = str_replace( $home_urls, WP_HOME, $content );

    return $content;
}
```

### Using a Drop-In

What if we don’t want to hack core code? Avoiding changes to core code is a good practice for easy upgrading and code-sharing. There is even a filter for this (`pre_option_siteurl` and `pre_option_home`) but there’s a problem: within **wp-settings.php**,

- the filter can’t be defined until after line 65 when `functions.php` is included
- WordPress makes calls to `get_option` on line 155 of (via `wp_plugin_directory_constants()`)
- plugins aren’t defined until later down around line 194.

However, between lines 65 and 155, there is something we can use, namely the loading of the drop-in `db.php`; the filter can be safely defined there. (However, this is perhaps only halfway towards “not core” code.) Check if you already have an existing wp-content/db.php before trying this technique. Plugins like W3 Total Cache use it for similar reasons.

```
<?php
// paste this in a (new) file, wp-content/db.php
add_filter ( 'pre_option_home', 'test_localhosts' );
add_filter ( 'pre_option_siteurl', 'test_localhosts' );
function test_localhosts( ) {
  if (... same logic as before to see if on dev site ...) {
     return "https://my.example.com/dev";
  }
  else return false; // act as normal; will pull main site info from db
}
```

# 如何安装 WordPress

WordPress 以其安装简便而闻名。在大多数情况下，安装 WordPress 是一个非常简单的过程，只需不到五分钟即可完成。[许多网络主机](#)现在提供[工具（例如 Fantastico）来自动为您安装 WordPress](https://wordpress.org/documentation/article/automated-installation/)。不过，如果您希望自己安装 WordPress，以下指南将为您提供帮助。

## 安装 WordPress 前须知

在开始安装前，你需要准备并完成一些事项。请参阅文章[安装前准备](https://developer.wordpress.org/advanced-administration/before-install/)。同时，建议验证你的主机邮件发送功能是否正常。更多信息请参考[邮件](https://developer.wordpress.org/advanced-administration/server/mail/)。
如需安装多个 WordPress 实例，请参阅[安装多个 WordPress 实例](https://developer.wordpress.org/advanced-administration/before-install/multiple-instances/)。

## 基本安装指南

以下是针对已熟悉此类安装操作人员的快速指南。更[详细的说明](#detailed-instructions)将在后续提供。

1. 下载并解压 WordPress 安装包（如尚未操作）
2. 在服务器上为 WordPress 创建数据库，同时创建拥有该数据库完全访问权限的 [MySQL](https://wordpress.org/documentation/article/glossary/#mysql)（或 MariaDB）用户
3. （可选步骤）找到 `wp-config-sample.php` 文件并重命名为 `wp-config.php`，编辑该文件[（参见编辑 wp-config.php）](https://developer.wordpress.org/advanced-administration/wordpress/wp-config/)并添加数据库信息
**注意：** 若不熟悉文件重命名操作，可跳过第三步，安装程序将自动创建 `wp-config.php` 文件
4. 将 WordPress 文件上传至服务器目标位置：
    - 若需将 WordPress 集成至网站根目录（如 https://example.com/），请将解压后的 WordPress 目录内所有内容（不包括 WordPress 目录本身）移动或上传至服务器根目录
    - 若需将 WordPress 安装至网站子目录（如 https://example.com/blog/），请在服务器创建 blog 目录并通过 FTP 将解压后的 WordPress 内容上传至该目录
    - **注意：** 若 FTP 客户端有文件名转小写选项，请确保该功能已禁用
5. 通过浏览器访问安装脚本的 URL（即上传 WordPress 文件的地址）：
- 若安装在根目录，请访问：https://example.com/
- 若安装在子目录（如 blog），请访问：https://example.com/blog/
至此完成！WordPress 现已安装完毕。

## 详细说明 {#detailed-instructions}

### 步骤 1：下载并解压

从 [wordpress.org/download/](https://wordpress.org/download/) 下载并解压 WordPress 安装包。

- 如果您要将 WordPress 上传到远程 Web 服务器，请使用网页浏览器将 WordPress 安装包下载到您的计算机并解压。
- 如果您将使用 FTP，请跳到下一步 – 文件上传将在后面介绍。
- 如果您对您的 Web 服务器拥有 [shell](https://wordpress.org/documentation/article/glossary/#shell) 访问权限，并且习惯使用基于控制台的工具，您可能希望直接使用 wget（或 lynx 或其他基于控制台的网页浏览器）将 WordPress 下载到您的 [Web 服务器](https://wordpress.org/documentation/article/glossary/#web-server)上，以避免使用 [FTP](https://wordpress.org/documentation/article/glossary/#ftp)：
    - wget https://wordpress.org/latest.tar.gz
    - 然后使用以下命令解压包：
    - tar -xzvf latest.tar.gz

    WordPress 包将解压到您下载 latest.tar.gz 的同一目录中一个名为 wordpress 的文件夹里。

### 步骤 2：为 WordPress 创建数据库 {#detailed-step-2}

如果您使用的是[托管服务提供商](https://wordpress.org/documentation/article/glossary/#hosting-provider)，可能已为您设置好 WordPress 数据库，或者可能有自动设置解决方案。请查看托管服务提供商的支持页面或控制面板，以确定是否需要手动创建。

如果确定需要手动创建，请按照下方使用 phpMyAdmin 的说明来创建 WordPress 用户名和数据库。对于其他工具（如 Plesk、cPanel 和使用 MySQL 客户端），请参阅文章[为 WordPress 创建数据库](https://developer.wordpress.org/advanced-administration/before-install/creating-database/)。

如果只有一个数据库且已在使用，您可以在其中安装 WordPress——只需确保为表使用独特的前缀，以避免覆盖任何现有的数据库表。

#### 使用 phpMyAdmin

如果您的网络服务器已安装 [phpMyAdmin](https://wordpress.org/documentation/article/glossary/#phpmyadmin)，您可以按照以下说明创建 WordPress 用户名和数据库。如果您在自己的计算机上操作，在大多数 Linux 发行版上可以自动安装 PhpMyAdmin。

_**注意：** 这些说明针对 phpMyAdmin 4.4 版本编写；不同版本的 phpMyAdmin 用户界面可能略有差异。_

1. 如果左侧**数据库**下拉菜单中尚未存在与 WordPress 相关的数据库，请创建一个：
    1. 为您的 WordPress 数据库选择一个名称：'`wordpress`' 或 '`blog`' 都是不错的选择，但大多数托管服务（尤其是共享托管）会要求名称以您的用户名和下划线开头。因此，即使您在自己的计算机上操作，我们也建议您查看托管服务的要求，以便在自己的服务器上遵循这些要求，并能够无需修改地迁移数据库。在**创建数据库**字段中输入选定的数据库名称，并为您的语言和编码选择最佳排序规则。在大多数情况下，最好选择 "utf8_" 系列，如果找不到您的语言，请选择 "utf8mb4_general_ci" [(参考这篇关于升级到 utf8mb4 的文章)](https://make.wordpress.org/core/2015/04/02/the-utf8mb4-upgrade/)。
    ![在 phpMyAdmin 4.4 中创建数据库](https://wordpress.org/documentation/files/2018/10/phpMyAdmin_create_database_4.4.jpg)
    2. 点击左上角的 **phpMyAdmin** 图标返回主页，然后点击 **用户** 标签。如果用户列表中尚未存在与 WordPress 相关的用户，请创建一个：
    ![在 phpMyAdmin 4.4 中创建用户](https://codex.wordpress.org/images/2/26/users.jpg)
        1. 点击 **添加用户**。
        2. 为 WordPress 选择一个用户名（'`wordpress`' 是个不错的选择）并在**用户名**字段中输入。（确保从下拉菜单中选择**使用文本字段**：。）
        3. 选择一个安全的密码（理想情况下包含大小写字母、数字和符号的组合），并在**密码**字段中输入。（确保从下拉菜单中选择**使用文本字段**：。）在**重新输入**字段中再次输入密码。
        4. 记下您选择的用户名和密码。
        5. 保持**全局权限**下的所有选项为默认设置。
        6. 点击 **执行**。
        7. 返回用户界面，点击您刚刚为 WordPress 创建的用户旁边的**编辑权限**图标。
        8. 在**数据库特定权限**部分，从**为以下数据库添加权限**下拉菜单中选择您刚刚为 WordPress 创建的数据库，然后点击执行。
        9. 页面将刷新显示该数据库的权限。点击**全选**以选择所有权限，然后点击**执行**。
        10. 在结果页面上，注意页面顶部**服务器**：后列出的主机名。（这通常是 **localhost**。）

    ![确保服务器是 localhost](https://wordpress.org/documentation/files/2018/10/phpMyAdmin_server_info_4.4.jpg)

### 步骤 3：设置 wp-config.php {#detailed-step-3}
您可以自行创建和编辑 wp-config.php 文件，也可以跳过此步骤，让 WordPress 在运行安装脚本（步骤 5）时尝试自行完成此操作。（您仍然需要告诉 WordPress 您的数据库信息）。

（有关创建配置文件和用于密码安全的密钥的更详细说明和分步指南，请参阅 [编辑 wp-config.php](https://developer.wordpress.org/advanced-administration/wordpress/wp-config/)）。

返回到您在步骤 1 中解压 WordPress 软件包的位置，将文件 wp-config-sample.php 重命名为 wp-config.php，并在文本编辑器中打开它。

在标有以下注释的部分中[输入您的数据库信息](https://developer.wordpress.org/advanced-administration/wordpress/wp-config/#configure-database-settings)：

```
 // ** MySQL 设置 - 您可以从您的网络主机获取此信息 ** //
```

**DB_NAME**
    您在步骤 2 中为 WordPress 创建的数据库名称。
**DB_USER**
    您在步骤 2 中为 WordPress 创建的用户名。
**DB_PASSWORD**
    您在步骤 2 中为 WordPress 用户名选择的密码。
**DB_HOST**
    您在步骤 2 中确定的主机名（通常是 localhost，但并非总是如此；请参阅[一些可能的 DB_HOST 值](https://developer.wordpress.org/advanced-administration/wordpress/wp-config/#set-database-host)）。如果需要端口、套接字或管道，请在主机名后附加冒号 (:) 和相关信息。
**DB_CHARSET**
    数据库字符集，通常不应更改（请参阅[编辑 wp-config.php](https://developer.wordpress.org/advanced-administration/wordpress/wp-config/)）。
**DB_COLLATE**
    数据库排序规则通常应留空（请参阅[编辑 wp-config.php](https://developer.wordpress.org/advanced-administration/wordpress/wp-config/)）。

在标有以下注释的部分中[输入您的密钥值](https://developer.wordpress.org/advanced-administration/wordpress/wp-config/)：
```
/* 身份验证唯一密钥和盐。 */
```
保存 `wp-config.php` 文件。

### Step 4: Upload the files

Now you will need to decide where on your domain you'd like your WordPress-powered site to appear:
- In the root directory of your website. (For example, https://example.com/)
- In a subdirectory of your website. (For example, https://example.com/blog/)

_**Note:** The location of your root web directory in the filesystem on your [web server](https://wordpress.org/documentation/article/glossary/#web-server) will vary across [hosting providers](https://wordpress.org/documentation/article/glossary/#hosting-provider) and operating systems. Check with your hosting provider or system administrator if you do not know where this is._

#### 在根目录中

- 如需将文件上传至网络服务器，请使用 [FTP](https://wordpress.org/documentation/article/glossary/#ftp) 客户端将 wordpress 目录的全部内容（不包括目录本身）上传至网站根目录。
若文件已在服务器上，且通过 [shell](https://wordpress.org/documentation/article/glossary/#shell) 安装 WordPress，请将 wordpress 目录的全部内容（不包括目录本身）移至网站根目录。

#### 在子目录中

- 如果您需要将文件上传到您的网络服务器，请将 wordpress 目录重命名为您想要的名称，然后使用 [FTP](https://wordpress.org/documentation/article/glossary/#ftp) 客户端将该目录上传到您网站根目录内的目标位置。
- 如果您的文件已在网络服务器上，并且您正在使用 [shell](https://wordpress.org/documentation/article/glossary/#shell) 访问来安装 WordPress，请将 wordpress 目录移动到您网站根目录内的目标位置，并将该目录重命名为您想要的名称。

### 步骤 5：运行安装脚本

在网页浏览器中访问安装脚本。

- 如果您将 WordPress 文件放置在根目录，请访问：https://example.com/wp-admin/install.php
- 如果您将 WordPress 文件放置在子目录（例如名为 blog 的目录）中，请访问：https://example.com/blog/wp-admin/install.php

#### 设置配置文件

如果 WordPress 找不到 wp-config.php 文件，它会提示并尝试自动创建和编辑该文件。（您也可以通过浏览器直接访问 `wp-admin/setup-config.php` 手动操作。）WordPress 将询问数据库信息并写入新的 wp-config.php 文件。若成功，即可继续安装；否则请返回并[自行创建、编辑并上传 wp-config.php 文件（步骤 3）。](https://developer.wordpress.org/advanced-administration/before-install/howto-install/#step-3-set-up-wp-config-php)

![WordPress 设置界面](https://wordpress.org/documentation/files/2018/10/install-step3_v47.png)

#### 完成安装

以下截图展示了安装过程的进展。请注意，在填写详细信息页面时，您需要输入站点标题、期望的用户名、密码（两次）以及电子邮件地址。同时还会显示一个复选框，询问您是否希望您的博客出现在 Google 和 DuckDuckGo 等搜索引擎中。如果您希望您的博客对所有人（包括搜索引擎）可见，请保持复选框未勾选；如果您想阻止搜索引擎但允许普通访客访问，请勾选该复选框。请注意，所有这些信息稍后都可以在您的[管理界面](https://wordpress.org/documentation/article/administration-screens/)中更改。

![WordPress 安装界面](https://wordpress.org/documentation/files/2018/10/install-step5_v47.png)

如果成功安装 WordPress，将显示登录提示。

安装脚本故障排除
- 如果在运行安装脚本时遇到数据库错误：
    - 请返回[步骤 2](#detailed-step-2) 和[步骤 3](#detailed-step-3)，确保您已在 wp-config.php 文件中输入了所有正确的数据库信息。
    - 确保您已在**步骤 3** 中授予 WordPress 用户访问 WordPress 数据库的权限。
    - 确保数据库服务器正在运行。

## 在主流托管公司安装 WordPress {#installing-wordpress-at-popular-hosting-companies}

### 在 Atlantic.net 安装 WordPress

[在 Ubuntu 14.04 LTS 上安装 WordPress](https://www.atlantic.net/vps-hosting/how-to-install-wordpress-ubuntu-14/)
您也可以在 Atlantic.Net 上通过[一键式 WordPress 托管](https://www.atlantic.net/vps-hosting/wordpress-vps-hosting/)在 Ubuntu 上安装 WordPress。

### 在 AWS 上安装 WordPress

- [Installatron WordPress](https://aws.amazon.com/marketplace/pp/prodview-duuvqpjnl65oe) Installatron WordPress 是一个预配置且可立即启动的镜像，包含一个 WordPress 网站和 Installatron 的 WordPress 管理工具。
- [在 AWS 中构建高可扩展的 WordPress 站点架构](https://www.slideshare.net/harishganesan/scaling-wordpress-in-aws-amazon-ec2) 本指南介绍如何使用亚马逊关系数据存储（RDS）等工具，构建一个成本更高、高度可扩展的 AWS 实施方案。

### 在 DigitalOcean 安装 WordPress

- [如何在 Ubuntu 14.04 上安装 WordPress](https://www.digitalocean.com/community/tutorials/how-to-install-wordpress-on-ubuntu-14-04)

### 在 Linode 安装 WordPress

- [使用 WordPress 管理网站内容](https://www.linode.com/docs/websites/cms/manage-web-content-with-wordpress) 在基于 LAMP 环境的 Debian 服务器上安装 WordPress

您也可以在 Linode 上使用此 [StackScript](https://www.linode.com/stackscripts/view/12) 一键在 Ubuntu 上安装 WordPress。

### 在 iPage 托管服务上安装 WordPress

- [这是 IStartBlogging 提供的优秀分步教程](https://istartblogging.com/#express-blog-install)，介绍如何通过 iPage 托管服务以智能方式设置您的博客。

从现在起不到 5 分钟，您就能在您的域名上准备好博客。您将利用 iPage 托管的“一键安装 WordPress”功能，在您自己的域名上自动完成 WordPress 安装。

### 在 Microsoft Azure 上安装 WordPress

- [在 Microsoft Azure 上安装 WordPress](https://azure.microsoft.com/en-us/marketplace/partners/wordpress/wordpress/) 只需点击几下即可完成。系统将自动创建并配置托管空间和 MySQL 数据库，您可以在几秒钟内开始创作。
- 遇到问题并需要在 Azure 上对 WordPress 站点进行故障排除？请遵循这份实用的 [Azure 上 WordPress 故障排除指南](https://azure.microsoft.com/en-us/blog/wordpress-troubleshooting-techniques-on-azure-websites/)。
- 这里有一份完整的资源列表，介绍如何 [深入了解 Microsoft Azure 上的 WordPress！](https://azure.microsoft.com/en-us/documentation/articles/develop-wordpress-on-app-service-web-apps/)

## Common installation problems

The following are some of the most common installation problems. For more information and troubleshooting for problems with your WordPress installation, check out [FAQ Installation](https://wordpress.org/documentation/article/faq-installation/) and [FAQ Troubleshooting](https://wordpress.org/documentation/article/faq-troubleshooting/).

**I see a directory listing rather than a web page.**

The web server needs to be told to view index.php by default. In Apache, use the DirectoryIndex index.php directive. The simplest option is to create a file named .htaccess in the installed directory and place the directive there. Another option is to add the directive to the web server's configuration files.

**I see lots of `Headers already sent` errors. How do I fix this?**

You probably introduced a syntax error in editing wp-config.php.

1. Download wp-config.php (if you don't have [shell](https://wordpress.org/documentation/article/glossary/#shell) access).
2. Open it in a [text editor](https://wordpress.org/documentation/article/glossary/#text-editor).
3. Check that the first line contains nothing but <?php, and that there is **no** text before it (not even whitespace).
4. Check that the last line contains nothing but ?>, and that there is no text after it (not even whitespace).
5. If your text editor saves as Unicode, make sure it adds **no byte order mark (BOM)**. Most Unicode-enabled text editors do not inform the user whether or not it adds a BOM to files; if so, try using a different text editor.
6. Save the file, upload it again if necessary, and reload the page in your browser.

**My page comes out gibberish. When I look at the source I see a lot of "`<?php ?>`" tags.**

If the `<?php ?>` tags are being sent to the browser, it means your [PHP](https://wordpress.org/documentation/article/glossary/#php) is not working properly. All PHP code is supposed to be executed before the server sends the resulting [HTML](https://wordpress.org/documentation/article/glossary/#html) to your web browser. (That's why it's called a preprocessor.) Make sure your web server meets the requirements to run WordPress, that PHP is installed and configured properly, or contact your hosting provider or system administrator for assistance.

**I keep getting an `Error connecting to database` message but I'm sure my configuration is correct.**

Try resetting your MySQL password manually. If you have access to MySQL via shell, try issuing:
```
SET PASSWORD FOR 'wordpressusername'@'hostname' = OLD_PASSWORD('password');
```

If you do not have shell access, you should be able to simply enter the above into an SQL query in phpMyAdmin. Failing that, you may need to use your host's control panel to reset the password for your database user.

**I keep getting an `Your PHP installation appears to be missing the MySQL extension which is required by WordPress` message but I'm sure my configuration is correct.**

请检查并确保您的 Web 服务器配置正确，且 MySQL 插件已被 Web 服务器程序正确加载。有时，此问题需要检查从 Web 服务器到 MySQL 安装的整个路径中的所有内容，并验证其完全正常运行。配置文件或设置不正确通常是导致此问题的原因。

**我的图片/MP3 上传功能无法正常工作。**

如果您在安装于子目录的博客上使用富文本编辑器，并将新上传的图片拖拽到编辑器字段中，图片可能会在几秒钟后消失。这是由于 TinyMCE（富文本编辑器）在拖拽操作期间未获得足够信息来正确构建图片或其他文件的路径所致。解决方案是不要将上传的图片拖拽到编辑器中，而是点击并按住图片，然后选择 **发送到编辑器**。

# 安装您语言版本的 WordPress

_注意：本文介绍如何将 WordPress 管理后台（"后端"）显示为您的语言。如果您想了解如何本地化您的"前端"网站，或定制主题使其可本地化，请参阅 [WordPress 开发者的国际化](https://codex.wordpress.org/I18n_for_WordPress_Developers)（以及主题开发者可选的 [国际化](https://developer.wordpress.org/themes/functionality/internationalization/) 和 [本地化](https://developer.wordpress.org/themes/functionality/localization/)）。如果您对如何构建多语言（例如：法语/英语）WordPress 站点感兴趣，可以从 [这里](https://developer.wordpress.org/advanced-administration/wordpress/multilingual/) 开始。_

虽然 WordPress 默认显示为美式英语，但它内置了支持任何语言的能力。WordPress 社区已将 WordPress 翻译成多种语言，并且许多其他语言也提供了主题、翻译文件和支持（请参阅 [您语言版本的 WordPress](https://developer.wordpress.org/advanced-administration/wordpress/multilingual/)）。

## 从管理面板安装语言文件

自 4.0 版本起，您可以在安装过程中[让 WordPress 自动安装您选择的语言](https://make.wordpress.org/core/2014/09/05/language-chooser-in-4-0/)。

对于 WordPress 4.1 或更高版本，您可以随时[直接从管理后台安装语言包](https://wplang.org/wordpress-4-1-install-language-packs-dashboard/)。WordPress 将下载它们并将管理后台切换为该语言。请导航至 **设置 > 常规 > 站点语言**，并从可用语言列表中选择。对于多站点超级管理员，您可以使用网络管理 **设置** 面板来设置默认语言。

## 手动安装语言文件

以下是安装 WordPress 国际化版本需要遵循的步骤。

**注意：** 如果步骤出错或未指定正确的语言，WordPress 将默认回退到英文。有关安装 WordPress 的更多帮助，请参阅 [安装 WordPress](https://developer.wordpress.org/advanced-administration/before-install/howto-install/) 和 [常见问题：安装](https://wordpress.org/documentation/article/faq-installation/)。

* 下载您所需语言的 `.mo` 语言文件。`.mo` 文件的命名规则基于 ISO-639 语言代码（例如，葡萄牙语为 _pt_），后跟 ISO-3166 国家/地区代码（例如，葡萄牙为 _PT_，巴西为 _BR_）。因此，巴西葡萄牙语文件将命名为 `pt_BR.mo`，而非特定地区的葡萄牙语文件将命名为 `pt.mo`。完整的代码列表可在 [(国家/地区代码)](https://www.gnu.org/savannah-checkouts/gnu/gettext/manual/gettext.html#Country-Codes) 和 [(语言代码)](https://www.gnu.org/savannah-checkouts/gnu/gettext/manual/gettext.html#Language-Codes) 找到。

## 设置网站语言

### 单站点安装

#### WordPress 4.0 及以上版本

* 在管理设置界面更改语言。路径为：`设置 > 常规 > 站点语言`。

#### WordPress 3.9.2 及以下版本

* 在[文本编辑器](https://wordpress.org/documentation/article/wordpress-glossary/#Text_editor)中打开您的 `wp-config.php` 文件，并搜索：

```
define( 'WPLANG', '' );
```

* 根据您刚刚下载的 `.mo` 文件编辑此行，例如，对于巴西葡萄牙语，您必须添加：

```
define ( 'WPLANG', 'pt_BR' );
```

* 请注意，如果 wp-config.php 中调用的语言代码没有对应的 .mo 和 .po 文件，则不会出现错误消息，但该代码仍会在 language_attributes() 中使用。这对于那些语言与 en_US 足够相似、无需翻译，但又不想在博客中使用 en-US 作为语言标签，而希望使用其他英语变体的人来说很有用。例如：

```
define ( 'WPLANG', 'en_GB' );
```

* 添加语言代码后，保存文件。

### 多站点安装

如果您拥有[站点网络](https://developer.wordpress.org/advanced-administration/multisite/create-network/)（WordPress 多站点），语言将通过 `设置 > 常规` 子面板中的“站点语言”选项按博客进行设置。

您可以在 `网络管理 > 设置` 界面（“默认语言”）下为整个网络设置默认语言。

### 添加翻译

如果您希望在安装后为仍显示为英文的术语添加翻译，请访问 [translate.wordpress.org](https://translate.wordpress.org) 并选择您的语言。要开始使用，请参阅 [翻译者手册](https://make.wordpress.org/polyglots/handbook/) 中的 [此页面](https://make.wordpress.org/polyglots/handbook/tools/glotpress-translate-wordpress-org/)。

# 安装前准备

在安装 WordPress 之前，您需要确认您的网络托管服务提供商满足必要的软件和条件。同时，您必须能够访问服务器并拥有一些工具。

如果您对这些术语感到陌生：**主机**（或**托管服务提供商**）是您付费以将网站上线的公司，而**服务器**是运行 WordPress 的计算机。

## 服务器端要求

* PHP 7.4 或更高版本
* MySQL 5.7 或 MariaDB 10.3 或更高版本
* HTTPS 支持

有关您网络主机的详细要求列表，请参阅[官方要求页面](https://wordpress.org/about/requirements/)和[服务器环境页面](https://make.wordpress.org/hosting/handbook/server-environment/)。

## 本地要求

* 通过 FTP 或 shell 访问服务器的登录账户（用户 ID 和密码）
* 文本编辑器
* FTP 工具
* 您选择的网页浏览器

您需要知道如何使用文本编辑器来编辑主配置文件。如果您是 Windows 用户，记事本即可。如果您是 OS X 用户，可以使用 TextEdit。之后，您可能还需要编辑模板文件（可参考[模板](https://codex.wordpress.org/Templates)）。您可以通过 WordPress [管理界面](https://wordpress.org/documentation/article/administration-screens/)完成此操作，但强烈建议使用一个好的文本编辑器。有关更多信息，请参阅[编辑文件](https://developer.wordpress.org/advanced-administration/wordpress/edit-files/)。

您需要能够使用 FTP 程序来[上传](https://developer.wordpress.org/advanced-administration/upgrade/ftp/filezilla/)文件和[设置文件权限](https://developer.wordpress.org/advanced-administration/server/file-permissions/)（可选）。您可以选择 [FileZilla](https://developer.wordpress.org/advanced-administration/upgrade/ftp/filezilla/) 来完成此任务。

现在您已准备就绪，可以继续[安装](https://developer.wordpress.org/advanced-administration/before-install/howto-install/)了。

# 安装多个 WordPress 实例

如果您需要多个 WordPress 实例，根据系统架构或 WordPress 实例与数据库的组合方式，有三种安装类型：

1. WordPress 多站点网络：单个 WordPress 实例（在同一 WP 实例内创建多个站点）共享单个数据库实例。
2. 单一数据库：多个 WordPress 实例共享单个数据库实例。
3. 多个数据库：多个 WordPress 实例，每个实例使用自己的数据库实例。

![](https://wordpress.org/documentation/files/2022/06/multisite_db_layout-1024x469.jpg)

让我们首先看看第三种类型，即具有多个数据库的多个 WordPress 实例，因为其安装过程与单个 WordPress 实例相同。

## 多个 WordPress 实例与多个数据库 {#multiple-wordpress-instances-with-multiple-databases}

您计划安装的每个实例都需要一个独立的 [MySQL 数据库](https://wordpress.org/documentation/article/wordpress-glossary/#mysql)。如果您尚未创建这些数据库，[可以在此处找到基本说明](https://developer.wordpress.org/advanced-administration/before-install/howto-install/#step-2-create-the-database-and-a-user)。

为确保每个 WordPress 实例连接到正确的数据库，您需要将这些信息添加到 [wp-config.php](https://developer.wordpress.org/advanced-administration/wordpress/wp-config/) 文件中。需要修改的行如下：

```
define('DB_NAME', 'wordpress');    // 数据库名称
define('DB_USER', 'username');     // 您的 MySQL 用户名
define('DB_PASSWORD', 'password'); // 用户的密码
define('DB_HOST', 'localhost' );  // 数据库主机
```

`DB_NAME` 是为托管在 `DB_HOST` MySQL 服务器上的博客创建的独立数据库的名称。如果您为每个数据库使用不同的用户登录，也请相应修改 `DB_USER` 和 `DB_PASSWORD`。

将每个 [wp-config.php](https://developer.wordpress.org/advanced-administration/wordpress/wp-config/) 文件上传到其特定的根目录/安装目录，并运行安装。更多信息请参阅 [安装 WordPress](https://developer.wordpress.org/advanced-administration/before-install/howto-install/)。

## 多站点功能 {#the-multisite-feature}

若需多个站点使用 WordPress，可利用多站点功能创建所谓的站点**网络**。该功能涉及安装单一的 WordPress 实例和数据库。

多站点功能看似比其他类型的多 WordPress 安装更简单，但存在一些注意事项和限制。更多详细信息请参阅以下文档：

* [创建网络前的准备](https://developer.wordpress.org/advanced-administration/multisite/prepare-network/)
* [创建网络](https://developer.wordpress.org/advanced-administration/multisite/create-network/)
* [多站点网络管理](https://developer.wordpress.org/advanced-administration/multisite/administration/)

## 使用单一数据库运行多个 WordPress 实例 {#multiple-wordpress-instances-with-a-single-database}

与上文描述的多数据库解决方案类似，每个安装的 [wp-config.php](https://developer.wordpress.org/advanced-administration/wordpress/wp-config/) 文件都会有所不同。然而，在这种情况下，每个博客只有一行代码是唯一的：

```
$table_prefix = 'wp_'; // 例如：'wp_' 或 'b2' 或 'mylogin_'
```

默认情况下，WordPress 为其 [MySQL 数据库](https://wordpress.org/documentation/article/wordpress-glossary/#mysql) 表分配表前缀 `wp_`，但这个前缀可以是您选择的任何内容。这允许您为数据库中的每个博客创建唯一的标识符。例如，假设您要设置三个博客，名称分别为 _主站_、_项目_ 和 _测试_。您应该替换每个博客 [wp-config.php](https://developer.wordpress.org/advanced-administration/wordpress/wp-config/) 文件中的 `wp_` 前缀：

**主站博客：**
```
$table_prefix = 'main_';
```

**项目博客：**
```
$table_prefix = 'projects_';
```

**测试博客：**
```
$table_prefix = 'test_';
```

如前所述，您可以使用自己创建的前缀。此处提供的仅作示例。

将每个 [wp-config.php](https://developer.wordpress.org/advanced-administration/wordpress/wp-config/) 文件上传到其特定的根目录/安装目录，并运行安装。更多信息请参阅 [安装 WordPress](https://developer.wordpress.org/advanced-administration/before-install/howto-install/)。

为了增强安全性，您还可以向同一数据库添加多个用户，并为每个 WordPress 实例分配其自己的 MySQL 用户。

## 多数据库，相同用户 {#multiple-databases-same-users}

您可以通过定义 `CUSTOM_USER_TABLE` 常量（以及可选的 `CUSTOM_USER_META_TABLE` 常量）指向相同的 `wp_your_blog_users` 和 `wp_your_blog_usermeta` 表，从而为同一域名下的所有博客使用相同的用户库。  
详情请参阅 [编辑 wp-config.php/自定义用户和用户元表](https://developer.wordpress.org/advanced-administration/wordpress/wp-config/#custom-user-and-usermeta-tables)。

# 在主流服务商安装 WordPress

## 在 Atlantic.Net 安装 WordPress {#installing-wordpress-at-atlantic-net}

* [如何在 Ubuntu 14.04 LTS 云服务器上安装 WordPress](https://www.atlantic.net/community/howto/install-wordpress-ubuntu-14/)

您也可以通过一键式 [WordPress 托管](https://www.atlantic.net/vps-hosting/wordpress-vps-hosting/)在 Ubuntu 上安装 WordPress。

## 在 AWS 上安装 WordPress {#installing-wordpress-at-aws}

* [由 Bitnami 和 Automattic 认证的 WordPress](https://aws.amazon.com/marketplace/pp/prodview-bzstv3wbn5wkq)。WordPress 是全球最受欢迎的内容管理平台。它包含新的 Gutenberg 编辑器以及超过 45,000 个主题和插件。此镜像由 Bitnami 认证为安全、最新且采用行业最佳实践打包，并得到 WordPress 背后的专家 Automattic 的批准。
* [由 Bitnami 和 Automattic 认证的带 NGINX 和 SSL 的 WordPress](https://aws.amazon.com/marketplace/pp/prodview-s6cuqgfczpuwm)。带 NGINX 和 SSL 的 WordPress 通过 SSL 自动配置和高性能 NGINX Web 服务器增强了 WordPress。此镜像由 Bitnami 认证为安全、最新且采用行业最佳实践打包，并得到 WordPress 背后的专家 Automattic 的批准。
* [带 LiteSpeed 缓存的 WordPress（由 OpenLiteSpeed 驱动）](https://aws.amazon.com/marketplace/pp/prodview-w7ee7rs5uhlem)。此 OLS + WordPress 镜像比常规 WordPress 镜像快 200 多倍。
* [由 Bitnami 和 Automattic 认证的 WordPress 多站点](https://aws.amazon.com/marketplace/pp/prodview-rcmdzzu2x3ntm)。WordPress 多站点使得从同一服务器和界面管理多个 WordPress 网站变得简单。此镜像由 Bitnami 认证为安全、最新且采用行业最佳实践打包，并得到 WordPress 背后的专家 Automattic 的批准。
* [在 AWS 中构建高度可扩展的 WordPress 站点架构](https://www.slideshare.net/harishganesan/scaling-wordpress-in-aws-amazon-ec2)。这是一份使用亚马逊关系数据存储 (RDS) 构建更昂贵、高度可扩展的 AWS 实施方案的指南。

## 在 DigitalOcean 上安装 WordPress {#installing-wordpress-at-digitalocean}

* [如何在 Ubuntu 12.04 上安装 WordPress](https://www.digitalocean.com/community/tutorials/how-to-install-wordpress-on-ubuntu-12-04)
* [如何在 Ubuntu 14.04 上安装 WordPress](https://www.digitalocean.com/community/tutorials/how-to-install-wordpress-on-ubuntu-14-04)
* [如何在 Ubuntu 16.04 上使用 LAMP 安装 WordPress](https://www.digitalocean.com/community/tutorials/how-to-install-wordpress-with-lamp-on-ubuntu-16-04)
* [如何在 Ubuntu 18.04 上使用 LAMP 安装 WordPress](https://www.digitalocean.com/community/tutorials/how-to-install-wordpress-with-lamp-on-ubuntu-18-04)
* [如何在 Ubuntu 20.04 上使用 LAMP 堆栈安装 WordPress](https://www.digitalocean.com/community/tutorials/how-to-install-wordpress-on-ubuntu-20-04-with-a-lamp-stack)
* [如何在 Ubuntu 22.04 上使用 LAMP 堆栈安装 WordPress](https://www.digitalocean.com/community/tutorials/how-to-install-wordpress-on-ubuntu-22-04-with-a-lamp-stack)
* [如何在 Ubuntu 18.04 上使用 Ansible 通过 LAMP 安装和设置 WordPress](https://www.digitalocean.com/community/tutorials/how-to-use-ansible-to-install-and-set-up-wordpress-with-lamp-on-ubuntu-18-04)
* [如何在 Debian 9 上使用 LAMP 安装 WordPress](https://www.digitalocean.com/community/tutorials/how-to-install-wordpress-with-lamp-on-debian-9)
* [如何在 Debian 10 上使用 LAMP 安装 WordPress](https://www.digitalocean.com/community/tutorials/how-to-install-wordpress-with-lamp-on-debian-10)

## 在 Linode 上安装 WordPress {#installing-wordpress-at-linode}

* [在 Ubuntu 16.04 上安装 WordPress](https://www.linode.com/docs/guides/install-wordpress-on-ubuntu-16-04/)
* [在 Ubuntu 18.04 上安装 WordPress](https://www.linode.com/docs/guides/install-wordpress-ubuntu-18-04/)
* [在 Ubuntu 20.04 上安装 WordPress](https://www.linode.com/docs/guides/how-to-install-wordpress-ubuntu-2004/)
* [在 Ubuntu 22.04 上安装 WordPress](https://www.linode.com/docs/guides/how-to-install-wordpress-ubuntu-22-04/)
* [在 Debian 10 上安装 WordPress](https://www.linode.com/docs/guides/how-to-install-wordpress-debian-10/)
* [在 AlmaLinux 8 上安装 WordPress](https://www.linode.com/docs/guides/how-to-install-wordpress-almalinux-8/)

## Installing WordPress at Microsoft Azure {#installing-wordpress-at-microsoft-azure}

* [Installing WordPress on Microsoft Azure](https://learn.microsoft.com/azure/app-service/quickstart-wordpress) is as simple as a few clicks. A hosting space and MySQL database will be created and configured, so you’re ready to start creating within a matter of seconds.
* Running into some issues and need to troubleshoot your WordPress site on Azure? Follow this handy [Troubleshooting guide for WordPress on Azure](https://learn.microsoft.com/troubleshoot/azure/app-service/web-apps-open-source-technologies-faqs).
* For other WordPress related content or specific WordPress related questions, you may perform a [search with WordPress related terms on Microsoft Learn](https://learn.microsoft.com/en-us/search/?terms=wordpress).

# 使用浏览器诊断 JavaScript 错误

如果您遇到交互功能问题，可能是由于 JavaScript 错误或冲突导致的。例如，下拉菜单可能失效、元框无法拖动或添加媒体按钮无法工作。为了有效提交支持请求，让团队了解具体的 JavaScript 错误信息将大有帮助。

本指南将向您展示如何在不同的浏览器中诊断 JavaScript 问题。

## 步骤 1：尝试其他浏览器

不同浏览器对 JavaScript 的实现方式常有差异。为确保这是 JavaScript 错误而非浏览器错误，请首先尝试在其他浏览器中打开您的网站。

* 若网站在新浏览器中没有相同问题，则说明错误是特定于浏览器的
* 若网站出现相同错误，则说明该错误并非特定于单一浏览器

请记录所有出现此错误的浏览器信息。在提交支持请求时，这些信息将非常有用。

## 步骤 2：启用 SCRIPT_DEBUG

你需要开启[脚本调试](https://developer.wordpress.org/advanced-administration/debug/debug-wordpress/#script_debug)。打开 `wp-config.php` 文件，在 "That's all, stop editing! Happy blogging" 这一行之前添加以下代码：

```
define('SCRIPT_DEBUG', true);
```

检查问题是否仍然存在。

* **问题已解决** – 关闭脚本调试，并在支持论坛报告此问题，告知志愿者你开启了脚本调试并解决了问题。
* **问题仍然存在** – 继续执行步骤 3。

## 步骤 3：诊断

### 打开开发者工具

*   **Chrome**：输入 `Cmd-Option-J` (Mac) 或 `Ctrl-Shift-J` (Windows, Linux, Chrome OS)，或在菜单中导航至 `查看 -> 开发者 -> 开发者工具`。
*   **Firefox**：输入 `Cmd-Option-K` (Mac) 或 `Ctrl-Shift-K` (Windows, Linux, Chrome OS)，或在菜单中导航至 `Web 开发 -> Web 控制台`。
*   **Edge**：遵循 Chrome 的说明。
*   **Safari**：首先，导航至 `Safari -> 偏好设置`。点击 `高级` 标签页，然后勾选 `在菜单栏中显示“开发”菜单`。接着，在新的 `开发` 菜单中，导航至 `显示 JavaScript 控制台`。
*   **Opera**：在菜单中导航至 `工具 -> 高级 -> 错误控制台`。

### 识别错误

通常，错误信息会直接显示在控制台中。它可能看起来类似这样：

![开发者工具错误页面示例截图。](https://wordpress.org/documentation/files/2020/07/chrome-devtools.png)

上图显示错误位于 `jquery.js 的第 2 行`，但请记住要复制完整的堆栈信息！仅说明行号不如展示上下文更有帮助。

如果没有显示错误，请重新加载页面；许多错误仅在页面首次加载时出现。

## Step 4: Reporting

Now that you have diagnosed your error, you should make your support forum request. Go to the [troubleshooting forum](https://wordpress.org/documentation/forum/how-to-and-troubleshooting).

If your problem is with a specific theme or plugin, you can access their dedicated support forum by visiting https://wordpress.org/support/plugin/PLUGINNAME or https://wordpress.org/support/theme/THEMENAME.

Please include the below information:

* the browsers that you are experiencing the problem in
* whether `SCRIPT_DEBUG` fixed the error or not
* the JavaScript error
* the location of the error – both the file name and the line number
* the context of the error – including the whole error stack will help developers
* If possible, a link to the web page showing the error

# 调试 WordPress 多站点网络

如果您访问到此页面，很可能是在设置或运行 [WordPress 多站点网络](https://wordpress.org/documentation/article/multisite-network-administration/)时遇到了错误。这些错误通常发生在 WordPress 无法在数据库中找到网络所需的一个或多个全局表，或者 Web 服务器配置不正确时。

本指南概述了 WordPress 多站点网络在设置或运行过程中最常见的问题原因及解决方法。

---

## 开始之前 {#before-you-begin}
- 在进行更改前，**请备份您的数据库和文件**。
- 确保您的主机环境满足[多站点网络的技术要求](https://developer.wordpress.org/advanced-administration/multisite/create-network/)。
- 向您的主机服务商确认是否允许安装网络/多站点（某些共享主机可能会限制此功能）。

---

## 如果您刚刚安装了网络 {#new-install}

### 验证 wp-config.php 文件 {#verify-wp-config}
检查您的 [wp-config.php](https://developer.wordpress.org/advanced-administration/wordpress/wp-config/) 文件，确认以下内容：

- 正确的数据库信息 (`DB_NAME`, `DB_USER`, `DB_PASSWORD`, `DB_HOST`)
- `MULTISITE` 常量
- `SUBDOMAIN_INSTALL` 常量（根据设置填写 true/false）
- `$base` 变量
- 数据表前缀 (`$table_prefix`)

确保在以下代码块之后没有放置任何代码：

```php
/* That's all, stop editing! Happy publishing. */

/** WordPress目录的绝对路径。 */
if ( ! defined('ABSPATH') ) {
    define('ABSPATH', __DIR__ . '/');
}

/** 设置WordPress变量和包含文件。 */
require_once ABSPATH . 'wp-settings.php';
```

如果您在 `require_once` 行*之后*发现了自定义代码，请将其移动到“stop editing”注释之前。

---

### Mod_rewrite 或重写规则不工作 {#rewrites}

如果主站点能加载但子站点返回 404 错误，可能是您的重写规则未生效。

#### Apache
在 Ubuntu/Debian 系统上：

```bash
sudo a2enmod rewrite
sudo nano /etc/apache2/sites-available/000-default.conf
```

将两处 `AllowOverride None` 都改为 `AllowOverride All`，然后重启 Apache：

```bash
sudo systemctl restart apache2
```

#### Nginx
对于 Nginx，请确保您的服务器块包含以下配置：

```nginx
location / {
    try_files $uri $uri/ /index.php?$args;
}
```

重启 Nginx：

```bash
sudo systemctl restart nginx
```

---

### 检查数据库 {#check-database}

多站点网络需要额外的数据库表。请确认以下表存在（使用您的前缀，例如 `wp_`）：

- `wp_blogs`
- `wp_blogmeta`
- `wp_blog_versions`
- `wp_registration_log`
- `wp_signups`
- `wp_site`
- `wp_sitemeta`

如果表缺失，或者 `wp_site`/`wp_blogs` 表为空，您可能需要手动插入数据行。**请先备份！**

示例 SQL（请调整前缀、域名、路径、用户和日期）：

```sql
INSERT INTO wp_site VALUES (1, 'example.com', '/');
INSERT INTO wp_blogs VALUES (1, 1, 'example.com', '/', '2025-01-01', '2025-01-01', 1, 0, 0, 0, 0, 0);
INSERT INTO wp_sitemeta VALUES (1, 1, 'site_admins', 'a:1:{i:1;s:5:"admin";}');
```

⚠️ 请将 `"admin"` 更改为您的实际用户名，并调整 `s:5` 以匹配其字符长度。

---

## 如果新站点创建突然停止工作 {#site-creation-stopped}
- 确认数据库服务器主机名未更改（检查 `wp-config.php` 中的 `DB_HOST`）。
- 检查数据库用户是否对数据库拥有**所有权限**。
- 查看 Web 服务器错误日志中与 `.htaccess` 或重写相关的问题。

---

## 其他问题 {#other-issues}
- **数据库排序规则冲突**：如今已很少见，但从 WordPress MU 升级的遗留系统可能因排序规则不匹配导致站点创建错误。如果从非常旧的版本升级，请检查数据库排序规则设置。
- **Apache 重写限制**：如果看到如下错误：

  ```
  Options FollowSymLinks or SymLinksIfOwnerMatch is off which implies that RewriteRule directive is forbidden
  ```

  这可能会阻止重写并导致 WordPress 报告缺少数据表。请更新 Apache 配置以允许重写。

---

## 相关文章 {#related-articles}
- [WordPress 多站点网络：完整指南](https://multilingualpress.org/wordpress-multisite-network/)
- [强化 WordPress 多站点安全](https://developer.wordpress.org/advanced-administration/security/hardening/)

## 外部链接 {#external-links}
- [WordPress 支持 → 多站点论坛](https://wordpress.org/support/forum/multisite/)

---

## 遗留说明 {#legacy-notes}
部分问题可追溯至从 WordPress MU（3.0 版之前）迁移而来。这些问题在现代网络中已很罕见，但在运行非常古老的站点时仍可能出现。如有可能，请考虑迁移至全新的多站点安装。

# WordPress 调试

调试 PHP 代码是任何项目的一部分，但 WordPress 配备了特定的调试系统，旨在简化调试过程并标准化核心、插件和主题中的代码。本页介绍了 WordPress 中可用的各种调试工具，以及如何提高编码效率，同时提升代码的整体质量和互操作性。

对于非程序员或普通用户，这些选项可用于显示错误的详细信息。

**注意**：在对网站进行任何修改之前，请确保您已使用暂存环境或对网站进行了适当的备份。

## 调试用 wp-config.php 示例

将以下代码插入您的 [wp-config.php](https://wordpress.org/documentation/article/editing-wp-config-php/) 文件，会将所有错误、通知和警告记录到 `wp-content` 目录下名为 `debug.log` 的文件中。它还会隐藏错误，使其不会中断页面生成。

```
// 启用 WP_DEBUG 模式
define( 'WP_DEBUG', true );
```

```
// 启用调试日志记录到 /wp-content/debug.log 文件
define( 'WP_DEBUG_LOG', true );
```

```
// 禁用错误和警告的显示
define( 'WP_DEBUG_DISPLAY', false );
@ini_set( 'display_errors', 0 );
```

```
// 使用核心 JS 和 CSS 文件的开发版本（仅在修改这些核心文件时需要）
define( 'SCRIPT_DEBUG', true );
```

**注意**：您必须将此代码插入到 [wp-config.php](https://developer.wordpress.org/advanced-administration/wordpress/wp-config/) 文件中的 `/* 就这些，停止编辑！祝您博客愉快。 */` **之前**。

## WP_DEBUG

`WP_DEBUG` 是一个 PHP 常量（永久全局变量），可用于在整个 WordPress 中触发“调试”模式。默认情况下它被假定为 false，通常在 WordPress 开发副本的 [wp-config.php](https://developer.wordpress.org/advanced-administration/wordpress/wp-config/) 文件中设置为 true。

```
// 启用调试模式。
define( 'WP_DEBUG', true );
```

```
// 禁用调试模式。
define( 'WP_DEBUG', false );
```

**注意**：示例中的 `true` 和 `false` 值没有用单引号 (') 包围，因为它们是布尔值（真/假）。如果将常量设置为 `'false'`，它将被解释为 true，因为引号使其成为字符串而非布尔值。

不建议在正式站点上使用 `WP_DEBUG` 或其他调试工具；它们仅用于本地测试和暂存安装。

### PHP 错误、警告与通知

启用 `WP_DEBUG` 将显示所有 PHP 错误、通知和警告。这可能会改变 PHP 的默认行为——PHP 通常仅显示致命错误，或在遇到错误时呈现白屏死机。

显示所有 PHP 通知和警告常会暴露看似未损坏但未遵循 PHP 内部数据验证规范的代码问题。一旦识别出相关代码，这些警告很容易修复，且修复后的代码几乎总能增强抗错能力并提升可维护性。

### 自定义 PHP 调试

若出于调试目的需要记录非错误信息，PHP 确实提供了 `error_log` 函数。然而，此方法默认不提供格式正确的输出。

为解决此问题，您可以在站点上添加另一个函数来处理格式化，可以通过创建[自定义插件](https://developer.wordpress.org/plugins/plugin-basics/)或使用带有[代码片段](https://wordpress.org/plugins/search/code+snippets/)插件的代码片段来实现。该函数将作为 `error_log` 的包装器，在记录前使用 `print_r` 正确格式化数组和对象。

以下是一个示例函数，它要求启用 `WP_DEBUG`。

```
function write_log( $data ) {
	if ( true === WP_DEBUG ) {
		if ( is_array( $data ) || is_object( $data ) ) {
			error_log( print_r( $data, true ) );
		} else {
			error_log( $data );
		}
	}
}
```

使用示例：

```
write_log( 'DEBUG TEXT' );
write_log( $variable );
```

**注意**：不建议在 `functions.php` 中添加如上例的自定义代码，以避免维护、安全、性能、兼容性和代码组织问题。

### 已弃用的函数与参数

启用 `WP_DEBUG` 还会显示您网站上正在使用的 WordPress 中已弃用的函数和参数的相关通知。这些是尚未从核心代码中移除，但计划在近期删除的函数或函数参数。弃用通知通常会指明应使用的新函数。

## WP_DEBUG_LOG

`WP_DEBUG_LOG` 是 `WP_DEBUG` 的配套功能，它会导致所有错误同时被保存到 `debug.log` 日志文件中。如果您想稍后查看所有通知，或者需要查看在屏幕外生成的通知（例如，在 AJAX 请求或 `wp-cron` 运行期间），这将非常有用。

请注意，这允许您使用 PHP 内置的 `error_log()` 函数写入日志文件，这在调试 Ajax 事件等情况下非常有用。

当设置为 `true` 时，日志将保存在您站点文件系统的内容目录下的 `debug.log` 文件中（通常是 `wp-content/debug.log`）。或者，您可以将其设置为一个有效的文件路径，以便将文件保存在其他位置。

```
define( 'WP_DEBUG_LOG', true );
```

-或-

```
define( 'WP_DEBUG_LOG', '/tmp/wp-errors.log' );
```

**注意**：要使 `WP_DEBUG_LOG` 生效，必须启用 `WP_DEBUG`（设为 true）。请记住，您可以独立地关闭 `WP_DEBUG_DISPLAY`。

## WP_DEBUG_DISPLAY

`WP_DEBUG_DISPLAY` 是 `WP_DEBUG` 的另一个辅助常量，用于控制是否在页面的 HTML 中显示调试信息。默认值为 'true'，即在生成时显示错误和警告。将其设置为 false 将隐藏所有错误。这应与 `WP_DEBUG_LOG` 配合使用，以便稍后可以查看错误。

```
define( 'WP_DEBUG_DISPLAY', false );
```

**注意**：要使 `WP_DEBUG_DISPLAY` 生效，必须启用 `WP_DEBUG`（设为 true）。请记住，您可以独立控制 `WP_DEBUG_LOG`。

## SCRIPT_DEBUG

`SCRIPT_DEBUG` 是一个相关常量，它会强制 WordPress 使用核心 CSS 和 JavaScript 文件的“开发”版本，而不是通常加载的压缩版本。这在测试对任何内置 `.js` 或 `.css` 文件的修改时非常有用。默认值为 `false`。

```
define( 'SCRIPT_DEBUG', true );
```

## SAVEQUERIES

`SAVEQUERIES` 定义将数据库查询保存到数组中，随后可以显示这些查询以帮助进行分析。当该常量设置为 true 时，会导致每个查询与其执行时间及调用它的函数一同被保存。

```
define( 'SAVEQUERIES', true );
```

该数组存储在全局变量 `$wpdb->queries` 中。

**注意**：这会对您的网站性能产生影响，因此请确保在非调试时关闭此功能。

## 调试插件

WordPress 有许多[调试插件](https://wordpress.org/plugins/search/debug/)，用于显示内部运行的更多信息，无论是针对特定组件还是通用信息。

例如，[Debug Bar](https://wordpress.org/plugins/debug-bar/)会在管理栏添加一个调试菜单，显示查询、缓存和其他有用的调试信息。当启用 WP_DEBUG 时，它还会追踪 PHP 警告和通知，使其更易于查找。

# WordPress 调试

调试是网站开发的重要环节，也是确保用户获得流畅可靠体验的关键步骤。调试指的是在网站代码中查找并修复错误或问题的过程。

在《高级管理手册》的这一部分，我们将探讨 WordPress 网站调试的各个方面，包括常规 WordPress 调试、JavaScript 调试、WordPress 网络调试以及测试驱动。

## 常规 WordPress 调试

在[调试 WordPress 网站](https://developer.wordpress.org/advanced-administration/debug/debug-wordpress/)时，有多种方法和技术可供使用，包括在 WordPress 配置文件中启用调试、使用错误日志以及借助调试插件。这些技术有助于识别和解决各类错误，例如 PHP 错误和数据库错误。

## JavaScript 调试

[JavaScript 调试](https://developer.wordpress.org/advanced-administration/debug/debug-javascript/)对于确保网站前端交互和用户体验正常运行至关重要。本节将介绍如何使用浏览器开发者工具检查源代码并诊断 JavaScript 问题，同时提供更多实用技巧。

## WordPress 网络调试

维护 WordPress 站点网络时，[WordPress 网络调试](https://developer.wordpress.org/advanced-administration/debug/debug-network/)是必不可少的；它指的是对通过单一 WordPress 安装连接的多个站点进行调试的过程。这种设置通常被拥有多个网站的组织采用，这些网站共享一组通用的插件、主题和用户。

## 测试驱动

[测试驱动](https://developer.wordpress.org/advanced-administration/debug/test-driving/)指的是在网站上线前进行测试的过程。这个过程使开发人员能够在网站向公众开放之前识别并解决任何问题或错误。测试驱动通常在沙盒环境中进行。本节将介绍如何创建沙盒环境。

# 测试驱动 WordPress

有时您需要在公众视线之外测试 WordPress 网站的更改。对实时网站进行修改可能会对读者产生不利影响。

您有几种选择。

### 创建沙盒环境

此操作适用于测试驱动您的 WordPress 主题和样式表，让您能在计算机上开发 [WordPress 主题](https://wordpress.org/documentation/article/using-themes/)。该环境限制您仅能处理 CSS，无法使用插件和 WordPress 的其他高级功能，最适合仅进行页面样式设计。

### 隐藏您的 WordPress 测试区域

您还可以在网站服务器上关闭对 WordPress 测试站点的访问。这需要您对 .htaccess 和 Apache 有一定了解，但它能让您在互联网上继续工作的同时，不向公众暴露您的测试站点。

### 在您的计算机上安装 WordPress

如果您决心全面测试 WordPress，可以通过一些修改在个人计算机上安装 WordPress。这使您能够完全控制 WordPress 的操作和功能。您仍可使用插件、模板文件、主题，并像在互联网上一样重新设计所有内容，而无需消耗带宽或忍受缓慢的网络访问速度。我们为此提供两套说明：在计算机上全新安装 WordPress 和安装现有 WordPress 站点。我们还介绍了在计算机上完成站点开发后，如何将 WordPress 迁移至您的网站。

## 创建沙盒

**沙盒**这个术语源于儿时玩耍和堆砌沙堡的沙坑。它是一个用于实践概念和探索想象力的游乐场。WordPress 沙盒本质上是 WordPress 站点上生成页面的副本，保存到您的硬盘驱动器，供您在开发最终主题和设计站点外观时使用。

WordPress 使用不同的[模板文件](https://codex.wordpress.org/Templates)在您的站点上生成不同的视图。通常，有**首页视图**、**单篇文章视图**和用于分类、归档和搜索的**多篇文章视图**。有关 WordPress 主题结构的更多信息，请参阅[站点架构 1.5](https://developer.wordpress.org/advanced-administration/wordpress/site-architecture/)。由于不同的页面视图使用不同的 CSS 样式，您至少需要按照以下说明将三种页面视图放入沙盒中。

1.  在管理后台的“外观”屏幕中选择您要基于其进行工作的 WordPress 主题。
2.  从您的初始或测试 WordPress 站点，查看以下页面视图之一：
    *   首页
    *   单篇文章
    *   多篇文章页面
3.  在您的浏览器中：
    *   选择“文件”>“另存为”。
    *   使用上述“标题”之一命名保存的页面。
    *   将每个页面的文件保存到您的沙盒文件夹。
4.  从您的主题文件夹中，将 style.css 样式表文件复制到您的沙盒文件夹。
5.  在文本编辑器中打开您保存的三个文件，并更改以下内容：

```
<style type="text/css" media="screen">
@import url('/wp-content/themes/yourtheme/style.css');
</style>
```

改为：

```
<link rel="stylesheet" type="text/css" media="screen" href="style.css" />
```

最后，找到与样式表关联的所有图像文件和图形，例如背景图像、图标、项目符号或其他，并将它们复制到您的沙盒文件夹。样式表中指向这些项目的链接不应包含文件夹路径，或者应链接到沙盒文件夹内的子文件夹，例如：

```
header {
  margin:5px;
  padding:10px;
  background:url(images/background.jpg)....
}
```

要测试此操作，请双击该文件夹中的一个页面以在浏览器中查看。如果样式和图形可见，则表示成功。如果不可见，请检查样式表的链接。

现在，您就有了一个可以使用的沙盒。

要使用您的沙盒，请打开两个程序。一个是打开 style.css 文件的文本编辑器，另一个是浏览器，其中显示您正在处理的页面。在样式表中进行更改，保存它，然后[完全刷新](https://wordpress.org/support/topic/i-make-changes-and-nothing-happens/)浏览器屏幕并查看更改。然后重复此过程。完成一个页面后，转到下一个页面，检查这些更改，并在必要时添加更多更改。

### 沙盒使用提示

以下是在沙盒环境中操作的一些建议。

### 频繁备份

在修改过程中，进行重大调整前请将文件夹中的文件复制到备份文件夹。您也可以使用压缩工具（如 zip 程序）保存整个文件夹。若修改出现问题，您仍可使用最近的备份文件继续工作。

### 追踪 DIV 和 CLASS

开始前，请用文本编辑器逐一查看三个页面视图的源代码文件，并为每个分区的起始和结束位置添加注释。这些分区常跨越模板文件的行，难以追踪。通过记录它们的起止位置，让工作更轻松。

### 记录笔记

在进行重大变更前，请先写下你要修改的内容。这样当后续出现问题、需要追溯变更历史时，你就有笔记可以参考。

### 在代码中添加注释

当对样式表或网页源代码进行重大修改时，请在代码中添加注释。这也有助于您跟踪所做的更改。

### 小步前进

一次性进行大量更改会使你难以找出导致问题的小改动。更好的方法是采取小步骤并检查，然后进行额外的小修改并再次检查。

### 避免修改模板文件

首先应遵循现有的网站架构和样式规范。若计划公开发布主题，必须审慎考虑并谨慎处理模板文件的修改。若仅为个人使用重建网站，可先在保存的 HTML 页面源代码中调整，后续再将变更迁移至模板文件。

### 将沙盒环境迁移至主题
当您完成所有修改并对结果满意后，即可将沙盒环境移回 WordPress 主题。

1. 将 style.css 样式表文件上传至网站上的 WordPress 主题文件夹，替换旧文件。
2. 将所有图形和图像上传至主题文件夹或子文件夹。
3. 在浏览器中查看您的网站，更改应立即生效。
4. 若您修改了三个页面中任意页面的源代码，请定位到对应的具体模板文件，并在网站上的这些模板文件中进行相应修改。

### 安装另一个博客

1. 再次安装 WordPress，但在 wp-config.php 文件中使用不同的数据表前缀。
2. 在“设置”>“撰写”>“更新服务”中，清空该文本框。
3. 不要告诉任何人你的博客地址。

如果你从你的博客访问其他网站，你的网站可能会因为浏览器中的引荐来源而被发现。为防止这种情况，请先访问你的真实博客，然后再访问其他网站。

此方法在测试后期很有用，因为你可以邀请他人使用不同的浏览器或屏幕分辨率进行测试。

## 隐藏您的 WordPress 测试区域

要隐藏您的 WordPress 测试文件夹，您可以在 Apache 网络服务器上使用 `.htaccess` 文件。`.htaccess` 文件是一个存储服务器指令的文件，这些指令告诉服务器在特定情况下该做什么。您也可以使用 Apache 配置文件 (httpd.conf) 或其他方法，但 `.htaccess` 文件仅适用于其所在的文件夹及其所有子文件夹，从而允许您限制对特定文件夹的访问。

请记住，这仅在支持 `.htaccess` 的服务器上有效。如果您不确定您的服务器是否支持 `.htaccess`，请联系您的主机提供商。根据您对主机服务器的访问权限，您可能能够也可能无法执行此操作。您可能需要他们的帮助。如果您运行自己的服务器，或者您的主机提供商对此不了解，请查阅 [AllowOverride 文档](https://httpd.apache.org/docs/2.0/mod/core.html#allowoverride)。

使用 `.htaccess` 文件，您需要提供指令来告诉服务器限制或拒绝对您的 WordPress 测试站点的访问。在安装 WordPress 的文件夹或目录中，请执行以下操作：

1.  使用文本编辑器创建一个名为 `.htaccess` 的空白文本文件。
2.  您需要以下信息：
3.  - 您站点服务器上一个公众无法访问的目录的完整路径（例如 https://example.com/public_html/ 可访问，但 https://example.com/private/ 不可访问。请使用后者）。
4.  - 受保护区域的名称，例如“输入密码”或“安全区域”（这不重要，简单即可）。
5.  在文件中输入以下内容，将 `/full/path/of/directory/` 和 `Security Area` 替换为上述信息：`AuthUserFile /full/path/of/directory/.htpasswd AuthName "Security Area" AuthType Basic require valid-user`
6.  保存此 .htaccess 文件并将其上传到您想要隐藏和保护的服务器目录。这将是 WordPress 的安装目录，例如 `/wordpress/` 或 `blog`。
7.  使用 Telnet、cPanel 或其他方式访问服务器的命令面板，转到指定为 `AuthUserFile` 的目录。
8.  输入以下命令，其中 `user_name` 是访问的用户名：`htpasswd -c .htpasswd user_name`
9.  出现提示时，输入密码并确认。
10. 记下您的密码和用户名，并将其保存在安全的地方。

当您准备好向公众开放站点并移除保护时，请从相应位置删除密码文件和 `.htaccess` 文件。

强烈建议您移除默认的 ping URL 指向 [Ping-o-Matic!](https://pingomatic.com/)，否则您的测试文章将发出 ping，并且您的测试博客将被公开，尽管无法访问。

### Htaccess 资源

- [.htaccess 文件使用指南](https://httpd.apache.org/docs/2.0/howto/htaccess.html)
- [认证、授权与访问控制](https://httpd.apache.org/docs/2.0/howto/auth.html)

## 在 Mac 上安装 WordPress

使用以下说明在 Mac 上设置本地服务器环境，用于测试和开发。

- [在 Mac 上使用 MAMP 本地安装 WordPress](https://codex.wordpress.org/Installing_WordPress_Locally_on_Your_Mac_With_MAMP)

## Installing WordPress on Your Windows Desktop

In order for WordPress to work, it must have access to an Apache server, MySQL/MariaDB, and phpMyAdmin. Installing these separately can be painful. Luckily for us, [XAMPP](https://www.apachefriends.org/download.html) installs all of these with one program, allowing you to run WordPress on your computer. There are two versions of the program, Basic and Lite. The Lite version is usually adequate.

1. Download and install [XAMPP](https://www.apachefriends.org/download.html).
2. This installs by default into `C:/xampplite` or `C:\xampp`.
3. Start XAMPP from `c:\xampplite` or `c:\xampp`.
4. You may need to restart your computer to allow apache services to start.
5. In your browser, go to http://localhost/xampp.
6. In the left column under Tools, click **phpMyAdmin**.
7. Login is admin.
8. In **Create new database** enter **wordpress**.
9. In the next box, select **utf8 unicode ci**.
10. Click **Create** button.
11. Unzip your WordPress download into the `htdocs` directory `– c:\xampp\htdocs\`.
12. From the folder, open `wp-config-sample.php` in a text editor.
13. The connection details you need are as follows:
```
// ** MySQL settings ** //
define('DB_NAME', 'wordpress'); // The name of the database
define('DB_USER', 'root'); // Your MySQL username
define('DB_PASSWORD', ''); // ...and password
define('DB_HOST', 'localhost'); // 99% chance you won't need to change this
```
14. Save as `wp-config.php`.
15. Install by going to http://localhost/wordpress/wp-admin/install.php

**IMPORTANT:** It is possible to use this to actually host your blog if you have a good enough connection. If you want to do this, you MUST increase the security level. This description is NOT SECURE if you allow web access to your blog.

## 安装现有 WordPress 站点

借助 XAMPP，您可以直接在计算机上安装 WordPress 并尽情使用。这种方式完全隔离于公开环境，您的所有操作失误都不会被外界看到。当您准备就绪后，即可将其迁移至网站，供所有人访问。

### 要求

1. 能够访问您的服务器数据库。
2. 能够将整个 WordPress 安装文件下载到您的计算机。
3. [适用于 Windows 的基础版 XAMPP](https://www.apachefriends.org/download.html)
4. 硬盘上有足够的空间来容纳您的数据库、WordPress 安装文件和 XAMPP。

### 备份 WordPress

![phpMyAdmin MySQL 数据库](https://user-images.githubusercontent.com/6118303/189545243-6ac55696-9f98-41fe-ab06-061c505f5ab2.png)

首先，完整备份您的 WordPress 站点，包括文件和数据库。这将确保您有一个完好的副本可以回退，以防万一。

然后需要对您的数据库进行第二次备份，但这需要您先做一些清理工作。

通常情况下，WordPress 数据库中存在统计表，这些表包含大量数据，会增加数据库的整体大小，并减慢备份和下载数据库备份副本的过程。您不必清除这些数据，但通常认为这样做是个好主意。

1.  登录您网站服务器上的 PHPMyAdmin。
2.  在主登录界面，选择 **数据库**。
3.  选择您的 WordPress 数据库名称。
4.  从屏幕顶部的标签中，选择 **导出**。
5.  在[导出部分](https://wordpress.org/documentation/files/2018/11/phpmyadmin-export-tab.jpg)顶部的框架中，您将看到数据库中的表列表。
6.  您需要仅选择与您的 WordPress 安装对应的那些表。它们将是您在 `wp-config.php` 文件中找到的带有 `table_prefix` 的表。如果只安装了 WordPress，则从左侧列中选择 **全选**。
7.  确保选中 SQL 按钮。
8.  在面板右侧，确保勾选以下复选框。

![phpMyAdmin 导出界面](https://user-images.githubusercontent.com/6118303/189546285-35103e54-cba6-42ee-86ea-8ea480bf1630.png)

-   结构
-   添加 AUTO_INCREMENT 值
-   用反引号括住表和字段名
-   数据 勾选"另存为文件"选项，并保持模板名称不变。
-   对于压缩，选择 **无**。点击 **执行**。
-   系统应提示您下载一个文件。将该文件保存到您的计算机。根据数据库大小，这可能需要一些时间。

### 下载 WordPress
现在，将整个 WordPress 站点下载到您的计算机。这通常通过 [FTP 客户端程序](https://developer.wordpress.org/advanced-administration/upgrade/ftp/) 完成。请确保包含根目录或 WordPress 目录中的所有核心 WordPress 文件，包括 `index.php`。

此时您的计算机上应包含以下两项：

1. 一个或多个数据库备份。
2. 所有 WordPress 文件、文件夹和图片目录。

请再次将备份文件复制到计算机上的安全位置，以便在下一阶段处理备份副本。

### 安装基础版 XAMPP

1. 安装 XAMPP。默认情况下，它将安装到 `C:\xampp`。
2. 进入 `C:\xampp\apache\conf`，用[文本编辑器](https://wordpress.org/documentation/article/wordpress-glossary/#Text%20editor)打开名为 `httpd.conf` 的文件。
3. 大约在第 166 行，你会找到：`#LoadModule rewrite_module modules/mod_rewrite.so`。
4. 删除 # 并保存文件（这将启用 `mod_rewrite`）。
5. 在 `C:\xampp\htdocs` 内创建一个文件夹。这将是用于 WordPress 的。
6. 将所有下载的 WordPress 文件（不包括 sql 备份）复制到该目录中。
7. 使用文本编辑器，打开你 WordPress 安装中的 `wp-config.php` 文件。
8. 更改新 MySQL 连接的详细信息：
```
// ** MySQL 设置 ** //
define('DB_NAME', 'wordpress'); // 你创建的新数据库的名称
define('DB_USER', 'root'); // 保持原样
define('DB_PASSWORD', ''); // 保持为空
define('DB_HOST', 'localhost'); // 99% 的情况下你不需要更改此项
```
9. 你的主 `index.php` 文件应位于 `/htdocs` 文件夹或子目录中，例如 `/htdocs/wordpress/`。请记下这个路径。
10. 通过点击橙色的 `xampp_start.exe` 或使用 `Program Files \ApacheFriends\XAMPP\XAMPP Control Panel` 中的控制台程序来启动 XAMPP。
11. 一旦它开始运行，点击左侧边栏中的 phpMyAdmin 链接。
12. 创建一个数据库。名称应与你在 `wp-config.php` 文件中使用的名称匹配。

### Importing Your SQL Backup File

Before you begin to import your SQL backup file, you need to change some information inside your `.SQL` file.

1. Using your text editor, open the `.sql` backup database file you downloaded.
2. Find and replace all the instances of your old URL with your new URL. For instance if your blog address is at https://example.com/wordpress/, and your files on your computer are at `/htdocs/wordpress/`, replace it with http://127.0.0.1/wordpress/.
3. Click **Save – Do not use Save as**.

![phpMyAdmin SQL tab](https://user-images.githubusercontent.com/6118303/189546617-26a843c4-e793-4c44-b2a6-13a32b366a8e.png)

Now it is time to import your sql file. From within the phpMyAdmin on your computer, click on **your database name**, then choose the **SQL** tab. From this screen, click **Browse** and find your backup files on your computer. Click **Go**. This can take a few minutes to import.

![Success message](https://user-images.githubusercontent.com/6118303/189546659-7e3cefe1-1744-4458-ac49-98fbd04626c5.png)

Once the procedure is complete, your database will be restored and will work just as it did before. If something goes wrong with this last part of the process, it could be that either your backup was corrupted in some way, or something went wrong with the database itself. **Keep your backup files safe!**

If everything so far has gone well, it is now time to visit your blog! In your browser, type in http://127.0.0.1/wordpress/index.php or the actual name of the folder you created for your WordPress files.

If you get a 404, check you have the right place. You do not need to put htdocs or xampp or anything else after the http://127.0.0.1/ except use your directory name.

WordPress should now function just as it did on the web. You do not need to use the built-in editor in WordPress to alter your files. Just open the files directly in a text editor and edit them as you would any other file. Refreshing your browser’s web page will then show the effects.

### 将测试版 WordPress 站点迁移至您的网站

即将推出 – 如何将您电脑上的测试站点重新部署到主机服务器上。

### 资源
- [qSandbox.com – 创建免费的 WordPress 测试站点来试用（新）插件和主题](https://qsandbox.com/app/)

# 版本控制

版本控制是一种追踪不同人员随时间对文件（如网站代码或其他应用程序）所做更改的方式。它允许人们追踪代码的修订历史，并通过命令行轻松回滚或应用更改。当网站出现问题时，这也是调试的好方法，因为您可以快速恢复到网站代码的先前状态，而无需从完整备份中恢复。

许多 WordPress 主机提供版本控制功能，但也有第三方服务和自托管选项可供选择。

# 网络管理员

## 网络管理员

**网络管理员界面**是管理 WordPress [多站点（或网络）](https://wordpress.org/documentation/article/glossary#multisite)功能所需各项设置的中心入口。以下信息专门面向网络管理员。其他用户应查阅[管理界面](https://wordpress.org/documentation/article/administration-screens/)了解 WordPress 使用信息。

网络管理员链接仅在您[创建网络](https://developer.wordpress.org/advanced-administration/multisite/create-network/)后可见。该菜单将出现在菜单栏右上角，且仅对超级管理员可见。它已被移至管理区域内的独立位置，只要您以超级管理员身份登录，即可从任何站点的管理区域访问。

访问网络管理员界面时，您将看到仪表盘界面。其外观与站点仪表盘相似，但增加了一个额外的小工具，并移除了站点特定的小工具。"当前概况"小工具提供快速链接至"创建站点"和"创建用户"界面，同时包含可快速查找站点和用户的搜索框。

每个界面均通过主导航菜单访问，如下方框所示。这些框中的链接将引导您至本文描述对应界面的章节。通过这些章节，您可以导航至详细说明每个界面的文章。

### 仪表盘 {#dashboard}

仪表盘是信息中心，展示您的网络站点信息，提供 WordPress 社区动态，允许管理插件，并显示其他 WordPress 相关资讯。

### 站点 {#sites}

使用[网络管理站点屏幕](https://developer.wordpress.org/advanced-administration/multisite/admin/#network-admin-sites-screen)来查看和管理网络中各个站点。这些站点根据网络配置方式，可能是子目录站点或子域名站点。在此屏幕中，您可以访问网络中每个站点的信息、用户、主题和设置。

使用[添加新站点屏幕](https://developer.wordpress.org/advanced-administration/multisite/admin/#add-site)向网络添加新站点。

### 用户 {#users}

[网络管理员用户界面](https://codex.wordpress.org/Network_Admin_Users_Screen)是网络管理员人员管理用户的地方，而[添加新用户界面](https://codex.wordpress.org/Network_Admin_Users_Screen#Add_User)则用于添加新用户。

### 主题 {#themes}

[网络管理员主题屏幕](https://codex.wordpress.org/Network_Admin_Themes_Screen) 允许您控制站点管理员可以为每个站点使用哪些主题。它不会激活或停用站点当前正在使用的主题。如果网络管理员禁用了正在使用的主题，该主题仍可在该站点保持选中状态。如果选择了另一个主题，被禁用的主题将不会出现在站点的外观 > 主题屏幕中。网络管理员可以在站点编辑屏幕（通过站点屏幕上的编辑操作链接进入）上逐个站点启用主题。

要添加新主题，请参阅[添加新主题](https://codex.wordpress.org/Network_Admin_Themes_Screen#Add_New_Theme)以了解为您的网络查找和安装新主题的流程。

使用主题编辑器来编辑构成您主题的各种文件。[主题编辑器屏幕](https://codex.wordpress.org/Network_Admin_Themes_Screen#Theme_Editor)允许您指定要编辑的主题，然后显示该主题中的文件。主题中的每个文件（模板和CSS）都可以在大文本框中编辑。

### 插件 {#plugins}

[网络管理插件界面](https://codex.wordpress.org/Network_Admin_Plugins_Screen) 允许您为 WordPress 网络添加默认安装中未包含的新功能。WordPress 拥有丰富多样的可用插件，插件的安装和管理非常简便。

请参阅 [添加新插件](https://codex.wordpress.org/Network_Admin_Plugins_Screen#Add_New_Plugins) 来添加新插件。有关下载和安装插件的信息，请参见 [管理插件](https://wordpress.org/documentation/article/manage-plugins/)。

使用 [插件编辑器](https://codex.wordpress.org/Network_Admin_Plugins_Screen#Plugin_Editor)，您可以修改所有插件的源代码。

### 设置 {#settings}

[网络管理员设置界面](https://wordpress.org/documentation/article/network-admin-settings-screen/)是网络管理员为整个网络设置和修改配置的地方。网络中的第一个站点是主站点，网络设置是从该原始站点的选项中获取的。

此外，可以访问在[创建网络](https://developer.wordpress.org/advanced-administration/multisite/create-network/)时使用的[网络设置](https://wordpress.org/documentation/article/network-admin-settings-screen/)信息。

### 更新 {#updates}

[网络管理员更新屏幕](https://developer.wordpress.org/advanced-administration/multisite/admin/)控制网络和站点的更新流程。在[可用更新屏幕](https://developer.wordpress.org/advanced-administration/multisite/admin/#available-updates)中，您可以更新 WordPress 核心、主题和插件。在您更新到最新版本的 WordPress 后，可以从[升级网络屏幕](https://wordpress.org/documentation/article/network-admin-updates-screen/#upgrade-network)升级网络上的所有站点。

## 网络管理站点界面

**网络管理站点界面** 允许您在[网络](https://wordpress.org/documentation/article/glossary#network)中添加新站点并管理现有站点。

[![](https://i1.wp.com/wordpress.org/support/files/2019/02/superadmin-sites.png?fit=1277%2C443&ssl=1)](https://wordpress.org/documentation/superadmin-sites-2/)
_超级管理员站点_

### 站点 {#sites}

列出此网络上的所有站点。
- **编辑**：点击此链接进入编辑站点界面，以查看/编辑站点设置并添加用户。
- **仪表盘**：将管理界面切换至该站点的仪表盘。
- **停用 / 激活**：停用或激活站点。
- **归档**：归档站点（效果等同于停用）。
- **标记为垃圾**：将站点标记为垃圾站点。这将使其对所有人不可用。
- **删除**：删除站点。
- **访问**：前往该网站。

#### 添加站点 {#add-site}

填写各项并点击 _添加站点_ 按钮，将新站点加入您的网络。

- **站点地址**：仅允许使用字符 a-z 和 0-9。  
- **站点标题**：站点的名称。  
- **管理员邮箱**：新站点管理员的电子邮件地址。如果上述邮箱地址不在数据库中，将创建一个新用户。  
用户名和密码将发送到此邮箱地址。

#### 编辑站点 {#edit-site}

编辑站点界面分为多个标签页以便于数据管理。强烈建议除非您确定知道自己在做什么，否则不要编辑这些字段。

**基本信息**

此部分数据为站点的基本信息。包括域名、注册日期、最后更新时间，以及是否公开或包含成人内容。

[![](https://i2.wp.com/wordpress.org/support/files/2019/02/superadmin-sites-edit.png?fit=1277%2C633&ssl=1)](https://wordpress.org/documentation/superadmin-sites-edit/)
_编辑站点 – 超级管理员_

- **用户**：用户列表显示站点的所有用户。还提供添加新用户的选项，可通过“添加现有用户”（即网络中已有的用户）或“添加新用户”（即网络中的新用户）实现。
- **主题**：主题显示站点上的所有主题。网络启用的主题不会在此界面显示。
- **设置**：所有站点设置都存储在此表中。除非您知道自己在做什么，否则请勿在此处编辑任何内容。

## 网络管理员更新界面

**网络管理员更新界面**控制网络中的更新流程。当有可用更新时，工具栏和导航菜单中会显示通知。保持站点更新对安全至关重要，也能为您和读者营造更安全的网络环境。在[网络管理员](https://developer.wordpress.org/advanced-administration/multisite/admin/) > [更新](https://developer.wordpress.org/advanced-administration/multisite/admin/#updates)下有两个界面：默认的[可用更新界面](#available-updates)可更新WordPress、主题和插件；升级至最新WordPress版本后，可通过[网络升级界面](#upgrade-nework)升级网络中的所有站点。

### 可用更新 {#available-updates}

在此[可用更新屏幕](#available-updates)上，您可以更新到最新版本的 WordPress，并更新来自 [WordPress.org](https://wordpress.org/) 存储库的主题和插件。

[![](https://wordpress.org/documentation/files/2019/04/network-available-updates-1024x590.png)](https://wordpress.org/documentation/files/2019/04/network-available-updates.png)

#### 如何更新 {#how-to-update}

**WordPress**：更新您的 WordPress 安装是一个简单的单步操作：当收到新版本可用通知时，只需点击“立即更新”按钮。在大多数情况下，WordPress 会自动在后台为您应用维护和安全更新。

**主题和插件**：要在此界面更新单个主题或插件，请使用复选框进行选择，然后点击相应的“更新”按钮。要一次性更新所有主题或插件，您可以在点击更新按钮前，勾选该部分顶部的复选框以全选。

**翻译**：翻译文件会在需要时更新。当收到新翻译可用通知时，点击“更新翻译”按钮。

### 升级网络 {#upgrade-network}

此[升级网络页面](#upgrade-network)用于在[WordPress 升级](#available-updates)完成后，升级[网络](https://wordpress.org/documentation/article/glossary#network)中的所有站点。WordPress 升级后，系统会提示您访问**升级网络**，并显示类似“感谢更新！请访问升级网络页面以升级您的所有站点。”的消息。

[![](https://i1.wp.com/wordpress.org/support/files/2019/04/superadmin-update.png?fit=1024%2C584&ssl=1)](https://wordpress.org/documentation/files/2019/04/superadmin-update.png)

升级网络功能将逐步处理每个站点（每次五个），确保应用所有数据库更改。此菜单项仅当您以超级管理员角色用户登录时才可见。您可以从网络中的任何站点访问它。

如果因任何原因某个站点未升级，当该站点的管理员登录其管理后台时，每个站点都应被升级。已停用的站点不会通过此过程升级，但如果站点被重新激活，当该站点的管理员登录其仪表盘时，站点将得到升级。

**升级网络** 点击此按钮开始升级过程。点击升级网络按钮将逐步处理网络中的每个站点（每次五个），确保应用所有数据库更新。

如果核心版本未发生更新，点击此按钮不会产生任何影响。

# 多站点网络管理

在[创建多站点网络](https://developer.wordpress.org/advanced-administration/multisite/create-network/)后，由于多站点的额外复杂性，您可能需要了解一些高级管理知识。即使您熟悉 WordPress，多站点网络管理的结构和行为起初也可能令人困惑。

## 用户访问与权限 {#user-access-capabilities}

默认情况下，添加到您网络的所有用户都将拥有对**所有站点**的*订阅者*访问权限。若要在各个站点为用户分配不同的默认角色，您需要使用插件。

在 WordPress 多站点网络中，站点管理员角色的权限也有所缩减。站点管理员无法安装新主题或插件，也无法编辑其站点上的用户个人资料。只有网络管理员（又称超级管理员）才具备在 WordPress 多站点网络中执行这些任务的权限。

## 子文件夹安装中的固定链接 {#permalinks-in-subfolder-installs}

虽然固定链接仍能正常工作，但主站点（即第一个创建的站点）会多出一个 `blog` 条目，使你的网址显示为 `domain.com/blog/YYYY/MM/POSTNAME`。

这是有意设计的，旨在防止与子文件夹安装发生冲突。目前没有简便的方法来更改此设置，因为这样做会阻止 WordPress 自动检测主站点与任何子站点之间的冲突。此问题将在未来版本的 WordPress 中得到解决并支持自定义。

还需注意，`blog` 前缀不用于静态页面，静态页面可直接通过基础地址访问，例如 `domain.com/PAGENAME`。如果你尝试在第一个站点中创建一个与网络中现有站点同名的静态页面，该页面的固定链接将获得后缀（例如 `domain.com/PAGENAME-2`）。如果你使用现有静态页面的别名创建新站点，该静态页面将无法再访问。为防止这种情况，你可以将静态页面的名称添加到黑名单中，从而阻止创建具有该名称的站点。

## 上传文件路径 {#uploaded-file-path}

全新安装后，您的第一个站点上传文件将存储在传统位置 `/wp-content/uploads/`，但网络中的所有*后续*站点将位于 `/wp-content/uploads/sites/` 文件夹中，每个站点根据数据库指定的站点编号拥有自己的子文件夹。这些文件可通过该 URL 访问。

这与 Multisite 3.0-3.4.2 版本不同，当时子站点的图片存储在 `/wp-content/blogs.dir/` 中，并通过 https://example.com/files/ 和 https://example.com/sitename/files 等 URL 显示。如果您使用的 Multisite 安装版本早于 3.5，即使图片显示为 `/files/` 的 URL，也*不是*错误。

无论 WordPress 版本如何，站点管理员都无法更改这些位置。只有网络管理员可以在站点设置页面进行更改。不建议在不理解 `ms-files.php` 如何与您的 `.htaccess` 协同工作的情况下更改这些设置，否则很容易导致功能失效。如果 `/files/` 的 URL 无法工作，通常表明服务器上的 `.htaccess` 或 `httpd.conf` 文件配置有误。

## 插件 {#plugins}

插件现在根据其在网络中的实现方式拥有额外的灵活性。所有插件都安装在网络仪表盘的插件页面，可以按站点或整个网络激活。

* **站点特定插件：** 这些插件在单个特定站点的插件页面内激活。某些插件（例如联系表单）在单站点激活时效果最佳，这样它们可以将数据和设置存储在该单个站点的数据库表中，而不是整个网络的表中。要单站点激活/停用的 WordPress 插件存储在插件目录中。
* **网络插件：** 网络管理员可以在网络管理仪表盘中“网络激活”插件。一旦“网络激活”，插件将在所有站点中变为活动状态。“网络激活”的插件在单个站点的仪表盘插件列表中会显示为“网络活动”。某些插件仅在网络激活时才能在多站点环境中运行。网络激活的 WordPress 插件也存储在插件目录中。
* **必须使用插件：** 整个网络中所有站点都要使用的插件也可以作为单个文件或包含子文件夹的文件安装在 mu-plugins 目录中。文件夹内的任何文件都不会被读取。这些文件不会被激活或停用；如果存在，就会被使用。这些插件完全不会出现在按站点的插件列表中。

并非存储库中的所有插件都能在多站点环境中工作。请查阅插件的存储库页面或联系开发者，以了解特定插件是否能在多站点网络中运行。

如果您希望单站点管理员能够为其站点激活/停用站点特定插件，您需要从网络管理的设置 -> 网络设置菜单（“菜单设置”）中为单站点管理员启用插件页面。网络管理员始终可以访问每个站点的插件。单站点的管理员将能够激活和停用未网络激活的插件，但会看到网络激活的插件显示为“网络活动”，且没有停用或设置的选项。

有一些插件可以帮助批量激活/停用单个站点的插件。

## 主题 {#themes}

所有主题均为整个网络安装。如果您编辑某个主题的代码，即为所有使用该主题的站点进行编辑。您可以安装插件 [WP Add Custom CSS](https://wordpress.org/plugins/wp-add-custom-css/) 来允许每个站点调整自己的 CSS，而不影响其他站点。此外，单个站点可以使用主题定制器，其设置将仅存储在其站点的数据库表中。

“网络激活”一个主题并不会使其在每个站点上成为活动主题，而仅仅是使其可在所有单个站点上被激活。要在单个站点的仪表盘中可供激活，主题必须在网络管理中通过“网络激活”或在“编辑站点 - 主题”选项卡中启用。在单个站点中激活主题后，可以网络停用它，而不会影响其保持激活状态的单个站点。

默认情况下，WordPress 将最新的“Twenty ...”主题分配给所有新站点。可以通过在 `wp-config.php` 文件中添加类似 `define('WP_DEFAULT_THEME', 'classic');` 的行来自定义此设置，其中“classic”替换为您主题的文件夹名称。

## 分类与标签 {#categories-and-tags}

WordPress 3.0 不支持全局术语（即在网络中的站点间共享标签和分类）。您可以使用插件在网站门户/首页或网络内的特定页面或站点上整合全局标签，以增强基于微分类内容的导航。

## 站点间内容共享 {#content-sharing-between-sites}

网络中的站点是独立的，默认不共享内容。可以将您的网络视为 WordPress.com 的迷你版。有几款插件可以帮助您在站点间共享内容，[例如这款](https://wordpress.org/plugins/network-posts-extended/)。

## 切换网络类型 {#switching-network-types}

可以在基于域名（子域名）和基于路径（子目录）的多站点安装类型之间进行切换。如果您在单站点上安装 WordPress 已超过一个月，并尝试将该站点激活为网络，系统会提示您使用**子域名**站点。这是为了确保页面（例如 example.com/pagename）和站点（例如 example.com/sitename）之间不会发生冲突。如果您确信不会出现此问题，则可以在完成初始设置后进行更改。

在您的 `wp-config.php` 文件中，需要更改 `SUBDOMAIN_INSTALL` 的定义调用：
对于基于域名的网络（子域名安装）

```
define( 'SUBDOMAIN_INSTALL', true );
```

对于基于路径的网络（子目录安装）

```
define( 'SUBDOMAIN_INSTALL', false );
```

您还需要将 `.htaccess` 文件更改为新的设置。可以转到网络管理员 — 设置 — 网络设置以查找新的 `.htaccess` 规则，或参见下文。

请注意，根据[设置要求](https://developer.wordpress.org/advanced-administration/multisite/prepare-network/#WordPress_Settings_Requirements)，在 `127.0.0.1` 或 `localhost` 上运行时，无法从**子目录**切换到**子域名**。这可能会由于 Cookie 处理导致根站点出现 reauth=1 的无限循环。

## Apache 虚拟主机与 Mod Rewrite {#apache-virtual-hosts-and-mod-rewrite}

要使 mod_rewrite 在 Apache 虚拟主机中正常工作，您可能需要在 DocumentRoot 上设置一些选项。

```
<VirtualHost *:80>
	...
	DocumentRoot /var/www/vhosts/wordpress
	<Directory /var/www/vhosts/wordpress>
		AllowOverride Fileinfo Options
	</Directory>
	...
</VirtualHost>
```

在某些情况下，您需要将 AllowOverride 设置为 All，以确保所有 htaccess 规则生效。

## .htaccess 与 Mod Rewrite {#htaccess-and-mod-rewrite}

与单站点 WordPress 不同，后者可以使用"不美观"的[固定链接](https://wordpress.org/documentation/article/customize-permalinks/)工作，因此不需要 Mod Rewrite，而多站点网络*必须*使用它来格式化子站点的 URL。这就需要使用 .htaccess 文件，如果您使用子文件夹或子域名，其格式会略有不同。以下示例是当 WordPress 安装在网站根目录时，用于 WordPress 子文件夹和子域名的标准 .htaccess 条目。如果 WordPress 安装在它自己的文件夹中，您需要相应地更改 RewriteBase 的值。

提醒一下，这些是**示例**，适用于大多数安装，但并非全部。

**子文件夹示例**

WordPress 3.0 至 3.4+

```
# BEGIN WordPress
RewriteEngine On
RewriteBase /
RewriteRule ^index.php$ - [L]

# 上传的文件
RewriteRule ^([_0-9a-zA-Z-]+/)?files/(.+) wp-includes/ms-files.php?file=$2 [L]

# 为 /wp-admin 添加尾部斜杠
RewriteRule ^([_0-9a-zA-Z-]+/)?wp-admin$ $1wp-admin/ [R=301,L]

RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]
RewriteRule ^[_0-9a-zA-Z-]+/(wp-(content|admin|includes).*) $1 [L]
RewriteRule ^[_0-9a-zA-Z-]+/(.*\.php)$ $1 [L]
RewriteRule . index.php [L]
# END WordPress
```

WordPress 3.5+ *仅当您在 3.5 版本上开始使用多站点网络时使用此规则。如果您是从 3.4 升级到 3.5，请使用旧的规则！*

```
# BEGIN WordPress
RewriteEngine On
RewriteBase /
RewriteRule ^index.php$ - [L]

# 为 /wp-admin 添加尾部斜杠
RewriteRule ^([_0-9a-zA-Z-]+/)?wp-admin$ $1wp-admin/ [R=301,L]

RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]
RewriteRule ^([_0-9a-zA-Z-]+/)?(wp-(content|admin|includes).*) $2 [L]
RewriteRule ^([_0-9a-zA-Z-]+/)?(.*\.php)$ $2 [L]
RewriteRule . index.php [L]
# END WordPress
```

**子域名示例**

WordPress 3.0 至 3.4+

```
# BEGIN WordPress
RewriteEngine On
RewriteBase /
RewriteRule ^index.php$ - [L]

# 上传的文件
RewriteRule ^files/(.+) wp-includes/ms-files.php?file=$1 [L]

RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]
RewriteRule . index.php [L]
# END WordPress
```

WordPress 3.5+

```
# BEGIN WordPress
RewriteEngine On
RewriteBase /
RewriteRule ^index.php$ - [L]

# 为 /wp-admin 添加尾部斜杠
RewriteRule ^wp-admin$ wp-admin/ [R=301,L]

RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]
RewriteRule ^(wp-(content|admin|includes).*) $1 [L]
RewriteRule ^(.*\.php)$ wp/$1 [L]
RewriteRule . index.php [L]
# END WordPress
```

**旧版 WPMU 安装的问题**

如果您将 WordPress MU 安装在子文件夹/子目录中（不是通过 ftp 安装在服务器的根目录），并且遇到图片库问题，缩略图和图片不显示，您可能需要手动为您的文件目录添加重写规则，如下所示：

```
RewriteRule ^([_0-9a-zA-Z-]+/)?siteN/files/(.+) wp-content/blogs.dir/N/files/$2 [L]
```

将这些规则放在常规上传文件调用的 _下方_。

## 网络管理员链接位置 {#network-admin-link-location}

网络管理员链接的位置随每个 WordPress 主要版本而变动，因为此功能仍在完善中。根据您使用的 WordPress 版本，该链接可在以下位置找到：

* 3.0 – 名为 _超级管理员_ 的菜单
* 3.1 – 在管理页头 "您好，YOURNAME" 旁
* 3.2 – 在管理页头，作为 "您好，YOURNAME" 下的下拉菜单
* 3.3+ – 在管理工具栏，作为 "我的站点" 下的下拉菜单

## 域名映射 {#domain-mapping}

在 WordPress 4.5 之前，域名映射需要插件支持。自 WordPress 4.5 起，域名映射成为多站点网络的原生功能。请访问 [WordPress 多站点域名映射](https://developer.wordpress.org/advanced-administration/multisite/domain-mapping/) 了解如何使用此功能。

## 迁移多站点 {#moving-multisite}

迁移多站点比迁移单站点安装更为复杂。在继续操作前，请先阅读[迁移 WordPress 多站点](https://developer.wordpress.org/advanced-administration/upgrade/migrating/#moving-wordpress-multisite)。

## 导入到网络 {#importing-into-a-network}

当你创建了用于导入其他站点的 WordPress 网络后，需要查阅 [将多个博客迁移到 WordPress 多站点](https://wordpress.org/documentation/article/migrating-multiple-blogs-into-wordpress-multisite/) 这篇文章。

# 创建网络

您可以使用[多站点](https://wordpress.org/documentation/article/glossary/#multisite)功能创建一个[站点](https://wordpress.org/documentation/article/glossary/#site)[网络](https://wordpress.org/documentation/article/glossary/#network)。本文包含创建多站点网络的说明。建议先阅读文章“[创建网络前的准备](https://developer.wordpress.org/advanced-administration/multisite/prepare-network/)”，其中包含关于规划网络的重要信息。

多站点网络可以非常类似于您个人版的 WordPress.com。您网络的最终用户可以按需创建自己的站点，就像 WordPress.com 的最终用户可以按需创建博客一样。如果您不需要允许最终用户按需创建自己的站点，您可以创建一个多站点网络，其中只有您（管理员）可以添加新站点。

多站点网络是一组共享相同 WordPress 安装核心文件的站点集合。它们还可以共享插件和主题。网络中的各个站点是*虚拟*站点，因为它们没有在服务器上拥有自己的目录，尽管它们在共享安装中有独立的媒体上传目录，并且在数据库中有独立的表。**注意：**[升级后找不到网络管理菜单？](https://developer.wordpress.org/advanced-administration/multisite/administration/#network-admin-link-location)

## 步骤 0：准备工作 {#step-0-before-you-begin}

与典型的单站点 WordPress 安装相比，网络安装需要考虑更多事项。您必须决定使用子域名还是子目录，以及如何管理它们。安装主题和插件的方式也不同：例如，网络中的每个独立站点都可以激活两者，但都不能安装。

BitNami 也提供[即用型安装包](https://codex.wordpress.org/User:Beltranrubo/BitNami_Multisite)。

**请务必完整阅读[创建网络前的准备工作](https://developer.wordpress.org/advanced-administration/multisite/prepare-network/)，然后再继续。**

## 步骤 1：准备您的 WordPress {#step-1-prepare-your-wordpress}

创建网络时，您现有的 WordPress 站点将被更新。除非这是一个全新安装且您不会丢失任何内容，否则请[备份您的数据库和文件](https://developer.wordpress.org/advanced-administration/security/backup/)。

请确认[固定链接](https://wordpress.org/documentation/article/using-permalinks/)在您的单个 WP 实例上正常工作。

同时，请停用所有已启用的插件。您可以在网络创建完成后重新激活它们。

如果您计划[将 WordPress 从其自身目录中移出运行](https://developer.wordpress.org/advanced-administration/server/wordpress-in-directory/)，请在启用多站点功能*之前*完成此操作。

## 步骤 2：启用多站点功能 {#step-2-allow-multisite}

要启用“网络设置”菜单项，您必须先在 [wp-config.php](https://developer.wordpress.org/advanced-administration/wordpress/wp-config/) 文件中定义多站点。

打开 `wp-config.php` 文件，在出现 `/* That's all, stop editing! Happy publishing. */` 的**上方**添加以下代码行。如果文件中没有该行，则在第一个以 `require` 或 `include` 开头的代码行之前添加：

```
/* Multisite */
define( 'WP_ALLOW_MULTISITE', true );
```

您需要刷新浏览器才能继续。

## 步骤 3：安装网络 {#step-3-installing-a-network}

上一步操作使您的**工具菜单**中启用了**网络设置**项。使用该菜单项进入**创建 WordPress 站点网络**屏幕。

要查看创建 WordPress 站点网络屏幕的示例，请参阅[管理](https://wordpress.org/documentation/article/administration-screens/) > [工具](https://wordpress.org/documentation/article/administration-screens/#tools-managing-your-blog) > [网络设置](https://wordpress.org/documentation/article/tools-network-screen/)。该屏幕在所有情况下看起来并不完全相同。显示的示例是针对 `localhost` 上的安装，这限制了可用的选项。

[![创建 WordPress 站点网络页面](https://i0.wp.com/wordpress.org/support/files/2018/11/network-create.png?fit=1024%2C743&ssl=1)](https://i0.wp.com/wordpress.org/support/files/2018/11/network-create.png?fit=1024%2C743&ssl=1)
_创建 WordPress 站点网络页面_

**网络中站点的地址**

您可以在子域名和子目录之间进行选择，除非[现有设置](https://developer.wordpress.org/advanced-administration/multisite/prepare-network/#wordpress-settings-requirements)限制了您的选择。

您必须选择其中一种。尽管屏幕上有建议，但您可以在安装后将网络重新配置为使用另一种选择，但重新配置可能并不容易。

尽管屏幕上可能有建议，但您只需要为按需的基于域名的站点配置通配符 DNS。

再次提醒：请参阅[创建网络之前](https://developer.wordpress.org/advanced-administration/multisite/prepare-network/)。

*   **子域名** — 一种基于域名的网络，其中按需站点使用子域名
*   **子目录** — 一种基于路径的网络，其中按需站点使用路径

**网络详细信息**

这些信息会自动填充，但您可以进行更改。`服务器地址`：您用于访问 WordPress 安装的 URL 的域名。`网络标题`：您整个网络的标题。`网络管理员电子邮件`：您作为整个网络超级管理员的电子邮件地址。

仔细核对详细信息，然后按**安装**按钮。

**注意：** 当您尚未配置通配符子域名，或者根本不需要它们时，安装程序可能会检查通配符子域名。如果警告不适用于您的网络，请忽略它。有关通配符子域名的信息，请参阅[创建网络之前](https://developer.wordpress.org/advanced-administration/multisite/prepare-network/)中的[服务器要求](https://developer.wordpress.org/advanced-administration/multisite/prepare-network/#server-requirements)部分。

## 步骤 4：启用网络 {#step-4-enabling-the-network}

要启用您的网络，请按照"创建 WordPress 站点网络"屏幕上的说明操作。您看到的说明是针对您的安装定制的，可能与您在此处看到的示例不同。

[![创建站点网络时已填充的设置](https://i0.wp.com/wordpress.org/support/files/2018/11/tools-network-created.png?fit=1024%2C742&ssl=1)](https://i0.wp.com/wordpress.org/support/files/2018/11/tools-network-created.png?fit=1024%2C742&ssl=1)
_创建站点网络时已填充的设置_

备份您现有的 `wp-config.php` 和 `.htaccess` 文件，除非这是全新安装且您没有需要保留的内容。

有两个步骤：

1.  将指定的行添加到您的 [wp-config.php](https://developer.wordpress.org/advanced-administration/wordpress/wp-config/) 文件中。这些额外的行应添加在您于[步骤 1：准备您的 WordPress](https://developer.wordpress.org/advanced-administration/multisite/create-network/#step-1-prepare-your-wordpress) 中添加的那一行之后。
2.  将指定的行添加到您的 `.htaccess` 文件中。如果您没有 `.htaccess` 文件，请在 `wp-config.php` 文件所在的目录中创建它。如果您*已经*有一个 `.htaccess` 文件，请用这些新行替换任何现有的 WordPress 相关行。在某些情况下，您可能还需要在文件开头添加 `Options FollowSymlinks`。

完成这些步骤后，使用提供的链接重新登录。您可能需要清除浏览器的缓存和 Cookie 才能登录。

## 步骤 5：网络管理员设置 {#step-5-network-admin-settings}

[![](https://i0.wp.com/wordpress.org/support/files/2018/11/network-admin-link.png?fit=383%2C184&ssl=1)](https://i0.wp.com/wordpress.org/support/files/2018/11/network-admin-link.png?fit=383%2C184&ssl=1)

在 WordPress 工具栏左侧，**我的站点**现在是第二项。在那里，列出了您的所有站点，带有便捷的弹出菜单，以及一个**网络管理员**菜单项。在**网络管理员**下，您可以使用**仪表盘**项转到网络仪表盘屏幕。

前往[设置屏幕](https://developer.wordpress.org/advanced-administration/multisite/admin/)配置网络选项，并前往[站点屏幕](https://developer.wordpress.org/advanced-administration/multisite/admin/#Sites)管理您的站点。

更多信息，请参阅：[网络管理员](https://developer.wordpress.org/advanced-administration/multisite/admin/)

[已升级但找不到网络管理员菜单？](https://developer.wordpress.org/advanced-administration/multisite/administration/#network-admin-link-location)

## 步骤 6：管理 {#step-6-administration}

由于多站点的额外复杂性，你可能需要了解一些关于网络高级管理的额外知识。即使你熟悉 WordPress，多站点网络管理的位置和行为也可能令人困惑。

阅读 [多站点网络管理](https://developer.wordpress.org/advanced-administration/multisite/administration/) 以获取更多信息。

如需故障排除帮助：

* [调试 WordPress 网络](https://developer.wordpress.org/advanced-administration/debug/debug-network/)

## 相关文章 {#related-articles}

* [托管 WordPress](https://wordpress.org/documentation/article/hosting-wordpress/)
* [安装多个博客](https://developer.wordpress.org/advanced-administration/before-install/multiple-instances/)
* [如何让我的插件适配多站点？](https://stackoverflow.com/questions/13960514/how-to-adapt-my-plugin-to-multisite/)

# WordPress Multisite Domain Mapping

WordPress multisite subsites may be mapped to a non-network top-level domain. This means a site created as subsite1.networkdomain.com, can be mapped to show as domain.com. This also works for subdirectory sites, so networkdomain.com/subsite1 can also appear at domain.com. Before setting up domain mapping, make sure your network has been correctly set up, and subsites can be created without issues.

Before WordPress 4.5, domain mapping requires a domain mapping plugin like [WordPress MU Domain Mapping](https://wordpress.org/plugins/wordpress-mu-domain-mapping).

In WordPress 4.5+, domain mapping is a native feature.

## Map Domains in DNS {#map-domains-in-dns}

Make sure all the domains you want to use are already mapped to your **DNS** server. The additional domains should be parked upon the master domain.

## Install SSL Certificates {#install-ssl-certificates}

Install SSL for the primary domain and use **SERVER NAME INDICATION** (SNI) for all other domains. Every domain should have SSL installed to ensure encrypted admin login.

## Update WordPress {#update-wordpress}

In the network admin dashboard, click on Sites to show the listing of all the subsites, and then click on edit for the subsite you want to map to. In our example, this is subsite1.mynetwork.com.

In the Site Address (URL) field, enter the full URL to the domain name you're mapping – https://example.com – and click save.

## Edit wp-config.php {#edit-wp-config-php}

If you get an error about cookies being blocked when you try to log in to your network subsite (or log in fails with no error message), open your wp-config.php file and add this line after the other code you added to create the network:

```
define( 'COOKIE_DOMAIN', $_SERVER['HTTP_HOST'] );
```

## Related Articles {#related-articles}

1. [Create A Network](https://developer.wordpress.org/advanced-administration/multisite/create-network/)
2. [MultiSite Network Administration](https://developer.wordpress.org/advanced-administration/multisite/administration/)
3. [Installing Multiple Blogs](https://developer.wordpress.org/advanced-administration/before-install/multiple-instances/)

# WordPress 多站点 / 网络

WordPress 多站点是 WordPress 的一项功能，允许您在一个安装中管理多个 WordPress 实例。使用多站点需要启用重写功能。详情请查看[服务器要求](https://developer.wordpress.org/advanced-administration/multisite/prepare-network/#server-requirements)。

多站点可用于多种目的。例如，商业网站常使用多站点来共享某些资源（如主题或插件），同时为不同地区提供不同的内容。

多站点中的内容在数据库中有其独立的表，只有用户表在各个实例间共享。

您可以创建使用子目录（“基于路径”）的多站点，也可以使用域名或子域名（“基于域名”）。关于如何映射域名，请参阅[WordPress 多站点域名映射](https://developer.wordpress.org/advanced-administration/multisite/domain-mapping/)。

# 创建网络前的准备工作

本节概述了在开始[创建多站点网络](https://developer.wordpress.org/advanced-administration/multisite/create-network/)之前需要考虑的一些要求。

## 你真的需要多站点网络吗？{#do-you-really-need-a-network}

多站点网络中的站点是独立的，非常像 WordPress.com 上独立的博客。它们不像其他类型网络中的事物那样*相互连接*（尽管插件可以在站点之间创建各种类型的互连）。如果你计划创建紧密互连、共享数据或共享用户的站点，那么多站点网络可能不是最佳解决方案。

例如，如果你只是希望不同的网页集合看起来完全不同，那么你可能可以通过使用插件来切换主题、模板或样式表，在单个站点中实现你的需求。

再例如，如果你只是希望不同的用户组能够访问不同的信息，那么你可能可以通过使用插件来切换功能、菜单和链接 URL，在单个站点中实现你的需求。

## 多站点网络类型 {#types-of-multisite-network}

根据您希望网络如何处理 URL 以及是否允许最终用户按需创建新站点，您可以在几种不同类型的多站点网络中进行选择。

不同类型的网络有不同的服务器要求，这些要求将在下文的一个章节中描述。如果您无法完全控制服务器，那么某些类型的多站点网络可能无法使用。例如，如果您使用共享主机环境，可能就无法完全控制服务器。在这种情况下，您需要与主机环境的运营方协商相关要求。

网络中的站点拥有不同的 URL。您可以选择以下两种方式之一来指定站点的 URL：

* 每个站点使用不同的**子域名**。例如：`site1.example.com`、`site2.example.com`。
* 每个站点使用不同的**路径**。例如：`example.com/site1`、`example.com/site2`

此外，您也可以映射像 `example1.com`、`example2.com` 等这样的域名，但建议使用插件来实现。您可以直接在网络设置中进行更改，但这被视为高级管理操作。

[![管理站点界面](https://i0.wp.com/wordpress.org/support/files/2018/11/sites-edit-site_4.7.png?fit=612%2C235&ssl=1)](https://i0.wp.com/wordpress.org/support/files/2018/11/sites-edit-site_4.7.png?fit=612%2C235&ssl=1)

管理站点

您还可以选择是否允许最终用户按需创建新站点。基于域名的按需站点通常只能使用像 `site1.example.com` 和 `site2.example.com` 这样的子域名。基于路径的按需站点也是可行的。

多站点安装过程使用不同的术语。**子域名安装**会创建一个基于域名的网络，即使您可能为站点使用单独的映射域名而非子域名。**子目录安装**会创建一个基于路径的网络，即使它并不使用文件系统目录。如果您想使用**子域名**安装，必须将 WordPress 安装在 Web 路径的根目录（即 domain.com），但如果您选择从 WordPress 自己的目录运行，则**无需**将其安装在根目录（即 /public_html/）。

多站点网络安装完成后，WordPress 在“网络管理”用户界面中使用**域名**和**路径**这两个术语来指代每个站点的域名和路径。超级管理员（即多站点网络管理员）可以编辑站点的域名和路径设置，尽管对已建立的站点进行此类更改并不常见，因为这会改变它们的 URL。

插件可以扩展可用选项并协助管理。请在[插件目录](https://wordpress.org/plugins/)中搜索“multisite”或点击[此链接](https://wordpress.org/plugins/search/multisite/)。

## 管理员要求 {#admin-requirements}

要创建一个多站点网络，您必须是 WordPress 安装的管理员，并且通常需要访问服务器的文件系统，以便编辑文件和创建目录。例如，您可以使用 [FTP](https://wordpress.org/documentation/article/glossary#ftp)、[cPanel](https://wordpress.org/documentation/article/glossary#cpanel) 中的文件管理器或其他方式来访问服务器的文件系统。

您不一定需要了解 WordPress [开发](https://wordpress.org/documentation/article/glossary#developer)、[PHP](https://wordpress.org/documentation/article/glossary#php)、[HTML](https://wordpress.org/documentation/article/glossary#html)、[CSS](https://wordpress.org/documentation/article/glossary#css)、服务器管理或系统管理，尽管了解这些知识可能有助于故障排除或在安装后自定义您的多站点网络。

## Server Requirements {#server-requirements}

When you are planning a network, it can sometimes be helpful to use a development server for initial testing. However, setting up a development server that exactly matches your production server is not always possible, and transferring an entire network to a production server may not be easy. A test site on your production server is sometimes a more useful way to test your planned network.

In all cases, you will need to make sure your server can use the more complex .htaccess (or nginx.conf or web.config) rules that Multisite requires.

Multisite requires [mod_rewrite](https://wordpress.org/documentation/article/glossary#mod-rewrite) to be loaded on the Apache server, support for it in [.htaccess](https://wordpress.org/documentation/article/glossary#htaccess) files, and Options FollowSymLinks either already enabled or at least not permanently disabled. If you have access to the server configuration, then you could use a Directory section instead of a .htaccess file. Also make sure that your httpd.conf file is set for "AllowOverride" to be "All" or "Options All" for the vhost of the domain. You can ask your webhost for more information on any of this.

Some server requirements depend on the type of multisite network you want to create, as follows.

### 基于域名的网络 {#domain-based}

也称为“子域名”安装，基于域名的网络使用类似 https://subsite.example.com 的 URL。

基于域名的网络将不同的域名映射到服务器文件系统中安装 WordPress 的同一目录。您可以通过多种方式实现这一点，例如：

* 配置通配符子域名
* 配置虚拟主机，为每个主机指定相同的文档根目录
* 在 [cPanel](https://wordpress.org/documentation/article/glossary#cpanel) 或类似的网络托管控制面板中创建附加域或子域名

按需创建的基于域名的站点需要使用通配符子域名方法。您可以使用其他方法在同一网络中手动创建额外的站点。

无论使用哪种方法，您都需要配置 DNS（将域名映射到服务器的 IP 地址）和服务器（将域名映射到 WordPress 安装目录）。然后 WordPress 会将域名映射到站点。

为了使子域名正常工作，WordPress _应该_ 从您的网站文件夹根目录（例如 `public_html`）运行。要从非根目录使子域名工作，需要具备虚拟主机和重定向的经验。

外部链接：

* [通配符 DNS 记录](https://en.wikipedia.org/wiki/Wildcard_DNS_record)（维基百科）
* [Apache 虚拟主机](https://httpd.apache.org/docs/2.0/en/vhosts/)（Apache HTTP 服务器文档）
* [cPanel 域名](https://documentation.cpanel.net/display/74Docs/cPanel+Features+List#DomainsTab)（cPanel 文档）

有关如何在各种系统上配置通配符子域名的一些示例，请参阅：[配置通配符子域名](https://wordpress.org/documentation/article/configuring-wildcard-subdomains/)

### 基于路径的 {#path-based}

也称为“子文件夹”或“子目录”安装，基于路径的网络使用类似 https://example.com/subsite 的 URL。

如果您已经在站点中使用了固定链接，那么基于路径的网络同样可以工作，您不需要本节中的其他信息。但请注意，您的主站点将使用以下 URL 模式来显示文章：https://example.com/blog/[postformat]/

目前，**无法**在不进行手动配置的情况下移除博客别名，且配置位置不直观。不建议这样做。

## WordPress 设置要求 {#wordpress-settings-requirements}

安装多站点网络时，您需要从一个现有的 WordPress 安装开始。如果这是一个拥有自己域名的新安装，则无需阅读本节。如果这是一个已建立的站点，或者无法仅通过域名访问，则需满足以下要求才能将其转换为多站点网络。

### 注意事项 {#be-aware}

自 3.5 版本起，[为 WordPress 设置独立目录](https://developer.wordpress.org/advanced-administration/server/wordpress-in-directory/) 功能已支持多站点网络，但您必须在启用多站点网络**之前**完成“独立目录”的修改。

虽然不建议在域名 URL 中使用 www，但如果您选择这样做并计划为多站点网络使用**子域名**，请确保**同时**将站点地址和 WordPress 地址设为相同。还需注意，部分主机会默认显示此类 URL：

[![](https://i0.wp.com/wordpress.org/support/files/2018/11/no-www.png?fit=474%2C215&ssl=1)](https://wordpress.org/documentation/files/2018/11/no-www.png)

基于此以及诸多其他原因，我们建议您尽可能避免在域名中使用 www。如果您计划将其更改为 `domain.com` 或 `www.domain.com`，请在开始多站点网络的其他设置**之前**完成更改，因为事后修改域名会更加复杂。

### 限制 {#restrictions}

在以下情况下，您**无法创建网络**：

* "WordPress 地址 (URL)" 使用了除 ':80'、':443' 之外的端口号。

在以下情况下，您_无法选择**子域名**安装_（用于基于域名的网络）：

* WordPress URL 包含路径，而不仅仅是域名。（即，WordPress 未安装在文档根目录中，或者您未使用该文档根目录的 URL。）
* "WordPress 地址 (URL)" 是 `localhost`。
* "WordPress 地址 (URL)" 是 IP 地址，例如 127.0.0.1。

（请注意，您可以在本地机器上通过使用 hosts 文件将其他主机名映射到 IP 地址 127.0.0.1 来创建基于域名的网络用于测试目的，这样您就永远不需要使用主机名 `localhost`。）

如果您的现有 WordPress 安装已设置超过一个月，由于现有固定链接的问题，您_无法选择**子目录**安装_（用于基于路径的网络）。（此问题将在未来版本中修复。更多信息请参阅[切换网络类型](https://developer.wordpress.org/advanced-administration/multisite/administration/#switching-network-types)。）

_更多详情请参阅 `wp-admin/network.php`）_

# 网络管理员设置界面

**网络管理员设置**是网络管理员为整个网络设置和修改配置的地方。网络中的第一个站点是主站点，网络设置是从该原始站点的选项中提取的。

![](https://i0.wp.com/wordpress.org/documentation/files/2020/02/superadmin-options.png?fit=1024%2C751&ssl=1)

## 运行设置

**网络名称**

您希望为此网站命名的名称。

**网络管理员邮箱**

注册和支持邮件将从此地址发出。建议使用类似 _support@example.com_ 的地址。

## 注册设置

**允许新用户注册**

禁用或启用注册功能，以及允许注册的对象类型。（默认设置为禁用。）

* 禁用注册功能。（默认）
* 允许注册用户账户。
* 允许已登录用户注册新站点。
* 允许注册站点和用户账户。

**注册通知**

每当有人注册站点或用户账户时，向网络管理员发送电子邮件通知。

**添加新用户**

允许站点管理员通过“用户 -> 添加新用户”页面向其站点添加新用户。

**禁止使用的名称**

用户不允许注册这些站点名称。请用空格分隔各个名称。

**限制邮箱注册**

如果您希望将站点注册限制在特定的邮箱域名。请每行输入一个域名。

**禁止的邮箱域名**

如果您希望禁止某些域名用于站点注册。请每行输入一个域名。

## 新站点设置

**欢迎邮件**

```
发送给新站点所有者的欢迎邮件。

亲爱的用户：

您的新 SITE_NAME 博客已成功创建于：
BLOG_URL

您可以使用以下信息登录管理员账户：
用户名：USERNAME
密码：PASSWORD
在此登录：BLOG_URLwp-login.php

希望您喜欢您的新博客。
谢谢！

--SITE_NAME 团队
```

**欢迎用户邮件**

```
发送给新用户的欢迎邮件。

亲爱的用户：

您的新账户已设置完成。

您可以使用以下信息登录：
用户名：USERNAME
密码：PASSWORD
LOGINLINK

谢谢！

--SITE_NAME 团队
```

**首篇文章**

新站点上的第一篇文章。

```
欢迎来到 <a href="SITE_URL">SITE_NAME</a>。这是您的第一篇文章。编辑或删除它，然后开始写博客吧！
```

**首个页面**

新站点上的第一个页面。

**首条评论**

新站点上的第一条评论。

**首条评论作者**

新站点上第一条评论的作者。

**首条评论网址**

新站点上第一条评论的网址。

## 上传设置

**站点上传空间**

限制上传文件总大小为 [ 50 ] MB。

**上传文件类型**

默认为 `jpg jpeg png gif mp3 mov avi wmv midi mid pdf m2ts`。

注意：添加任意文件类型将不会生效，除非同时通过 [upload_mimes](https://developer.wordpress.org/reference/hooks/upload_mimes/) 过滤器挂载了相应的功能。当前默认支持的 MIME 类型/文件扩展名集，请参阅 [wp-includes/functions.php](https://github.com/WordPress/WordPress/blob/master/wp-includes/functions.php) 中的 `wp_get_mime_types` 函数。在“上传文件类型”字段中添加默认集中未列出的 MIME 类型将**不会**生效，除非您已使用 [upload_mimes](https://developer.wordpress.org/reference/hooks/upload_mimes/) 过滤器添加了它们！上传不支持 MIME 类型的文件（未使用过滤器添加）将失败，并显示消息“抱歉，出于安全原因，不允许此文件类型”。

**最大上传文件大小**

默认为 [ 1500 ] KB。

## 语言设置

**默认语言**

默认语言为英语。

## 菜单设置

**启用管理菜单**

*   插件

在 WordPress 多站点网络中，插件的默认设置是禁用的。这意味着您的用户将无法在其仪表板内访问插件管理面板，除非您首先在网络范围内启用对插件的访问权限。

# 将 WordPress 站点迁移至 WordPress 多站点

本教程介绍如何将多个 WordPress 独立安装迁移至 WordPress 多站点安装。您可以迁移使用自有域名的站点，以及使用主域名下子域名的站点。

本教程假设您在使用 cPanel 的服务器上托管 WordPress。如果您使用其他解决方案管理服务器，则需要调整这些说明。

## 操作步骤 {#steps-to-follow}

### 备份您的网站 {#backup-your-site}

在 cPanel 中生成完整的网站备份。通过 FTP 复制服务器上的所有文件也可能有所帮助，这样您可以方便地访问插件和主题文件，这在后续步骤中会用到。

### 从现有 WordPress 安装中导出 {#export-from-your-existing-wordpress-installs}

在您现有的每个 WordPress 安装中，前往 WordPress 的 工具 > 导出。下载包含每个站点所有文章和页面的 WXR 文件。请参阅 [工具导出屏幕](https://wordpress.org/documentation/article/tools-export-screen/) 上的说明。

请确保您的导出文件确实包含所有文章和页面。您可以使用文本编辑器查看导出文件的最后一条记录来验证这一点。最后一条记录应是最新的文章。

某些插件可能会与导出过程冲突，导致生成空文件或不完整的文件。为稳妥起见，您可能应在执行导出前禁用所有插件。

首先删除所有隔离的垃圾评论也是一个好主意，因为这些评论也会被导出，导致文件不必要地变大。

注意：此方法不会导出小工具配置和博客/插件设置。如果您在单个托管账户内迁移，请在此阶段记下这些设置，因为当您删除旧域名时，它们将会消失。

### 安装 WordPress {#install-wordpress}

安装 WordPress。请按照 [安装 WordPress](https://developer.wordpress.org/advanced-administration/before-install/howto-install/) 的说明进行操作。

### 激活多站点 {#activate-multisite}

在您的 WordPress 安装中激活多站点功能。这需要多次编辑 wp-config.php 文件。您必须选择子域名选项，而非子目录选项。请参阅关于如何[创建网络](https://developer.wordpress.org/advanced-administration/multisite/create-network/)的说明。

### Create blogs for each site you want to import {#create-blogs-for-each-site-you-want-to-import}

Create blogs for each of the sites you want to host at separate domains. For example, `importedblogdotorg.mydomain.com`.

Note: choose the name carefully, because changing it causes admin redirection issues. This is particularly important if you are migrating a site within the same hosting account.

### 为每个博客导入 WXR 文件 {#import-wxr-files-for-each-blog}

进入每个博客的后台，导入对应博客导出的 WXR 文件。将作者映射到正确的用户，或创建新用户。务必勾选导入照片和其他附件的选项。请参阅“工具 > 导入”子面板上的说明。

注意：如果选择将图片从源站点导入到目标站点，请确保它们已上传到正确位置，并在相应的文章或页面中正确显示。

### 复制主题和插件文件 {#copy-theme-and-plugin-files}

开始前，请确认你的插件能在网络安装中运行。如果插件不支持，请勿安装。可通过搜索插件功能并加上"multisite"或"mu"来寻找合适的替代品，例如"social bookmarking plugin wordpress multisite"。

将主题和插件文件从旧的 WP 安装复制到新 wp-content 的相应目录中。你可以为整个网络激活主题，也可以前往超级管理员 > 站点，点击要编辑的站点，仅为该站点启用特定主题。

注意：如果使用子主题，请将父主题和子主题都复制到新站点。

### 为每个站点编辑 WordPress 配置设置 {#edit-wordpress-configuration-settings-for-each-site}

编辑每个站点的配置设置、小部件等。在此步骤结束时，每个站点应看起来与之前完全一样，只是 URL 使用子域名.example.com 或 example.com/子站点，而非其正确、最终的 URL。

## 潜在问题 {#potential-problems}

### PHP 配置限制 {#limitations-of-php-configuration}

您可能会遇到主机上的 PHP 配置问题。主要有两个潜在问题：一是 PHP 的 `max_upload_size` 对于 WXR 文件来说可能太小；二是 PHP 内存限制可能不足以导入所有文章。

有两种解决方法：一是请求您的主机提供商提高限制（即使是临时的）；二是在 `/wp-admin/` 和 `/wp-includes` 目录中放置 php.ini 文件来提高限制（php.ini 文件不递归生效，因此必须放在这些目录中）。通常设置 10 MB 上传限制和 128 MB 内存限制即可，但请先咨询您的主机提供商，以免违反服务条款。

如需 PHP 配置问题帮助，请在 [WordPress 论坛支持](https://wordpress.org/documentation/forums/) 中搜索。

### 将附加域转换为停靠域 {#converting-add-on-domains-to-parked-domains}

在 cPanel 中删除附加域并用停靠域替换，也会删除与这些域关联的所有域名转发器和电子邮件转发器。请注意这一点，以便在切换后可以恢复这些转发器。

### 导入用户的限制 {#limitations-of-importing-users}

虽然存在上述方法可将内容导入到多站点博客实例中，但在导入多个用户时，您会遇到巨大的麻烦。用户会在导入过程中生成，但您无法为新博客获取任何角色或附加信息。

### 丢失设置 {#losing-settings}

如果旧站点已无法访问，而您发现自己忘记复制某些设置，或想确保所有配置都正确无误，请通过谷歌搜索您的站点，然后点击查看缓存版本。此选项仅在您的新站点被爬取之前可用，因此最好尽快操作。

另一个选择可能是使用 [互联网档案馆 Wayback Machine](https://archive.org/web/)。他们可能已存档了该站点（或部分内容）的副本。

# 缓存

本文是 [WordPress 优化](https://developer.wordpress.org/advanced-administration/performance/optimization/)系列文章的一部分。

WordPress 缓存是提升性能的最快方式。如果你的网站**此刻**正面临高负载，请立即安装 [W3 Total Cache](https://wordpress.org/plugins/w3-total-cache/)、[WP Super Cache](https://wordpress.org/plugins/wp-super-cache/) 或 [Cache Enabler](https://wordpress.org/extend/plugins/cache-enabler/)。

## 缓存插件 {#caching-plugins}

诸如 [W3 Total Cache](https://wordpress.org/plugins/w3-total-cache/)、[WP Super Cache](https://wordpress.org/plugins/wp-super-cache/) 和 [Cache Enabler](https://wordpress.org/plugins/cache-enabler/) 等插件可以轻松安装，并将您的 WordPress 文章和页面缓存为静态文件。这些静态文件随后会提供给用户，从而减轻服务器的处理负载。对于相当静态的页面，这可以将性能提升数百倍。

当与系统级页面缓存（如 Varnish）结合使用时，效果会非常强大。

如果您的文章/页面包含大量动态内容，配置缓存可能会更加复杂。搜索 "WordPress cache plugin" 以获取更多信息。

## 浏览器缓存 {#browser-caching}

**浏览器缓存** 通过减少每个页面的请求数量，有助于降低服务器负载。例如，通过对不常更改的文件（如图片、CSS、JavaScript 等静态文件）设置正确的文件头，浏览器会在访问者的计算机上缓存这些文件。这项技术使浏览器能够检查文件是否已更改，而不是简单地请求它们。结果是您的 Web 服务器可以返回更多的 304 响应（确认文件未更改），而不是需要发送文件的 200 响应。

了解更多信息，请查阅 HTTP Cache-Control（特别是 **max-age**）和 Expires 头，以及 [实体标签](https://en.wikipedia.org/wiki/HTTP_ETag)。

## 对象缓存 {#object-caching}

WordPress 中的对象缓存是指将数据从检索成本高且速度慢的位置移动到检索成本低且速度快的位置。对象缓存通常还具有持久性，这意味着在一次请求中缓存的数据在后续请求中仍然可用。

除了使数据访问更加容易之外，缓存的数据应始终是可替换和可再生的。如果应用程序遇到数据库损坏（例如 MySQL、Postgres、Couchbase），该数据库将会并应该承担严重后果（但愿有良好的备份计划）。与应用程序的主数据存储不同，如果缓存损坏，应用程序应继续运行，因为缓存数据应能自行再生。虽然缓存再生期间可能会出现一些性能问题，但不会丢失任何数据。

对象缓存的存储引擎可以采用多种技术。流行的对象缓存引擎包括 Redis、Memcached、APC 和文件系统。使用的缓存引擎应根据应用程序的需求来决定。每种引擎都有其优缺点。至少，所使用的引擎应使数据访问比重新生成数据更具性能优势。

## 服务器缓存 {#server-caching}

**Web 服务器缓存**更为复杂，但用于流量极高的站点。可选的方案很多，超出了本文的讨论范围。最简单的方案从服务器本地缓存开始，而更复杂精细的系统可能会在运行 WordPress 应用程序的 Web 服务器"前端"使用多个缓存服务器（也称为反向代理服务器）。

在服务器上添加像 [Opcache](https://www.php.net/manual/en/book.opcache.php) 这样的操作码缓存，或在 IIS 上使用 [WinCache](https://www.iis.net/downloads/microsoft/wincache-extension)，可以将 PHP 性能提升数倍。

当与 W3TC 等 WordPress 缓存插件配合使用时，[Varnish](https://www.varnish-cache.org/) 缓存功能非常强大。

## 延伸阅读 {#further-reading}

* [WordPress 核心缓存概念](https://www.tollmanz.com/core-caching-concepts-in-wordpress/)
* [加速网站的最佳实践](https://developer.yahoo.com/performance/rules.html) – Expires / Cache-Control 标头与 ETags (由 Yahoo! Developer Network 提供)
* [WebSiteOptimization.com: 使用服务器缓存控制提升性能](https://www.websiteoptimization.com/speed/tweak/cache/)

# 优化

无论您运行的是高流量 WordPress 站点，还是低成本共享主机上的小型博客，都应优化 WordPress 和服务器以实现最高效运行。本文提供 WordPress 优化的全面概述及具体推荐方案，但不对每个方面进行详细技术说明。

如需快速解决方案，请直接跳转至缓存部分，您将以最小代价获得最大收益。若想立即开始更全面的优化流程，请参阅[如何提升 WordPress 性能](#how-to-improve-performance-in-wordpress)。

下方[性能影响因素](#performance-factors)和[性能测试工具](#performance-testing-tools)部分包含性能主题的全面概述。本文讨论的许多技术同样适用于 WordPress 多站点（MU）。

## 性能影响因素

多个因素可能影响您的 WordPress 博客（或网站）的性能。这些因素包括但不限于：托管环境、WordPress 配置、软件版本、图片数量及其文件大小。

本文档将探讨并解决大部分导致性能下降的因素。

### 托管

您可用的优化技术将取决于您的托管设置。

#### 共享托管

这是最常见的托管类型。您的网站将与许多其他网站一起托管在同一台服务器上。托管公司为您管理网络服务器，因此您对服务器设置等的控制权非常有限。在大多数共享托管中，用户可以通过 SFTP 访问网站根目录的文件系统，并通过[网络托管控制面板](https://developer.wordpress.org/advanced-administration/server/control-panel/)执行许多常见的域名/托管任务。

与此类托管最相关的领域是：[缓存](#caching)、[WordPress 性能](#optimizing-your-wordpress-website)和[内容卸载](#content-offloading)。

#### 托管主机

托管主机类似于共享主机，但更局限于用户可在特定使用场景下运行的一组软件栈。因此，托管提供商为用户管理软件栈，但条件是限制软件选择。用户通常无法（或无需）访问文件系统并通过[网络托管控制面板](https://developer.wordpress.org/advanced-administration/server/control-panel/)管理任务。一些托管提供商会在更高层级的托管方案中提供更多软件或插件选择。

如今网络上的大多数内容平台（例如博客/社交媒体）都属于托管主机的一种形式，因为它们旨在为特定使用场景提供平台。

#### 虚拟专用服务器与专用服务器

在此托管方案中，您拥有对服务器的完全控制权：包括完整的文件系统、SSH 访问权限，以及能够在专用于该服务器的独立操作系统上安装/配置任意软件。该服务器可能是专用硬件设备，也可能是共享同一物理硬件的多个虚拟服务器之一。

关键在于，您拥有服务器设置的控制权。除了上述领域（缓存与 WordPress 性能）外，这里需要重点关注的核心领域是：[优化软件](#optimize-software) 与 [内容分流](#content-offloading)。

#### 服务器数量

在处理极高流量场景时，可能需要部署多台服务器。若已达到此级别，您应当已应用上文列出的所有适用技术。

WordPress 数据库可轻松迁移至独立服务器，仅需在配置文件中进行微小调整。同样，图片等静态文件也可转移至其他服务器（参见[内容分流](#content-offloading)章节）。

[负载均衡器](https://en.wikipedia.org/wiki/Load_balancing_(computing))可协助将流量分散至多个网络服务器，但需要更高专业能力。若需部署多台数据库服务器，[HyperDB](https://codex.wordpress.org/HyperDB)类可作为标准[WPDB](https://developer.wordpress.org/reference/classes/wpdb/)类的即插即用替代方案，能同时处理复制结构与分区结构的多数据库服务器。

#### 硬件性能

您的硬件配置将极大影响网站性能。处理器数量、处理器速度、可用内存容量、磁盘空间及存储介质类型都是关键因素。托管服务商通常提供价格越高、性能越优的方案。

#### 地理距离

服务器与网站访问者之间的距离也会影响性能。内容分发网络（CDN）可在不同地理区域镜像静态文件（如图片），从而确保所有访问者都能获得最佳性能。

#### 服务器负载

服务器上的流量大小及其处理负载的配置方式也会产生巨大影响。例如，若不使用缓存方案，随着额外页面请求涌入并堆积，性能将急剧下降直至停滞，通常会导致 Web 或数据库服务器崩溃。

若配置得当，大多数托管方案都能处理极高的流量。将流量分流至其他服务器也可减轻服务器负载。

恶意流量（如登录[暴力破解攻击](https://developer.wordpress.org/advanced-administration/security/brute-force/)、图片盗链（其他网站从高流量页面链接至您的图片文件）或 DoS 攻击）同样会增加服务器负载。识别并拦截此类攻击至关重要。

#### 软件版本与性能

确保使用最新软件同样重要，因为软件升级通常能修复漏洞并提升性能。确保运行最新版本的 Linux（或 Windows）、Apache、MySQL/MariaDB 和 PHP 至关重要。

### WordPress 配置

您选择的主题将极大影响网站性能。一个轻量级快速主题的运行效率远高于那些图形密集、效率低下的主题。

插件数量及其性能同样对网站性能有重大影响。停用并删除不必要的插件是提升性能的重要途径。

及时更新 WordPress 版本也至关重要。

#### 图形尺寸

确保文章中的图片针对网络进行优化，可以节省时间、带宽，并提升搜索引擎排名。

## 性能测试工具

- [在线网页基准测试工具](https://duckduckgo.com/?q=online+web+page+benchmarking+tools) 可以从不同地点、浏览器和连接速度测试实际网站性能。
- 内置的浏览器开发者工具（例如 Firefox 或 Chrome）都包含性能测量工具。

## 如何提升 WordPress 性能

### 优化您的 WordPress 网站

#### 最小化插件数量

提升 WordPress 性能最首要且简单的方法是审视插件。停用并删除所有不必要的插件。尝试选择性禁用插件以测试服务器性能。

是否有某个插件显著影响网站性能？请查阅插件文档、在相应的插件支持论坛寻求帮助，或寻找具有相似功能集的其他插件。

#### 内容优化

*图像文件*

- 是否存在不必要的图像？（例如：能否用文本替代部分图像？）
- 确保所有图像文件都已优化。为每张图像选择正确的格式（JPG/PNG/GIF）和压缩方式。
- 考虑使用更现代的图像格式，如体积更小的 WebP。

*文件总数/大小*

- 能否减少网站平均页面所需的文件数量？
- 当仍在使用 HTTP/1.x 时，建议将多个文件合并为单个优化文件。
- 压缩 CSS 和 JavaScript 文件。

### 升级硬件

为托管服务商的高级服务层级支付更多费用可能非常有效。增加 CPU 和内存（RAM）或切换到使用固态硬盘（SSD）或 NVMe 的主机可以带来显著改善。增加处理器数量和提升处理器速度也会有所帮助。在可能的情况下，尽量将不同功能的服务（如 HTTP 和 MySQL）分离到多台服务器或 VPS 上（理想情况下服务器应位于同一位置以减少延迟）。如果您使用的是共享主机，当您达到资源上限时，升级到具有更高资源限制（如磁盘 I/O、IOPS、NPROC 和总进程数）的方案可能会有所帮助。

### 优化软件

确保您运行的是最新的操作系统版本（例如 Linux 或 Windows Server）、最新的 Web 服务器版本（例如 Apache 或 IIS）、数据库（例如 MySQL 服务器）和 PHP。

如果您无法执行以下任务，您的主机提供商或许能为您执行其中一些任务，或者您可以寻求外部帮助，例如自由职业者。一个好的主机提供商会升级或将您的账户迁移到升级后的服务器以满足推荐配置，但并非所有提供商都会帮助您管理/优化服务器，因为这通常超出了主机套餐服务的范围。如果需要，一个预选软件栈和固定版本的托管 WordPress 主机解决方案可能适合您的需求。

**DNS**：不要在您的 WordPress 服务器上运行 DNS。使用商业 DNS 服务或您的域名注册商提供的免费服务。使用外部服务还可以使在维护或紧急情况下在备份服务器之间切换变得更加容易。它还提供了一定程度的容错能力。如果您在外部服务器上托管 DNS，将减轻您主 Web 服务器的负载。这是一个简单的更改，但会分流一些流量和 CPU 负载。

**Web 服务器**：可以配置您的 Web 服务器以提高性能。有多种技术，从 Web 服务器缓存到设置缓存头以减少每位访客的负载。搜索针对您特定 Web 服务器的优化（例如，搜索“Apache 优化”以获取更多信息）。有些 Web 服务器有付费的高速版本。根据您特定的主机和站点配置，还有许多方法可以调整 Apache 以获得更高的性能（例如 Memcached）。

**PHP**：有多种可用的 PHP 加速器可以显著提高 PHP 文件的性能。这将适用于所有 PHP 文件，而不仅仅是您的 WordPress 安装。搜索 PHP 优化以获取更多信息（例如 [APC](https://www.php.net/manual/book.apcu.php) 或 [OPcache](https://www.php.net/manual/book.opcache.php)）。一些 WordPress 缓存插件提供对 Memcached、APC 和其他操作码缓存的集成支持。较新的 PHP 版本通常也包含更好的性能优化。

**MySQL/MariaDB**：MySQL 或 MariaDB 优化本身就是一门玄学。对查询缓存设置进行一些简单的更改，就能显著影响 WordPress 的性能，因为 WordPress 在每个请求中都会重复执行许多查询。如今，InnoDB 已成为 MySQL 的默认存储引擎，你必须确保使用它。InnoDB 可以进行优化和微调，请在网上搜索 [mysql optimization](https://duckduckgo.com/?q=mysql+optimization)、[mysql innodb performance](https://duckduckgo.com/?q=mysql+innodb+performance) 或 [innodb optimization](https://duckduckgo.com/?q=innodb+optimization) 以获取更多信息和示例。如需了解如何将旧的 MyISAM 表转换为 InnoDB，请在网上搜索 [mysql convert myisam to innodb](https://duckduckgo.com/?q=mysql+convert+myisam+to+innodb)。

**其他服务**：不要在 WordPress 服务器上运行邮件服务器。对于联系表单，请使用联系表单插件配合外部邮件服务。

### 缓存

#### 缓存插件

缓存插件可以轻松安装，并将您的 WordPress 文章和页面缓存为静态文件。这些静态文件随后会提供给用户，从而减轻服务器的处理负载。对于相当静态的页面，这可以将性能提升数百倍。您可以通过在插件目录中搜索 [cache](https://wordpress.org/plugins/search/cache/) 来获取相关插件列表。

当与系统级页面缓存（如 Varnish）结合使用时，效果会非常强大。如果您的文章/页面包含大量动态内容，配置缓存可能会更加复杂。

#### 服务器端缓存

Web 服务器缓存更为复杂，但适用于流量极高的站点。可选的方案众多，超出了本文的讨论范围。最简单的方案从本地服务器缓存开始，而更复杂精细的系统可能会在运行 WordPress 应用程序的 Web 服务器"前端"使用多个缓存服务器（也称为反向代理服务器）。某些 Web 服务器也可同时充当反向代理。在服务器上添加像 [Alternative PHP Cache](https://www.php.net/manual/book.apcu.php) (APC) 这样的操作码缓存，可将 PHP 性能提升数倍。

[Varnish Cache](https://varnish-cache.org/) 可与某些缓存插件协同工作，将预构建的页面存储在内存中并快速提供，无需执行 Apache、PHP 和 WordPress 堆栈。

如前所述，使用外部评论插件而非 WordPress 原生评论功能，可避免读者登录 WordPress，并增加 Varnish Cache 可从缓存中提供的页面浏览量，从而有助于 Varnish 的工作。

#### 浏览器缓存

浏览器缓存通过减少每个页面的请求数量来帮助降低服务器负载。例如，通过对不常更改的文件（如图片、CSS、JavaScript 等静态文件）设置正确的文件头，浏览器会在用户计算机上缓存这些文件。这项技术使浏览器能够检查文件是否已更改，而不是简单地请求它们。结果是您的 Web 服务器可以响应更多的 304 状态码（确认文件未更改），而不是需要发送文件的 200 状态码。

了解更多信息，请查阅 HTTP Cache-Control（特别是 `max-age`）和 Expires 头，以及[实体标签](https://developer.mozilla.org/docs/Web/HTTP/Headers/ETag)。

一些 WordPress 缓存插件集成了对浏览器缓存和 ETag 的支持。

#### 对象缓存

使用 __持久化__ 对象缓存有助于加快页面加载速度，因为它减少了 Web 服务器对数据库的访问次数。例如，您网站的选项数据需要在每次页面浏览时可用。如果没有持久化对象缓存，您的 Web 服务器必须从数据库中读取这些选项来处理每次页面浏览。这些额外的数据库访问会减慢 Web 服务器的响应时间，例如“首字节时间”（TTFB），并且在流量高峰期间可能迅速压垮您的数据库服务器。

要让您的网站使用持久化对象缓存，您的托管服务提供商必须为您提供特定类型的服务器，即[缓存服务器](https://en.wikipedia.org/wiki/Category:Database_caching)。请咨询您的托管服务提供商或外部帮助（如自由职业者），以帮助您安装和配置持久化对象缓存服务器，然后安装一个支持已安装缓存服务器的[对象缓存 WordPress 插件](https://wordpress.org/plugins/search/object+cache/)。

### 延伸阅读

- [WP 对象缓存](https://developer.wordpress.org/reference/classes/wp_object_cache/)

### 内容卸载

#### 使用内容分发网络（CDN）

使用 CDN 可以显著减轻您网站的负载。将图片、JavaScript、CSS 和主题文件的搜索与分发任务交由 CDN 处理，不仅速度更快，还能大幅减轻 WordPress 服务器自身应用栈的压力。若与上文所述的 WordPress 缓存插件配合使用，CDN 的效果将最为显著。一些新型 CDN 还包含全页缓存（FPC）或边缘缓存功能，可缓存网站的完整 HTML 内容。

详情请参阅[知名内容分发服务提供商列表](https://en.wikipedia.org/wiki/Content_delivery_network#Notable_content_delivery_service_providers)。

#### 静态内容

任何静态文件都可以分流到另一台服务器。例如，所有静态图片、JavaScript 或 CSS 文件都可以迁移到不同的服务器。这是极高性能系统（Google、Flickr、YouTube 等）的常用技术，但对于单台服务器不堪重负的小型站点也很有帮助。此外，将这些内容迁移到不同主机名上，可以为未来的多服务器部署奠定基础。

某些 Web 服务器针对静态文件服务进行了优化，其效率远高于 Apache 等复杂 Web 服务器，例如 [lighttpd](https://www.lighttpd.net/)。

[云存储](https://en.wikipedia.org/wiki/Object_storage#Cloud_storage) 是按使用量付费的专用静态文件托管服务。由于没有最低费用，对于流量较低但已达到共享或单台服务器处理极限的站点来说，这可能是一个实用的选择。

#### 多个主机名

通过将静态文件分散到多个主机名上，也能带来用户体验的改进。大多数浏览器对单个主机只会同时发起 2 个请求，因此如果你的页面需要 16 个文件，它们会以每次 2 个的速度请求。如果你将这 16 个文件分散到 4 个主机名上，它们就能以每次 8 个的速度请求。这可以减少用户的页面加载时间，但也会通过创建更多并发请求来增加服务器负载（如果不同的主机名由同一台服务器提供）。此外，如果过度使用，已知的“管道化”技术常常会占满访问者的网络连接。

分流图片是最简单易行的起点。所有图片文件可以均匀地分配到三个主机名之间（例如 `assets1.example.com`、`assets2.example.com`、`assets3.example.com`）。随着流量增长，这些主机名可以迁移到你自己的专用服务器上。注意：避免随机选择主机名，因为这会影响浏览器缓存，导致流量增加，并可能产生过多的 DNS 查询，从而带来性能损失。

同样，任何静态的 JavaScript 和 CSS 文件也可以分流到单独的主机名或服务器上。

在 HTTP/2 和 HTTP/3 下，“HTTP 管道化”已被多路复用技术取代，因此上述技术的使用可能不再必要。

#### 订阅源

您的订阅源可以轻松卸载到外部订阅服务，该服务能够处理所有订阅流量，并仅每隔几分钟从您的站点更新订阅源。这可以显著节省流量。

同样，您也可以将自有订阅源卸载到独立服务器（例如 feeds.example.com），然后自行处理订阅统计和广告投放。

### 压缩

有多种方法可以压缩服务器上的文件和数据，以便更快地将页面传递给读者的浏览器。上文提到的一些[缓存插件](https://wordpress.org/plugins/search/cache/)集成了对大多数常见压缩方法的支持。

部分 WordPress 缓存插件支持使用 Minify 和 Tidy 来压缩和合并样式表与 JavaScript 文件。它们还支持输出压缩，例如 [zlib](https://zlib.net/)，另请参阅[输出压缩](https://codex.wordpress.org/Output_Compression)。

压缩媒体文件（尤其是图像）同样至关重要。

### 数据库优化

#### 清理数据库

某些[优化插件](https://wordpress.org/plugins/search/optimization/)和[数据库插件](https://wordpress.org/plugins/search/database/)可以帮助您减少数据库中的冗余数据。

您还可以设置 WordPress 以[限制文章和页面的修订版本数量](https://wordpress.org/documentation/article/revisions/)。

### 添加服务器

虽然需要额外的专业知识，但添加服务器是提升性能的有效方式。

您可以使用[负载均衡器](https://en.wikipedia.org/wiki/Load_balancing_(computing))将流量分散到多个 Web 服务器，也可以使用 [HyperDB](https://codex.wordpress.org/HyperDB) 或云数据库服务来运行更具扩展性或多个数据库服务器。

网络上有各种指南以及 WordCamp 演讲，涉及在云服务上扩展 WordPress 站点。

### 自动加载选项

自动加载选项是插件和主题的配置设置，在 WordPress 中每次页面加载时都会自动加载。每个插件和主题都定义了自己的选项以及哪些选项是自动加载的。自动加载选项过多可能会拖慢您的网站。通常，您应尽量将网站的自动加载选项保持在 800KB 以下。

默认情况下，自动加载选项保存在 wp_options 表中。可以在此表中逐个选项关闭自动加载功能。有关查看和更改自动加载选项的逐步说明，请咨询您的主机提供商。

如果您使用持久对象缓存，选项（无论是否自动加载）的加载速度会更快、效率更高。

## 额外资源

### 延伸阅读

- [WordPress 高流量处理技巧](https://codex.wordpress.org/High_Traffic_Tips_For_WordPress)

### WordCamp Performance Presentations

- [Democratizing Performance by Pascal Birchler from WordCamp Asia 2024](https://wordpress.tv/2024/04/09/democratizing-performance/)
- [High-Performance WordPress by Iliya Polihronov from WordCamp 2012 (San Francisco)](https://wordpress.tv/2012/09/01/iliya-polihronov-high-performance-wordpress/)
- [WordPress Optimization from WordCamp Israel 2013](https://www.slideshare.net/AlmogBaku/wordpress-optimization-16678718)
- [Copy of the Slides on HyperDB and High Performance from WordCamp 2007 (San Francisco)](https://barry.blog/2007/07/22/high-performance-wordpress/)
   - [Presentation on HyperDB and High Performance from WordCamp 2007 (San Francisco)](https://onemansblog.com/2007/08/16/wordcamp-2007-hyperdb-and-high-performance-wordpress/)
- [50 tips su Web Performance Optimization per siti ad alto traffico WordCamp Bologna (Italy) 2013](https://www.slideshare.net/AndreaCardinali/50-tips-su-web-performance-optimization-per-siti-ad-alto-traffico-wpcamp-bologna-2013)

# Php

## PHP

PHP（PHP：超文本预处理器）是互联网上一种流行的编程语言。PHP 将动态内容（如 WordPress 中的内容）转换为网页浏览器可以读取的 HTML、CSS 和 JavaScript。WordPress 主要用 PHP 编写，服务器必须安装 PHP 才能运行 WordPress。

由于 PHP 是一种解释型语言，其版本和配置对 WordPress 的运行效果乃至能否运行都有很大影响。

### 版本

在可能的情况下，应使用 PHP 7.4 或更高版本来运行 WordPress。截至本文撰写时，PHP 7.4 是 WordPress 官方支持的版本，而 PHP 8.0 和 8.1 为“兼容但有例外”，PHP 8.2 处于“测试支持”阶段。PHP 8 是唯一仍在积极开发和维护的 PHP 主要版本。PHP 团队会定期停止对旧版本 PHP 的支持，且不保证会为旧版本提供安全更新。

同时，新版本的 PHP 包含安全和性能改进，并伴有新功能和错误修复，但这些更新不保证向后兼容。然而，升级 PHP 版本时必须极其谨慎。虽然 WordPress 与最新的 PHP 版本兼容，但基于旧版 PHP 构建的网站可能因其包含的插件和主题而不兼容。

如果无法立即升级到 PHP 8，应尽快升级到 PHP 7.4。虽然 WordPress *可能* 在旧版 PHP 上运行，但这些版本已达到官方生命周期终止状态，运行过时的 PHP 安装**可能使您的网站面临安全漏洞**。

您可以在 [PHP 兼容性与 WordPress 版本](https://make.wordpress.org/core/handbook/references/php-compatibility-and-wordpress-versions/) 页面找到与您的 WordPress 版本兼容的 PHP 版本。

有关 PHP 支持版本的更多信息，可随时查阅 [PHP 支持版本页面](https://www.php.net/supported-versions.php)。

升级 PHP 时，最好在升级前测试网站的兼容性。如果您提供多个环境（例如暂存环境和生产环境），应为每个环境单独配置 PHP 版本。这将允许用户在非生产环境中测试新版本的 PHP，并在升级生产环境的 PHP 版本前解决任何问题。

有一个有用的 [WP-CLI 命令](https://github.com/danielbachhuber/php-compat-command) 可用于执行通用兼容性检查，但请注意它并非 100% 准确。

### 配置

PHP 主要通过配置文件 `php.ini` 进行配置，PHP 在运行时从中读取所有设置和配置。这通常通过 CGI/FastCGI 或 PHP-FPM 等进程管理器实现。

某些服务器环境可能允许使用其他文件（如 `.htaccess` 或 `.user.ini` 文件）来自定义 PHP 配置。

您可以在 [官方 PHP 文档](https://www.php.net/manual/en/ini.core.php) 中查看每个指令的详细信息。

#### 超时设置

系统中有多个超时设置，用于限制请求的不同方面。配置超时值时，选择能良好协同工作的数值非常重要。例如，如果 Web 服务器（如 Apache）的超时时间低于 PHP 服务的脚本执行超时时间，那么设置非常高的 PHP 脚本执行超时就没有意义——在这种情况下，如果请求耗时过长，无论 PHP 超时设置如何，Web 服务器都会终止该请求。

请注意，进程所需时间因服务器负载而异，设置这些限制是为了确保服务器正常运行。如果服务器负载较高，进程可能需要更长时间才能完成，从而导致级联效应，进一步增加服务器负载。因此，需要在给予脚本足够编译时间与确保服务器负载正常之间取得平衡。

主要的 PHP 超时可以通过 [`max_execution_time`](https://www.php.net/manual/en/info.configuration.php#ini.max-execution-time) `php.ini` 指令设置。此设置限制代码执行时间，但不限制系统库调用或 MySQL 查询，[Windows 系统除外](https://www.php.net/manual/en/function.set-time-limit.php)，在 Windows 上它确实限制这些操作。

从 Web 服务器到 PHP 数据传输允许的最长时间由 [`max_input_time`](https://www.php.net/manual/en/info.configuration.php#ini.max-input-time) `php.ini` 指令指定。它通常用于限制文件上传时间。需要注意的是，此时间与 `max_execution_time` 是分开的，它定义了从 Web 服务器调用 PHP 到执行开始之间的时间。

请注意，这些超时设置通常是按服务器配置的，如果您使用的是共享主机账户，可能无法修改它们。最佳方法是联系您的主机公司技术支持，询问是否可以修改这些设置以满足您的需求。

#### 内存限制

PHP 在每次页面渲染时允许使用的最大内存量由 [`memory_limit`](https://www.php.net/manual/en/ini.core.php#ini.memory-limit) `php.ini` 指令指定。

除了在 PHP 内部设置内存限制外，WordPress 还有两个内存配置常量，可以在 **wp-config.php** 文件中修改。如果 WordPress 有权限，它会将 PHP 的 `memory_limit` 提升到这些值，但如果 `php.ini` 指定的值更高，WordPress 不会降低允许的内存量。

选项 `WP_MEMORY_LIMIT` 声明了 WordPress 为渲染网站前端应请求的内存量。WordPress 默认值为 40 MB，WordPress 多站点默认值为 64 MB。

```
define( 'WP_MEMORY_LIMIT', '128M' );
```

选项 `WP_MAX_MEMORY_LIMIT` 声明了 WordPress 为渲染网站后端应请求的内存量。WordPress 默认值为 256 MB。

```
define( 'WP_MAX_MEMORY_LIMIT', '256M' );
```

由于 WordPress 后端通常需要更多内存，因此有一个单独的设置用于为已登录用户指定内存量。这主要是媒体上传所必需的。你可以将其设置为高于前端限制，以确保后端拥有所需的所有资源。通常，`WP_MEMORY_LIMIT <= WP_MAX_MEMORY_LIMIT`。

#### 文件上传大小限制

通过 WordPress 管理后台上传媒体文件和其他内容时，WordPress 使用 PHP 处理上传。PHP 的配置包含对可通过 PHP 上传的文件大小限制，以及可发送到 Web 服务器进行处理的请求大小限制。这些设置需要与上文讨论的服务器超时设置保持一致。

单个文件上传的大小限制可通过 [`upload_max_filesize`](https://www.php.net/manual/en/ini.core.php#ini.upload-max-filesize) `php.ini` 指令进行配置。

从 Web 服务器发送到 PHP 进行处理的完整请求大小限制可通过 [`post_max_size`](https://www.php.net/manual/en/ini.core.php#ini.post-max-size) `php.ini` 指令进行配置。`post_max_size` 的值必须大于或等于 `upload_max_filesize` 的值。PHP 不会处理超过 `post_max_size` 设定值的请求。

请注意 `post_max_size` 适用于所有 PHP 请求而不仅仅是上传，因此如果网站需要处理请求中包含的大量其他数据，可能需要单独考虑此设置。

请注意在共享主机账户中，这些限制通常在服务器级别设置，您可能无法修改它们或将其提高到特定值以上。此外，不同环境修改上述值的方式也不同。如需进一步帮助，请联系您的主机提供商技术支持。

#### 替换 WordPress 的 Cron 触发器

`wp-cron.php` 脚本负责调度和执行某些自动任务。每次有人访问您的网站时，`wp-cron.php` 都会检查是否到了执行任务的时间。尽管这些检查量小且快速，但它们会消耗时间并产生负载。因此，值得考虑设置 [`DISABLE_WP_CRON` 常量](https://developer.wordpress.org/advanced-administration/wordpress/wp-config/#disable-cron-and-cron-timeout)并使用替代方法来触发 WordPress 的 cron 系统。但请注意，WordPress cron 系统在设计时考虑了性能，运行所需资源极少，因此除非确实需要，否则不必替换它。

# 文件编辑器界面

在标准 WordPress 安装中，众多用户可编辑文件包括[插件](https://wordpress.org/plugins/)文件。虽然很少需要修改插件代码，但**插件文件编辑器界面**允许您编辑这些插件文件。

根据您使用的主题，可以在以下位置找到此编辑器：

*   如果使用[区块主题](https://wordpress.org/documentation/article/block-themes/)，此编辑器将列在"工具"菜单下。
*   如果使用经典主题，此编辑器将列在"外观"菜单下。

![编辑插件界面](https://raw.githubusercontent.com/WordPress/Advanced-administration-handbook/main/assets/edit-plugins.png)

![编辑插件警告](https://raw.githubusercontent.com/WordPress/Advanced-administration-handbook/main/assets/edit-plugins-warning.png)

## 编辑插件

内置的插件文件编辑器允许您在占据屏幕主要区域的大文本（编辑）框中查看或修改任何插件的 PHP 代码。

如果特定文件可写入，您可以在此进行更改并保存文件。否则，您将看到提示信息**您需要将此文件设为可写才能保存更改**。

正在编辑的插件文件名显示在文本框顶部。由于插件文件是纯文本格式，无法在文本框中插入图像或图片。

您可以通过右上角的下拉菜单选择要编辑的插件。只需找到插件名称并点击"选择"。

### 插件文件

插件选择菜单下方列出了可编辑的插件文件列表。点击任意文件链接，即可将该文件的文本内容载入文本框。

编辑已激活的插件文件时请务必谨慎。编辑器不会创建备份副本。如果因错误导致网站崩溃，您将无法使用编辑器修复问题。这种情况下，请使用 FTP 上传问题文件的功能性备份，或更改 _/wp-content/_ 目录下 _/plugins/_ 文件夹的名称（这将使所有插件失效，直到文件夹被正确重命名）。

### 文档查询

编辑器下方有一个下拉菜单，列出了正在编辑的插件文件中包含的函数名称。选择函数并点击"查询"按钮，即可在[代码参考](https://developer.wordpress.org/reference/)或[PHP 文档](https://www.php.net/)中查看其文档。

## 更新文件

请记住点击此按钮以保存对插件文件所做的更改。点击后，您将在屏幕顶部看到提示消息"文件编辑成功"。如果未看到该消息，则说明更改未保存！请注意，如果文件不可写，更新文件按钮将不可用。

# 必用插件

必用插件（又称 mu-plugins）是安装在内容文件夹内特殊目录中的插件，它们会在安装的所有站点上自动启用。必用插件不会显示在 wp-admin 插件页面的默认插件列表中（尽管它们会出现在一个特殊的必用插件部分），并且无法禁用，除非从必用插件目录中删除插件文件，该目录默认位于 **wp-content/mu-plugins**。对于网络主机而言，mu-plugins 通常用于添加对主机特定功能的支持，尤其是那些缺失可能导致网站崩溃的功能。

要手动更改默认目录，请在 [wp-config.php](https://wordpress.org/documentation/article/editing-wp-config-php/) 中定义 `WPMU_PLUGIN_DIR` 和 `WPMU_PLUGIN_URL`。

## 功能特性
* 始终启用，无需管理员手动开启，用户也无法意外禁用。
* 只需将文件上传至 mu-plugins 目录即可启用，无需登录操作。
* 由 PHP 按字母顺序在常规插件之前加载，这意味着 mu-plugin 中添加的 API 钩子将应用于所有其他插件，即使它们在全局命名空间中运行钩子函数。

## Caveats
Despite its suitability for many special cases, the mu-plugins system is not always ideal and has several downsides that make it inappropriate in certain circumstances. Below are several important caveats to keep in mind:

* Plugins in the must-use directory will not appear in the update notifications nor show their update status on the plugins page, so you are responsible for learning about and performing updates on your own.
* Activation hooks are not executed in plugins added to the must-use plugins folder. These hooks are used by many plugins to run installation code that sets up the plugin initially and/or uninstall code that cleans up when the plugin is deleted. Plugins depending on these hooks may not function in the mu-plugins folder, and as such all plugins should be carefully tested specifically in the mu-plugins directory before being deployed to a live site.
* WordPress only looks for PHP files right inside the mu-plugins directory, and (unlike for normal plugins) not for files in subdirectories. You may want to create a proxy PHP loader file inside the mu-plugins directory:

```
<?php // mu-plugins/load.php
require WPMU_PLUGIN_DIR.'/my-plugin/my-plugin.php';
```

## 历史与命名

_mu-plugins_ 目录最初由 WPMU（多用户版）实现，旨在为站点管理员提供一种简便方式，默认在农场中的所有博客上激活插件。当时需要此功能，因为多用户专用代码无法通过站点管理区域实现此效果（如今更名为“WordPress 多站点”的功能已支持在管理界面内管理插件）。

处理 /mu-plugins/ 的代码于 2009 年 3 月 7 日通过[此变更集](https://core.trac.wordpress.org/changeset/10737)合并到 WordPress 主代码库中，比 wpmu 代码库首次合并早了整整 10 个月。此后所有 WordPress 站点均可利用自动加载插件功能，无论是否启用了 MU/多站点。该功能在不同情况下对所有类型的 WordPress 安装都有用，因此此举合乎逻辑。

在此过程中，“mu plugins”这一名称变得名不副实，因为它不仅适用于多站点安装，且“MU”已不再用于指代多博客的 WordPress 安装。尽管如此，该名称得以保留，并**被重新解释为“必须使用的插件”**，即这些插件必须始终使用，因此无论 wp-admin 插件面板中的设置如何，它们都会在所有站点上自动加载。

因此，“Must-Use”实际上是一个[逆向首字母缩写](https://en.wikipedia.org/wiki/Backronym)，类似于 [PHP](https://wordpress.org/documentation/article/wordpress-glossary/#PHP)（最初意为“个人主页”，后来被重新解释为“PHP 超文本预处理器”，这也是一个[递归首字母缩写](https://en.wikipedia.org/wiki/Recursive_acronym)）。

## 源代码
* `get_mu_plugins()` 函数位于 [wp-admin/includes/plugin.php](https://core.trac.wordpress.org/browser/tags/4.5.3/src/wp-admin/includes/plugin.php#L0)。
* `wp_get_mu_plugins()` 函数位于 [wp-includes/load.php](https://core.trac.wordpress.org/browser/tags/4.5.3/src/wp-includes/load.php#L0)。

# WordPress 开发资源指南

在您设计 WordPress 主题或构建插件时，将会综合运用 HTML、CSS、PHP 和 JavaScript (JS) 技术。

网络上存在*大量*（可能过多）的入门资源来帮助您学习这些网页开发语言。这可能会让人不知所措！

通过本资源页面，我们旨在聚焦那些能为您提供最清晰指引的资源与指南，帮助您高效掌握 HTML、CSS、PHP 和 JS 的使用。这里并非完整清单，仅为您提供入门指引。

建议您保存或收藏此页面，作为开发 WordPress 主题或插件时的学习参考。另请参阅：
- [主题开发者手册](https://developer.wordpress.org/themes/)
- [插件开发者手册](https://developer.wordpress.org/plugins/)
- [区块编辑器手册](https://developer.wordpress.org/block-editor/)

## 通用 Web 开发教育

WordPress.org 发布了 [Learn WordPress](https://learn.wordpress.org/)，它将指导你学习围绕 WordPress 开发的多个主题。

[freeCodeCamp](https://freecodecamp.org/) 是一个免费开源的教育平台，并非 WordPress 专属。他们提供教学、演示项目和自己的认证，已帮助数百万人学习 HTML、CSS 和 JavaScript。

他们将在其 [响应式网页设计](https://www.freecodecamp.org/learn/2022/responsive-web-design/) 课程中教你 HTML 和 CSS 的基础知识。

如果你想深入学习 JavaScript，可以在他们的 [前端开发库](https://www.freecodecamp.org/learn/front-end-development-libraries/#bootstrap) 课程中进行，该课程将带你入门 JavaScript 甚至 React，这对你开发主题、插件，尤其是区块会很有帮助。

遗憾的是，目前没有 PHP 课程。

此外，由于你将编写代码，最好熟悉一下 [WordPress 编码标准](https://developer.wordpress.org/coding-standards/) 和 [内联文档标准](https://developer.wordpress.org/coding-standards/inline-documentation-standards/)。

除此之外，以下是一些针对每种语言你可能觉得有用的资源。

## HTML

- [W3Schools HTML](https://www.w3schools.com/tags/default.asp)
- [Learn How to Make Websites](https://developer.mozilla.org/en-US/learn)

## CSS

If this is your first time using CSS with WordPress, [this document](https://developer.wordpress.org/advanced-administration/wordpress/css/) provides a fantastic overview

Other than that, these are some solid resources for you to review:

- [W3 Schools](https://www.w3schools.com/cssref/default.asp)
- [MDN](https://developer.mozilla.org/en-US/docs/CSS)
- [CSS Tricks](https://css-tricks.com/)
- [CSS Zen Garden - the art of the possible in CSS](https://www.csszengarden.com/)
- [CSS on A List Apart](https://alistapart.com/blog/topic/css/)
- [Flexbox Guide](https://duckduckgo.com/?q=css+tricks+flexbox&ia=web)
- [CSS Grid Guide](https://duckduckgo.com/?q=css+tricks+grid&ia=web)
- [CSS Grid by Example](https://gridbyexample.com/)

## JavaScript

- [W3Schools JS](https://www.w3schools.com/js/default.asp)
- [MDN](https://developer.mozilla.org/en-US/docs/Web/javascript)
- [JSDoc](https://jsdoc.app/about-getting-started.html) for documenting your code
- [ReactJS](https://reactjs.org/)

## PHP

- [PHP Language Reference](https://www.php.net/manual/en/langref.php)
- [PHP Function Reference](https://www.php.net/manual/en/funcref.php)
- [W3Schools PHP](https://www.w3schools.com/php/default.asp)
- [PHP The Right Way](https://phptherightway.com/) is a high level review of modern PHP
- [PHPDoc](https://www.phpdoc.org/docs/latest/index.html) for documenting your code
- [SitePoint's PHP resources](https://www.sitepoint.com/php/)

### Books

- The good folks at WebDev Studios have put out several books on WordPress theming, plugin development, and also how to use WordPress. You can find a list of their books [here](https://webdevstudios.com/books/)
- [You Don't Know JS](https://github.com/getify/You-Dont-Know-JS) is a book series on modern JS development. This the Github repo for the books, or you can purchase physical copies.
- [Eloquent JavaScript](https://eloquentjavascript.net/)
- [JavaScript: The Definitive Guide](https://www.oreilly.com/library/view/javascript-the-definitive/9781491952016/)
- [PHP Cookbook](https://www.oreilly.com/library/view/php-cookbook/9781098121310/)
- [Programming PHP](https://www.oreilly.com/library/view/programming-php-4th/9781492054122/)

# 应用密码

应用密码是 WordPress 的一项功能，允许您为程序化访问（例如移动应用、集成或脚本）生成**可撤销的、按应用分配的凭证**。其设计目的是避免与第三方工具共享您的主账户密码。

应用密码于 **WordPress 5.6**（2020 年 12 月）引入。请参阅：[应用密码：集成指南](https://make.wordpress.org/core/2020/11/05/application-passwords-integration-guide/)。

### 什么是应用密码？ {#what-are-application-passwords}

应用密码是：

*   与特定 WordPress 用户账户绑定的密码。
*   用于 API 身份验证（例如 WordPress REST API 和（如果启用）XML-RPC），而非用于交互式浏览器登录。
*   在 WordPress 中以哈希值存储，**仅在创建时显示一次**。
*   可单独撤销，因此您可以在不更改用户主密码的情况下禁用单个集成。

应用密码**不能用于通过 `wp-login.php` 登录 wp-admin**。它们适用于应用程序和脚本，而非用户在登录表单中手动输入凭据。

### 何时使用应用程序密码 {#when-to-use-application-passwords}

当你需要一个工具以 WordPress 用户身份进行身份验证，但又不想提供该用户的主密码时，请使用应用程序密码，例如：

* 需要调用 REST API 的部署/维护脚本。
* 向 WordPress 发布内容或上传媒体的第三方服务。
* 需要经过身份验证才能访问你网站 API 的桌面/移动客户端。

如果使用场景是浏览器中的交互式登录，请使用强密码并考虑启用**两步验证**（也称为双因素身份验证或 2FA）：[两步验证](https://developer.wordpress.org/advanced-administration/security/mfa/)。

### 在 wp-admin 中创建应用密码 {#creating-an-application-password-in-wp-admin}

1.  以需要凭据的用户身份（或以管理员身份编辑该用户）登录 wp-admin。
2.  转到 **用户 → 个人资料**（或 **用户 → 所有用户 → 编辑** 以编辑其他用户）。
3.  找到 **应用密码** 部分。
4.  输入一个描述性名称（例如：`CI 部署机器人`、`我的 iPhone 应用`、`报告集成`）。
5.  生成密码并 **立即复制/保存**（之后将不再显示）。

WordPress 将应用密码分组显示以提高可读性。使用时可以带空格或不带空格（验证前会去除空格）。

### 使用应用密码 {#using-an-application-password}

应用密码通常通过 HTTP 基本认证（[RFC 7617](https://datatracker.ietf.org/doc/html/rfc7617)）使用。使用基本认证时，客户端会在 `Authorization` HTTP 头部中发送凭据。

该头部值是通过对字符串 `username:password` 进行 Base64 编码构建的：

```
Authorization: Basic BASE64_ENCODED_CREDENTIALS
```

使用应用密码时：

* **用户名**：WordPress 用户名（登录名）。
* **密码**：生成的应用密码。

由于基本认证凭据如果在未加密的情况下通过网络发送可能会被截获，因此应始终使用 HTTPS。参见：[HTTPS](https://developer.wordpress.org/advanced-administration/security/https/)。

示例（使用 `curl` 的 REST API 请求）：

```
curl --user "USERNAME:APPLICATION_PASSWORD" https://example.com/wp-json/wp/v2/users/me
```

### 管理与轮换应用密码 {#managing-and-rotating-application-passwords}

在用户个人资料的同一**应用密码**区域，您可以：

* 查看现有应用密码（按名称）。
* 查看使用元数据（例如，最后使用时间 / 最后 IP）。
* 撤销单个密码。

操作最佳实践是将应用密码视为机密信息：

* 为每个集成/应用创建一个（不要在工具间重复使用）。
* 撤销任何不再需要的凭据。
* 定期或在任何疑似泄露后轮换凭据。

### 使用 WP-CLI 管理应用程序密码 {#managing-application-passwords-with-wp-cli}

如果您通过 SSH 管理 WordPress，WP-CLI 可以创建、列出、更新和撤销应用程序密码。

示例：

```
# 为用户 ID 123 创建一个应用程序密码（密码仅显示一次）。
wp user application-password create 123 "myapp"

# 为用户 ID 123 创建并仅输出密码（适用于脚本/CI）。
wp user application-password create 123 "myapp" --porcelain

# 列出用户 ID 123 的密码并显示常用字段。
wp user application-password list 123 --fields=uuid,name,created,last_used,last_ip

# 通过 UUID 删除用户 ID 123 的特定应用程序密码。
wp user application-password delete 123 <uuid>
```

官方命令参考：[wp user application-password](https://developer.wordpress.org/cli/commands/user/application-password/)。

### 可用性与禁用 {#availability-and-disabling}

默认情况下，当请求通过 HTTPS 提供服务时，应用程序密码功能可用。其可用性可通过过滤器进行自定义（或禁用）。

若您不希望网站启用应用程序密码功能，可通过代码（例如在必备插件中）使用 `wp_is_application_passwords_available` 过滤器来禁用。如需更精细的控制（例如仅允许特定用户/角色使用），请使用 `wp_is_application_passwords_available_for_user` 过滤器。

### 故障排除 {#troubleshooting}

如果身份验证失败（401/403）或用户配置文件中未显示应用密码：

* **确认 HTTPS**：应用密码专用于 HTTPS 请求。请确保站点已正确配置 TLS 且 WordPress 能检测到 HTTPS。参见：[HTTPS](https://developer.wordpress.org/advanced-administration/security/https/)。
* **确认您正在使用应用密码**：交互式登录可能仍需要用户的常规密码；应用密码是独立的。
* **检查功能是否被禁用**：安全插件、必须使用插件或自定义代码可能通过过滤器禁用应用密码。
* **确认客户端发送基本认证**：某些 HTTP 客户端和代理可能会剥离 `Authorization` 标头，除非明确配置。

### 相关内容 {#related}

* [HTTPS](https://developer.wordpress.org/advanced-administration/security/https/)
* [两步验证](https://developer.wordpress.org/advanced-administration/security/mfa/)
* WP-CLI 参考：[wp user application-password](https://developer.wordpress.org/cli/commands/user/application-password/)

# Backup Database

## 备份数据库

> 强烈建议您定期并在升级前备份数据库。

如果出现问题，您可以从备份中[恢复数据库](https://developer.wordpress.org/advanced-administration/security/backup/)。

**注意：** 以下步骤备份的是 WordPress 数据库（文章、页面、评论、设置等），但**不**备份您的 WordPress 文件（主题、插件、上传内容、`wp-config.php` 等）。要进行全站备份，请参阅 [WordPress 备份](https://developer.wordpress.org/advanced-administration/security/backup/)和[备份 WordPress 文件](https://developer.wordpress.org/advanced-administration/security/backup-files/)。

备份数据库时，通常会创建一个导出文件（例如 `.sql`、`.gz` 或 `.bz2` 格式）。该导出文件可以与您的文件备份一起存储，这样数据库和文件就作为一个“备份集”保存在一起，但恢复时仍需将其导入到 MySQL/MariaDB 中。

### 使用 cPanel X 进行备份 {#backup-using-cpanel-x}

cPanel 是许多网络主机使用的流行控制面板。其备份功能可用于备份您的 MySQL 数据库。请勿生成完整备份，因为这些备份严格用于存档目的，无法通过 cPanel 恢复。请找到“下载 MySQL 数据库备份”并点击数据库名称。一个 `*.gz` 文件将被下载到您的本地驱动器。

恢复时无需解压此文件。使用相同的 cPanel 程序，浏览到该 gz 文件并上传。上传完成后，浏览器底部将显示转储完成。如果您要上传到新主机，则需要重新创建数据库用户及匹配的密码。如果更改了密码，请在 wp-config.php 文件中进行相应更改。

### 使用 phpMyAdmin {#using-phpmyadmin}

[phpMyAdmin](https://developer.wordpress.org/advanced-administration/upgrade/phpmyadmin/) 是用于操作数据库的程序名称。

以下信息已通过使用 phpMyAdmin 版本 4.4.13 连接运行在 Linux 上的 MySQL 版本 5.6.28 进行测试验证。

[![phpmyadmin_top](https://wordpress.org/documentation/files/2018/11/phpmyadmin_top.jpg)](https://wordpress.org/documentation/files/2018/11/phpmyadmin_top.jpg)

#### 快速备份流程 {#quick-backup-process}

当您需要在不压缩的情况下备份 WordPress 数据库中的所有表时，可以使用简单方法。要恢复此备份，您的新数据库不应包含任何表。

1. 登录服务器上的 phpMyAdmin
2. 在左侧窗口中选择您的 WordPress 数据库。本例中数据库名为 "wp"
3. 右侧窗口将显示 WordPress 数据库中的所有表。点击顶部标签页中的“导出”标签

[![](https://wordpress.org/documentation/files/2018/11/phpmyadmin_dbtop.jpg)](https://wordpress.org/documentation/files/2018/11/phpmyadmin_dbtop.jpg)

4. 确保选择“快速”选项，点击“执行”后将提示下载文件。将文件保存到计算机。根据数据库大小，此过程可能需要一些时间

[![phpmyadmin_quick_export](https://wordpress.org/documentation/files/2018/11/phpmyadmin_quick_export.jpg)](https://wordpress.org/documentation/files/2018/11/phpmyadmin_quick_export.jpg)

#### 自定义备份流程 {#custom-backup-process}

如需更改默认行为，请选择自定义备份。在上述步骤 4 中，选择自定义选项。详细选项将显示。

[![phpmyadmin_custom_export](https://wordpress.org/documentation/files/2018/11/phpmyadmin_custom_export.jpg)](https://wordpress.org/documentation/files/2018/11/phpmyadmin_custom_export.jpg)

##### 表格部分 {#the-table-section}

数据库中的所有表格均被选中。如果您有其他程序使用该数据库，请仅选择与您的 WordPress 安装对应的表格。这些表格将以 "wp_" 开头，或您在 'wp-config.php' 文件中指定的 'table_prefix' 前缀开头。

如果仅安装了 WordPress 博客，请保持原样（或点击“全选”以恢复默认选择）。

##### 输出部分 {#the-output-section}

从压缩框中选择 'zipped' 或 'gzipped' 来压缩数据。

[![phpmyadmin_export_output](https://wordpress.org/documentation/files/2018/11/phpmyadmin_export_output.jpg)](https://wordpress.org/documentation/files/2018/11/phpmyadmin_export_output.jpg)

##### 格式部分 {#the-format-section}

确保已选择 SQL。与 CSV 或其他数据格式不同，此选项导出一系列 SQL 命令。

在格式特定选项部分，保持选项不变。

[![phpmyadmin_export_formatspecific](https://wordpress.org/documentation/files/2018/11/phpmyadmin_export_formatspecific.jpg)](https://wordpress.org/documentation/files/2018/11/phpmyadmin_export_formatspecific.jpg)

##### 对象创建选项部分 {#the-object-creation-options-section}

选择添加 DROP TABLE / VIEW / PROCEDURE / FUNCTION / EVENT / TRIGGER 语句。在目标数据库创建表之前，如果旧表存在，它将调用 DROP 语句删除旧表。

[![phpmyadmin_export_object](https://wordpress.org/documentation/files/2018/11/phpmyadmin_export_object.jpg)](https://wordpress.org/documentation/files/2018/11/phpmyadmin_export_object.jpg)

### 数据创建选项部分 {#the-data-creation-options-section}

保持选项不变。

[![phpmyadmin_export_data](https://wordpress.org/documentation/files/2018/11/phpmyadmin_export_data.jpg)](https://wordpress.org/documentation/files/2018/11/phpmyadmin_export_data.jpg)

现在点击窗口底部的“Go”，系统应会提示您下载文件。将此文件保存到您的计算机。根据数据库大小，这可能需要一些时间。

**请注意** – 您尚未备份文件和文件夹（例如图像），但您的所有文章和评论现在都已安全保存。

### 使用原生 MySQL/MariaDB 命令 {#using-straight-mysql-mariadb-commands}

phpMyAdmin 无法处理大型数据库，因此使用原生 MySQL/MariaDB 代码会有所帮助。

将目录切换到您想要导出备份的目标目录：

```
user@linux:~> cd files/blog
user@linux:~/files/blog>
```

使用 `mysqldump` 命令，并指定您的 MySQL 服务器名、用户名和数据库名。它会提示您输入密码（如需帮助，请尝试：`man mysqldump`）。

**备份所有数据库表**

```
mysqldump --add-drop-table -h mysql_hostserver -u mysql_username -p mysql_databasename﻿
```

**仅备份数据库中的特定表**

```
mysqldump --add-drop-table -h mysql_hostserver -u mysql_username -p mysql_databasename﻿
```

示例：

```
user@linux:~/files/blog> mysqldump --add-drop-table -h db01.example.net -u dbocodex -p wp > blog.bak.sql
Enter password: (输入密码)
```

**使用 bzip2 压缩备份文件**

```
user@linux:~/files/blog> bzip2 blog.bak.sql
```

您可以将上述两个命令的操作合并为一行完成：

```
user@linux:~/files/blog> mysqldump --add-drop-table -h db01.example.net -u dbocodex -p wp | bzip2 -c > blog.bak.sql.bz2
Enter password: (输入密码)
```

`|`（管道）后面的 `bzip2 -c` 表示备份在生成时即被压缩，而 `> blog.bak.sql.bz2` 则将 bzip 的输出发送到名为 `blog.bak.sql.bz2` 的文件中。

尽管 bzip2 比旧的压缩算法（.Z、.zip、.gz）能更有效地压缩大多数文件，但其[压缩和解压缩速度要慢得多](https://en.wikipedia.org/wiki/Bzip2)。如果您需要备份大型数据库，gzip 是一个更快的选择。

```
user@linux:~/files/blog> mysqldump --add-drop-table -h db01.example.net -u dbocodex -p wp | gzip > blog.bak.sql.gz
```

### 使用 MySQL Workbench {#using-mysql-workbench}

[MySQL Workbench](https://dev.mysql.com/downloads/workbench/)（曾被称为 My SQL Administrator）是一款用于执行管理操作的程序，例如配置 MySQL 服务器、监控其状态和性能、启动和停止服务、管理用户和连接、执行备份、恢复备份以及许多其他管理任务。

虽然您可以使用命令行界面（例如 [mysqladmin](https://dev.mysql.com/doc/refman/8.0/en/mysqladmin.html) 或 [mysql](https://dev.mysql.com/doc/refman/8.0/en/mysql.html) 提供的界面）执行大多数此类任务，但 MySQL Workbench 在以下方面具有优势：

* 其图形用户界面使其使用起来更加直观。
* 它更好地展示了对于 MySQL 服务器性能、可靠性和安全性至关重要的设置。
* 它以图形方式显示性能指标，从而更容易确定和调整服务器设置。
* 它适用于 Linux、Windows 和 MacOS X，并允许远程客户端跨平台备份数据库。只要您能访问远程服务器上的 MySQL 数据库，就可以将数据备份到任何您有写入权限的地方。
* 与 phpMyAdmin 不同，它对要备份的数据库大小没有限制。

以下信息已通过 MySQL Workbench 版本 6.3.6 连接运行在 Linux 上的 MySQL 版本 5.6.28 进行过测试验证。

[![mysql_workbench_top](https://wordpress.org/documentation/files/2018/11/mysql_workbench_top.jpg)](https://wordpress.org/documentation/files/2018/11/mysql_workbench_top.jpg)

#### 备份数据库 {#backing-up-the-database}

本文假设您已安装 MySQL Workbench 并完成配置，能够本地或远程登录 MySQL 数据库服务器。如需安装说明，请参考适用于您平台的 MySQL Workbench 安装包随附文档，或查阅[在线文档](https://dev.mysql.com/doc/workbench/en/)。

1. 启动 MySQL Workbench
2. 若数据库实例显示在首页，请直接点击。或通过顶部菜单选择 Database -> Connect Database，输入必要信息后点击 OK
3. 在左侧窗口点击 Data Export

[![mysql_workbench_export](https://wordpress.org/documentation/files/2018/11/mysql_workbench_export.jpg)](https://wordpress.org/documentation/files/2018/11/mysql_workbench_export.jpg)

1. 选择需要备份的 WordPress 数据库
2. 在 Export Options 中指定目标目录，需确保对备份目录具有写入权限
3. 点击窗口右下角的 Start Export

[![mysql_workbench_export2](https://wordpress.org/documentation/files/2018/11/mysql_workbench_export2.jpg)](https://wordpress.org/documentation/files/2018/11/mysql_workbench_export2.jpg)

#### 从备份恢复 {#restoring-from-a-backup}

1.  启动 MySQL Workbench。
2.  如果您的数据库实例显示在首页，请点击它。或者，点击 Database -> Connect Database，然后点击 OK。
3.  在左侧窗口中点击 Data Import/Restore。
4.  指定您存放备份文件的文件夹。点击 Import from Dump Project Folder 右侧的 "…"，选择备份文件夹，然后点击 Open。
5.  点击窗口右下角的 Start Import。数据库恢复将开始。

[![mysql_workbench_import](https://wordpress.org/documentation/files/2018/11/mysql_workbench_import.jpg)](https://wordpress.org/documentation/files/2018/11/mysql_workbench_import.jpg)

### MySQL GUI Tools {#mysql-gui-tools}

In addition to MySQL Workbench, there are many GUI tools that let you backup (export) your database.

| Name | OS (Paid edition) | OS (Free edition) | |
|---|---|---|
| [MySQL Workbench](https://www.mysql.com/products/workbench/) | Windows/Mac/Linux | Windows/Mac/Linux | See [above](https://developer.wordpress.org/advanced-administration/security/backup/database/#Using_MySQL_Workbench) |
| [EMS SQL Management Studio for MySQL](https://www.sqlmanager.net/products/mysql/studio) | Windows | | |
| [Aqua Data Studio](https://www.aquafold.com/) | Windows/Mac/Linux | Windows/Mac/Linux (14 days trial) | Available in 9 languages |
| [Navicat for MySQL](https://www.navicat.com/en/products/navicat-for-mysql) | Windows/Mac/Linux | Windows/Mac/Linux (14 days trial) | Available in 8 languages |
| [SQLyog](https://webyog.com/en/) | Windows | | |
| [Toad for MySQL](https://www.toadworld.com/) | | Windows | |
| [HeidiSQL](https://www.heidisql.com/) | | Windows | |
| [Sequel Pro](https://sequelpro.com/) | Mac | CocoaMySQL successor | |
| [Querious](https://www.araelium.com/querious/) | | Mac | |

### 使用 WordPress 数据库备份插件 {#using-wordpress-database-backup-plugin}

您可以在 [WordPress 插件目录](https://wordpress.org/plugins/search/database+backup/)中找到能帮助您备份数据库的插件。

以下说明适用于名为 [WP-DB-Backup:](https://wordpress.org/plugins/wp-db-backup/) 的插件。

#### 安装 {#installation}

1. 在[管理](https://wordpress.org/documentation/article/administration-screens/) > [插件](https://wordpress.org/documentation/article/administration-screens/#plugins-add-functionality-to-your-blog) > [添加新插件](https://wordpress.org/documentation/article/administration-screens/#add-new-plugins)中搜索“WP-DB-Backup”。
2. 点击“立即安装”。
3. 激活插件。

#### 备份 {#backing-up}

1.  导航至 [管理](https://wordpress.org/documentation/article/administration-screens/) > [工具](https://wordpress.org/documentation/article/administration-screens/#tools-managing-your-blog) > 备份
2.  WordPress 核心表将始终被备份。从“表”部分选择一些选项。

[![wp-db-backup_table](https://wordpress.org/documentation/files/2018/11/wp-db-backup_table.jpg)](https://wordpress.org/documentation/files/2018/11/wp-db-backup_table.jpg)

3.  选择备份选项；备份可以下载或通过电子邮件发送。

4.  最后，点击“立即备份！”按钮以实际执行备份。您也可以安排定期备份。

[![wp-db-backup_settings](https://wordpress.org/documentation/files/2018/11/wp-db-backup_settings.jpg)](https://wordpress.org/documentation/files/2018/11/wp-db-backup_settings.jpg)

#### 恢复数据 {#restoring-the-data}

生成的文件是一个标准的 SQL 文件。如需了解如何上传该文件，请参阅[从备份恢复数据库](https://developer.wordpress.org/advanced-administration/security/backup/)。

### 更多资源 {#more-resources}

* [WordPress.org 官方仓库中的备份插件](https://wordpress.org/plugins/search.php?q=backup)
* [WordPress 备份](https://developer.wordpress.org/advanced-administration/security/backup/)

### 外部资源 {#external-resources}

* [如何安排 WordPress 数据库的每日备份](https://www.narga.net/schedule-backup-wordpress-database/)

## 从备份恢复数据库

### 使用 phpMyAdmin {#using-phpmyadmin}

[phpMyAdmin](https://developer.wordpress.org/advanced-administration/upgrade/phpmyadmin/) 是一款通过网页界面远程操作数据库的程序。优质的主机套餐通常会包含此工具。有关备份 WordPress 数据库的信息，请参阅[备份数据库](https://developer.wordpress.org/advanced-administration/security/backup/database/)。

本文信息已通过运行在 Unix 系统上的 [phpMyAdmin](https://developer.wordpress.org/advanced-administration/upgrade/phpmyadmin/) 4.0.5 版本测试。

以下操作将**替换**您当前的数据库为备份版本，**使**您的数据库**回退**到备份时的状态。

#### 恢复流程 {#restore-process}

使用 phpMyAdmin，请按照以下步骤恢复 MySQL/MariaDB 数据库。

1.  登录 [phpMyAdmin](https://developer.wordpress.org/advanced-administration/upgrade/phpmyadmin/)。
2.  点击 "Databases"，然后选择您要将数据导入的数据库。
3.  随后您将看到该数据库中已有的表列表，或者一个显示没有表存在的界面。这取决于您的设置。
4.  屏幕顶部会有一排选项卡。点击 **Import** 选项卡。
5.  在下一个屏幕上，会有一个文本文件位置框，旁边有一个名为 **Browse** 的按钮。
6.  点击 **Browse**。找到存储在您计算机上的备份文件。
7.  确保在 **Format** 下拉菜单中选择了 **SQL**。
8.  点击 **Go** 按钮。

现在去喝杯咖啡。这一步需要一些时间。最终您会看到一个成功界面。

如果出现错误信息，最好的办法是到 [WordPress 支持论坛](https://wordpress.org/documentation/)发帖寻求帮助。

### Using MySQL/MariaDB Commands {#using-mysql-mariadb-commands}

The restore process consists of unarchiving your archived database dump, and importing it into your MySQL/MariaDB database.

Assuming your backup is a `.bz2` file, created using instructions similar to those given for [Backing up your database using MySQL/MariaDB commands](https://developer.wordpress.org/advanced-administration/security/backup/database/#using-straight-mysqlmariadb-commands), the following steps will guide you through restoring your database:

1. Unzip your `.bz2` file:

```
user@linux:~/files/blog> bzip2 -d blog.bak.sql.bz2
```

**Note:** If your database backup was a `.tar.gz` file called `blog.bak.sql.tar.gz`, then

```
tar -zxvf blog.bak.sql.tar.gz
```

is the command that should be used instead of the above.

2. Put the backed-up SQL back into MySQL/MariaDB:

```
user@linux:~/files/blog> mysql -h mysqlhostserver -u mysqlusername -p databasename < blog.bak.sql  
Enter password: (enter your mysql password)   
user@linux:~/files/blog>
```

# Backup Files

## 备份 WordPress 文件

备份 WordPress 网站包含两个部分：**数据库**和**文件**。

本页仅讨论**文件**备份；如需备份 WordPress 数据库，请参阅[备份数据库](https://developer.wordpress.org/advanced-administration/security/backup/database/)。

### 备份文件时是否同时备份数据库？

通常**不会**。您的 WordPress 文件存放在网络服务器的 WordPress 目录中，但数据库存储在 WordPress 目录之外的独立数据库系统（通常是 MySQL/MariaDB）中。

如果您将数据库导出为 `.sql`/`.gz`/`.bz2` 文件，该导出文件*确实*是一个文件——您可以将其与文件备份一起存储（例如放在同一文件夹或压缩包中），以便与对应的文件备份保持一致。恢复时仍需将该文件重新导入数据库。

您的 WordPress 网站包含以下文件：

* WordPress 核心安装文件
* WordPress 插件
* WordPress 主题
* 图片和文件
* JavaScript、PHP 脚本及其他代码文件
* 附加文件和静态网页

所有与网站外观相关的内容都存在于某个文件中，需要进行备份。此外，您必须备份 WordPress 目录（包括子目录）中的所有文件以及您的 [`.htaccess`](https://wordpress.org/documentation/article/wordpress-glossary/#.htaccess) 文件。

虽然大多数主机会备份整个服务器（包括您的网站），但最好还是自行备份文件。最简单的方法是使用 [FTP 程序](https://developer.wordpress.org/advanced-administration/upgrade/ftp/) 将 WordPress 文件从主机下载到本地计算机。

默认情况下，名为 wp-content 的目录中的文件是您自己生成的内容，例如编辑过的主题、新安装的插件和上传的文件。请特别注意备份此区域以及包含连接详情的 `wp-config.php` 文件。

其余文件主要是 WordPress 核心文件，由 [WordPress 下载压缩包](https://wordpress.org/download/) 提供。

更多信息请阅读 [备份您的 WordPress 网站](https://developer.wordpress.org/advanced-administration/security/backup/#backing-up-your-wordpress-site)。

其他备份文件的方法包括：

**网站主机提供的备份软件**

大多数网站主机提供备份网站的软件。请咨询您的主机了解他们提供的服务和程序。

**与网站创建同步**

[WinSCP](https://winscp.net/eng/index.php) 和其他程序允许您与网站同步，以保持服务器和硬盘驱动器上内容的镜像副本更新。这可以节省时间，并确保两地都有最新的文件。

#### 在 WinScp 中同步文件 {#synchronize-your-files-in-winscp}

1. 使用 WinScp 正常登录您的 FTP 服务器。
2. 点击“同步”按钮。远程目录将自动设置为当前 FTP 目录（通常是您的根目录）。本地目录将设置为点击同步时的本地目录。您可能需要将其更改为计算机上的其他目录。方向应设置为“本地”，以便将文件从您的网络主机复制到您的机器。同步模式应设置为“同步文件”。
3. 点击“确定”以显示操作摘要。
4. 再次点击“确定”以完成同步。

**将文件复制到桌面**

使用 [FTP 客户端](https://developer.wordpress.org/advanced-administration/upgrade/ftp/) 或 [UNIX Shell 技能](https://codex.wordpress.org/UNIX_Shell_Skills)，您可以将文件复制到计算机上的文件夹。之后，您可以将其压缩为 zip 文件以节省空间，从而保留多个版本。

通常，无需复制 WordPress 核心文件，因为您可以从新下载的 WordPress zip 文件替换它们。需要备份的重要文件是您的 wp-config.php 文件（包含您的设置）和您的 wp-content 目录（及其内容），其中包含所有主题和插件文件。

# 备份

## WordPress 备份

_注意：想跳过复杂步骤？可直接查看自动化解决方案，例如用于备份的 [WordPress 插件](https://wordpress.org/plugins/search.php?q=backup)。_

您的 WordPress 数据库包含博客中的所有文章、评论和链接。如果数据库被删除或损坏，您将丢失所有已发布的内容。这种情况可能由多种原因导致，并非所有因素都在您的掌控之中。通过妥善备份 WordPress 数据库和文件，您可以快速恢复正常运行。

WordPress 网站备份指南包括：

1. WordPress 网站及其数据库备份
2. 自动备份选项

此外，您可以通过 [WordPress 支持论坛](https://wordpress.org/documentation/)获取在线支持，协助您完成备份流程。

网站备份至关重要，因为问题难免发生，您需要在灾难降临时能够迅速应对。花几分钟时间轻松便捷地备份数据库，将让您有更多时间专注于网站的创意与高效运营。

### 备份常见问题

_请定期备份数据库，并在每次升级前务必进行备份。_

**备份频率应为多久？**

这取决于您的博客更新频率、您希望执行备份的周期，以及如果数据库连同部分文章丢失时您的感受。这完全由您决定。关于备份时机的通用建议如下：

 - 对于文章较少的小型网站，建议每周备份一次。
 - 对于文章发布频繁的高活跃度网站，建议每日备份。

**此方法能否用于备份其他数据？**

可以。备份在任何情况下都是有益的。

**应保留多少份备份？**

建议至少保留 3–5 份最新的 WordPress 备份，以防数据丢失，并将副本存储在不同位置——例如，一份存放在托管服务器，一份存放在云存储（Google Drive、Dropbox 等），一份下载到本地计算机。这样即使某份备份失效或丢失，您始终有可靠的版本来恢复网站。

**备份可以自动化吗？**

可以。有多种自动化备份方法可供选择，我们已在“自动 WordPress 备份”章节中列出部分方案。但强烈建议您偶尔通过手动备份来保存这些自动备份，以确保备份流程正常运行。

**是否有更多关于 WordPress 备份的信息？**

是的。更多信息请参阅“备份资源”章节。

### 备份您的 WordPress 站点

备份 WordPress 站点包含两个部分：**数据库**和**文件**。您需要同时备份两者才能完整恢复一个典型的 WordPress 站点。

有关分步说明，请参阅：

- [备份您的 WordPress 文件](https://developer.wordpress.org/advanced-administration/security/backup-files/)
- [备份您的数据库](https://developer.wordpress.org/advanced-administration/security/backup/database/)

#### 数据库与文件（为何两者都需要）

人们常会疑惑“备份文件”是否也备份了数据库。在典型的 WordPress 设置中，答案是**否**：

- **WordPress 文件**指 Web 服务器上 WordPress 目录中的文件（WordPress 核心、主题、插件、上传内容、`wp-config.php`、`.htaccess` 等）。
- **WordPress 数据库**存储在独立的数据库系统（通常是 MySQL/MariaDB）中。通常**无法**通过下载 WordPress 目录来备份它，因为数据库位于该目录之外。

“备份数据库”时通常需要创建**导出/转储文件**（例如 `.sql`、`.gz` 或 `.bz2` 文件）。该导出文件*确实*是一个文件，可将其与文件备份一同存储——但恢复时仍需将其重新导入 MySQL/MariaDB。

#### 推荐的备份与恢复顺序

为确保备份的一致性，建议将 **文件 + 数据库** 视为一个“备份集”（例如，两者创建时间相近）。

- **备份（典型顺序）**：
  - **先备份数据库**，再备份 WordPress 文件。
  - 可选择将数据库导出文件与文件备份存放在同一备份文件夹/压缩包中，以便统一管理。
- **恢复（典型顺序）**：
  - **先恢复 WordPress 文件**，再恢复/导入数据库。
  - 若迁移过程中更改了数据库凭据，需相应更新 `wp-config.php` 文件。

您的 WordPress 网站包含以下内容：

1. WordPress 核心安装文件
2. WordPress 插件
3. WordPress 主题
4. 图片与文件
5. JavaScript、PHP 及其他代码文件
6. 附加文件与静态网页

这些元素以不同组合形式共同构成您的网站。数据库存储了文章及大量网站生成数据，但并未包含上述共同塑造网站外观与信息的元素。这些内容均需备份保存。

大多数主机会备份整个服务器（包括您的网站），但从其备份中获取网站副本需要时间，而快速恢复至关重要。您需要学会如何自行备份和恢复网站文件。

以下是备份网站文件的几种方法：

**主机提供的备份软件**

多数网站主机会提供备份软件。请咨询您的主机服务商了解具体服务与程序。

**创建网站同步**

[WinSCP](https://winscp.net/eng/index.php) 等程序可让您与网站同步，保持服务器与硬盘内容的镜像更新。这既节省时间，又能确保两地文件均为最新版本。

**将文件复制到桌面**

通过 [FTP 客户端](https://developer.wordpress.org/advanced-administration/upgrade/ftp/) 或 [UNIX Shell 技能](https://codex.wordpress.org/UNIX_Shell_Skills)，您可以将文件复制到计算机文件夹中。随后可将其压缩为 zip 文件以节省空间，便于保存多个版本。

请谨记：至少保留三份备份文件，以防某份损坏或丢失，并应存储在不同位置及不同介质上（如 CD、DVD 或硬盘）。

### 数据库备份说明

请定期备份您的 WordPress 数据库，尤其是在升级或迁移到新位置之前。以下信息将帮助您使用各种流行的服务器软件包来备份 WordPress 数据库。如需详细信息，请联系您的网站托管服务商获取更多信息。

#### 访问 phpMyAdmin

有关 phpMyAdmin 的更多信息，请参阅 [phpMyAdmin](https://developer.wordpress.org/advanced-administration/upgrade/phpmyadmin/)。

虽然备份 WordPress 数据库不一定需要熟悉 phpMyAdmin，但这些说明将逐步引导您在服务器上找到 phpMyAdmin。然后，您可以按照以下说明进行简单轻松的备份。更详细的说明，请参阅《备份数据库》。

* Plesk
* cPanel
* Direct Admin
* Ensim
* vDeck
* Ferozo

##### Plesk

在您的网站与域名页面，点击与您在 [WordPress 安装](https://developer.wordpress.org/advanced-administration/before-install/howto-install/)过程中所设置数据库对应的**打开**按钮。这将打开 **phpMyAdmin** 界面：

![image](https://user-images.githubusercontent.com/8250598/189548052-05143263-7980-45b5-b2dc-23fc5a8b19fd.png)

如果您看不到**打开**按钮，请确保关闭**开始创建您的网站**提示：

![image](https://user-images.githubusercontent.com/8250598/189548074-703c1d79-a437-445b-8bf7-ac51272b69f8.png)

点击**选择现有数据库**以查找并选择您的 WordPress 数据库：

![image](https://user-images.githubusercontent.com/8250598/189548312-c455cf50-757e-4bf7-9128-825e3cb0832c.png)

##### cPanel

在 cPanel 主控制面板上，找到 MySQL 徽标并点击 MySQL 数据库链接。在下一页中，找到 **phpMyAdmin** 链接并点击以访问您的 phpMyAdmin。

![image](https://user-images.githubusercontent.com/8250598/189548290-9e815d91-e598-4b31-8bde-3101ac09bd89.png)

![image](https://user-images.githubusercontent.com/8250598/189548157-74dd7be8-ea45-4ee0-90d4-e16f57225d24.png)

##### Direct Admin

在 **您的账户** 页面，找到 **MySQL 管理** 并点击以访问 **phpMyAdmin**。

![image](https://user-images.githubusercontent.com/8250598/189548174-6951023a-c593-4f46-af78-5bf43a390279.png)

![image](https://user-images.githubusercontent.com/8250598/189548195-4b1ca6c1-0a6d-4191-8060-c90e59696ee3.png)

##### Ensim

寻找 MySQL 管理徽标并点击链接。在 **配置** 下选择 **MySQL 管理工具**。

![image](https://user-images.githubusercontent.com/8250598/189548260-d911357c-8681-4c27-a1ad-043d7a678c22.png)

![image](https://user-images.githubusercontent.com/8250598/189548265-2a7b7721-10e9-41d7-a150-ab11422c29cd.png)

##### vDeck

从主控制面板，点击 **Host Manager**，然后点击 **Databases**。在下一个窗口中，点击 **Admin**。另一个窗口将弹出，带您进入 phpMyAdmin 登录界面。

![image](https://user-images.githubusercontent.com/8250598/189548348-9f1135eb-4336-4f45-9fe6-8fa482f758d5.png)

![image](https://user-images.githubusercontent.com/8250598/189548353-75778b1a-686c-44a7-ab15-89b49d94e146.png)

##### Ferozo

使用您的凭据登录 Ferozo 控制面板。登录后，进入 "Base de Datos"（"数据库"）菜单，然后点击 "Acceso phpMyAdmin"（"访问 phpMyAdmin"）。新窗口将打开，显示 phpMyAdmin 登录界面。

![image](https://user-images.githubusercontent.com/8250598/189548372-ebebffc3-9723-4e4f-b478-df0d38499e58.png)

### 使用 phpMyAdmin 进行简单备份

以下是数据库备份的极简版本。找到访问网站 phpMyAdmin 的方法后，请按以下简易步骤操作。

1. 在 phpMyAdmin 面板中点击 **Databases**。（根据 phpMyAdmin 版本不同，此步骤可能非必需）

![image](https://user-images.githubusercontent.com/8250598/189548469-d63090c3-4e43-48d4-8039-507957e4a69c.png)

2. 您可能有多个数据库。点击存放 WordPress 数据的数据库，即[安装 WordPress](https://wordpress.org/installation/how-to-install-wordpress/)时创建的数据库。（旧版本可能通过下拉菜单操作）

3. 下图显示的是结构视图标签页中的默认数据表。您可能有更多数据表——如果安装了统计插件或反垃圾邮件插件就会出现这种情况。

![image](https://user-images.githubusercontent.com/8250598/189548524-84c2f476-7fae-4bc4-b7fb-19b72f72bed8.png)

4. 点击 **Export**。
		- 有两种导出方式：**Quick** 和 **Custom**；若选择 **Custom**，请按以下步骤操作：
				- 选择所有数据表
				- 在 **Output** 部分勾选 **Save output to a file**，并在 **Compression** 处选择 **None**（若数据库非常大，请使用压缩方式）
				- 从 **Format** 下拉菜单中选择 **SQL**
				- 勾选 "Add DROP TABLE"：这在覆盖现有数据库时很有用
				- 勾选 "IF NOT EXISTS"：可防止数据表已存在时恢复过程出错
				- 点击 **Go**。数据将保存至您的计算机

### 自动备份

有多种插件可为您的 WordPress 数据库提供自动定时备份功能。这有助于轻松管理您的备份集合。您可以在 WordPress 管理界面的**插件浏览器**中或通过 [WordPress 插件目录](https://wordpress.org/plugins/)找到自动备份插件。

* [备份插件列表](https://wordpress.org/plugins/tags/backup)

### 备份资源

* [FTP 备份](https://www.guyrutenberg.com/2010/02/28/improved-ftp-backup-for-wordpress/) – 如何自动备份到 FTP 服务器
* [增量备份](https://www.guyrutenberg.com/2013/03/28/incremental-wordpress-backups-using-duply-duplicity/) – 如何使用 duplicity 制作加密的增量备份
* [在 WordPress 中使用 phpMyAdmin](https://developer.wordpress.org/advanced-administration/upgrade/phpmyadmin/)

#### 备份工具

* [使用 phpMyAdmin](https://developer.wordpress.org/advanced-administration/upgrade/phpmyadmin/)
* [FTP 客户端](https://developer.wordpress.org/advanced-administration/upgrade/ftp/)
* [使用 FileZilla](https://developer.wordpress.org/advanced-administration/upgrade/ftp/filezilla/)

### 延伸阅读 {#read-further}

* [WordPress 备份](https://developer.wordpress.org/advanced-administration/security/backup/)
* [WordPress 升级详解](https://developer.wordpress.org/advanced-administration/upgrade/upgrading/)

# 暴力破解攻击

**暴力破解攻击**是最简单的入侵方式：攻击者反复尝试用户名/密码组合，直到成功为止。由于这些尝试是自动化的且通常分布式进行（僵尸网络），即使不成功的攻击也可能用请求淹没您的网站。

这并非 WordPress 独有——任何暴露登录界面的 Web 应用程序都可能成为目标——但 WordPress 的流行使其成为常见焦点。以下指南反映了 2025 年 WordPress 网站的最佳实践，并取代了旧有的、更脆弱的技术。

---

## 关键防护措施一览 {#key-defenses}
- **使用高强度、唯一的密码并配合密码管理器。**
- **为所有管理员账户启用双因素认证 (2FA)**（使用插件或您的身份提供商；WordPress 核心不包含 2FA）。
- **考虑通过信誉良好的插件使用通行密钥 (WebAuthn)**，以实现防钓鱼登录。
- **在边缘（WAF/CDN）或 Web 服务器上对登录尝试进行速率限制。**
- **在登录页面添加验证码/验证小部件** 以减缓机器人攻击（例如 Cloudflare Turnstile、reCAPTCHA）。
- **如果不需要，请保护或禁用 XML-RPC**；否则对其进行限制和速率限制。
- **保持 WordPress 核心、主题和插件为最新版本。**
- **监控并告警认证异常**；临时封禁恶意 IP。
- 优先使用**边缘/WAF 防护**（Cloudflare、Sucuri、主机提供商提供的 WAF），以便在恶意流量到达服务器前将其拦截。

> 提示：隐藏登录 URL 可以减少干扰，但不应作为唯一的防护手段。

---

## WordPress 层级防护 {#wordpress-level}

### 强制使用强密码 {#strong-passwords}
WordPress 在更改密码时会显示强度指示器。鼓励使用独特、冗长的密码（或密码短语）以及密码管理器。避免使用字典词汇和个人信息。

### 双重身份验证 (2FA) {#2fa}
为所有管理员和特权用户启用 2FA，使用信誉良好的插件或您的身份提供商（TOTP 应用、硬件密钥、短信备用）。截至 2025 年，**WordPress 核心不提供 2FA**；必须通过插件或 SSO/IdP 添加。

### 通行密钥 (WebAuthn) {#passkeys}
通行密钥通过平台验证器（Face ID/Touch ID、Windows Hello、安全密钥）提供防钓鱼的无密码登录。通过支持 WebAuthn/通行密钥的维护插件添加，并为每位管理员至少注册两个验证器。

### 应用程序密码（用于集成） {#application-passwords}
对于受信任应用/服务的 API 访问，请使用**应用程序密码**（WordPress 5.6 中引入）。它们限定访问范围，并且无需更改用户密码即可撤销。

### 限制登录尝试次数（应用层） {#limit-login}
如果您的托管/CDN服务未在边缘进行速率限制，安全插件可以限制登录尝试。请注意，应用层插件仍在PHP环境中执行，因此在遭受猛烈攻击时仍会消耗一些资源；如有可能，应优先选择边缘或服务器级限制。

### XML‑RPC 注意事项 {#xmlrpc}
`xmlrpc.php` 是常见的暴力攻击目标（尤其是 `system.multicall` 方法）。如果您不使用 XML‑RPC，请禁用它。如果使用（例如 Jetpack、移动应用），请限制其访问（通过 WAF 规则）并实施严格的速率限制。

## 服务器 / 代理 / WAF 防护 {#server-proxy}
> 这些示例需要服务器或代理访问权限，并且可能因环境而异。在应用到生产环境前，请在预演环境中测试。

### Apache (示例) {#apache}
**阻止或限制滥用登录尝试的速率**（示例需要适当的模块，如 `mod_rewrite`、`mod_authz_host`，或第三方工具如 ModSecurity 或 mod_evasive）。

**按 IP 拒绝 (Apache 2.4+):**
```apache
# wp-login.php: 仅允许特定 IP
<Files "wp-login.php">
    Require ip 203.0.113.15 203.0.113.16
</Files>
```

**将 401/403 错误发送到静态错误页面:**
```apache
ErrorDocument 401 /401.html
ErrorDocument 403 /403.html
```

> 考虑使用 ModSecurity 规则集（例如 OWASP CRS）在服务器层检测和阻止暴力破解模式。

### Nginx (examples) {#nginx}
**Rate‑limit login and XML‑RPC:**
```nginx
# Define a shared zone for rate limiting
limit_req_zone $binary_remote_addr zone=logins:10m rate=10r/m;

server {
    # ...

    location = /wp-login.php {
        limit_req zone=logins burst=20 nodelay;
        include fastcgi_params;
        # pass to PHP-FPM or upstream as usual
    }

    location = /xmlrpc.php {
        limit_req zone=logins burst=20 nodelay;
        include fastcgi_params;
        # pass to PHP-FPM or upstream as usual
    }
}
```

**Deny by IP:**
```nginx
location = /wp-login.php {
    allow 203.0.113.15;
    allow 203.0.113.16;
    deny all;
    # pass to PHP-FPM or upstream as usual
}
```

**Custom error pages:**
```nginx
error_page 401 /401.html;
error_page 403 /403.html;
```

### Caddy (v2) (examples) {#caddy}
**Password‑protect `/wp-login.php` with Basic Auth:**
```caddyfile
# Hash passwords first: `caddy hash-password`
basicauth /wp-login.php {
    user1 JDJhJDEw$example-hash-value...
    # add more users as needed (one per line)
}
```
> Caddy requires **hashed** passwords in the Caddyfile.

**Limit access to `/wp-login.php` by IP:**
```caddyfile
@blacklist {
    not client_ip forwarded 203.0.113.15 203.0.113.16
    path /wp-login.php
}
respond @blacklist "Forbidden" 403 {
    close
}
```

**Return 401 for `/wp-admin/*` and serve a custom error page:**
```caddyfile
@wpadmin path /wp-admin/*
respond @wpadmin "Unauthorized" 401

handle_errors {
    @need401 status 401
    rewrite @need401 /401.html
    file_server
}
```

**Deny “no‑referrer” POSTs to login/comments (optional, use with caution):**
```caddyfile
# Legitimate clients or privacy tools may omit Referer; test before enforcing.
@protected path_regexp protected (wp-comments-post|wp-login)\.php$
@no_referer {
    not header Referer https://{host}*
    method POST
}
abort @no_referer
```
> Using `abort` immediately drops the connection, which is efficient for bots.

For more Caddy discussion and rationale, see: *Using Caddy to deter brute force attacks in WordPress* (community thread).

### Windows IIS（示例）{#iis}
**使用 `web.config` 按 IP 限制 WP 管理后台：**
```xml
<location path="wp-admin">
  <system.webServer>
    <security>
      <ipSecurity allowUnlisted="false">
        <add ipAddress="203.0.113.15" allowed="true" />
        <add ipAddress="203.0.113.16" allowed="true" />
      </ipSecurity>
    </security>
  </system.webServer>
</location>
```

**自定义 401 错误页面：**
```xml
<system.webServer>
  <httpErrors errorMode="Custom">
    <remove statusCode="401" />
    <error statusCode="401" path="/401.html" responseMode="File" />
  </httpErrors>
</system.webServer>
```

---

## 主机/CDN WAF 防护 {#waf}
托管式 WAF（Cloudflare、Sucuri 或您的主机提供商）可以：
- 在网络边缘过滤已知的恶意 IP 和自动化登录尝试。
- 强制执行机器人管理、质询页面和特定于登录的规则。
- 对 `/wp-login.php` 和 `/xmlrpc.php` 全局应用**速率限制**。
- 为可疑请求添加 **CAPTCHA/turnstile** 质询。

> 优势：流量在到达您的服务器之前即被阻止，可在高流量攻击期间节省资源。

## 额外加固与操作建议 {#hardening}
- **不要使用用户名 `admin`。** 创建单独的管理员账户，并降级或移除旧用户。
- **限制管理员数量；** 日常操作使用最小权限角色。
- **审计日志**以记录失败的登录尝试并枚举来源；临时封禁恶意 IP（例如，使用 Fail2ban）。
- **避免使用永久性的国家封禁列表。** 它们可能误封合法用户且难以维护。
- **确保全程使用 HTTPS** 以保护传输中的凭据。
- **备份：** 维护经过测试、支持离线操作的备份，并演练恢复流程。

## 另请参阅 {#see-also}
- WordPress 高级管理：[安全](https://developer.wordpress.org/advanced-administration/security/)
- WordPress 高级管理：[强化 WordPress](https://developer.wordpress.org/advanced-administration/security/hardening/)
- WordPress.com：[暴力攻击防护](https://developer.wordpress.com/docs/platform-features/brute-force-attack-protection/)
- WordPress 核心：[应用密码（集成指南）](https://make.wordpress.org/core/2020/11/05/application-passwords-integration-guide/)
- 使用 Caddy 阻止 WordPress 中的暴力攻击 – 社区讨论：https://caddy.community/t/using-caddy-to-deter-brute-force-attacks-in-wordpress/13579

---

## 关于已弃用/遗留内容的说明 {#legacy-notes}
旧指南常建议使用繁重的 `.htaccess` 重写、国家 IP 黑名单或对整个 `/wp-admin` 目录启用 BasicAuth。如今这些措施要么不可靠，要么会破坏基于 AJAX 的插件，要么会降低用户体验。建议改用**边缘级 WAF**、**2FA**、**通行密钥**和**针对性速率限制**。若确实应用服务器级封锁，请将其范围限定在特定路径（如 `/wp-login.php`、`/xmlrpc.php`），并记录站点所需的例外情况（移动应用、Jetpack、SSO）。

# 缓存安全

虽然缓存能显著提升 WordPress 网站性能，但如果缓存提供程序配置不当，也可能使网站暴露于新的安全风险。常见漏洞包括但不限于：网站访问其他网站的缓存数据，或缓存应用提供错误的缓存数据/文件。各类缓存应用通常都设有安全设置与配置选项，以确保在享受缓存性能优势的同时提供安全环境。

## OpCache 安全

如 WordPress 托管手册的性能章节所述，PHP 操作码缓存能显著提升 WordPress 网站的 PHP 处理性能。然而，若配置不当，PHP 操作码缓存可能允许用户未经授权访问其他用户的 PHP 文件。存在重要的 PHP 配置选项可缓解此类漏洞，例如未经授权访问文件。

### 验证权限

以下设置使 PHP 检查当前用户是否具有访问缓存文件的必要权限。应在根 php.ini 配置级别启用此设置，以防止用户访问其他用户的缓存文件。  
`opcache.validate_permission = On`

此设置默认未启用。且仅在 PHP 7.0.14 及更高版本中可用。

### 验证根目录

以下设置可防止 PHP 用户访问其通常无法访问的 chroot 目录之外的文件。此设置也应添加到根 php.ini 配置层级，以防止对文件的未授权访问。  
`opcache.validate_root = On`

此设置默认未启用。且仅在 PHP 7.0.14 及更高版本中可用。

### 限制 API 访问权限

通常情况下，任何 PHP 用户都可以访问 opcache API 来查看当前缓存的文件并管理 PHP 操作码缓存。然而，在某些 PHP 配置中，PHP 操作码缓存在服务器上的所有用户之间共享内存。这意味着所有用户都可以查看和访问 PHP 操作码缓存，并能访问其他用户缓存的 PHP 文件。限制 Opcache API 可以防止在未授权目录中运行的 PHP 脚本查看缓存文件，以及从 PHP 脚本内部手动与 PHP 操作码缓存交互。以下设置定义了 PHP 脚本必须从哪个目录路径开始才能访问 Opcache API：  
`opcache.restrict_api = '/some/folder/path'`

该设置的默认值为 `''`，这意味着对哪些 PHP 脚本可以访问 Opcache API 没有限制。此设置应在 PHP 配置的根 php.ini 文件中定义，以防止用户覆盖它。

## 对象缓存安全

WordPress 提供多种数据库对象缓存解决方案。每种方案都有其特定的配置要求，以确保在使用数据库对象缓存时提供安全的环境。

### Redis

Redis 是一款轻量级、高性能的键值数据库服务器，常用于缓存 WordPress 数据库查询结果。在默认配置下，Redis 使用单一数据库，无需用户名和密码即可访问。同时，Redis 应仅允许来自授权网络主机的访问。

#### Redis 数据库

Redis 默认提供 16 个数据库，编号从 0 到 15。Redis 客户端应配置为使用不同的数据库，而非默认的 0 号数据库。Redis 可配置为拥有更多数据库，但这超出了本文档的范围。

#### Redis 用户凭证

若 Redis 将用于数据库对象缓存，则应配置 Redis 服务器要求访问凭证。

#### Redis 网络主机

默认配置下，Redis 服务器监听 6379 端口。该端口可在 Redis 配置中修改，但无论使用哪个端口，都应通过防火墙进行保护以防止未授权访问。

#### Redis 缓存键盐值

若使用 Redis 进行数据库对象缓存，采用唯一的 Redis 缓存键盐值有助于防止缓存冲突——即当两个网站尝试使用相同键名缓存内容时发生的情况。缓存冲突可能导致网站访问其他网站的缓存数据，并引发其他非预期的不良行为。Redis 缓存键盐值通常通过 Redis 缓存插件或 Redis 客户端进行配置，这些工具用于在 WordPress 网站中启用 Redis 数据库对象缓存功能。

### Memcached

Memcached 是一种内存对象缓存解决方案，常用于为 WordPress 提供数据库对象缓存。使用 Memcached 时最重要的配置注意事项之一是防止 Memcached 被公共互联网访问。将 Memcached 服务器置于防火墙之后，是安全使用 Memcached 进行 WordPress 数据库对象缓存的最重要环节之一。

# 强化 WordPress 安全性

WordPress 非常[重视安全性](https://wordpress.org/about/security/)，但与其他系统一样，如果不采取一些基本的安全预防措施，可能会出现潜在的安全问题。本文将介绍一些常见的漏洞形式，以及您可以采取的措施来保护 WordPress 安装的安全。

本文并非解决安全问题的终极快速方案。如果您有特定的安全疑虑或疑问，应与您信任的、具备足够计算机安全和 WordPress 知识的人士讨论。

## 什么是安全？ {#what-is-security}

从根本上说，安全**并非**指绝对安全的系统。这样的系统可能不切实际，或者难以找到和/或维护。安全实际上是降低风险，而非消除风险。它意味着在合理范围内，运用所有可用的适当控制措施，以改善整体安全状况，降低成为攻击目标并随后被入侵的可能性。

**网站托管服务**

在网站安全方面，一个良好的起点通常是您的托管环境。如今，您有多种选择，虽然托管服务提供商会提供一定程度的安全保障，但重要的是要了解他们的责任在哪里结束，而您的责任从哪里开始。这里有一篇很好的文章，解释了[网络托管服务与您网站安全之间复杂的动态关系](https://perezbox.com/2014/11/how-hosts-manage-your-website-security/)。一个安全的服务器能保护服务器管理员控制下的资源的隐私性、完整性和可用性。

可信赖的网站托管服务商应具备以下特质：

* 乐于讨论您的安全顾虑，并说明其托管服务提供哪些安全功能和流程。
* 提供所有服务器软件的最新稳定版本。
* 提供可靠的备份和恢复方法。

通过确定需要保护的软件和数据，来决定您的服务器需要哪些安全措施。本指南的其余部分将帮助您完成这项工作。

**网站应用程序**

人们很容易将目光投向网站托管服务商，并将安全责任推给他们，但网站所有者自身也承担着巨大的安全责任。托管服务商通常负责您网站所依赖的基础设施，但并不对您选择安装的应用程序负责。

要理解这一点为何重要以及其重要性体现在哪里，您必须[了解网站是如何被入侵的](https://blog.sucuri.net/2015/05/website-security-how-do-websites-get-hacked.html)。入侵很少归因于基础设施，而最常归因于应用程序本身（即您负责的环境）。

### 安全主题 {#security-themes}

在为系统的每个方面考虑安全时，请牢记以下一些总体思路：

**限制访问**

做出明智的选择，以减少恶意人员可能利用的入口点。

**遏制**

应配置您的系统，以在系统被入侵时最大限度地减少可能造成的损害。

**准备与认知**

定期备份并了解 WordPress 安装的状态。制定灾难情况下的备份和恢复计划，可以帮助您在出现问题时更快地恢复在线。

**可信来源**

不要从未知来源获取插件/主题。请仅使用 WordPress.org 官方仓库或知名公司的产品。尝试从外部获取插件/主题[可能导致问题](https://blog.sucuri.net/2014/03/unmasking-free-premium-wordpress-plugins.html)。

### 您计算机上的漏洞 {#vulnerabilities-on-your-computer}

请确保您使用的计算机没有间谍软件、恶意软件和病毒感染。如果您的计算机上存在键盘记录器，WordPress 或您的 Web 服务器上的任何安全措施都将无济于事。

请始终将您的操作系统及其上的软件（尤其是您的 Web 浏览器）保持最新，以防范安全漏洞。如果您正在浏览不受信任的站点，我们还建议您在浏览器中使用 no-script 等工具（或禁用 JavaScript/Flash/Java）。

### WordPress 中的漏洞 {#vulnerabilities-in-wordpress}

与许多现代软件包一样，WordPress 会定期更新以解决可能出现的新安全问题。提升软件安全性始终是一项持续的工作，为此**您应始终使用最新版本的 WordPress**。旧版本的 WordPress 不会获得安全更新维护。

#### Updating WordPress {#updating-wordpress}

Main article: [Updating WordPress](https://wordpress.org/documentation/article/updating-wordpress/).

The latest version of WordPress is always available from the main WordPress website at https://wordpress.org. Official releases are not available from other sites — **never** download or install WordPress from any website other than https://wordpress.org.

Since version 3.7, WordPress has featured automatic updates. Use this functionality to ease the process of keeping up to date. You can also use the WordPress Dashboard to keep informed about updates. Read the entry in the Dashboard or the WordPress Developer Blog to determine what steps you must take to update and remain secure.

If a vulnerability is discovered in WordPress and a new version is released to address the issue, the information required to exploit the vulnerability is almost certainly in the public domain. This makes old versions more open to attack, and is one of the primary reasons you should always keep WordPress up to date.

If you are an administrator in charge of more than one WordPress installation, consider using [Subversion](https://codex.wordpress.org/Installing/Updating_WordPress_with_Subversion) to make management easier.

#### 报告安全问题 {#reporting-security-issues}

如果您认为在 WordPress 中发现了安全漏洞，可以通过报告问题来提供帮助。请参阅[安全常见问题解答](https://make.wordpress.org/core/handbook/testing/reporting-security-vulnerabilities/)了解如何报告安全问题。

如果您认为发现了错误，请报告它。请参阅[提交错误](https://make.wordpress.org/core/handbook/testing/reporting-bugs/)了解如何操作。您可能发现了一个漏洞，或是一个可能导致漏洞的错误。

### Web 服务器漏洞 {#web-server-vulnerabilities}

运行 WordPress 的 Web 服务器及其上的软件可能存在漏洞。因此，请确保您运行的是安全、稳定的 Web 服务器版本及其上的软件，或者确保您使用的是值得信赖的主机，由他们为您处理这些事务。

如果您使用的是共享服务器（除了您自己的网站外还托管其他网站），并且同一服务器上的某个网站遭到入侵，那么即使您遵循了本指南中的所有建议，您的网站也可能受到威胁。请务必向您的[网络主机](https://wordpress.org/documentation/article/glossary/#Hosting_provider)咨询他们采取了哪些安全预防措施。

### 网络漏洞 {#network-vulnerabilities}

两端网络——WordPress 服务器端和客户端网络端——都应是可信的。这意味着需要更新家庭路由器的防火墙规则，并谨慎选择工作网络。在网吧通过未加密连接（无论是有线还是无线）发送密码，**不是**可信网络。

您的网络托管服务商应确保其网络不受攻击者入侵，您也应如此。网络漏洞可能导致密码和其他敏感信息被截获。

### 密码 {#passwords}

良好的安全习惯可以避免许多潜在漏洞。设置强密码是其中的重要一环。

密码的目标是让他人难以猜测，并使[暴力破解攻击](https://developer.wordpress.org/advanced-administration/security/brute-force/)难以成功。可以使用许多[自动密码生成器](https://www.google.com/?q=password+generator)来创建安全密码。

WordPress 还提供了密码强度检测功能，在 WordPress 中更改密码时会显示。更改密码时请利用此功能确保密码强度足够。

选择密码时应避免以下情况：

* 任何与本人真实姓名、用户名、公司名称或网站名称相关的排列组合。
* 任何语言词典中的单词。
* 过短的密码。
* 纯数字或纯字母密码（混合使用最佳）。

强密码不仅对保护博客内容至关重要。黑客一旦获取管理员账户访问权限，就能安装恶意脚本，可能危及整个服务器。

除了使用强密码外，建议启用[两步验证](https://developer.wordpress.org/advanced-administration/security/mfa/)作为额外的安全措施。

### FTP {#ftp}

连接到您的服务器时，如果您的网络主机提供 SFTP 加密，您应该使用它。如果您不确定您的网络主机是否提供 SFTP，直接询问他们即可。

使用 SFTP 与 FTP 相同，区别在于您的密码和其他数据在计算机和网站之间传输时会被加密。这意味着您的密码永远不会以明文形式发送，攻击者无法截获。

### 文件权限 {#file-permissions}

WordPress 的一些巧妙功能源于允许 Web 服务器对各类文件进行写入操作。然而，允许文件写入访问存在潜在风险，尤其是在共享托管环境中。

最佳做法是尽可能严格锁定文件权限，仅在需要允许写入访问时放宽限制，或为特定目的（如上传文件）创建限制较少的专用文件夹。

以下是一种可行的权限设置方案。

所有文件应归您的用户账户所有，且仅对您可写。任何需要 WordPress 写入访问的文件应对 Web 服务器可写——如果您的托管环境要求如此，这可能意味着这些文件需要由 Web 服务器进程使用的用户账户进行组所有。

**`/`**

WordPress 根目录：所有文件应仅对您的用户账户可写，但若希望 WordPress 自动生成重写规则，则 `.htaccess` 文件除外。

**`/wp-admin/`**

WordPress 管理区域：所有文件应仅对您的用户账户可写。

**`/wp-includes/`**

WordPress 应用程序逻辑主体：所有文件应仅对您的用户账户可写。

**`/wp-content/`**

用户提供的内容：设计为对您的用户账户和 Web 服务器进程可写。

在 `/wp-content/` 目录内，您会发现：

**`/wp-content/themes/`**

主题文件。若需使用内置主题编辑器，所有文件需对 Web 服务器进程可写。若不使用内置主题编辑器，所有文件可仅对您的用户账户可写。

**`/wp-content/plugins/`**

插件文件：所有文件应仅对您的用户账户可写。

`/wp-content/` 中可能存在的其他目录应由请求它们的插件或主题进行说明。其权限设置可能有所不同。

#### 更改文件权限 {#changing-file-permissions}

如果您拥有服务器的 shell 访问权限，可以使用以下命令递归更改文件权限：

对于目录：

```
find /path/to/your/wordpress/install/ -type d -exec chmod 755 {} \;
```

对于文件：

```
find /path/to/your/wordpress/install/ -type f -exec chmod 644 {} \;
```

#### 关于自动更新 {#regarding-automatic-updates}

当您指示 WordPress 执行自动更新时，所有文件操作将以文件所有者的身份执行，而非 Web 服务器用户身份。所有文件权限将设置为 0644，目录权限设置为 0755，仅允许所有者写入，其他用户（包括 Web 服务器）仅可读取。

### 数据库安全 {#database-security}

若在同一服务器上运行多个博客站点，建议考虑将它们分别置于由不同用户管理的独立数据库中。这一操作最好在初次进行 [WordPress 安装](https://developer.wordpress.org/advanced-administration/before-install/howto-install/)时完成。这是一种隔离策略：即使入侵者成功攻破某个 WordPress 实例，也能极大增加其篡改其他博客的难度。

若您自行管理 MySQL，请确保理解 MySQL 配置并禁用非必要功能（例如接受远程 TCP 连接）。更多信息请参阅 [MySQL 安全指南](https://dev.mysql.com/doc/refman/8.0/en/security.html)。

#### 限制数据库用户权限 {#restricting-database-user-privileges}

对于正常的 WordPress 操作，例如发布博客文章、上传媒体文件、发表评论、创建新 WordPress 用户和安装 WordPress 插件，MySQL 数据库用户仅需要对 MySQL 数据库的数据读取和写入权限：SELECT、INSERT、UPDATE 和 DELETE。

因此，任何其他数据库结构和管理权限，例如 DROP、ALTER 和 GRANT，都可以被撤销。通过撤销这些权限，您也在加强遏制策略。

**注意：** 某些插件、主题和主要的 WordPress 更新可能需要更改数据库结构，例如添加新表或更改架构。在这种情况下，安装插件或更新软件之前，您需要临时授予数据库用户所需的权限。

**警告：** 尝试在没有这些权限的情况下进行更新，当数据库架构发生更改时可能会导致问题。因此，**不**建议撤销这些权限。如果您确实出于安全原因需要这样做，请确保您首先制定了可靠的备份计划，定期进行完整的数据库备份，并已验证备份有效且易于恢复。失败的数据库升级通常可以通过将数据库恢复到旧版本、授予适当权限，然后让 WordPress 再次尝试数据库更新来解决。恢复数据库将使其回到旧版本，WordPress 管理界面随后会检测到旧版本，并允许您对其运行必要的 SQL 命令。大多数 WordPress 升级不会更改架构，但有些会。只有主要版本升级（例如从 3.7 到 3.8）才会更改架构。次要升级（例如从 3.8 到 3.8.1）通常不会。尽管如此，**请定期备份**。

### 保护 wp-admin {#securing-wp-admin}

为 `/wp-admin/` 添加服务器端密码保护（例如 [BasicAuth](https://en.wikipedia.org/wiki/Basic_access_authentication)）能为博客管理后台、登录界面及文件增加第二层防护。这迫使攻击者或机器人必须突破这层额外保护，而非直接攻击实际的管理文件。许多 WordPress 攻击是由恶意软件机器人自主执行的。

但仅保护 `wp-admin/` 目录可能会破坏部分 WordPress 功能，例如位于 `wp-admin/admin-ajax.php` 的 AJAX 处理器。请查阅 [资源](https://developer.wordpress.org/advanced-administration/resources/) 章节获取关于如何正确设置 `wp-admin/` 目录密码保护的详细文档。

针对 WordPress 博客的最常见攻击通常分为两类：

1. 向服务器发送精心构造的 HTTP 请求，其中包含针对特定漏洞的利用载荷。这包括利用老旧/过期的插件和软件。
2. 通过“暴力破解”密码猜测来尝试获取博客访问权限。

这种“第二层”密码保护的终极实施方案是要求通过 HTTPS SSL 加密连接进行管理，以确保所有通信和敏感数据均被加密。_参见 [SSL 加密管理](https://developer.wordpress.org/advanced-administration/security/https/)。_

### 保护 wp-includes 目录 {#securing-wp-includes}

可以添加第二层保护来防止用户访问通常不应被直接访问的脚本文件。一种方法是在 .htaccess 文件中使用 mod_rewrite 模块来阻止这些脚本。**注意：** 为确保以下代码不被 WordPress 覆盖，请将其放置在 .htaccess 文件的 `# BEGIN WordPress` 和 `# END WordPress` 标签之外。WordPress 可能会覆盖这些标签之间的任何内容。

```
# 阻止仅包含文件。
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^wp-admin/includes/ - [F,L]
RewriteRule !^wp-includes/ - [S=3]
RewriteRule ^wp-includes/[^/]+\.php$ - [F,L]
RewriteRule ^wp-includes/js/tinymce/langs/.+\.php - [F,L]
RewriteRule ^wp-includes/theme-compat/ - [F,L]
</IfModule>
# BEGIN WordPress
```

请注意，这在多站点（Multisite）环境下可能无法良好工作，因为 `RewriteRule ^wp-includes/[^/]+\.php$ - [F,L]` 会阻止 ms-files.php 文件生成图像。省略该行可以使代码正常工作，但会降低安全性。

### 保护 wp-config.php 文件 {#securing-wp-config-php}

您可以将 `wp-config.php` 文件移动到 WordPress 安装目录的上层目录。这意味着，对于安装在网站根目录下的站点，您可以将 `wp-config.php` 存储在网站根目录文件夹之外。

**注意：** 有人认为 [移动 wp-config.php 文件的安全益处有限](https://wordpress.stackexchange.com/questions/58391/is-moving-wp-config-outside-the-web-root-really-beneficial)，并且如果操作不当，实际上可能引入严重的安全漏洞。[其他人则持不同意见](https://wordpress.stackexchange.com/questions/58391/is-moving-wp-config-outside-the-web-root-really-beneficial/74972#74972)。

请注意，`wp-config.php` 可以存储在 WordPress 安装目录（即包含 wp-includes 的目录）的上层目录中。同时，请确保只有您（和 Web 服务器）可以读取此文件（通常意味着权限设置为 400 或 440）。

如果您使用的服务器支持 .htaccess 文件，可以在该文件顶部添加以下内容，以拒绝任何试图访问该文件的请求：

```
<Files "wp-config.php">
Require all denied
</Files>
```

### 禁用文件编辑 {#disable-file-editing}

默认情况下，WordPress 仪表盘允许管理员编辑 PHP 文件，例如插件和主题文件。如果攻击者能够登录，这通常是他们首先利用的工具，因为它允许执行代码。WordPress 提供了一个常量来禁用仪表盘中的编辑功能。将以下代码行放入 wp-config.php 文件，等同于移除所有用户的 'edit_themes'、'edit_plugins' 和 'edit_files' 权限：

```
define( 'DISALLOW_FILE_EDIT', true );
```

这并不能阻止攻击者向您的网站上传恶意文件，但可能会阻止某些攻击。

### 插件 {#plugins}

首先，请确保您的插件始终保持最新。此外，如果您不使用某个特定插件，请将其从系统中删除。

#### 防火墙 {#firewall}

有许多插件和服务可以充当您网站的防火墙。其中一些通过修改您的 .htaccess 文件并在 WordPress 处理之前，在 Apache 级别限制某些访问来工作。一个很好的例子是 [iThemes Security](https://wordpress.org/plugins/better-wp-security/) 或 [All in One WP Security](https://wordpress.org/plugins/all-in-one-wp-security-and-firewall/)。一些防火墙插件在 WordPress 级别工作，例如 [WordFence](https://wordpress.org/plugins/wordfence/) 和 [Shield](https://wordpress.org/plugins/wp-simple-firewall/)，它们会在 WordPress 加载时但尚未完全处理之前尝试过滤攻击。

除了插件，您还可以在 Web 服务器上安装 WAF（Web 应用程序防火墙），以便在 WordPress 处理之前过滤内容。最受欢迎的开源 WAF 是 ModSecurity。

网站防火墙也可以作为互联网流量和您托管服务器之间的中间层添加。这些服务都充当反向代理，它们接受初始请求并将其重新路由到您的服务器，同时剥离所有恶意请求。它们通过修改您的 DNS 记录（通过 A 记录或完整的 DNS 交换）来实现这一点，允许所有流量首先通过新网络。这导致所有流量在到达您的网站之前都经过防火墙过滤。一些公司提供此类服务，例如 [CloudFlare](https://www.cloudflare.com/)、[Sucuri](https://sucuri.net/wordpress-security/) 和 [Incapsula](https://www.imperva.com/)。

此外，这些第三方服务提供商默认情况下也充当内容分发网络（CDN），提供性能优化和全球覆盖。

#### 需要写入权限的插件 {#plugins-that-need-write-access}

如果某个插件需要写入您的 WordPress 文件和目录，请阅读其代码以确保其合法性，或咨询您信任的人。可查阅的地方包括[支持论坛](https://wordpress.org/support/welcome/)和[IRC 频道](https://make.wordpress.org/support/handbook/appendix/other-support-locations/introduction-to-irc/)。

#### 代码执行插件 {#code-execution-plugins}

正如我们所说，强化 WordPress 的部分目标是在发生成功攻击时控制损害。允许从数据库条目中执行任意 PHP 或其他代码的插件，会显著放大成功攻击时造成损害的可能性。

避免使用此类插件的一种方法是使用调用函数的[自定义页面模板](https://wordpress.org/documentation/article/pages/#Creating_your_own_Page_Templates)。这种安全措施的部分有效性，仅在您[禁止在 WordPress 内编辑文件](#File_Permissions)时才得以体现。

### Security through obscurity {#security-through-obscurity}

[Security through obscurity](https://en.wikipedia.org/wiki/Security_through_obscurity) is generally an unsound primary strategy. However, there are areas in WordPress where obscuring information _might_ help with security:

1. **Rename the administrative account:** When creating an administrative account, avoid easily guessed terms such as `admin` or `webmaster` as usernames because they are typically subject to attacks first. On an existing WordPress install you may rename the existing account in the MySQL command-line client with a command like:
```
UPDATE wp_users SET user_login = 'newuser' WHERE user_login = 'admin';
```
or by using a MySQL frontend like [phpMyAdmin](https://developer.wordpress.org/advanced-administration/upgrade/phpmyadmin/).
2. **Change the table_prefix:** Many published WordPress-specific SQL-injection attacks make the assumption that the table_prefix is `wp_`, the default. Changing this can block at least some SQL injection attacks.

### 数据备份 {#data-backups}

请定期备份您的数据，包括 MySQL 数据库。详见主文：[备份您的数据库](https://developer.wordpress.org/advanced-administration/security/backup/database/)。

数据完整性对于可信备份至关重要。对备份进行加密、为每个备份文件保留独立的 MD5 哈希记录，以及/或将备份存储在只读介质上，可以增强您对数据未被篡改的信心。

一个完善的备份策略可以包括：在可信位置保存一组定期对整个 WordPress 安装（包括 WordPress 核心文件和数据库）的快照。设想一个每周制作快照的网站。这样的策略意味着，如果网站在 5 月 1 日遭到入侵，但直到 5 月 12 日才检测到，网站所有者将拥有入侵前的备份来帮助重建网站，甚至可能还有入侵后的备份，这将有助于确定网站是如何被入侵的。

### 日志记录 {#logging}

日志是理解网站动态的最佳伙伴，尤其是在进行取证分析时。与普遍看法相反，日志能让你看到发生了什么、由谁操作以及何时发生。遗憾的是，日志不会显示登录的用户名，但能帮你识别IP地址、时间，更重要的是攻击者可能采取的行动。通过日志，你可以发现以下攻击行为——跨站脚本攻击（XSS）、远程文件包含（RFI）、本地文件包含（LFI）以及目录遍历尝试。你还能看到暴力破解企图。网上有各种[示例和教程](https://blog.sucuri.net/2015/08/ask-sucuri-how-did-my-wordpress-website-get-hacked-a-tutorial.html)可帮助你解析和分析原始日志。

当你更熟悉日志后，就能观察到诸如主题和插件编辑器的使用情况、小工具更新记录以及文章页面的新增时间。这些都是对Web服务器进行取证工作的关键要素。部分WordPress安全插件也能提供协助，例如[Sucuri审计工具](https://wordpress.org/plugins/sucuri-scanner/)或[审计追踪](https://wordpress.org/plugins/audit-trail/)插件。

从安全层面考虑，你的Web服务器需要部署两个关键的开源解决方案，这是分层安全策略的重要组成。

OSSEC可运行于任何NIX发行版及Windows系统。正确配置后功能非常强大，其核心理念是关联并聚合所有日志。必须确保配置涵盖所有access_logs和error_logs，若服务器托管多个网站也需纳入考量。同时要注意过滤干扰信息——默认设置会产生大量杂讯，需通过配置提升实效性。

### 监控 {#monitoring}

有时预防措施并不足够，您仍可能遭受攻击。因此入侵检测/监控至关重要，它能帮助您更快响应、查明事件并恢复网站。

#### 监控日志 {#monitoring-your-logs}

如果您使用的是专用服务器或虚拟私有服务器，并拥有 root 访问权限，则可以轻松配置以查看系统运行状况。[OSSEC](https://www.ossec.net/) 能便捷地实现此功能，这篇简短的文章或许能为您提供帮助：[OSSEC 用于网站安全 – 第一部分](https://perezbox.com/2013/03/ossec-for-website-security-part-i/)。

#### 监控文件变更 {#monitoring-your-files-for-changes}

攻击发生时总会留下痕迹，无论是在日志中还是在文件系统中（新增文件、修改文件等）。例如，若使用 [OSSEC](https://www.ossec.net/)，它将监控文件并在变更时发出警报。

##### 目标 {#goals}

文件系统追踪的目标包括：

* 监控已更改和新增的文件
* 记录变更和新增内容
* 能够回滚细粒度的更改
* 自动告警

##### 通用方法 {#general-approaches}

管理员可以通过以下通用技术监控文件系统：

* 系统工具
* 版本控制
* 操作系统/内核级监控

##### 特定工具 {#specific-tools}

文件系统监控的选项包括：

* [diff](https://en.wikipedia.org/wiki/Diff_utility) – 构建站点的干净测试副本并与生产环境进行比较
* [Git](https://git-scm.com/) – 源代码管理
* [inotify](https://en.wikipedia.org/wiki/Inotify) – 操作系统内核级文件监控服务，可在文件系统事件上运行命令
* [Watcher](https://github.com/gregghz/Watcher/blob/master/jobs.yml) – Python inotify 库
* [OSSEC](https://www.ossec.net/) – 开源基于主机的入侵检测系统，执行日志分析、文件完整性检查、策略监控、rootkit 检测、实时警报和主动响应。

##### 注意事项 {#considerations}

配置基于文件的监控策略时，需要考虑许多因素，包括以下几点。

###### 以 root 身份运行监控脚本/服务

这将使攻击者难以禁用或修改您的文件系统监控解决方案。

###### 在计划维护/升级期间禁用监控

这可以防止您在网站进行常规维护时收到不必要的通知。

###### 仅监控可执行文件类型

仅监控可执行文件类型（例如 .php 文件等）可能是相对安全的。过滤掉非可执行文件可以减少不必要的日志条目和警报。

###### 使用严格的文件系统权限

了解如何保护文件权限和所有权。通常，应尽可能避免授予 _执行_ 和 _写入_ 权限。

#### 外部监控您的 Web 服务器 {#monitoring-your-web-server-externally}

如果攻击者试图篡改您的网站或添加恶意软件，您也可以使用基于 Web 的完整性监控解决方案来检测这些变化。如今这类方案形式多样，使用您常用的搜索引擎搜索“Web 恶意软件检测与修复”，很可能会得到一长串服务提供商列表。

### 官方 WordPress 资源 {#resources}

* [WordPress 安全白皮书](https://wordpress.org/about/security/)
* [暴力破解攻击](https://developer.wordpress.org/advanced-administration/security/brute-force/)
* [安全常见问题解答](https://make.wordpress.org/core/handbook/testing/reporting-security-vulnerabilities/)
* [常见问题解答 – 我的网站被黑了](https://wordpress.org/documentation/article/faq-my-site-was-hacked/)

### 另请参阅 {#see-also}

* [开源安全详解](https://snyk.io/series/open-source-security/) (Snyk)
* [WordPress 安全吗？](https://patchstack.com/articles/is-wordpress-safe/) (Patchstack)
* [身份验证与授权 — Apache HTTP 服务器 2.2 官方文档](https://httpd.apache.org/docs/current/howto/auth.html)
* [安全控制](https://docs.nginx.com/nginx/admin-guide/security-controls/) 和 [NGINX 高级安全文档](https://docs.nginx.com/nginx-management-suite/acm/how-to/policies/advanced-security/)
* Gridpane 的 [WordPress 安全知识库](https://gridpane.com/knowledgebase/security/) 和 [WordPress 安全分步指南](https://gridpane.com/knowledgebase/security-strategies-and-tools/)
* [WordPress 如何使用身份验证 Cookie 和会话：技术深度解析](https://snicco.io/blog/how-wordpress-uses-authentication-cookies-and-sessions) (Snicco)
* [WordPress 如何使用盐值以及为何不应轮换它们：技术深度解析](https://snicco.io/blog/wordpress-salts) (Snicco)
* [会话管理与安全](https://github.com/snicco/fortress/blob/beta/docs/modules/session/session-managment-and-security.md#session-management-and-security) (Snicco)
* [WordPress 信息安全加固指南](https://cio.ubc.ca/information-security/policy-standards-and-resources/securing-wordpress) (不列颠哥伦比亚大学 OCIO)
* [安全：从基础到企业级，与 Calvin Alkan、Kathy Zant 和 Carl Alexander 探讨](https://openchannels.fm/security-from-the-basics-to-enterprise-with-calvin-alkan/) (视频)
* [WordPress 安全：拨开迷雾](https://blog.sucuri.net/2012/08/wordpress-security-cutting-through-the-bs.html)
* [电子书：锁定 WordPress](https://newcodepoet.files.wordpress.com/2012/07/lockingdownwordpress1-1.pdf)
* [Brad Williams：锁定它 (视频)](https://wordpress.tv/2010/01/23/brad-williams-security-boston10/)
* [安全插件](https://wordpress.org/plugins/tags/security)

# HTTPS

HTTPS 是一种加密通信协议——本质上是一种更安全的网页浏览方式，因为它能在您的浏览器和网络服务器之间建立专用通道。这就是为什么大多数主流网站都采用 HTTPS。

如果网站使用 HTTPS，您会在地址栏看到一个小锁图标，如下图所示：

![“安全网站”锁形图标截图](https://wordpress.org/documentation/files/2019/03/image.png)

以下是在您自己的网站上使用 HTTPS 的最常见原因：

**更快。** 有人可能认为 HTTPS 会让网站变慢，因为加密和解密所有数据需要时间。但许多 HTTP 的效率改进只有在使用 HTTPS 时才能实现。因此，对于绝大多数访问者来说，HTTPS 实际上会让您的网站加载更快。

**信任。** 用户更容易信任安全的网站。虽然他们不一定知道自己的流量已被加密，但他们确实明白小锁图标意味着网站重视隐私。技术人员会知道，您的计算机与网络服务器之间的任何中间服务器都无法查看或篡改传输的信息。

**支付安全。** 如果您在网站上销售商品，用户希望确保支付信息安全。HTTPS 和小锁图标能保证他们的信息安全传输到网络服务器。

**搜索引擎优化。** 许多搜索引擎会对不使用 HTTPS 的网站进行降权处理，从而使其更难在搜索结果中获得靠前排名。

**您的声誉。** 您是否注意到某些网站地址旁会显示“不安全”字样？

当您的网络浏览器想让您知道某个网站未使用 HTTPS 时就会出现这种情况。浏览器希望您明白（这种想法是正确的！）：那些懒得使用 HTTPS（很多情况下是免费的）的网站所有者不值得您花费时间，更不值得您花钱。

反过来，您肯定也不希望浏览器暗示您可能是那种不可靠的网站所有者。

当 TLS/SSL 证书已安装并可供网络服务器使用时，WordPress 完全兼容 HTTPS。强烈建议启用 HTTPS 支持，以帮助维护 WordPress 登录和网站访问者的安全性。

## 通过 HTTPS 进行管理

要轻松启用（并强制）通过 SSL 进行 WordPress 管理，您可以在网站的 [wp-config.php](https://wordpress.org/documentation/article/editing-wp-config-php/) 文件中定义两个常量。在插件文件中定义这些常量是不够的；必须在您的 [wp-config.php](https://wordpress.org/documentation/article/editing-wp-config-php/) 文件中定义。您还必须已在服务器上配置好 SSL，并为安全服务器配置好（虚拟）主机，然后您的网站在将这些常量设置为 true 时才能正常工作。

**注意：** `FORCE_SSL_LOGIN` 已在 [4.0 版本](https://wordpress.org/documentation/wordpress-version/version-4-0/)中弃用。请使用 `FORCE_SSL_ADMIN`。

### 强制 HTTPS 登录与 HTTPS 管理访问 {#to-force-ssl-logins-and-ssl-admin-access}

在 `wp-config.php` 文件中将常量 `FORCE_SSL_ADMIN` 设置为 true，即可强制所有登录 **及** 所有管理会话通过 SSL 进行。

#### 示例 {#example}

```
define( 'FORCE_SSL_ADMIN', true );
```

### 使用反向代理 {#using-a-reverse-proxy}

如果 WordPress 托管在提供 SSL 的反向代理之后，但其自身未启用 SSL，这些设置最初会导致请求陷入无限重定向循环。为避免此问题，你可以配置 WordPress 以识别 `HTTP_X_FORWARDED_PROTO` 标头（假设你已正确配置反向代理来设置该标头）。

#### Example {#example-2}

```
define( 'FORCE_SSL_ADMIN', true );
// in some setups HTTP_X_FORWARDED_PROTO might contain 
// a comma-separated list e.g. http,https
// so check for https existence
if( strpos( $_SERVER['HTTP_X_FORWARDED_PROTO'], 'https') !== false )
	$_SERVER['HTTPS'] = 'on';
```

#### 注意

当您使用代理转发重定向时，您将请求传输到网络中的某个主机，但不会传输与之关联的标头。然而，WordPress 需要某些标头才能执行一些重定向。为了传输这些标头，您需要在重定向配置中添加一些行。

例如，对于 Nginx，您需要添加以下行：
```
location / {
	proxy_pass http://your_host_name:your_port;
	proxy_set_header Host $host:$server_port;
	proxy_set_header X-Real-IP $remote_addr;
	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
	proxy_set_header X-Forwarded-Host $server_name;
	proxy_set_header X-Forwarded-Proto $scheme;
	proxy_redirect off;
}
```

像 `$variable` 这样的变量由反向代理自动管理。

### 更多信息 {#further-information}

本文其余部分提供的信息适用于以下情况：您正在使用旧版 WordPress（理想情况下不应如此！）或您的 SSL 设置有所不同（例如，您的 SSL 证书用于其他域名）。

有时，您希望整个 wp-admin 通过 https 协议在安全连接上运行。从概念上讲，该过程的工作原理如下：

1. 设置两个具有相同 URL（博客 URL）的虚拟主机，一个安全，另一个不安全。
2. 在安全的虚拟主机上，设置重写规则，将所有非 wp-admin 流量转移到不安全站点。
3. 在不安全的虚拟主机上，设置重写规则，将所有 wp-admin 流量转移到安全主机。
4. 通过插件添加过滤器，过滤 wp-admin 中的链接，以便激活后，管理链接被重写为使用 https，并编辑 cookie 使其仅通过加密连接工作。

以下指南适用于 WordPress 1.5 和运行 `mod_rewrite` 的 Apache，在 `httpd.conf` 中使用重写规则（而不是 `.htaccess` 文件），但可以轻松修改以适应其他托管场景。

#### Virtual Hosts {#virtual-hosts}

You need a (virtual) host configured for the secure server in addition to the non-secure site. In this example, the secure virtual host uses the same `DocumentRoot` as the insecure host. Hypothetically, you could use a host with a different name, such as wpadmin.mysite.com and link the document root to the wpadmin directory.

Please ask your ISP to set up a secure virtual host for you, or if you have administrative access set up your own. Note that [you cannot use name based virtual hosting to identify different SSL servers](https://httpd.apache.org/docs/2.0/ssl/ssl_faq.html#vhosts2).

**Rewrite Rules For The Insecure Host**

In the `.htaccess` or virtual host stanza in `httpd.conf` for your insecure host, add this rewrite rule to automatically go to the secure host when you browse to https://example.com/wp-admin/ or https://example.com/wp-login.php

This should go above the main wordpress rewrite block.

```
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /(.*)\ HTTP/ [NC]
RewriteCond %{HTTPS} !=on [NC]
RewriteRule ^/?(wp-admin/|wp-login\.php) https://example.com%{REQUEST_URI}%{QUERY_STRING} [R=301,QSA,L]
```

If you are using permalink rewrite rules, this line must come before `RewriteRule ^.*$ - [S=40]`.

An important idea in this block is using `THE_REQUEST`, which ensures only actual http requests are rewritten and not local direct file requests, like an include or fopen.

**Rewrite Rules For Secure Host (Optional)**

These rewrite rules are optional. They disable access to the public site over a secure connection. If you wish to remain logged in to the public portion of your site using the plugin below, you must _not_ add these rules, as the plugin disables the cookie over unencrypted connections.

The secure virtual host should have two rewrite rules in an .htaccess file or in the virtual host declaration (see [Using Permalinks](https://wordpress.org/documentation/article/customize-permalinks/) for more on rewriting):

```
RewriteRule !^/wp-admin/(.*) - [C]
RewriteRule ^/(.*) https://www.example.com/$1 [QSA,L]
```

The first rule excludes the wp-admin directory from the next rule, which shuffles traffic to the secure site over to the insecure site, to keep things nice and seamless for your audience.

**Setting WordPress URI**

For some plugins to work, and for other reasons, you may wish to set your WordPress URI in options to reflect the https protocol by making this setting https://example.com. Your blog address should not change.

**Example Config Stanzas**

NOTE: The below config is not 100% compatible with WordPress 2.8+, WordPress 2.8 uses some files from the wp-includes folder. The redirection that the first set of Rewrite rules introduces may cause security warnings for some users. See [#10079](https://core.trac.wordpress.org/ticket/10079) for more information.

```
<VirtualHost nnn.nnn.nnn.nnn:443>
	ServerName www.example.com

SSLEngine On
	SSLCertificateFile /etc/apache2/ssl/thissite.crt
	SSLCertificateKeyFile /etc/apache2/ssl/thissite.pem
	SetEnvIf User-Agent ".*MSIE.*" nokeepalive ssl-unclean-shutdown

	DocumentRoot /var/www/mysite

	<IfModule mod_rewrite.c>
		RewriteEngine On
		RewriteRule !^/wp-(admin|includes)/(.*) - [C]
		RewriteRule ^/(.*) https://www.example.com/$1 [QSA,L]
	</IfModule>

</VirtualHost>
```

_不安全站点_

```
<VirtualHost *>
	ServerName www.mysite.com

	DocumentRoot /var/www/ii/mysite

	<Directory /var/www/ii/mysite >
		<IfModule mod_rewrite.c>
			RewriteEngine On
			RewriteBase /
			RewriteCond %{REQUEST_FILENAME} -f [OR]
			RewriteCond %{REQUEST_FILENAME} -d
			RewriteRule ^wp-admin/(.*) https://www.example.com/wp-admin/$1 [C]
			RewriteRule ^.*$ - [S=40]
			RewriteRule ^feed/(feed|rdf|rss|rss2|atom)/?$ /index.php?&feed=$1 [QSA,L]

		</IfModule>
	</Directory>

</VirtualHost>
```

**登录和注册的重写规则**

为用户登录和注册使用 SSL 可能是个好主意。请考虑以下替代的 RewriteRules。

_不安全_

```
RewriteRule ^/wp-(admin|login|register)(.*) https://www.example.com/wp-$1$2 [C]
```

_安全_

```
RewriteRule !^/wp-(admin|login|register)(.*) - [C]
```

**在端口 443 或端口 80 上运行的站点的重写规则**

```
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /

# 对于在端口 443 或其他端口（基于 SSL 的 HTTP）上运行的站点
RewriteCond %{SERVER_PORT} !^80$
RewriteRule !^wp-(admin|login|register)(.*) - [C]
RewriteRule ^(.*)$ https://%{SERVER_NAME}/$1 [L]

# 对于在端口 80（HTTP）上运行的站点
RewriteCond %{SERVER_PORT}  ^80$
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^wp-(admin|login|register)(.*) https://%{SERVER_NAME}:10001/wp-$1$2 [L]

RewriteCond %{SERVER_PORT}  ^80$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

</IfModule>
```

#### 摘要 {#summary}

此方法**无法**修复 WordPress 中的某些[固有安全风险](https://wordpress.org/support/topic/securing-loginphp-with-ssl/)，也不能保护您免受中间人攻击或其他可能破坏安全连接的风险。

然而，它**应该**能大大增加恶意人员窃取您的 Cookie 和/或身份验证标头，并利用它们冒充您访问 wp-admin 的难度。它还能混淆嗅探您内容的能力，这对于可能包含需要严格保护的文档草稿的法律博客来说可能很重要。

#### 验证 {#verification}

在作者的服务器上，日志显示 GET 和 POST 请求均通过 SSL 进行，并且所有发往不安全主机上 wp-admin 的流量都被转移到了安全主机。

示例 POST 日志行：

```
[Thu Apr 28 09:34:33 2005] [info] Subsequent (No.5) HTTPS request received for child 6 (server foo.com:443)
xx.xxx.xxx.xxx - - [28/Apr/2005:09:34:33 -0500] "POST /wp-admin/post.php HTTP/1.1" 302 - "https://foo.com/wp-admin/post.php?action=edit&post=71" "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.7) Gecko/20050414 Firefox/1.0.3"
```

进行更多测试（最好使用数据包嗅探器和一些专业的网络分析工具）将有助于进一步确认。

#### Limitations {#limitations}

The author assumes (but hasn't checked) that if the user has stored cookies/told their browser to remember passwords (not based on form fields but if using certain external auth mechanism) and hits https://www.example.com/wp-admin/, those packets are sent in the clear and the cookie/auth headers could be intercepted. Therefore, to ensure maximum security, the user should explicitly use the https host or always log in at the beginning of new sessions.

# 安全

本页面的目标是向管理 WordPress 站点的用户介绍通用的安全最佳实践，涵盖环境层面（如文件权限）和应用层面（如设置适当的用户角色），以便他们在部署 WordPress 时获得比默认配置更扎实的安全基础。

**WordPress 安全最重要的事项是保持 WordPress 核心、所有已安装插件和主题的更新。同时鼓励用户选择持续接收更新的主题和插件。**

WordPress 致力于为用户提供安全的使用体验。关于 WordPress 官方安全立场及整体安全目标的详细讨论，请参阅 [WordPress.org 安全页面](https://wordpress.org/about/security/)。

本指南大量借鉴了 WordPress Codex 中的 [强化 WordPress](https://wordpress.org/support/article/hardening-wordpress/) 指南。由于该文档允许公开编辑，阅读时应谨慎参考其中建议。

保持任何系统（不仅是 WordPress）的安全是一项持续的工作。良好的安全需要周密的规划、监控和定期维护。

安全主要包含降低风险和制定恢复计划。多数安全方案仅聚焦于最小化未授权访问风险，但风险永远无法完全降为零。只要存在风险，就必须制定恢复计划，确保在发生意外时用户站点不会完全丢失，并能快速恢复正常运行。

安全不仅关乎 WordPress，还涉及确保托管环境的安全以及个人在线行为的安全性。良好的安全既取决于所用技术，也取决于使用技术的人员。过时技术可能存在的缺陷或漏洞会使 WordPress 网站面临风险。不良的在线操作习惯同样会危及网站安全。因此，不仅要保持所用技术的更新和维护，还需确保员工在使用互联网、操作托管平台或客户 WordPress 站点时遵循安全最佳实践。

# 您的密码

本文是对[重置密码文章](https://wordpress.org/documentation/article/resetting-your-password/)的扩展，但将所有技术细节放置于此。

[请查看 GitHub 上待接管的章节问题](https://github.com/WordPress/Documentation-Issue-Tracker/issues/79)，并注意以下事项：
- 将 WP CLI 置于其他选项之上，因其最为安全。

# 两步验证

也称为双因素认证。

随着越来越多的网站寻求更安全的登录方式，两步验证正在互联网上普及。登录是用户在线操作中最薄弱的环节。

### 什么是两步验证 {#what-is-two-step-authentication}

密码是网络登录的实际标准，但它们相对容易被破解。即使你设置了强密码并定期更换，它们仍需存储在你登录的任何地方，服务器一旦被攻破就可能泄露密码。识别一个人的方式有三种：你是谁、你有什么、你知道什么。

使用密码登录是单步验证，它仅依赖于“你知道什么”。顾名思义，两步验证是一种系统，它要求你使用三种可能因素中的两种来证明身份，而不仅仅是一种。然而，在实践中，当前的两步验证实现仍然依赖于“你知道的”密码，但会使用你的手机或其他设备通过“你拥有的”东西进行验证。

#### 三种可能的因素 {#three-possible-factors}

有三种可能的方式来识别用户。

**你拥有的特征**

每个用户都有许多独特的属性可用于识别身份。最常用的是指纹，但视网膜、声音、DNA或任何其他个人特有的特征都适用。这被称为生物识别信息，因为这些信息都属于一个人的生物学特征。

生物识别因素很有趣，因为它们不易伪造，用户也永远不会丢失或忘记它们。然而，生物识别认证很棘手，因为丢失的指纹永远无法替换。如果黑客能够访问指纹数据库，用户将无法重置或获取新的指纹。

2013年，苹果发布了TouchID，允许用户使用指纹解锁iPhone。这项技术的有趣之处在于，指纹存储在手机本地，而不是存储在云端，从而降低了黑客窃取的风险。这种方法仍然存在权衡，但它是迄今为止最广泛的消费者生物识别认证应用。

**你拥有的物品**

也称为拥有因素，用户可以通过他们携带的设备来识别。传统上，公司想要启用两步认证时，会向用户分发安全密钥链。密钥链每30秒显示一个新数字，用户每次登录时都需要输入该数字和密码。

现代的两步认证更频繁地依赖用户的智能手机，而不是新的硬件设备。一种常见的模式是使用短信来提供简单的第二因素。当用户输入密码后，他们会收到一条包含唯一代码的短信。通过输入该代码，他们被认为证明了他们也拥有自己的手机。不幸的是，短信并不是安全的通信渠道，因此开发了智能手机应用程序和[插件](#plugins-for-two-step-authentication)来创建安全通道。

**你知道的信息**

最熟悉的认证形式是知识因素，即密码。密码的历史可以追溯到[芝麻开门](https://en.wikipedia.org/wiki/Open_sesame)，长期以来一直是匿名认证的标准。为了使知识因素起作用，双方都需要知道密码，但其他方必须无法找到或猜测它。

第一个挑战是与可信方安全地交换密码。在网络上，当你注册一个新网站时，你的密码需要发送到该网站的服务器，并可能在此过程中被拦截（这就是为什么在注册或登录时应该始终检查SSL——[HTTPS](https://developer.wordpress.org/advanced-administration/security/https/)）。

密码一旦接收，必须保密。用户不应将其写下或在其他地方使用，网站也需谨慎保护数据库，以防黑客获取密码。

最后，密码需要验证。用户访问网站时，需提供密码并与存储副本核对。此过程也可能被截获（因此应始终通过 SSL — [HTTPS](https://developer.wordpress.org/advanced-administration/security/https/) 进行），并给用户带来另一风险。

#### 优势 {#benefits}

提升网站安全性的方法有很多，但 WordPress 安全团队[曾指出](https://wpvip.com/security/)："您在线操作中最薄弱的安全环节就是密码"，因此投入精力加强网站的这一方面是明智之举。

#### 缺点 {#drawbacks}

顾名思义，两步验证为原本可能已冗长繁琐的流程增加了一个步骤。尽管如今大多数高安全性的登录都采用两步验证保护，但多数消费级应用即便提供此功能，也仅将其作为可选选项。这是因为如果操作更困难，用户注册和登录服务的意愿就会降低。

两步验证也可能阻碍合法登录。如果用户将手机忘在家中且启用了两步验证，他们将无法访问自己的账户。这正是智能手机对两步验证特别有用的主要原因之一——用户随身携带手机的可能性远高于其他物品。

#### 两步验证插件 {#plugins-for-two-step-authentication}

您可以在 [WordPress.org 插件库中搜索两步验证插件](https://wordpress.org/plugins/tags/two-factor-authentication)。以下是一些最受欢迎的插件供您入门（按字母顺序排列）：

* [Duo](https://wordpress.org/plugins/duo-wordpress/)
* [Google Authenticator](https://wordpress.org/plugins/google-authenticator/)
* [Rublon](https://wordpress.org/plugins/rublon/)
* [Two-Factor](https://wordpress.org/plugins/two-factor/)
* [WordFence](https://wordpress.org/plugins/wordfence/)

### 相关 {#related}

* [暴力破解攻击](https://developer.wordpress.org/advanced-administration/security/brute-force/)

# 监控

网站监控系统和服务可以在您的网站运行异常时发出通知。它们通常能够自动修复轻微问题，或在问题恶化前协助您进行处理。

## 运行时间监控

运行时间监控传统上在服务器层面实施，或通过定期检查网站上一个或多个 URL 来确保其正常响应。结合内部与外部运行时间监控对用户最为理想，现有多种软件和服务可为您处理此项工作。

## 性能监控

虽然网站服务可能正常响应，但对用户而言，"正常运行"意味着更多内涵。性能监控类似于运行时间监控，但还会关注可能预示问题的特定指标。应定期监控并报告"页面加载时间"和"最慢平均事务处理"等指标，帮助您预防性能问题。监控问题查询或请求的慢日志也有助于保持用户网站稳定。MySQL、PHP-FPM 等工具均提供捕获此类信息以供监控的选项。

## 性能分析

最佳实践是使用性能分析工具（如 New Relic、AppDynamics 或 Tideways）来诊断网站和基础设施的性能瓶颈。这些工具能帮助您洞察导致性能低下的根本原因，例如执行缓慢的函数、外部 HTTP 请求、缓慢的数据库查询等。

# WordPress 用户与角色

WordPress 默认提供五种用户角色类型——若启用 WordPress 多站点功能则为六种：

1. __超级管理员__ 是多站点网络中的超级用户。他们可以创建和删除网络中的站点，并管理整个网络及其所有站点、用户、插件、主题和设置。超级管理员在网络内的任何站点中也拥有常规管理员权限。只有现有超级管理员才能授予或撤销其他用户的超级管理员权限。
2. __管理员__ 是单个 WordPress 站点中的超级用户。他们可以更新 WordPress 核心、插件和主题，可以安装、删除和编辑主题与插件。管理员能够编辑文件和用户，添加和删除用户。
3. __编辑__ 可以创建、编辑、发布和删除自己及其他用户撰写的页面和文章（包括私密和已发布内容）。他们可以管理分类、审核评论以及上传文件。
4. __作者__ 可以创建、编辑、发布和删除自己的文章，也可以上传文件。
5. __投稿者__ 可以创建、编辑和删除自己的文章，但无法发布。
6. __订阅者__ 没有内容管理权限，仅能阅读公开内容。但与未注册的访客不同，订阅者可以访问 WordPress 后台界面，并像其他用户一样编辑自己的基本账户设置。

首次安装 WordPress 多站点网络或独立站点时，系统会自动创建超级管理员和管理员账户。

超级管理员、管理员和编辑均被视为“可信”用户，这意味着他们拥有的权限可能被滥用以破坏或危害 WordPress 站点。

请注意：插件和主题可以修改默认的用户角色和权限。配置错误或存在漏洞的插件和主题可能允许任何用户行使任意权限，或将订阅者、投稿者、作者或编辑提升至管理员权限。

# 控制面板

## 适用于 cPanel & WHM 和 Plesk 的 WP Toolkit

WP Toolkit 是一个统一的管理界面，可让您轻松安装、配置和管理 WordPress®。WP Toolkit 能够安装、配置和管理 4.9 或更高版本的 WordPress。

cPanel & WHM 102 及更高版本默认安装 WP Toolkit。如果服务器管理员已安装 WP Toolkit 扩展，则 Plesk 中也可使用 WP Toolkit。

## cPanel & WHM

本教程介绍如何使用 WP Toolkit 在 cPanel & WHM 控制面板中安装 WordPress。如需了解在 cPanel & WHM 中安装 WordPress 的其他方法，请阅读 cPanel 的 [How to Install WordPress with cPanel](https://docs.cpanel.net/knowledge-base/third-party/how-to-install-wordpress-with-cpanel/) 文档。

要通过 WP Toolkit 安装 WordPress，请执行以下操作：

1.  使用托管公司提供的信息登录 cPanel 界面。
2.  从左侧菜单栏中选择 _WP Toolkit_。_WP Toolkit_ 界面将出现。
3.  点击 _Install WordPress_ 以创建新的 WordPress 安装。

### 安装 WordPress

在 _安装 WordPress_ 界面中，点击 _安装_ 以使用默认设置。或者，提供以下可选信息以自定义安装，然后点击 _安装_：

   * 安装目录。默认情况下，安装使用账户的 `public_html` 目录。
   * 网站标题。
   * 插件或主题集。
   * 网站语言。
   * 要安装的 WordPress 版本。默认情况下，安装使用当前的 WordPress 版本。
   * WordPress 管理员用户名和密码。
   * 数据库名称、表前缀、用户名和密码。
   * WordPress 软件、插件和主题的自动更新设置。

如果您想安装插件和主题，请点击 _安装插件_，或者点击 _不，谢谢_ 稍后选择性地安装它们。

## Plesk

本教程提供使用 Plesk Web Installer 安装 Plesk WP Toolkit 的逐步示例。

### 使用 Web Installer

要使用 Web Installer 安装 Plesk，请打开浏览器并访问 [get.plesk.com](https://get.plesk.com/)。安装 Plesk 需要一台能访问互联网的全新 Linux 服务器。您可以在任何受支持的基于 Linux 的操作系统上安装 Plesk。

![Image_1](https://user-images.githubusercontent.com/19301688/189542599-4fce4d63-8060-416e-9fdf-f21ae62c87e1.png)

提供您服务器的 IP 地址或主机名，输入 root 密码，或直接添加私钥。

* 接受最终用户许可协议的条款，然后单击安装按钮。
* 放松并等待一段时间，让安装完成。
* 点击登录链接。无需担心“安全连接警告”，只需添加例外即可。

### 安装 WordPress

![image_2](https://user-images.githubusercontent.com/19301688/189542665-78f52a1c-e92b-4d70-bb5d-899ac02cc57e.png)

* 如需快速安装，请点击“安装（快速）”。这将安装最新版本的 WordPress 并使用默认设置。如果为该域名启用了 SSL/TLS 支持，新实例将通过 HTTPS 访问。
* 如需更改默认安装设置，请点击“安装（自定义）”。这允许您设置管理员用户、选择所需的 WordPress 版本、指定数据库名称、选择自动更新设置等。

### 管理 WordPress 实例

前往 WordPress 查看所有 WordPress 实例。WP Toolkit 将每个实例的信息分组在我们称为卡片的区块中。

![image_3](https://user-images.githubusercontent.com/19301688/189542692-5d6f38b5-1b32-4de8-8f40-2abe9a5d1d86.png)

卡片显示您网站的截图，并提供多个控件，方便您访问常用工具。截图会实时更新，反映您对网站所做的更改。例如，如果您开启维护模式或更换 WordPress 主题，网站截图将立即更新。

### 工具

在“工具”部分，点击可访问以下 WP Toolkit 功能：

![image_4](https://user-images.githubusercontent.com/19301688/189542713-abf476de-fcbd-4113-9975-1c2961765190.png)

* “同步”可将您的网站内容与另一个网站同步。
* “克隆”可创建网站的完整副本。
* “管理文件”可在文件管理器中管理网站文件。
* “备份/恢复”可为网站创建备份并在必要时进行恢复。

下方的控件让您能便捷访问以下设置和工具：

* “搜索引擎索引”使您的网站显示在搜索引擎的搜索结果中。
* “缓存 (nginx)”可加快网站加载速度并降低服务器负载。
* “调试”可帮助您调试尚未准备好供查看、测试或开发的网站。
* “维护模式”可对访客隐藏您的网站内容。
* “密码保护”指定您将从 Plesk 登录 WordPress 时使用的密码。

# 清空数据库表

为您生成网站统计数据的插件会快速创建大量数据——每位访客都会导致某些内容被写入数据库。通常这不是问题，但如果您的数据库大小受主机限制，则可能成为问题。此外，如果您因任何原因需要迁移数据库，其大小会影响导出和导入时间。本页将向您展示如何清空表，从而将其内容和大小重置为零。这不会阻止统计插件工作，也不会损坏您的数据库。

[phpMyAdmin](https://developer.wordpress.org/advanced-administration/upgrade/phpmyadmin/) 是用于操作数据库的程序名称。一个好的托管套餐会包含此工具。[访问 phpMyAdmin](https://developer.wordpress.org/advanced-administration/security/backup/#accessing-phpmyadmin) 提供了在各种服务器控制面板下访问 phpMyAdmin 的信息。

本文概述的流程已在运行于 Unix 上的 phpMyAdmin 版本 2.5.3 和 2.5.7 pl1 中经过尝试和测试。

**注意：** 在对数据库进行此类重大更改时，您应始终创建备份！

详情请参阅 [WordPress 备份](https://developer.wordpress.org/advanced-administration/security/backup/) 和 [备份数据库](https://developer.wordpress.org/advanced-administration/security/backup/database/)。

## 操作流程

1. 登录服务器上的 phpMyAdmin。

2. 从左侧边栏中选择您的 WordPress 数据库。

![左侧边栏中的数据库选择](https://user-images.githubusercontent.com/90067869/189547314-a8bbe78e-70b6-4533-b14e-196a5db35840.png)

3. WordPress 数据库中的所有表将显示出来。

![表列表](https://user-images.githubusercontent.com/90067869/189547350-944a1066-e81d-404b-8eca-9125161eb5d4.png)

4. 点击您希望清空的表的“清空”按钮。在本示例中，我们将清空“wp_dstats2”表。

**注意：** 您的表名可能不同，请查阅插件文档以确定其名称。请勿清空 WordPress 核心使用的表。（有关这些特定表名，请参阅 [Database_Description](https://codex.wordpress.org/Database_Description) 下的列表。）

![点击“清空”按钮](https://user-images.githubusercontent.com/90067869/189547374-2088ff00-3c19-420d-86b7-fbcd0df6ed6d.png)

7. 现在您将看到一个确认屏幕。

![图片](https://user-images.githubusercontent.com/90067869/189547394-d6a58758-7a2d-420c-9cd6-33de864b3078.png)

**这是您最后一次检查是否选择了正确的表和数据库的机会**——phpMyAdmin 没有撤销功能，因此一旦提交更改，您将无法回退。当然，除非您已按照建议进行了备份。

8. 点击“确定”，您将返回查看数据库中的所有表，指定表的内容已被清空。

# 更改文件权限

在计算机文件系统中，不同的文件和目录拥有**权限**设置，用于指定谁以及什么可以读取、写入、修改和访问它们。这很重要，因为 WordPress 可能需要访问并写入 `wp-content` 目录中的文件以实现某些功能。

## 简要说明

Linux [文件权限](https://en.wikipedia.org/wiki/File_system_permissions) 主要由三个部分组成——文件或文件夹所有者拥有的权限、拥有该文件或文件夹的组成员拥有的权限，以及其他人访问或修改该文件和文件夹的权限。这三个权限部分通常用三个数字表示，依次是所有者权限级别、组权限级别和所有人的权限级别。_从技术上讲还有第四个部分，但这超出了保护 WordPress 所需了解的范围，此处不予讨论。_

对于用户、组和其他人，各有三种访问权限：读取权限、写入权限和执行权限。读取权限允许您读取文件或目录的内容。写入权限允许您修改文件或目录。执行权限允许您像运行程序或脚本一样运行文件。

## 权限模式

```
 7      5      5
用户   组     其他用户
r+w+x  r+x    r+x
4+2+1  4+0+1  4+0+1  = 755
```

权限模式的计算方法是将用户、文件组和其他所有用户的以下数值相加。图示展示了计算过程。

* **读** 4 – 允许读取文件
* **写** 2 – 允许写入/修改文件
* 执**行** 1 – 读取/写入/删除/修改/目录

```
 7      4      4
用户   组     其他用户
r+w+x  r      r
4+2+1  4+0+0  4+0+0  = 744
```

### Example Permission Modes

| Mode | Str Perms | Explanation |
| ---- | --------- | ----------- |
| **0677** | -rw-rwxrwx | owner has rw only(6), other and group has rwx (7) |
| **0670** | -rw-rwx— | owner has rw only, group has rwx, others have no permission |
| **0666** | -rw-rw-rw- | all have rw only (6) |
| **0607** | -rw—-rwx | owner has rw only, group has no permission and others have rwx |
| **0600** | -rw——- | owner has rw only, group and others have no permission |
| **0477** | -r–rwxrwx | owner has read only (4), other and group has rwx (7) |
| **0470** | -r–rwx— | owner has read only, group has rwx, others have no permission |
| **0407** | -r—–rwx | owner has read only, other has rwx, group has no permission |
| **0444** | -r–r–r– | all have read only (4) |
| **0400** | -r——– | owner has read only(4), group and others have no permission(0) |

## WordPress 权限方案

不同主机的权限设置各不相同，因此本指南仅详述通用原则，无法涵盖所有情况。本指南适用于运行标准配置的服务器（注意：对于使用 "suexec" 方法的共享主机，请参阅下文）。

通常，所有文件应归您 Web 服务器上的用户（FTP）账户所有，并可由该账户写入。在共享主机上，文件绝不应由 Web 服务器进程本身所有（有时是 **www**、**apache** 或 **nobody** 用户）。

任何需要 WordPress 写入访问的文件，应归 WordPress 使用的用户账户所有或组所有（可能与服务器账户不同）。例如，您可能有一个允许您通过 FTP 上传下载文件的用户账户，但您的服务器本身可能使用单独的用户（在单独的用户组中）运行，例如 **dhapache** 或 **nobody**。如果 WordPress 以 FTP 账户身份运行，则该账户需要具有写入权限，即成为文件的所有者，或属于具有写入权限的组。在后一种情况下，这意味着权限设置比默认更宽松（例如，文件夹为 775 而非 755，文件为 664 而非 644）。

对于大多数用户，WordPress 的文件和文件夹权限应相同，具体取决于您执行的安装类型以及安装时系统环境的 umask 设置。

**注意：** 如果由经验丰富的用户为您安装 WordPress，您可能无需修改文件权限。除非您遇到权限错误问题，或者您*想要*修改，否则您可能不应改动此设置。

**注意：** 如果您自行安装 WordPress，您很可能*需要*修改文件权限。某些文件和目录应通过更严格的权限进行"加固"，特别是 wp-config.php 文件。该文件初始创建时权限为 644，保持此状态存在风险。请参阅安全与加固。

通常，所有核心 WordPress 文件应仅可由您的用户账户（或 httpd 账户，如果不同）写入。（但有时，多个 FTP 账户用于管理安装，如果所有 FTP 用户已知且可信，即非共享主机，则分配组写入权限可能是合适的。请咨询您的服务器管理员以获取更多信息。）但是，如果您使用 mod_rewrite 固定链接或其他 `.htaccess` 功能，应确保 WordPress 也能写入您的 `/.htaccess` 文件。

If you want to use the built-in theme editor, all files need to be group writable. Try using it before modifying file permissions, it should work. (This may be true if different users uploaded the WordPress package and the Plugin or Theme. This wouldn't be a problem for Plugin and Themes installed via the admin. When uploading files with different ftp users group writable is needed. On shared hosting, make sure the group is exclusive to users you trust... the apache user shouldn't be in the group and shouldn't own files.)

Some plugins require the `/wp-content/` folder be made writeable, but in such cases they will let you know during installation. In some cases, this may require assigning 755 permissions. The same is true for `/wp-content/cache/` and maybe `/wp-content/uploads/` (if you're using [MultiSite](https://developer.wordpress.org/advanced-administration/multisite/create-network/) you may also need to do this for `/wp-content/blogs.dir/`)

Additional directories under /wp-content/ should be documented by whatever plugin / theme requires them. Permissions will vary.

```
|
|- index.php
|- wp-admin
|   |- wp-admin.css
|- wp-blog-header.php
|- wp-comments-post.php
|- wp-commentsrss2.php
|- wp-config.php
|- wp-content
|   |- cache
|   |- plugins
|   |- themes
|   |- uploads
|- wp-cron.php
|- wp-includes
|- xmlrpc.php
```

### 使用 suexec 的共享主机

上述内容可能不适用于采用 "suexec" 方式运行 PHP 二进制文件的共享主机系统。这是许多网络主机常用的方法。在此类系统中，PHP 进程以 PHP 文件所有者的身份运行，从而为共享主机这一特定场景提供了更简单的配置和更安全的环境。

注意：**切勿**在单站点服务器配置中使用 suexec 方法，它们**仅**在共享主机的特定场景下才更安全。

在这种 suexec 配置中，正确的权限方案很容易理解。

* 所有文件应归实际用户账户所有，而非用于 httpd 进程的用户账户。
* 组所有权无关紧要，除非 Web 服务器进程权限检查有特定的组要求。通常情况并非如此。
* 所有目录应为 755 或 750。
* 所有文件应为 644 或 640。例外：wp-config.php 应为 440 或 400，以防止服务器上的其他用户读取。
* 任何目录都不应设置为 777，即使是上传目录。由于 PHP 进程以文件所有者的身份运行，它拥有所有者的权限，即使对 755 目录也能写入。

在这种特定类型的设置中，WordPress 会检测到它可以直接创建具有正确所有权的文件，因此在升级或安装插件时不会要求提供 FTP 凭据。

系统管理员用于此设置的常用方法包括：

* [suPHP](https://smarsching.github.io/suphp/Home.html)，通过 php-cgi 运行，自 2013 年起已停止维护。
* [mod_ruid2](https://github.com/mind04/mod-ruid2)，Apache 模块，自 2013 年起已停止维护。
* [mpm-itk](http://mpm-itk.sesse.net/)，Apache 模块。
* [mod_fcgid](https://httpd.apache.org/mod_fcgid/)，一个 Apache 模块和 FastCGI 服务器，具有更广泛的配置选项。
* [PHP-FPM](https://php-fpm.org/)，一个替代的 FastCGI 服务器，具有共享 OPCode，可与 Apache 和 Nginx 配合使用。

## 使用 FTP 客户端

[FTP 程序](https://developer.wordpress.org/advanced-administration/upgrade/ftp/)（"客户端"）允许您为远程主机上的文件和目录设置权限。此功能在程序菜单中通常称为 `chmod` 或 `设置权限`。

在 [WordPress 安装](https://developer.wordpress.org/advanced-administration/before-install/howto-install/)中，您可能想要修改的两个文件是索引页和控制布局的 css 文件。以下是更改 index.php 的方法——_对于任何文件，过程都是相同的_。

在下面的截图中，查看最后一列——它显示了权限。看起来有点令人困惑，但现在只需注意字母序列。

[![](https://wordpress.org/documentation/files/2019/02/podz_filezilla_12.gif)](https://wordpress.org/documentation/files/2019/02/podz_filezilla_12.gif)
初始权限

右键单击 'index.php' 并选择 '文件权限'
将弹出一个屏幕。

[![](https://wordpress.org/documentation/files/2019/02/podz_filezilla_13.gif)](https://wordpress.org/documentation/files/2019/02/podz_filezilla_13.gif)
更改文件权限

不用担心复选框。只需删除 '数值：' 并输入您需要的数字——在本例中为 666。然后单击确定。

[![](https://wordpress.org/documentation/files/2019/02/podz_filezilla_14.gif)](https://wordpress.org/documentation/files/2019/02/podz_filezilla_14.gif)
权限已更改。

您现在可以看到文件权限已更改。

### 显示隐藏文件

默认情况下，大多数 [FTP 客户端](https://developer.wordpress.org/advanced-administration/upgrade/ftp/)（包括 [FileZilla](https://sourceforge.net/projects/filezilla/)）都不会显示以点号（.）开头的隐藏文件。但有时您可能需要查看隐藏文件，以便更改其权限。例如，您可能需要使控制 [固定链接](https://wordpress.org/documentation/article/using-permalinks/) 的 [.htaccess](https://wordpress.org/documentation/article/glossary#htaccess) 文件可写。

要在 FileZilla 中显示隐藏文件，需要从顶部菜单选择“查看”，然后选择“显示隐藏文件”。文件显示界面将刷新，之前隐藏的文件应会显示出来。

若要让 FileZilla 始终显示隐藏文件，请在“编辑”>“设置”>“远程文件列表”中勾选“始终显示隐藏文件”复选框。

在最新版本的 FileZilla 中，“显示隐藏文件”选项已移至“服务器”选项卡。请选择“强制显示隐藏文件”。

## 使用命令行

如果您拥有对托管账户的 shell/SSH 访问权限，可以使用 `chmod` 命令来更改文件权限，这是经验用户的首选方法。在开始使用 `chmod` 之前，建议先阅读一些教程，以确保您理解其功能。设置错误的权限可能导致网站离线，请务必谨慎操作。

* [Unix 权限](https://web.archive.org/web/20190715230319/http://www.washington.edu/computing/unix/permissions.html)

您可以通过两个步骤使 `wp-content` 目录中的**所有**文件可写，但在使每个文件和文件夹都可写之前，应先尝试更安全的替代方案，例如仅修改目录权限。请先依次尝试以下每条命令，如果无效再使用递归选项（这会使您的主题图像文件也可写）。请将 **DIR** 替换为您要写入的目标文件夹：

```
chmod -v 746 DIR
chmod -v 747 DIR
chmod -v 756 DIR
chmod -v 757 DIR
chmod -v 764 DIR
chmod -v 765 DIR
chmod -v 766 DIR
chmod -v 767 DIR
```

如果上述命令仍无法写入，请按相同顺序重试所有命令，但这次将 -v 替换为 -R（递归更改文件夹内的每个文件）。如果之后仍无法写入，可尝试使用 777 权限。

### [关于 Chmod](#about-chmod)

`chmod` 是一个 Unix 命令，意为对文件进行“**ch**ange **mod**e”（更改模式）。`-R` 标志表示将更改应用于 `wp-content` 内的每个文件和目录。766 是我们将目录更改到的模式，它意味着该目录对 WordPress 以及您系统上的任何其他用户都是可读和可写的。最后，我们指定要修改的目录名称 `wp-content`。如果 766 不起作用，您可以尝试 777，这会使所有文件、文件夹对所有用户、组和进程都可读、可写和可执行。

如果您使用[固定链接](https://wordpress.org/documentation/article/using-permalinks/)，您还应该更改 .htaccess 的权限，以确保当您更改设置（例如添加新页面、重定向、分类等）时，WordPress 可以更新它，因为在使用 mod_rewrite 固定链接时，需要更新 .htaccess 文件。

1.  转到 WordPress 的主目录
2.  输入 `chmod -v 666 .htaccess`

**注意：** 从安全角度来看，即使少量的保护也比全局可写的目录要好。从低权限设置（如 744）开始，逐步提高直到它正常工作。仅在必要时使用 777，并且希望只是临时使用。

## 777 权限的危险性

此权限问题的核心在于服务器配置方式。您通过 FTP 或 SSH 登录服务器时使用的用户名，很可能与服务器应用程序自身用于提供页面的用户名不同。

```
 7      7      7
用户   组     其他用户
读写执行 读写执行 读写执行
4+2+1  4+2+1  4+2+1  = 777
```

Apache 服务器通常由 **www-data**、**dhapache** 或 **nobody** 用户账户"拥有"。这些账户对服务器文件的访问权限有限，这是有充分理由的。通过将您个人账户拥有的文件和文件夹设置为全局可写，您实际上是在让所有用户都能写入。现在，运行服务器、提供页面、执行 PHP 解释器的 www-data、dhapache 和 nobody 用户将拥有对您账户文件的完全访问权限。

这为攻击者通过劫持服务器上几乎任何进程（包括机器上的其他用户）来获取文件访问权限提供了途径。因此，您应谨慎考虑修改机器权限。我从未遇到过需要超过 767 权限的情况，所以当看到 777 时，请务必询问其必要性。

### 最坏的结果

对文件夹甚至文件使用 777 权限可能导致的最坏情况是：如果恶意攻击者或实体能够上传恶意文件或修改现有文件以执行代码，他们将完全控制你的博客，包括获取你的数据库信息和密码。

### 寻找变通方案

通常可以轻松获取出色的 WordPress 插件提供的增强功能，同时避免将自己置于风险之中。联系插件作者或您的服务器支持团队，请求一个变通方案。

## 寻找安全的文件权限

.htaccess 文件是由运行服务器的进程所有者访问的文件之一。因此，如果权限设置过低，服务器将无法访问该文件并导致错误。这就是寻找最安全设置的方法：从过于严格的限制开始，逐步增加权限直到其正常工作。

### 示例权限设置

以下示例包含一个*自定义编译的 php-cgi 二进制文件*和一个位于 cgi-bin 目录中的*自定义 php.ini* 文件，用于执行 PHP 脚本。为防止解释器和 `php.ini` 文件在 Web 浏览器中被直接访问，它们通过 .htaccess 文件进行保护。

默认权限 (umask 022)

```
644 -rw-r--r--  /home/user/wp-config.php
644 -rw-r--r--  /home/user/cgi-bin/.htaccess
644 -rw-r--r--  /home/user/cgi-bin/php.ini
755 -rwxr-xr-x  /home/user/cgi-bin/php.cgi
755 -rwxr-xr-x  /home/user/cgi-bin/php5.cgi
```

安全权限

```
600 -rw-------  /home/user/wp-config.php
6**0**4 -rw----r--  /home/user/cgi-bin/.htaccess
6**00** -rw-------  /home/user/cgi-bin/php.ini
7**11** -rwx--x--x  /home/user/cgi-bin/php.cgi
**100** ---x------  /home/user/cgi-bin/php5.cgi
```

#### .htaccess 权限

**644 > 604** – 移除了允许 .htaccess 文件所属组拥有读取权限的位。通常建议 .htaccess 文件使用 644 权限。

#### php.ini 权限

**644 > 600** – 之前，所有能访问服务器的组和用户都可以访问 php.ini，甚至可以直接从网站请求它。棘手之处在于，由于 php.ini 文件仅由 php.cgi 使用，我们只需确保 php.cgi 进程有访问权限即可。php.cgi 以拥有这两个文件的同一用户身份运行，因此现在只有该用户能够访问此文件。

#### php.cgi 权限

**755 > 711** 此文件是一个已编译的 php-cgi 二进制文件，用于替代 mod_php 或托管公司提供的默认原生 php。此文件的默认权限为 755。

#### php5.cgi 权限

**755 > 100** – 由于用户账户是运行 php cgi 进程的所有者，因此其他用户或组无需访问权限，所以我们禁除了执行权限之外的所有访问。这很有趣，因为它确实有效。你可以尝试读取文件、写入文件等，但对此文件的唯一访问权限就是运行 php 脚本。作为文件所有者，你随时可以再次更改权限模式。

```
$ cat: php5.cgi: Permission denied
./php5.cgi:  Welcome
```

## SELinux

[安全增强型 Linux](https://en.wikipedia.org/wiki/Security-Enhanced_Linux) 是一个内核安全模块，它提供了一种机制，可以将进程沙盒化到特定的上下文中。这对于限制网页对操作系统其他部分所能执行的操作特别有用。被安全策略拒绝的操作通常很难与常规的文件权限错误区分开来。

selinux 通常安装在 Redhat 系列发行版上（例如 CentOS、Fedora、Scientific、Amazon 等）。

### 如何判断 selinux 是否是问题所在？

如果您使用的是基于 Debian 的发行版，通常不会有问题。

运行以下命令（在基于 rpm 的系统上）：

```
$ rpm -qa | grep selinux
selinux-policy-targeted-3.13.1-166.el7_4.7.noarch
selinux-policy-3.13.1-166.el7_4.7.noarch
libselinux-2.5-11.el7.x86_64
libselinux-python-2.5-11.el7.x86_64
libselinux-utils-2.5-11.el7.x86_64
```

要检查它是否是导致权限拒绝的原因：

```
$ getenforce
Enforcing
```

selinux 导致的一个问题是阻止 wp-admin 工具写出 URL 重写所需的 \`.htaccess\` 文件。有多个命令可以检查此行为：

```
$ audit2allow -w -a
type=AVC msg=audit(1517275570.388:55362): avc:  denied  { write } for  pid=11831 comm="httpd" path="/var/www/example.org/.htaccess" dev="vda1" ino=67137959 scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:object_r:httpd_sys_content_t:s0 tclass=file
        Was caused by:
        The boolean httpd_unified was set incorrectly.
        Description:
        Allow httpd to unified

        Allow access by executing:
        # setsebool -P httpd_unified 1
```
以及

```
$ ausearch -m avc -c httpd
----
time->Tue Jan 30 01:30:31 2018
type=PROCTITLE msg=audit(1517275831.762:55364): proctitle=2F7573722F7362696E2F6874747064002D44464F524547524F554E44
type=SYSCALL msg=audit(1517275831.762:55364): arch=c000003e syscall=21 success=no exit=-13 a0=55b9c795d268 a1=2 a2=0 a3=1 items=0 ppid=11826 pid=11829 auid=4294967295 uid=48 gid=48 euid=48 suid=48 fsuid=48 egid=48 sgid=48 fsgid=48 tty=(none) ses=4294967295 comm="httpd" exe="/usr/sbin/httpd" subj=system_u:system_r:httpd_t:s0 key=(null)
type=AVC msg=audit(1517275831.762:55364): avc:  denied  { write } for  pid=11829 comm="httpd" name="bioactivator.org" dev="vda1" ino=67137958 scontext=system_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:httpd_sys_content_t:s0 tclass=dir
----
```
  
您可以临时禁用 selinux 以确定它是否是问题的根源：

```
$ setenforce
usage:  setenforce \[ Enforcing | Permissive | 1 | 0 \]
```

# Apache HTTPD / .htaccess

## .htaccess

`.htaccess` 是一个分布式配置文件，Apache 通过它实现基于目录的配置变更。

WordPress 利用此文件来调整 Apache 从其根目录及子目录提供文件的方式。最显著的是，WP 会修改此文件以支持美观的固定链接功能。

本页面可用于恢复损坏的 `.htaccess` 文件（例如因插件异常导致的问题）。

### Basic WP

```
# BEGIN WordPress

RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

# END WordPress
```

### 多站点

#### WordPress 3.5 及以上版本

如果您在 WordPress 3.5 或更高版本上启用了多站点功能，请使用以下方法之一。

##### WordPress >=3.5 Subfolder Example

```
# BEGIN WordPress Multisite
# Using subfolder network type: https://wordpress.org/documentation/article/htaccess/#multisite

RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteBase /
RewriteRule ^index\.php$ - [L]

# add a trailing slash to /wp-admin
RewriteRule ^([_0-9a-zA-Z-]+/)?wp-admin$ $1wp-admin/ [R=301,L]

RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]
RewriteRule ^([_0-9a-zA-Z-]+/)?(wp-(content|admin|includes).*) $2 [L]
RewriteRule ^([_0-9a-zA-Z-]+/)?(.*\.php)$ $2 [L]
RewriteRule . index.php [L]

# END WordPress Multisite
```

##### WordPress >=3.5 SubDomain Example

```
# BEGIN WordPress Multisite
# Using subdomain network type: https://wordpress.org/documentation/article/htaccess/#multisite

RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteBase /
RewriteRule ^index\.php$ - [L]

# add a trailing slash to /wp-admin
RewriteRule ^wp-admin$ wp-admin/ [R=301,L]

RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]
RewriteRule ^(wp-(content|admin|includes).*) $1 [L]
RewriteRule ^(.*\.php)$ $1 [L]
RewriteRule . index.php [L]

# END WordPress Multisite
```

#### WordPress 3.4 及更低版本

如果您最初安装的是 3.4 或更旧版本的 WordPress 并启用了多站点功能，则需要使用以下配置之一：

##### WordPress <=3.4 子文件夹示例

WordPress 3.0 至 3.4.2

```
# BEGIN WordPress Multisite
# 使用子文件夹网络类型：https://wordpress.org/documentation/article/htaccess/#multisite

RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]

# 上传的文件
RewriteRule ^([_0-9a-zA-Z-]+/)?files/(.+) wp-includes/ms-files.php?file=$2 [L]

# 为 /wp-admin 添加尾部斜杠
RewriteRule ^([_0-9a-zA-Z-]+/)?wp-admin$ $1wp-admin/ [R=301,L]

RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]
RewriteRule ^[_0-9a-zA-Z-]+/(wp-(content|admin|includes).*) $1 [L]
RewriteRule ^[_0-9a-zA-Z-]+/(.*\.php)$ $1 [L]
RewriteRule . index.php [L]

# END WordPress Multisite
```

##### WordPress <=3.4 SubDomain Example

```
# BEGIN WordPress Multisite
# Using subdomain network type: https://wordpress.org/documentation/article/htaccess/#multisite

RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]

# uploaded files
RewriteRule ^files/(.+) wp-includes/ms-files.php?file=$1 [L]

RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]
RewriteRule . index.php [L]

# END WordPress Multisite
```

### 通用示例

#### 选项

任何以 **+** 开头的选项会被添加到当前生效的选项中，而任何以 **–** 开头的选项会从当前生效的选项中移除。

[Options 指令](https://httpd.apache.org/docs/trunk/mod/core.html#options) 的可能值是以下任意组合：

**None**

所有选项均被关闭。

**All**

除 MultiViews 外的所有选项。这是默认设置。

**ExecCGI**

允许使用 mod_cgi 执行 CGI 脚本。

**FollowSymLinks**

服务器将跟踪此目录中的符号链接。

**Includes**

允许使用 mod_include 提供的服务器端包含。

**IncludesNOEXEC**

允许服务器端包含，但禁用 #exec cmd 和 #exec cgi。

**Indexes**

URL 映射到一个目录，且没有 DirectoryIndex 时，显示目录的格式化列表。

**MultiViews**

允许使用 mod_negotiation 进行内容协商的“MultiViews”。

**SymLinksIfOwnerMatch**

仅当目标与链接具有相同用户 ID 时才跟踪符号链接。

以下示例将禁用所有选项，然后仅启用 FollowSymLinks（这是 mod\_rewrite 所必需的）。

```
Options None
Options FollowSymLinks
```

#### DirectoryIndex

[DirectoryIndex 指令](https://httpd.apache.org/docs/trunk/mod/mod_dir.html#directoryindex) 用于设置当请求一个目录时，Apache 将提供的文件。

可以指定多个 URL，服务器将返回它找到的第一个文件。

```
DirectoryIndex index.php index.html /index.php
```

#### DefaultLanguage

[DefaultLanguage 指令](https://httpd.apache.org/docs/trunk/mod/mod_mime.html#defaultlanguage) 将使所有未关联特定语言标签的文件使用此默认语言。

```
DefaultLanguage en
```

#### 默认字符集

设置 HTTP 头中发送的默认字符编码。请参阅[在 .htaccess 中设置字符集信息](https://www.w3.org/International/questions/qa-htaccess-charset)

```
AddDefaultCharset UTF-8
```

**为特定文件设置字符集**

```
AddType 'text/html; charset=UTF-8' .html
```

**为特定文件设置**

```
AddCharset UTF-8 .html
```

#### ServerSignature

[ServerSignature 指令](https://httpd.apache.org/docs/trunk/mod/core.html#serversignature) 允许配置服务器生成文档的页脚行。可选择性地在服务器生成的页面（内部错误文档、FTP 目录列表、mod_status 和 mod_info 输出等，但不包括 CGI 生成的文档或自定义错误文档）中添加一行，包含服务器版本和虚拟主机名。

**On**

添加一行，包含服务器版本号和提供服务的虚拟主机的 ServerName

**Off**

隐藏页脚行

**Email**

创建一个指向被引用文档的 ServerAdmin 的 "mailto:" 链接

```
SetEnv SERVER_ADMIN admin@site.com
ServerSignature Email
```

#### 强制文件下载

以下设置将导致任何以指定扩展名结尾的文件请求不会在浏览器中显示，而是强制弹出“另存为”对话框，以便客户端可以下载。

```
AddType application/octet-stream .avi .mpg .mov .pdf .xls .mp4
```

#### HTTP 压缩

[AddOutputFilter 指令](https://httpd.apache.org/docs/trunk/mod/mod_mime.html#addoutputfilter) 将文件扩展名映射到过滤器，这些过滤器会在服务器响应发送给客户端之前对其进行处理。这是对其他地方定义的过滤器（包括 `SetOutputFilter` 和 `AddOutputFilterByType`）的补充。此映射会与任何已生效的映射合并，并覆盖同一扩展名的任何现有映射。

另请参阅 [启用压缩](https://developers.google.com/speed/docs/insights/EnableCompression)

```
AddOutputFilterByType DEFLATE text/html text/plain text/xml application/xml application/xhtml+xml text/javascript text/css application/x-javascript
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4\.0[678] no-gzip
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
```

**强制压缩特定文件**

```
SetOutputFilter DEFLATE
```

#### 发送自定义 HTTP 头

[Header 指令](https://httpd.apache.org/docs/trunk/mod/mod_headers.html#header)允许您为每个请求或特定文件发送 HTTP 头。您可以使用 [Firebug](https://getfirebug.com/)、[Chrome Dev Tools](https://developer.chrome.com/docs/devtools/)、[Wireshark](https://www.wireshark.org/) 或 [Advanced HTTP Request / Response Headers](https://www.askapache.com/online-tools/http-headers-tool/) 查看站点的 HTTP 头。

```
Header set X-Pingback "https://example.com/xmlrpc.php"
Header set Content-Language "en-US"
```

#### 取消设置 HTTP 头信息

这将取消设置 HTTP 头信息，使用 **always** 会额外努力地尝试移除它们。

```
Header unset Pragma
Header always unset WP-Super-Cache
Header always unset X-Pingback
```

#### 密码保护登录

此功能对保护 `wp-login.php` 文件非常有用。你可以使用这个 [高级 Htpasswd/Htdigest 文件生成器](https://www.askapache.com/online-tools/htpasswd-generator/)。

**基本身份验证**

```
AuthType Basic
AuthName "Password Protected"
AuthUserFile /full/absolute/path/to/.htpasswd
Require valid-user
Satisfy All
```

**摘要式身份验证**

```
AuthType Digest
AuthName "Password Protected"
AuthDigestDomain /wp-login.php https://example.com/wp-login.php
AuthUserFile /full/absolute/path/to/.htpasswd
Require valid-user
Satisfy All
```

#### 要求特定 IP

这是一种仅允许所列 IP 地址访问的方法。注意此处使用 RequireAny 而非 RequireAll。

```
<RequireAny>
  Require ip 192.0.2.123
  Require ip 2001:0DB8:1111:2222:3333:4444:5555:6666
</RequireAny>
```

#### 保护敏感文件

此设置将禁止所有网络访问您的 wp-config 文件、htaccess/htpasswd 以及 WordPress debug.log。对于已安装的站点，建议同时添加 install.php。

```
<FilesMatch "^(wp-config\.php|\.htaccess|\.htpasswd|debug\.log)$">
  Require all denied
</FilesMatch>
```

#### 强制使用 SSL

这将强制使用 SSL，并要求精确匹配主机名，否则将重定向到 SSL 版本。适用于 `/wp-admin/.htaccess` 文件。

```
SSLOptions +StrictRequire
SSLRequireSSL
SSLRequire %{HTTP_HOST} eq "www.example.com"
ErrorDocument 403 https://www.example.com
```

### 外部资源

* [Apache HTTP 服务器官方教程：.htaccess 文件](https://httpd.apache.org/docs/trunk/howto/htaccess.html)
* [官方 Htaccess 指令快速参考](https://httpd.apache.org/docs/trunk/mod/quickreference.html)
* [Htaccess 教程](https://www.askapache.com/htaccess/)
* [Google PageSpeed 开发者指南](https://developers.google.com/speed/docs/insights/rules)
* [愚蠢的 Htaccess 技巧](https://perishablepress.com/stupid-htaccess-tricks/)
* [高级 Mod_Rewrite](https://www.askapache.com/htaccess/crazy-advanced-mod_rewrite-tutorial/)

### 另请参阅

* [子目录的 htaccess](https://codex.wordpress.org/htaccess%20for%20subdirectories)
* [使用固定链接](https://wordpress.org/documentation/article/customize-permalinks/)
* [更改文件权限](https://wordpress.org/documentation/article/changing-file-permissions/)
* [UNIX Shell 技能](https://codex.wordpress.org/UNIX%20Shell%20Skills)
* [Rewrite API](https://codex.wordpress.org/Rewrite%20API)

# 邮件

本页面详细阐述了为 WordPress 设置本地邮件环境的理念、操作流程及推荐实践。

## 先决条件

开始之前，您需要对 [SMTP 协议](https://en.wikipedia.org/wiki/Simple_Mail_Transfer_Protocol) 以及三种邮件代理（[MUA](https://en.wikipedia.org/wiki/Mail_user_agent)、[MTA](https://en.wikipedia.org/wiki/Message_transfer_agent) 和 [MDA](https://en.wikipedia.org/wiki/Message_delivery_agent)）各自的角色有基本的了解。

## WordPress 的邮件发送理念

WordPress 默认从不提供 MUA 或 MTA。它仅提供一个语言 API 库的封装器，该库负责将消息提交给能与 PHP `mail()` 函数或 `SMTP` 扩展交互的 MTA。

这意味着，服务器管理员有责任正确配置 MTA 及相关邮件环境，以便与所选的语言 API 交互。历史上，[PHPMailer](https://github.com/PHPMailer/PHPMailer) 一直是首选库。WordPress 不参与发送邮件的过程，仅参与格式化消息以提交给此邮件 API 的过程。

## WordPress 默认邮件系统的工作原理

目前，WordPress 使用 `wp_mail()` 包装函数。在默认配置下，该包装器指示 PHPMailer 库使用 PHP 内置的 `mail()` 函数，这要求系统存在一个充当 MTA 的 sendmail 兼容二进制文件。因此，要让 WordPress 开箱即用，需要正确配置相关的本地邮件环境。

如果您使用的是托管服务，这通常不是问题。但如果您运行自己的服务器，并且没有设置 SMTP 服务器（MTA）和/或未正确配置相关邮件环境，则外发邮件将无法发送，除非您将 WordPress 的包装器配置为使用远程 SMTP 服务器。

## 推荐操作

除了技术层面，根据不同的场景概述推荐的解决方案也很有价值，这样管理员就不会选择不适合自己的方案。

如果你的 WordPress 站点使用托管主机，通常无需额外操作即可发送邮件，但可能需要采取一些额外措施来确保送达率，如下文所述。从 WordPress 安装中发出的邮件应该可以开箱即用。所有与邮件相关的问题都应咨询你的网络主机，你可能需要查看主机是否提供通过其管理面板配置 SMTP 中继的选项。

如果你使用的是自托管平台（即运行自己的服务器），通常有三种方式可以设置邮件服务：

- **设置本地 MTA 或专用邮件服务器直接发送邮件**。使用此方法，管理员需负责一切事宜。请注意，即使你正确配置了所有相关软件，仍可能遇到问题，因为邮件送达率还涉及你无法控制的因素，例如 IP 信誉。由于需要大量开销和持续维护，此方法通常仅适用于有相关经验的服务器管理员，因为可能会遇到严重的送达率问题。

- **设置本地 MTA 并将其邮件中继到第三方邮件服务**。这是大多数自托管设置的推荐方法，因为它比前一种方法更容易实现，并且仍然与 WordPress 的理念兼容。如果你不想处理运行完整 MTA 时邮件送达率问题的复杂性，这是理想选择。事实上，一些小型网络主机也采用此方法（他们会持有第三方邮件服务的商业账户，并将所有邮件中继到邮件服务）。如果你自行托管和管理站点，并通过 WordPress 发送大量邮件，此方法也很理想，因为你可以将责任委托给第三方邮件服务。与第一种方法一样，请注意此选项并非没有风险，如下一节所述。即使依赖第三方邮件服务，设置 MTA 始终需要一定程度的服务器管理专业知识。

- **通过代码配置 SMTP 中继以利用第三方邮件服务**。如果你不处理大量邮件，或者不想处理运行自托管 MTA 时邮件送达率问题的复杂性，这是推荐的方法。请注意，此方法[会导致性能下降](https://konstantin.blog/2021/wp_mail-is-not-broken/)，原因有很多。

## 设置您自己的 MTA

如果您选择设置自己的 MTA（无论是用于本地还是第三方中继），本节将简要介绍在 *NIX 和 Windows 环境中设置 MTA 的基础知识。在深入细节之前，请注意这种方法存在一些风险。必须开放端口 25，如果不小心处理可能会带来问题，因为这是最常见的攻击途径之一。如果未能妥善保护 SMTP 中继身份验证，您可能会面临安全问题，或者服务器被用于发送垃圾邮件。

### *NIX 服务器基础

如果你运行自己的 *NIX 服务器，你的机器上应该已安装最流行的 MTA（邮件传输代理），如 `postfix`、`exim`、`qmail` 或 `sendmail`，只需进行配置即可（你可以在网上搜索相关教程）。若希望使用第三方邮件服务，推荐的做法是设置本地 MTA 将邮件转发至远程 SMTP 服务器，以避免页面加载时间受到影响。

### Windows 主机服务器特定设置

检查 SMTP 虚拟服务器上的“中继”设置。授予 `127.0.0.1` 访问权限。然后在 `php.ini` 文件中，将 `SMTP` 设置设为相同的 IP 地址。同时将 `smtp_port` 设为 `25`。

在 Windows 机器上，可以尝试使用 [支持 TLS v1.2 的 Windows 版 Fake sendmail](https://github.com/sendmail-tls1-2/main) 等 sendmail 模拟器。

### MTA 设置的替代方案

如果您不想在服务器上手动设置完整的 MTA，还有其他一些选择：

* 使用中继 MTA 替代本地全功能 MTA：例如，[msmtp-mta](https://wiki.debian.org/msmtp) 是一个简化的 MTA，可用于通过远程 SMTP 服务器（即远程 MTA）转发电子邮件。该软件包提供了指向 `msmtp` 的 `/usr/sbin/sendmail` 符号链接，并具有其他软件可直接使用的 sendmail 兼容接口。

* 使用 SMTP 插件：您可以从 WP.org 插件目录安装 [SMTP 插件](https://wordpress.org/plugins/search/smtp/)。这类插件会覆盖 `wp_mail()` 的默认设置，使用 PHPMailer 或其他自选的邮件库，这些库利用远程第三方邮件服务代表您的域名发送邮件。

### 确保邮件可送达性

当我们的系统开始发送邮件后，需要确保邮件能实际送达收件人。有几项内容需要检查：

#### 确保使用正确的发件地址

默认情况下，WordPress 封装器会将 `From:` 字段填充为 `wordpress@example.com`，发件人名称设为 *WordPress*。如果这是一个有效的电子邮件地址，这样设置没有问题。例如，如果你的域名是 `example.com`，你的主机将传递 `wordpress@example.com` 进行投递。只要 `example.com` 已设置收发邮件，即使 `wordpress` 不是有效的邮箱，你的邮件也可能会被发送。一些旧的邮件投递代理会检查 `From:` 地址是否有效且能接收邮件。如今这种检查已不常见，但我们建议确保使用有效的电子邮件地址，并且该邮箱存在于你的接收邮件服务器中。如果你使用默认的 `From:` 地址，只需验证你可以在 `wordpress@example.com` 邮箱中接收邮件。请记住，`example.com` 是你的 WordPress 安装域名。

如果你不希望从与安装域名相同的域发送邮件，则必须在 WordPress 中进行一些代码更改。例如，如果你的 WordPress 域名是 `example.org`，但你想从 `mail.example.org` 发送邮件，邮件可能无法发送，因为 `example.org` 的 DNS 记录可能未授权你的邮件服务器处理邮件，因为默认的 `From:` 地址将是 `wordpress@wordpress.org`。要更改默认的 `From:` 地址，你的 WordPress 可以[使用 `wp_mail_from` 过滤器](https://developer.wordpress.org/reference/hooks/wp_mail_from/)。对于名称，你可以使用 [`wp_mail_from_name` 过滤器](https://developer.wordpress.org/reference/hooks/wp_mail_from_name/)。

你也可以在配置的 MTA 服务器中强制设置 `From:` 地址配置。请参考你的 MTA 相关文档。

#### 回复地址

WordPress 封装器会忽略 `Reply-To:` 字段，因此它将与 `From:` 地址保持一致。按照上述示例，默认情况下为 `wordpress@example.com`。如果您希望用户能够回复发送的邮件，请确保此邮箱存在于您的接收邮件服务器上。默认的 `Reply-To:` 地址始终与 `From:` 地址相同，除非您在邮件头中明确将其设置为不同的地址。

仅有一种情况会自动设置 `Reply-To:` 地址：当我们向评论文章的用户发送邮件时。在这种情况下，`Reply-To:` 地址将被设置为评论者明确指定的电子邮件地址。

### 排查垃圾邮件送达问题

您的邮件可能被路由至垃圾邮件文件夹，甚至更糟，直接被当作恶意邮件丢弃。您可以采取几项措施来说服收件方的邮件服务器，证明您的邮件是合法的，应按指定地址投递。设置 SPF、DKIM 和 DMARC 记录是确保送达率的关键步骤。网上有多种指南可帮助您设置这些记录。以下将解释这些记录为何有益。

#### SPF（发件人策略框架）

这是最常用的反垃圾邮件措施。邮件投递代理（MDA）会检查发件人域的 SPF 记录，以确认其是否被授权为该域发送邮件。SPF 是一种 TXT 类型的 DNS 记录，您需要自行添加或检查主机商是否已为您添加，该记录列出了被授权为该域发送邮件的 IP 地址或主机名。这确保了邮件并非来自未经授权的来源。例如，如果某个未知服务器 IP 地址发送了一封在 `From:` 字段中包含您域名的电子邮件，借助 SPF DNS 记录，MDA 会将其作为垃圾邮件拒收。但如果您未在 DNS 记录中正确配置此设置，您的邮件也可能被当作垃圾邮件拒绝。

请记住，如果您通过不同服务器（包括您的 WordPress 安装）发送电子邮件，则需要将所有地址添加到 SPF 记录中。

#### DKIM（域名密钥识别邮件）

这种反垃圾邮件的完整性验证检查在过去几年中获得了广泛认可，并已被大多数主要电子邮件提供商实施。您可以在同一封邮件中同时使用 SPF 和 DKIM。同样，与 SPF 类似，您可以通过检查邮件头来验证接收邮件服务器是否验证了您主机的域名密钥。与 SPF 一样，如果您可以编辑 TXT DNS 记录，您可以自行设置 DKIM 凭证。如果您处于托管环境中，请咨询您的托管提供商是否已为您设置此功能，因为这是常见做法。

如果您需要自行管理，有多种方法可以在邮件中发送正确的 DKIM 签名：

* 配置您的 MTA 以使用 DKIM 签名签署邮件。
* 某些 SMTP 插件提供 DKIM 签名选项。
* 使用 `PHPMailer` 库设置 DKIM 签名。为此，您可能需要[挂载到 `phpmailer_init` 操作](https://developer.wordpress.org/reference/hooks/phpmailer_init/)并遵循 PHPMailer 库的文档（此方法无官方文档，请参阅[此帖子了解更多详情](https://stackoverflow.com/a/24464694/4442122)）。

同时，请确保使用正确的域名信息生成 DKIM 密钥，并相应地发布 DNS 记录。当您将 DKIM 公钥添加到 DNS 记录后，MDA 将检查邮件头的 DKIM-Signature 并验证签名。如果签名无效，MDA 会将邮件作为垃圾邮件拒绝。这旨在防止电子邮件被伪造并从未经授权的来源发送。DKIM 和 SPF 结合使用，以确保邮件的合法性并按地址正确投递。

#### DMARC (Domain-based Message Authentication, Reporting & Conformance)

The DMARC record is another TXT DNS record that you need to add or check if your hosting has added it for you, that lists the actions to take when the email has not passed the SPF or DKIM checks. DMARC is becoming almost mandatory, so to ensure deliverability, we recommend setting it up. You can read more about it [here](https://dmarc.org/).

# Nginx

虽然 LAMP 堆栈（Linux + Apache + MySQL + PHP）在驱动 WordPress 方面非常流行，但使用 Nginx 也是可行的。WordPress 支持 Nginx，一些大型 WordPress 站点（例如 WordPress.com）就是由 Nginx 驱动的。

在讨论 Nginx 时，重要的是要了解有多种实现 Nginx 的方式。它可以设置为 Apache 前面的反向代理，这是一种非常强大的设置，允许您使用 Apache 的所有功能和优势，同时受益于 Nginx 的速度。大多数报告使用 Nginx 作为服务器的网站（基于从 HTTP 响应头收集的统计数据），实际上是 Apache 与 Nginx 作为反向代理一起运行。（显示“Nginx”的 HTTP 响应头是由反向代理报告的，而不是服务器本身。）

**本指南指的是独立的 Nginx 设置，其中 Nginx 被用作主要服务器，而不是 Apache。** 需要注意的是，Nginx 并非 Apache 的完全可互换替代品。在继续之前，您需要了解一些影响 WordPress 实现的关键差异：

- 使用 Nginx 时，没有像 Apache 的 .htaccess 或 IIS 的 web.config 文件那样的目录级配置文件。所有配置都必须在服务器级别由管理员完成，WordPress 无法像在 Apache 或 IIS 中那样修改配置。
- 运行 Nginx 时，美观固定链接功能略有不同。
- 由于 Nginx 没有 .htaccess 类型的功能，并且 WordPress 无法自动为您修改服务器配置，因此它无法为您生成重写规则。
- 如果不修改您的安装，“index.php”将被添加到您的固定链接中。（可以通过插件（见下文）和/或在子主题的 functions.php 中添加自定义代码来缓解此问题。）
- 但是，如果您确实希望拥有一些（有限的）.htaccess 功能，从技术上讲，可以通过安装 [PHP 的 htscanner PECL 扩展](https://www.php.net/manual/en/book.htscanner.php) 来实现。（然而，这不是一个完美的解决方案，因此请务必在使用前在生产站点上进行彻底测试和调试。）

本指南不会涵盖如何安装和配置 Nginx，因此假设您已经安装了 Nginx 并对其操作和调试有基本的了解。

## 通用与多站点支持

要让 WordPress 在 Nginx 上运行，您需要配置后端 php-cgi。可用的选项是 `fastcgi` 或 `php-fpm`。这里使用 php-fpm，因为它包含在 PHP 5.3+ 中，所以安装起来很简单。

Nginx 配置已拆分为五个独立的文件，并添加了大量注释，以便更容易理解每个选项。[作者](https://wordpress.org/support/users/bigsite/)也尽力遵循 Nginx 配置的“最佳实践”。

### Main (generic) startup file

This is equivalent to /etc/nginx/nginx.conf (or /etc/nginx/conf/nginx.conf if you’re using Arch Linux).

```
# Generic startup file.
user {user} {group};

#usually equal to number of CPUs you have. run command "grep processor /proc/cpuinfo | wc -l" to find it
worker_processes  auto;
worker_cpu_affinity auto;

error_log  /var/log/nginx/error.log;
pid        /var/run/nginx.pid;

# Keeps the logs free of messages about not being able to bind().
#daemon     off;

events {
    worker_connections  1024;
}

http {
    #rewrite_log on;

    include mime.types;
    default_type       application/octet-stream;
    access_log         /var/log/nginx/access.log;
    sendfile           on;
    #tcp_nopush         on;
    keepalive_timeout  3;
    #tcp_nodelay        on;
    #gzip               on;
    #php max upload limit cannot be larger than this
    client_max_body_size 13m;
    index              index.php index.html index.htm;

    # Upstream to abstract backend connection(s) for PHP.
    upstream php {
        #this should match value of "listen" directive in php-fpm pool
        server unix:/tmp/php-fpm.sock;
        # server 127.0.0.1:9000;
    }

    include sites-enabled/*;
}
```

### Per Site configuration

```
# Redirect everything to the main site. We use a separate server statement and NOT an if statement - see https://www.nginx.com/resources/wiki/start/topics/depth/ifisevil/

server {
    server_name  _;
    return 302 $scheme://example.com$request_uri;
}

server {
    server_name example.com;
    root /var/www/example.com;

    index index.php;

    include global/restrictions.conf;

    # Additional rules go here.

    # Only include one of the files below.
    include global/wordpress.conf;
    # include global/wordpress-ms-subdir.conf;
    # include global/wordpress-ms-subdomain.conf;
}
```

Splitting sections of the configuration into multiple files allows the same logic to be reused over and over. A ‘global’ subdirectory is used to add extra rules for general purpose use (either /etc/nginx/conf/global/ or /etc/nginx/global/ depending on how your nginx install is set up).

### Global restrictions file

```
# Global restrictions configuration file.
# Designed to be included in any server {} block.
location = /favicon.ico {
    log_not_found off;
    access_log off;
}

location = /robots.txt {
    allow all;
    log_not_found off;
    access_log off;
}

# Deny all attempts to access hidden files such as .htaccess, .htpasswd, .DS_Store (Mac).
# Keep logging the requests to parse later (or to pass to firewall utilities such as fail2ban)
location ~ /\. {
    deny all;
}

# Deny access to any files with a .php extension in the uploads directory
# Works in sub-directory installs and also in multisite network
# Keep logging the requests to parse later (or to pass to firewall utilities such as fail2ban)
location ~* /(?:uploads|files)/.*\.php$ {
    deny all;
}
```

### General WordPress rules

For single site installations, here is the `global/wordpress.conf` file:

```
# WordPress single site rules.
# Designed to be included in any server {} block.
# Upstream to abstract backend connection(s) for php
upstream php {
    server unix:/tmp/php-cgi.socket;
    server 127.0.0.1:9000;
}

server {
    ## Your website name goes here.
    server_name domain.tld;
    ## Your only path reference.
    root /var/www/wordpress;
    ## This should be in your http block and if it is, it's not needed here.
    index index.php;

    location = /favicon.ico {
        log_not_found off;
        access_log off;
    }

    location = /robots.txt {
        allow all;
        log_not_found off;
        access_log off;
    }

    location / {
        # This is cool because no php is touched for static content.
        # include the "?$args" part so non-default permalinks doesn't break when using query string
        try_files $uri $uri/ /index.php?$args;
    }

    location ~ \.php$ {
        #NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini
        include fastcgi.conf;
        fastcgi_intercept_errors on;
        fastcgi_pass php;
    }

    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
        expires max;
        log_not_found off;
    }
}
```

This is more up-to-date example for Nginx: https://www.nginx.com/resources/wiki/start/topics/recipes/wordpress/

### WordPress 多站点

对于多站点安装，请根据启用多站点时使用的 WordPress 版本以及域名/子目录配置，在 `global/wordpress.conf` 文件中使用以下相应部分。

#### WordPress 3.5 及以上版本

如果您在 WordPress 3.5 或更高版本上启用了多站点功能，请使用以下配置之一。

##### WordPress 3.5 及以上版本子目录配置示例

```
# 适用于 WP 3.5 及以上版本的 WordPress 多站点子目录配置文件。
server {
    server_name example.com ;

    root /var/www/example.com/htdocs;
    index index.php;

    if (!-e $request_filename) {
        rewrite /wp-admin$ $scheme://$host$request_uri/ permanent;
        rewrite ^(/[^/]+)?(/wp-.*) $2 last;
        rewrite ^(/[^/]+)?(/.*\.php) $2 last;
    }

    location / {
        try_files $uri $uri/ /index.php?$args ;
    }

    location ~ \.php$ {
        try_files $uri =404;
        include fastcgi_params;
        fastcgi_pass php;
    }

    # 在此处为静态内容添加一些过期头规则
}
```

##### WordPress 3.5 and up Subdomains Examples

```
# WordPress multisite subdomain config file for WP 3.5 and up.
server {
    server_name example.com *.example.com ;

    root /var/www/example.com/htdocs;
    index index.php;

    location / {
        try_files $uri $uri/ /index.php?$args ;
    }

    location ~ \.php$ {
        try_files $uri =404;
        include fastcgi_params;
        fastcgi_pass php;
    }

    #add some rules for static content expiry-headers here
}
```

#### WordPress 3.4 and below

If you originally activated Multisite with WordPress with 3.4 or older, you need to use one of these:

##### WordPress <=3.4 Subdirectory Examples

```
# WordPress multisite subdirectory config file for WP 3.4 and below.

map $uri $blogname{
    ~^(?P<blogpath>/[^/]+/)files/(.*)       $blogpath ;
}

map $blogname $blogid{
    default -999;

    #Ref: https://wordpress.org/extend/plugins/nginx-helper/
    #include /var/www/wordpress/wp-content/plugins/nginx-helper/map.conf ;
}

server {
    server_name example.com ;

    root /var/www/example.com/htdocs;
    index index.php;

    location ~ ^(/[^/]+/)?files/(.+) {
        try_files /wp-content/blogs.dir/$blogid/files/$2 /wp-includes/ms-files.php?file=$2 ;
        access_log off;     log_not_found off; expires max;
    }

    #avoid php readfile()
    location ^~ /blogs.dir {
        internal;
        alias /var/www/example.com/htdocs/wp-content/blogs.dir ;
        access_log off;     log_not_found off; expires max;
    }

    if (!-e $request_filename) {
        rewrite /wp-admin$ $scheme://$host$request_uri/ permanent;
        rewrite ^(/[^/]+)?(/wp-.*) $2 last;
        rewrite ^(/[^/]+)?(/.*\.php) $2 last;
    }

    location / {
        try_files $uri $uri/ /index.php?$args ;
    }

    location ~ \.php$ {
        try_files $uri =404;
        include fastcgi_params;
        fastcgi_pass php;
    }

    #add some rules for static content expiry-headers here
}
```

NGINX provides 2 special directive: X-Accel-Redirect and map. Using these 2 directives, one can eliminate performance hit for static-file serving on WordPress multisite network.

##### WordPress <=3.4 Subdomains Examples

```
# WordPress multisite subdomain config file for WP 3.4 and below.
map $http_host $blogid {
    default       -999;

    #Ref: https://wordpress.org/extend/plugins/nginx-helper/
    #include /var/www/wordpress/wp-content/plugins/nginx-helper/map.conf ;

}

server {
    server_name example.com *.example.com ;

    root /var/www/example.com/htdocs;
    index index.php;

    location / {
        try_files $uri $uri/ /index.php?$args ;
    }

    location ~ \.php$ {
        try_files $uri =404;
        include fastcgi_params;
        fastcgi_pass php;
    }

    #WPMU Files
        location ~ ^/files/(.*)$ {
            try_files /wp-content/blogs.dir/$blogid/$uri /wp-includes/ms-files.php?file=$1 ;
            access_log off; log_not_found off; expires max;
        }

    #WPMU x-sendfile to avoid php readfile()
    location ^~ /blogs.dir {
        internal;
        alias /var/www/example.com/htdocs/wp-content/blogs.dir;
        access_log off;     log_not_found off;      expires max;
    }

    #add some rules for static content expiry-headers here
}
```

Ref: https://www.nginx.com/resources/wiki/start/topics/recipes/wordpress/

### HTTPS in Nginx

Enabling HTTPS in Nginx is relatively simple.

```
server {
    # listens both on IPv4 and IPv6 on 443 and enables HTTPS and HTTP/2 support.
    # HTTP/2 is available in nginx 1.9.5 and above.
    listen *:443 ssl;
    listen [::]:443 ssl;
    http2 on;

    # indicate locations of SSL key files.
    ssl_certificate /srv/www/ssl/ssl.crt;
    ssl_certificate_key /srv/www/ssl/ssl.key;
    ssl_dhparam /srv/www/master/ssl/dhparam.pem;

    # indicate the server name
    server_name example.com *.example.com;

    # Enable HSTS. This forces SSL on clients that respect it, most modern browsers. The includeSubDomains flag is optional.
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains";

    # Set caches, protocols, and accepted ciphers. This config will merit an A+ SSL Labs score as of Sept 2015.
    ssl_session_cache shared:SSL:20m;
    ssl_session_timeout 10m;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;
    ssl_ciphers 'ECDH+AESGCM:ECDH+AES256:ECDH+AES128:DH+3DES:!ADH:!AECDH:!MD5';
}
```

Mozilla offers an [excellent SSL config generation tool](https://mozilla.github.io/server-side-tls/ssl-config-generator/) as well.

### WP Super Cache Rules

```
# WP Super Cache rules.
# Designed to be included from a 'wordpress-ms-...' configuration file.

set $cache_uri $request_uri;

# POST requests and urls with a query string should always go to PHP
if ($request_method = POST) {
    set $cache_uri 'null cache';
}

if ($query_string != "") {
    set $cache_uri 'null cache';
}

# Don't cache uris containing the following segments
if ($request_uri ~* "(/wp-admin/|/xmlrpc.php|/wp-(app|cron|login|register|mail).php|wp-.*.php|/feed/|index.php|wp-comments-popup.php|wp-links-opml.php|wp-locations.php|sitemap(_index)?.xml|[a-z0-9_-]+-sitemap([0-9]+)?.xml)") {
    set $cache_uri 'null cache';
}

# Don't use the cache for logged in users or recent commenters
if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_logged_in") {
    set $cache_uri 'null cache';
}

# START MOBILE
# Mobile browsers section to server them non-cached version. COMMENTED by default as most modern wordpress themes including twenty-eleven are responsive. Uncomment config lines in this section if you want to use a plugin like WP-Touch
# if ($http_x_wap_profile) {
    # set $cache_uri 'null cache';
#}

#if ($http_profile) {
    # set $cache_uri 'null cache';
#}

#if ($http_user_agent ~* (2.0\ MMP|240x320|400X240|AvantGo|BlackBerry|Blazer|Cellphone|Danger|DoCoMo|Elaine/3.0|EudoraWeb|Googlebot-Mobile|hiptop|IEMobile|KYOCERA/WX310K|LG/U990|MIDP-2.|MMEF20|MOT-V|NetFront|Newt|Nintendo\ Wii|Nitro|Nokia|Opera\ Mini|Palm|PlayStation\ Portable|portalmmm|Proxinet|ProxiNet|SHARP-TQ-GX10|SHG-i900|Small|SonyEricsson|Symbian\ OS|SymbianOS|TS21i-10|UP.Browser|UP.Link|webOS|Windows\ CE|WinWAP|YahooSeeker/M1A1-R2D2|iPhone|iPod|Android|BlackBerry9530|LG-TU915\ Obigo|LGE\ VX|webOS|Nokia5800)) {
    # set $cache_uri 'null cache';
#}

#if ($http_user_agent ~* (w3c\ |w3c-|acs-|alav|alca|amoi|audi|avan|benq|bird|blac|blaz|brew|cell|cldc|cmd-|dang|doco|eric|hipt|htc_|inno|ipaq|ipod|jigs|kddi|keji|leno|lg-c|lg-d|lg-g|lge-|lg/u|maui|maxo|midp|mits|mmef|mobi|mot-|moto|mwbp|nec-|newt|noki|palm|pana|pant|phil|play|port|prox|qwap|sage|sams|sany|sch-|sec-|send|seri|sgh-|shar|sie-|siem|smal|smar|sony|sph-|symb|t-mo|teli|tim-|tosh|tsm-|upg1|upsi|vk-v|voda|wap-|wapa|wapi|wapp|wapr|webc|winw|winw|xda\ |xda-)) {
    # set $cache_uri 'null cache';
#}
#END MOBILE

# Use cached or actual file if they exists, otherwise pass request to WordPress
location / {
    try_files /wp-content/cache/supercache/$http_host/$cache_uri/index.html $uri $uri/ /index.php?$args ;
}
```

**Experimental modifications:**

If you are using HTTPS, the latest development version of WP Super Cache may use a different directory structure to differentiate between HTTP and HTTPS. try_files line may look like below:

```
location / {
    try_files /wp-content/cache/supercache/$http_host/$cache_uri/index-https.html $uri $uri/ /index.php?$args ;
}
```

### W3 Total Cache 规则

W3 Total Cache 根据 WordPress 配置，对基于磁盘的缓存存储使用不同的目录结构。

缓存验证检查将保持通用，如下所示：

```
#W3 TOTAL CACHE 检查
set $cache_uri $request_uri;

# POST 请求和带有查询字符串的 URL 应始终交给 PHP 处理
if ($request_method = POST) {
    set $cache_uri 'null cache';
}
if ($query_string != "") {
    set $cache_uri 'null cache';
}

# 不缓存包含以下片段的 URI
if ($request_uri ~* "(/wp-admin/|/xmlrpc.php|/wp-(app|cron|login|register|mail).php|wp-.*.php|/feed/|index.php|wp-comments-popup.php|wp-links-opml.php|wp-locations.php|sitemap(_index)?.xml|[a-z0-9_-]+-sitemap([0-9]+)?.xml)") {
    set $cache_uri 'null cache';
}

# 不对登录用户或最近评论者使用缓存
if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_logged_in") {
    set $cache_uri 'null cache';
}
#从上面的 WP SUPER CACHE 部分添加移动端规则

#从下方追加一个代码块...
```

**对于普通 WordPress（非多站点）**

使用以下配置：

```
# 如果存在缓存文件或实际文件则使用，否则将请求传递给 WordPress
location / {
    try_files /wp-content/w3tc/pgcache/$cache_uri/_index.html $uri $uri/ /index.php?$args ;
}
```

**对于使用子目录的多站点**
使用以下配置：

```
if ( $request_uri ~* "^/([_0-9a-zA-Z-]+)/.*" ){
    set $blog $1;
}

set $blog "${blog}.";

if ( $blog = "blog." ){
    set $blog "";
}

# 如果存在缓存文件或实际文件则使用，否则将请求传递给 WordPress
location / {
    try_files /wp-content/w3tc-$blog$host/pgcache$cache_uri/_index.html $uri $uri/ /index.php?$args ;
}
```

**对于使用子域名/域名映射的多站点**
使用以下配置：

```
location / {
    try_files /wp-content/w3tc-$host/pgcache/$cache_uri/_index.html $uri $uri/ /index.php?$args;
}
```

注意事项

- Nginx 可以自动处理 gzip 和浏览器缓存，因此最好将这部分交给 nginx。
- W3 Total Cache 的 Minify 规则与上述配置配合使用不会有任何问题。

## Nginx fastcgi_cache

Nginx can perform caching on its own end to reduce load on your server. When you want to use Nginx’s built-in fastcgi_cache, you better compile nginx with [fastcgi_cache_purge](https://github.com/FRiCKLE/ngx_cache_purge) module. It will help nginx purge cache for a page when it gets edited. On the WordPress side, you need to install a plugin like [Nginx Helper](https://wordpress.org/plugins/nginx-helper/) to utilize fastcgi_cache_purge feature.

Config will look like below:

**Define a Nginx cache zone in http{…} block, outside server{…} block**

```
#move next 3 lines to /etc/nginx/nginx.conf if you want to use fastcgi_cache across many sites
fastcgi_cache_path /var/run/nginx-cache levels=1:2 keys_zone=WORDPRESS:500m inactive=60m;
fastcgi_cache_key "$scheme$request_method$host$request_uri";
fastcgi_cache_use_stale error timeout invalid_header http_500;
```

**For WordPress site config, in server{..} block add a cache check block as follow**

```
#fastcgi_cache start
set $no_cache 0;

# POST requests and urls with a query string should always go to PHP
if ($request_method = POST) {
    set $no_cache 1;
}
if ($query_string != "") {
    set $no_cache 1;
}

# Don't cache uris containing the following segments
if ($request_uri ~* "(/wp-admin/|/xmlrpc.php|/wp-(app|cron|login|register|mail).php|wp-.*.php|/feed/|index.php|wp-comments-popup.php|wp-links-opml.php|wp-locations.php|sitemap(_index)?.xml|[a-z0-9_-]+-sitemap([0-9]+)?.xml)") {
        set $no_cache 1;
}

# Don't use the cache for logged in users or recent commenters
if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_no_cache|wordpress_logged_in") {
        set $no_cache 1;
}
```

**Then make changes to PHP handling block**

Just add this to the following php block. Note the line fastcgi_cache_valid 200 60m; which tells nginx only to cache 200 responses(normal pages), which means that redirects are not cached. This is important for multilanguage sites where, if not implemented, nginx would cache the main url in one language instead of redirecting users to their respective content according to their language.

```
fastcgi_cache_bypass $no_cache;
fastcgi_no_cache $no_cache;

fastcgi_cache WORDPRESS;
fastcgi_cache_valid 200 60m;
```

Such that it becomes something like this

```
location ~ [^/]\.php(/|$) {
    fastcgi_split_path_info ^(.+?\.php)(/.*)$;
    if (!-f $document_root$fastcgi_script_name) {
        return 404;
    }
    # This is a robust solution for path info security issue and works with "cgi.fix_pathinfo = 1" in /etc/php.ini (default)

    include fastcgi.conf;
    fastcgi_index index.php;
    # fastcgi_intercept_errors on;
    fastcgi_pass php;

    fastcgi_cache_bypass $no_cache;
    fastcgi_no_cache $no_cache;

    fastcgi_cache WORDPRESS;
    fastcgi_cache_valid 200 60m;
}
```

**Finally add a location for conditional purge**

```
location ~ /purge(/.*) {
    # Uncomment the following two lines to allow purge only from the webserver
    # allow 127.0.0.1;
    # deny all;

    fastcgi_cache_purge WORDPRESS "$scheme$request_method$host$1";
}
```

If you get an ‘unknown directive “fastcgi_cache_purge”‘ error check that your Nginx installation has fastcgi_cache_purge module.

## 提升多站点静态文件性能（WP <= 3.4）

默认情况下，在 3.5 版本之前激活的多站点网络中，静态文件请求会调用 PHP 处理，即通过 `ms-files.php` 文件。使用 Nginx 的 `Map{..}` 指令可以获得更好的性能。

在您站点的 Nginx 配置中，于 `server{..}` 块上方添加如下部分：

```
map $http_host $blogid {
    default               0;

    example.com           1;
    site1.example.com     2;
    site1.com             2;
}
```

这只是一个站点名称与博客 ID 的对应列表。您可以使用 [Nginx helper](https://wordpress.org/extend/plugins/nginx-helper) 插件来获取这样的站点名称/博客 ID 对列表。该插件还会生成一个 `map.conf` 文件，您可以直接将其包含在 `map{}` 部分中，如下所示：

```
map $http_host $blogid {
    default               0;

    include /path/to/map.conf ;
}
```

创建 `map{..}` 部分后，您只需在 Nginx 配置中再做一个更改，以便对 /files/ 的请求首先使用 nginx `map{..}` 处理：

```
location ~ ^/files/(.*)$ {
    try_files /wp-content/blogs.dir/$blogid/$uri /wp-includes/ms-files.php?file=$1 ;
    access_log off; log_not_found off; expires max;
}
```

注意事项

- 每当创建新站点、删除站点或将额外域名映射到现有站点时，Nginx helper 会自动更新 map.conf 文件，但您仍需要手动重新加载 Nginx 配置。您可以稍后随时进行。在此之前，只有新站点的文件将通过 php-fpm 提供。
- 此方法不会生成任何符号链接。因此，不会出现因意外删除或备份脚本跟随符号链接而导致的问题。
- 对于大型网络，这将具有良好的扩展性，因为只有一个 map.conf 文件。

最后几点重要说明：整个设置假设站点的根目录是博客，并且所有引用的文件都位于主机上。如果您将博客放在子目录中（例如 /blog），则必须修改规则。也许有人可以借鉴这些规则，使其能够实现，例如，在主 'server' 块中使用：

```
set $wp_subdir "/blog";
```

指令，并使其自动应用于通用的 WordPress 规则。

## 警告

[全局限制文件](https://developer.wordpress.org/advanced-administration/server/web-server/nginx/#global-restrictions-file)中的拼写错误可能造成安全漏洞。要测试您的“uploads”目录是否真正受到保护，请创建一个包含某些内容的 PHP 文件（例如：<?php phpinfo(); ?>），将其上传到“uploads”目录（或其子目录），然后尝试从浏览器访问（执行）它。

## 资源

### 参考

- [nginx + php-fpm + PHP APC + WordPress 多站点（子目录）+ WP Super Cache](https://wordpress.org/support/topic/nginx-php-fpm-php-apc-wordpress-multisite-subdirectory-wp-super-cache/)。

### External Links

- [Nginx WordPress wiki page](https://www.nginx.com/resources/wiki/start/topics/recipes/wordpress/)
- [LEMP guides on Linode’s Library](https://www.linode.com/docs/guides/web-servers/lemp/)
- [Various guides about Nginx on Linode’s Library](https://www.linode.com/docs/guides/web-servers/nginx/)
- [Lightning fast WordPress with Php-fpm and Nginx](https://www.sitepoint.com/lightning-fast-wordpress-with-php-fpm-and-nginx/)
- [Virtual Hosts Examples](https://wiki.nginx.org/VirtualHostExample)
- [List of 20+ WordPress-Nginx Tutorials for common situations](https://rtcamp.com/wordpress-nginx/tutorials/)
- [An introduction to Nginx configuration](https://blog.martinfjordvald.com/nginx-primer/)
- [A comprehensive blog series on hosting WordPress yourself using Nginx](https://deliciousbrains.com/hosting-wordpress-setup-secure-virtual-server/)
- [WordPress Installation CentminMod](https://centminmod.com/nginx_configure_wordpress.html)
- [Nginx WordPress Installation Guide](https://thecustomizewindows.com/2015/12/nginx-wordpress-installation-guide-steps/)

### 脚本与工具

对于 WordPress 的 Nginx 脚本化安装，CentOS 系统可使用 [CentminMod](https://centminmod.com/nginx_configure_wordpress.html)。

### 加固 Nginx

- [加固 Nginx 与 PHP](http://kbeezie.com/securing-nginx-php/)
- [配置 PHP-FastCGI 与 nginx？别轻信教程：检查你的配置！](https://nealpoole.com/blog/2011/04/setting-up-php-fastcgi-and-nginx-dont-trust-the-tutorials-check-your-configuration/)

# 查找服务器信息

您正在使用哪个版本的 [PHP](https://wordpress.org/documentation/article/glossary#php)？您的网站主机使用什么服务器软件？您拥有哪个版本的 [MySQL](https://wordpress.org/documentation/article/glossary#mysql)？您的网站主机使用什么操作系统？

![php73win_phpinfo](https://user-images.githubusercontent.com/1508963/201365720-3a13ccab-c44c-43f2-8326-e3a997c5acfa.jpg)

ALT= PHP 信息测试文件结果顶部

这些是 WordPress 用户在准备[安装 WordPress](https://developer.wordpress.org/advanced-administration/before-install/howto-install/) 时经常被问到的问题。其他时候，这些问题是在排查 WordPress 安装问题时被问到的。但不必花费大量时间在您的网站或主机网站上搜索答案——有一种非常简单的方法可以获取这些信息。

收集信息最简单的方法是使用一个名为 phpinfo() 的 PHP 函数。phpinfo() 函数将查询您（或您主机）的服务器，并生成一份包含大量数据的报告。注意：请记住收藏此页面，因为将来 [WordPress 支持论坛](https://www.wordpress.org/support/forums/)的志愿者可能会要求您使用此方法获取信息，以协助他们排查您在支持论坛上提出的问题。

**警告：** 此文件将包含一些关于您服务器的中等敏感信息，这些信息可能帮助攻击者访问您的服务器。请确保为文件起一个不易猜测的文件名，并在完成后立即删除它。

在文本编辑器中，复制并粘贴以下命令：

```
<?php phpinfo(); ?>
```

确保命令前后没有空格，只有命令本身，然后将文件保存为一个不易猜测的名称，例如 sffdsajk234.php。使文件名难以被黑客猜测很重要，因为该文件包含的信息可能帮助他们入侵您的服务器。

将文件上传到您网站的根目录。然后在浏览器中输入该文件的地址：

```
https://example.com/sffdsajk234.php
```

结果将长达数页，并包含大量信息。虽然您的数据顺序可能不同，但大部分情况下，您只需要列出以下内容的摘要项：

|                |                                                               |
| -------------- | ------------------------------------------------------------- |
| PHP            | 版本 7.3.0                                                    |
| 系统           | Windows NT DESKTOP-LK01DAN 10.0 build 17763 (Windows 10) i586 |
| 构建日期       | 2018年12月6日 01:51:18                                        |
| 服务器 API     | Apache 2.0 处理器                                             |
| Apache 版本    | Apache/2.4.37 (Win32) OpenSSL/1.1.1a PHP/7.3.0                |

就是这样。请务必记得在使用完毕后删除该文件，因为将其留在服务器上可能会帮助黑客入侵您的系统。

## Information and Resources

- [PHP.net’s phpinfo Manual](https://www.php.net/phpinfo)
- [Zend’s PHP Manual on phpinfo](https://www.zend.com/manual/function.phpinfo.php)
- [WordPress Environment PHP library](https://github.com/abelcallejo/wordpress-environment)

# 配置通配符子域名

通配符子域名对于基于域名的 WordPress [多站点](https://wordpress.org/documentation/article/wordpress-glossary/#multisite)网络非常有用，它允许终端用户按需创建新站点。在此类网络中，每个新站点都有自己的子域名，而通配符配置意味着这些子域名无需单独配置。有关如何创建多站点网络的信息，请参阅：[创建网络](https://developer.wordpress.org/advanced-administration/multisite/create-network/)。

本页包含了一些示例，说明如何在不同情况下配置通配符子域名。如果您无法确定如何在特定的 Web 服务器上设置通配符子域名，*请联系您的网络托管服务商*以获取指导。

## Apache {#apache}

在 `httpd.conf` 文件中，或在包含您网站账户 `VirtualHost` 部分的包含文件中，添加如下一行（如果尚未存在）：

```
ServerAlias *.example.com
```

同时创建一个通配符 DNS 记录，例如：

```
*.example.com A 192.0.2.1
```

## CPanel {#cpanel}

在您的 CPanel 中创建一个名为 "*"（通配符）的子域 (`*.example.com`)。请确保将其指向与您的 `wp-config.php` 文件所在的文件夹位置相同。

## Plesk {#plesk}

在使用 Plesk 面板的服务器上为通配符子域设置服务器时，有几个步骤与使用 cPanel（或无控制面板）的服务器不同。这篇文章 [在 Plesk 控制面板下为多站点配置通配符子域](https://codex.wordpress.org/Configuring_Wildcard_Subdomains_for_multi_site_under_Plesk_Control_Panel) 详细说明了所有涉及的步骤。

## DirectAdmin {#directadmin-panel}

点击 "用户面板" -> DNS 管理 -> 使用三列添加以下三条记录：

```
* A 192.0.2.1
```

点击 "管理员面板"（如果您没有"管理员面板"，请让您的主机提供商操作） -> 自定义 Httpd -> yourdomain.com -> 在文本输入区域，精确地粘贴以下内容并"保存"：

```
ServerAlias *.|DOMAIN|
```

_如果您需要撤销自定义 Httpd 设置：返回此处，删除输入区域的文本，保存。_

- DirectAdmin.com: [Apache 通配符文档](https://help.directadmin.com/item.php?id=127)。DirectAdmin.com 论坛: [WordPress 通配符子域名](https://forum.directadmin.com/threads/wildcard-subdomains-yea-i-know-its-a-common-one.29074/#post-195033)。

## Amazon Web Services {#amazon-web-services}

默认情况下，AWS 实例不会分配永久 IP 地址。这意味着“服务器”的 IP 地址在重启时可能会改变。要解决此问题，请为您的服务器实例分配一个弹性 IP 地址，并在向域名注册商配置 A 记录时使用该 IP 地址。

AWS 弹性负载均衡器无法分配弹性 IP，因此必须使用 CName 为其提供一个友好的 URL。您不能为根 URL 设置 CName。因此，您必须将域名根目录（example.com）指向具有弹性 IP 地址的特定服务器实例，并创建一个通配符 CName（*.example.com），将其指向您的弹性负载均衡器。然后，在您的 .htaccess 文件中，将所有域名根目录流量（example.com）重定向到特定的子域名（www.example.com）。

**注意：**

- 目前一些域名注册商不支持通配符 CName。
- 亚马逊的 Route53 域名服务可以解决 CName 问题，但需要额外付费。

# Web 服务器

Web 服务器是一种软件，它接收用户的网络请求并提供相应的结果。许多不同的 Web 服务器运行在其他操作系统上。通常，只要您的 Web 服务器支持并执行 PHP 文件，它就应该能够运行 WordPress。

## Apache HTTPD

参见 [Apache HTTPD / .htaccess](https://developer.wordpress.org/advanced-administration/server/web-server/httpd/)

## nginx

参见 [Nginx](https://developer.wordpress.org/advanced-administration/server/web-server/nginx/)。

# 主题

主题是指构成 WordPress 网站视觉设计与功能实现的基础技术和组件集合。它既包含驱动 WordPress 运行的服务器端组件，也涵盖 WordPress 主题特有的架构与文件体系。

理解 WordPress 主题在服务器端的技术原理，是构建和维护成功 WordPress 网站的基石。无论您是开发者、设计师还是管理员，掌握这些知识都能帮助您高效创建和管理主题，从而确保网站具备安全可靠、性能优异且视觉出众的线上呈现。

## 主题技术

### Web 服务器
Web 服务器（如 Apache、Nginx）处理传入的 HTTP 请求并提供网页。它们在向用户交付 WordPress 主题方面起着关键作用。

### PHP
PHP 是 WordPress 所基于的服务器端脚本语言。它处理请求、连接数据库，并根据主题文件和用户输入生成动态内容。

### 数据库
WordPress 依赖数据库（通常是 MySQL）来存储内容、设置和主题数据。它从数据库中检索信息以动态生成网页。

### 文件系统
文件系统用于存储主题文件、图像、JavaScript 和 CSS。理解主题文件的结构和组织对于主题开发至关重要。

## 主题架构
WordPress 主题由 PHP 模板文件、CSS 样式表、JavaScript 文件和其他资源组成。主题在服务器的 `wp-content/themes` 目录内组织。

模板文件决定网页的布局和结构。关键模板包括 `header.php`、`footer.php` 以及各种内容特定的模板，如 `single.php` 和 `page.php`。

### 样式表 (CSS)
CSS 文件控制主题的视觉呈现。样式在 CSS 文件中定义，并决定颜色、字体和布局等元素。

### JavaScript
JavaScript 文件增强网站的交互性和功能。这些文件可以包含在主题中，用于表单验证、动画和 AJAX 功能等任务。

### Functions.php
`functions.php` 文件包含用于主题特定功能和自定义的 PHP 函数与代码。您可以在此处添加操作、过滤器和自定义函数以修改主题行为。

## 在您的 Web 服务器上的工作流程

### 用户请求
当用户访问 WordPress 站点时，Web 服务器会处理其请求并将其转发给 WordPress。

### WordPress 核心
WordPress 核心包含 PHP 脚本和数据库查询，它负责解释用户请求并检索内容和设置。

### 主题集成
所选主题的模板文件和样式被集成到内容中，最终生成 HTML、CSS 和 JavaScript 并发送到用户的浏览器。

## 自定义与优化

### 子主题
子主题用于扩展和自定义现有主题，而无需修改原始主题文件。这使您可以在不丢失更新或引发主题冲突风险的情况下进行更改。

### 性能优化
提升主题性能的方法包括减少服务器请求、压缩图片尺寸以及优化 CSS 和 JavaScript。缓存技术也能显著提高加载速度。

### 安全考量
正确的安全实践包括保持主题与 WordPress 核心版本更新、加强数据库访问防护，以及对用户输入进行过滤处理以防范漏洞风险。

# Adminer

## 什么是 Adminer？

[Adminer](https://www.adminer.org/)（原名 phpMinAdmin）是一个用 PHP 编写的功能齐全的数据库管理工具。与由多个文件组成的 [phpMyAdmin](https://developer.wordpress.org/advanced-administration/upgrade/phpmyadmin/) 不同，Adminer 仅包含一个文件，可直接部署到目标服务器。它支持多种数据库，包括 MySQL、MariaDB、PostgreSQL、SQLite、MS SQL、Oracle、Elasticsearch、MongoDB 等。由于 WordPress 将所有数据存储在 MySQL 数据库中，Adminer 提供了对该数据库中数据、表和字段的“原始”视图。

## Adminer 的优势

- **界面简洁**：与其他数据库管理工具不同，Adminer 提供了清晰且用户友好的界面。
- **直接数据操作**：适用于直接编辑数据库，尤其是在 WordPress 停止工作时。
- **轻量级**：作为单个 PHP 文件，它易于上传、使用和移除。

## 它有什么用处？

Adminer 适用于表维护、数据备份和直接数据库编辑。有时，在[支持论坛](https://wordpress.org/support/welcome/#asking-for-support)中，贡献者会分享一些有用的 SQL 查询，这些查询可以使用 Adminer 等工具执行。

## 我可以在哪里获取它？

许多托管控制面板，例如 cPanel 和 Plesk，都预装了 [phpMyAdmin](https://developer.wordpress.org/advanced-administration/upgrade/phpmyadmin/)。如果无法访问数据库，用户可以咨询其托管服务提供商以获取数据库访问权限。
对于更喜欢使用 Adminer 的用户，可以从 [Adminer 项目页面](https://www.adminer.org/)下载它。

## 安装 Adminer

1. 从 [Adminer 下载页面](https://www.adminer.org/en/#download) 下载最新版本的 Adminer。
2. 使用 [FileZilla](https://wordpress.org/documentation/article/using-filezilla/) 等 FTP 工具，将 Adminer PHP 文件上传到 WordPress 根目录（即 `wp-config.php` 文件所在的位置）。
3. 将 Adminer PHP 文件上传到 WordPress 根目录后，您可以在浏览器中通过将文件名添加到 URL 来访问它，例如 `https://example.com/adminer-4.8.1.php`。
4. 数据库登录凭据必须手动填写，可以从 `wp-config.php` 文件中获取。

## 将 Adminer 安装为 WordPress 插件

Adminer 也可能在 [WordPress 插件仓库](https://wordpress.org/plugins/search/database+adminer/) 中以插件形式提供。如果作为 WordPress 插件安装，Adminer 在访问时可能会自动使用 `wp-config.php` 文件中的数据库登录凭据。

## 安全注意事项

为防止未经授权的访问，请确保在使用后移除或保护 Adminer，特别是当它可以公开访问时。一种保护方法是使用 `.htaccess` 文件限制访问。如果您不熟悉 `.htaccess` 文件限制，请考虑寻求 [WordPress 加固指南](https://wordpress.org/documentation/article/hardening-wordpress/) 或在使用后移除 Adminer。

# 使用 FileZilla

[FileZilla](https://filezilla-project.org/) 是一款开源的文件传输客户端和服务器。客户端和服务器均适用于 Windows、Linux 和 macOS。FileZilla 支持 **SFTP** 和 **FTPS**（加密）以及其他协议。如果您的托管服务支持，请优先使用 **SFTP** 而非普通 FTP。

您可以使用 FileZilla 通过上传和下载文件及图片来管理您的 WordPress 站点。本文将指导您安装和使用 FileZilla FTP 客户端来管理您的 WordPress 站点。

![FileZilla 应用程序截图](https://raw.githubusercontent.com/WordPress/Advanced-administration-handbook/main/assets/filezilla_1.gif)

有关 FileZilla 的更多信息，请查看官方网站的[功能列表](https://filezilla-project.org/client_features.php)。

### 为何要下载 FileZilla？

它快速、稳定、易用且免费。FTP 是在本地系统与网络服务器之间上传或下载文件的标准方式，而 FileZilla 是满足日常 FTP 需求的可靠客户端。

## 设置选项

您需要从主机获取以下详细信息（适用于 FTP、FTPS 或 SFTP）：

1.  **主机/服务器名称**（通常是类似 `example.com`、`ftp.example.com` 或主机提供的服务器名称）
2.  **协议**（如果可用，**首选 SFTP**；有些主机提供 **FTPS**）
3.  您的**用户名**
4.  您的**密码**（或者，对于 SFTP，有时是 SSH 密钥）

如果您的服务器上还没有 FTP 账户，请使用控制面板或网站管理工具创建一个——它将包含所有必需的信息。如有疑问，请向您的主机咨询有关用于访问您网站空间的 FTP 账户的说明或帮助。

在连接 FTP 服务器之前，您应该在站点管理器中注册它。一旦注册，只需单击一下即可连接到同一服务器。

要注册 FTP 服务器，请按照以下步骤操作：

1.  在 FileZilla 主窗口中，点击 **文件 → 站点管理器**。
2.  点击 **新站点**，然后为您的新连接命名（例如：我的博客服务器）。
3.  在 **主机** 框中输入主机/服务器名称。这可能是 `ftp.example.com`、`example.com` 或主机提供的值。如果您不知道，请向您的主机核实。注意：除非您的主机特别指示，否则不要在末尾添加 `/`。
4.  为您的账户选择正确的 **协议**（可用时**首选 SFTP**）。除非您的主机提供特定端口，否则将 **端口** 留空。常见的默认端口是 22（SFTP）和 21（FTP）。
5.  在登录类型框中选择 **普通**
6.  在用户框中输入您获得的完整用户名。它可能只是一个用户名，或者看起来像电子邮件地址（但实际上不是）。例如，它可能类似于 `user` 或 `user@example.com`。
7.  输入密码。请注意密码可能区分大小写。
8.  点击确定。

![FileZilla 站点管理器窗口的屏幕截图。](https://raw.githubusercontent.com/WordPress/Advanced-administration-handbook/main/assets/filezilla_3.gif)

## 连接

前往 FileZilla 主窗口工具栏的第一个图标"打开站点管理器"，点击下拉箭头，从下拉列表中选择您的 FTP 服务器。

或者，通过 **文件 → 站点管理器** 启动站点管理器，选择您的 FTP 服务器，然后点击"连接"。

在小窗口（消息日志）中出现一系列消息后，您应该会在大窗口（远程目录树）中看到服务器上的文件列表。

## 故障排除

如果您遇到问题，那么是时候开始故障排除了！

查看 FileZilla 主窗口的顶部区域并检查消息。

1. 如果没有任何连接尝试，那么服务器/主机名是错误的（或者协议/端口不正确）。只要有一个字符错误就会失败。点击红色 X 断开连接，然后点击站点管理器检查您输入的内容。
2. 如果显示用户不存在或 _登录错误_ 等，请检查站点管理器设置，确保其与您的托管服务商提供的 FTP 账户和密码信息一致，或者使用托管服务商提供的 Web 服务器管理界面重新检查 FTP 账户是否存在。仔细检查您的密码，它是区分大小写的（大写和小写字母）。您可能还需要向您的网站托管服务商寻求一些帮助。
3. 如果显示 _无法检索目录列表_，您可能需要更改传输设置。在站点管理器中，选择您的 FTP 服务器并点击 *传输设置* 选项卡。从传输模式中选择 *被动* 并点击确定。

# 使用 FTP 更新 WordPress

## FTP 客户端
有两种常见方式可在您的网站上上传和管理文件：

1. 使用主机控制面板提供的文件管理器。常用文件管理器：[cPanel](https://documentation.cpanel.net/display/64Docs/File+Manager)、[DirectAdmin](https://www.site-helper.com/filemanager.html)、[Plesk](https://www.plesk.com/)。
2. 使用 FTP 或 SFTP 客户端。本指南将展示如何使用 [FileZilla](https://filezilla-project.org/)。

两种选项并无绝对的“优劣”之分——它们只是操作服务器上同类文件的不同界面。

- **适合使用控制面板文件管理器的场景**：在浏览器中快速执行一次性任务（重命名文件、上传单个文件、查看服务器内容，或在无法安装软件时进行紧急小修改）。
- **适合使用 FTP/SFTP 客户端的场景**：较大或可重复的任务（上传多个文件/文件夹、手动更新时替换 WordPress 核心文件、上传主题/插件、保持队列运行、恢复中断的传输，或通过拖放和批量操作提高工作效率）。

### cPanel 是否比 FTP 客户端“更好”？
通常不是。cPanel 的文件管理器很方便，因为它可以在浏览器中运行，但对于批量上传来说可能更慢且更繁琐。FTP/SFTP 客户端在移动大量文件和文件夹时通常更高效。

### FTP/SFTP 客户端能“自动化”文件管理器中笨拙的部分吗？
是的，它们通常可以。客户端通常提供传输队列、递归文件夹上传、覆盖提示、可恢复传输和更便捷的批量操作等功能。底层任务相同（在服务器间复制文件），但工具使用起来会更顺畅。

### 两种方式上传的内容有区别吗？
通常两者都能上传/下载相同的网站文件。差异通常在于**限制和功能**，而非能力：

- **控制面板限制**：部分主机在浏览器中限制了上传大小、超时时间或 ZIP 解压功能。
- **FTP/SFTP 客户端的优势**：能更好地处理大量小文件，更轻松地进行文件夹镜像，以及在慢速连接上实现更可靠的传输。

FTP（文件传输协议）三十多年来一直是使用最广泛的传输协议，但它以明文发送信息，存在安全风险。如果主机支持，请使用 SFTP（安全文件传输协议）。它通过安全连接传输文件和密码，因此应尽可能替代 FTP。有时您需要联系主机为账户启用 SFTP。

为何选择 FileZilla？因为它与 WordPress 一样，基于 GPL 协议发布。所以它不仅免费，而且将始终保持免费。以下页面将展示如何设置和使用 FileZilla：

1. [为您的网站设置 FileZilla](https://developer.wordpress.org/advanced-administration/upgrade/ftp/filezilla/)
2. [设置权限](https://developer.wordpress.org/advanced-administration/server/file-permissions/)
3. [FileZilla 的详细文档](https://wiki.filezilla-project.org/Documentation)

想尝试其他 FTP 或 SFTP 客户端？[在维基百科上查看更多](https://en.wikipedia.org/wiki/Comparison_of_FTP_clients)。

# 迁移 WordPress

## 更改站点 URL

在单站点 WordPress 安装的 `设置 -> 常规` 页面中，有两个分别名为“WordPress 地址（URL）”和“站点地址（URL）”的字段。这些设置非常重要，因为它们控制着 WordPress 的安装位置。这些设置控制着页面管理区域及前端的 URL 显示，并在整个 WordPress 代码中使用。

- “站点地址（URL）”设置是您希望用户在浏览器中输入以访问您的 WordPress 博客的地址。
- “WordPress 地址（URL）”设置是您的 WordPress 核心文件所在的地址。

**注意：** 两个设置都应包含 https:// 部分，且末尾不应有斜杠 `/`。

有时，用户可能需要手动更改（或修复）这些设置。通常，当他们更改其中一个或两个设置后，发现网站无法正常工作。这可能导致用户无法轻易找到纠正问题的方法。本文告诉您如何直接更改这些设置。

如果您要将 WordPress 从一个站点迁移到另一个站点，这里还提供了额外信息，因为这同样需要更改站点 URL。如果您只是尝试修复一个“损坏”的站点，则不应使用这些额外信息。

**警告！** 这些说明仅适用于单站点 WordPress 安装。如果您使用 WordPress 多站点，则需要手动编辑数据库。

有四种简单的方法可以手动更改站点 URL。其中任何一种方法都有效，并且功能大致相同。

#### 编辑 wp-config.php

可以在 `wp-config.php` 文件中手动设置站点 URL。

将以下两行添加到您的 `wp-config.php` 文件中，其中 "example.com" 是您网站的正确地址。

```
define( 'WP_HOME', 'https://example.com' );
define( 'WP_SITEURL', 'https://example.com' );
```

这不一定是最佳解决方案，它只是将值硬编码到网站本身。使用此方法后，您将无法再在常规设置页面上编辑这些值。

#### 编辑 functions.php 文件

如果您可以通过 FTP 访问网站，那么当您错误地修改了相关设置值时，此方法将帮助您快速恢复网站运行。

1. 通过 FTP 连接到网站，获取当前使用主题的 `functions.php` 文件副本。您将使用简单的文本编辑器编辑此文件，然后将其上传回网站。
2. 在文件开头的 `<?php` 行之后，立即添加以下两行代码：

```
update_option( 'siteurl', 'https://example.com' );
update_option( 'home', 'https://example.com' );
```
请务必将 `example.com` 替换为您自己的网址。

3. 将文件上传回网站的相同位置。FileZilla 提供了一个便捷的“编辑文件”功能，可以快速完成上述所有操作；如果您可以使用该功能，请加以利用。
4. 多次加载登录页面或管理页面。网站应该会恢复正常。

**重要提示！** 请勿将此代码保留在 `functions.php` 文件中。网站恢复运行后，请立即移除这些代码。

注意：如果您的主题没有 `functions.php` 文件，请使用文本编辑器创建一个新文件。添加 `<?php` 标签以及以下两行代码，并将 `example.com` 替换为您自己的网址：

```	
<?php
update_option( 'siteurl', 'https://example.com' );
update_option( 'home', 'https://example.com' );
```

将此文件上传到您的主题目录。网站恢复运行后，请移除这些代码行或删除该文件。

#### LAN-based site to externally accessible site

Here are some additional details that step you through transferring a LAN-based WordPress site into an externally accessible site, as well as enabling editing the wordpress site from inside the LAN.

Two important keys are router/firewall modifications and the "wait 10+ minutes" after making the changes at the end.

1. Using SSH to log into your server (nano is a server preinstalled text editor):

`$ nano /var/www/books/wp-content/themes/twentyeleven/functions.php`

2. Add lines just after `<?php`

```
update_option( 'siteurl', 'https://example.com:port/yourblog');
update_option( 'home', 'https://example.com:port/yourblog');
```

3. Refresh your web browser using your external site URL:

https://example.com:port/yourblog
`$ nano /var/www/books/wp-content/themes/twentyeleven/functions.php`

4. Remove those lines you just added (or comment them out)

5. Access your router, these steps are for pfSense, other routers should have similar settings to look for/watch out for)

6. Add to firewall/nat table a line like this

`wan/tcp/port/LAN.server.IP/80`

7. Add to firewall/rules table a line like this:

`tcp/*/port/LAN.server.IP/port/*`

8. Uncheck the box at System/advanced/network address translation/Disable NAT Reflection

`"Disables the automatic creation of NAT redirect rules for access to your public IP addresses from within your internal networks. Note: Reflection only works on port forward type items and does not work for large ranges > 500 ports."`

9. Then go do something for ten minutes and when you get back see if the external url https://example.com:port/yourblog from a LAN browser brings the page up correctly.

#### Relocate method

WordPress supports an automatic relocation method intended to be a quick assist to getting a site working when relocating a site from one server to another.

#### Code function

When RELOCATE has been defined as true in `wp-config.php` (see next chapter), the following code in `wp-login.php` will take action:

```
if ( defined( 'RELOCATE' ) AND RELOCATE ) {    
	// Move flag is set
	if ( isset( $_SERVER['PATH_INFO'] ) AND ($_SERVER['PATH_INFO'] != $_SERVER['PHP_SELF']) ) 
		$_SERVER['PHP_SELF'] = str_replace( $_SERVER['PATH_INFO'], "", $_SERVER['PHP_SELF'] );
	$url = dirname( set_url_scheme( 'https://'. $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'] ) );
	if ( $url != get_option( 'siteurl' ) )
		update_option( 'siteurl', $url );
}
```

**Steps**

1. Edit the `wp-config.php` file.
2. After the "define" statements (just before the comment line that says "That's all, stop editing!"), insert a new line, and type: `define('RELOCATE',true);`
3. Save your `wp-config.php` file.
4. Open a web browser and manually point it to `wp-login.php` on the new server. For example, if your new site is at https://www.example.com, then type https://www.example.com/wp-login.php into your browser's address bar.
5. Login as per normal.
6. Look in your web browser's address bar to verify that you have, indeed, logged in to the correct server. If this is the case, then in the Admin back-end, navigate to `Settings > General` and verify that both the address settings are correct. Remember to Save Changes.
7. Once this has been fixed, edit `wp-config.php` and either completely remove the line that you added (delete the whole line), comment it out (with `//`) or change the true value to false if you think it's likely you will be relocating again.

**Note:** When the `RELOCATE` flag is set to true, the Site URL will be automatically updated to whatever path you are using to access the login screen. This will get the admin section up and running on the new URL, but it will not correct any other part of the setup. You'll still need to alter those manually. 

**Important!** Leaving the RELOCATE constant in your `wp-config.php` file is insecure, as it allows an attacker to change your site URL to anything they want in some configurations. Always remove the RELOCATE line from `wp-config.php` after you're done.

#### 直接在数据库中修改 URL

如果您知道如何访问主机上的 phpMyAdmin，可以直接编辑这些值来让网站重新运行。

1. [备份数据库](https://developer.wordpress.org/advanced-administration/security/backup/database/)并将副本保存在站外。
2. 登录 [phpMyAdmin](https://developer.wordpress.org/advanced-administration/upgrade/phpmyadmin/)。
3. 点击您的**数据库**链接。
4. 将显示数据库列表。选择您的 WordPress 数据库。
5. 数据库中的所有表将显示在屏幕上。
6. 在列表中查找 `wp_options`。**注意：** 如果您在安装时更改过，表前缀 `wp_` 可能不同。
7. 点击标有**浏览**的小图标。
8. 将打开显示 wp_options 表内字段列表的界面。
9. 在 option_name 字段下，向下滚动查找 `siteurl`。
10. 点击**编辑字段**图标（通常位于该行最左侧）。
11. 将出现**编辑字段**窗口。
12. 在 option_value 输入框中，仔细将 URL 信息更改为新地址。
13. 确认无误后点击**执行**保存信息。
14. 您将返回 `wp_options` 表。
15. 在表中查找 home 字段并点击**编辑字段**。**注意：** `wp_options` 内有多个分页，使用 > 符号翻页查找。
16. 在 option_value 输入框中，仔细将 URL 信息更改为新地址。
17. 确认无误后点击**执行**保存信息。

### 迁移站点

将站点从一个位置迁移到另一个位置时，有时需要手动修改数据库中的数据，以使新的站点 URL 信息能被正确识别。虽然存在许多辅助工具，通常应优先使用这些工具而非手动修改。

此处提供的信息仅供参考。这些数据可能不完整或不准确。

若要将 WordPress 从一个系统迁移到另一个系统，您应首先阅读 [迁移 WordPress](https://developer.wordpress.org/advanced-administration/upgrade/migrating/) 文章。

#### 修改数据表前缀

与许多 WordPress 管理员一样，您可能通过修改 `wp-config.php` 文件，在单一数据库中运行多个 WordPress 安装。这些修改通常涉及动态设置数据表前缀。如果您确实需要更改数据表前缀，则必须同时更新 `prefix_usermeta` 表中的若干条目。

与上一节相同，请记住 SQL 更改是永久性的，因此您应首先备份数据库：

如果您正在为某个站点更改数据表前缀，请记得同时修改 usermeta 表中的表前缀。这将使新站点能够正确识别旧站点的用户权限。
```
UPDATE `newprefix_usermeta` SET `meta_key` = REPLACE( `meta_key` , 'oldprefix_', 'newprefix_' );
```

#### 修改模板文件

在您的 WordPress 主题中，打开每个模板文件，搜索所有手动输入的旧域名引用并将其替换为新域名。请仔细检查各个模板文件（如 `sidebar.php` 和 `footer.php`）中可能存在的特定手写代码链接。WordPress 使用名为 `bloginfo()` 的模板标签，根据管理后台 > 设置 > 常规面板中填写的信息自动生成网站地址，因此模板文件中的此标签无需修改。

#### 修改配置文件

如果您的数据库发生迁移或某些变更，您需要更新 WordPress 配置文件。

1. 仅在以下情况下需要修改配置文件：
  - 数据库已迁移至其他服务器，不再运行于本地主机
  - 您已重命名数据库
  - 您已更改数据库用户名
2. 备份您的 `wp-config.php` 文件副本。
3. 在[文本编辑器](https://wordpress.org/documentation/article/wordpress-glossary/#Text_editor)中打开 `wp-config.php` 文件。
4. 检查文件内容。特别需要关注[数据库主机配置项](https://developer.wordpress.org/advanced-administration/wordpress/wp-config/#set-database-host)。
5. 保存文件。
6. 此时您的 WordPress 博客应能正常运行。

#### 验证配置文件

1. 在您的[管理](https://wordpress.org/documentation/article/administration-screens/) > [设置](https://wordpress.org/documentation/article/administration-screens/#general) > [常规](https://wordpress.org/documentation/article/settings-general-screen/)面板中，验证您在上述“更改 URL”中所做的修改是否正确。
2. 验证您的 **WordPress 地址 (URL)** 中的引用是否包含新地址。
3. 验证您的 **站点地址 (URL)** 中的引用是否包含新地址。
4. 如果您已进行更改，请点击 **保存更改**。

#### 修改 .htaccess 文件

在管理后台 > 设置 > 常规面板中更改信息后，如果您正在使用固定链接或任何重写或重定向规则，则需要更新您的 .htaccess 文件。

1. **备份**您的 `.htaccess` 文件。这不是建议，而是必需步骤。
2. 在[文本编辑器](https://wordpress.org/documentation/article/glossary/#text-editor)中打开 `.htaccess` 文件。
3. 检查其内容，找到您之前添加的任何自定义重写或重定向规则。**复制**这些内容到另一个文本文件中妥善保存。
4. 关闭文件。
5. 按照固定链接子面板上的说明，将固定链接更新到 `.htaccess` 文件中。
6. 打开新的 `.htaccess` 文件，检查您的自定义重写和重定向规则是否仍然存在。如果不存在，请从保存的文件中复制它们并粘贴到新的 `.htaccess` 文件中。
7. 根据需要修改这些自定义重写和重定向规则，以反映新的站点地址。
8. 保存文件。
9. 测试这些重定向，确保它们正常工作。

如果操作失误，您可以从备份中[恢复数据库](https://developer.wordpress.org/advanced-administration/security/backup/)并重试。因此请确保第一次就操作正确。

#### 其他注意事项

迁移网站时，您可能还需要修改以下内容以修正 URL：

1. 图片链接：图片链接存储在 `wp_posts` 表的 "post_content" 字段中。您可以使用类似的代码更新图片链接。
2. wp_options：除了上述 "siteurl" 和 "home" 项，还有其他 option_value 也需要修改，例如 "upload path" 以及某些插件项（取决于已安装的插件，如 widgets、stats、DMSGuestbook、sitemap 等）。
3. 要修复包含过时 URL 的小工具，可在仪表盘 / 外观 / 小工具中进行编辑。
4. 对剩余项执行完整的数据库搜索。**务必**了解您要修改的内容，并逐一检查每个项是否存在不当替换。
5. 如果您运行的是网络/多站点，则需替换数据库中的 URL 实例。它们存储在多个表中，包括每个站点（博客）。替换时请谨慎操作，确保在修改前了解字段的含义。请参阅下方重要的 GUID 说明，了解不应修改的示例。
6. **注意：** 如果在数据库选项表的 `dashboard_incoming_links` 下找到旧 URL，可以忽略或删除该选项。自 WP 3.8 起已不再使用。

#### 重要 GUID 说明

当执行上述操作并直接在数据库中更改 URL 时，您会遇到 URL 位于 `wp_posts` 表的 "guid" 列中的情况。**切勿**更改此字段的内容，这一点至关重要。

术语 "GUID" 代表 "全局唯一标识符"。该字段旨在存储文章的标识符，该标识符 a) 在整个时空范围内是唯一的，并且 b) **永不**更改。GUID 字段主要用于生成 WordPress 订阅源。

当订阅阅读器读取订阅源时，它会使用 GUID 字段的内容来判断之前是否已显示过特定项目。它通过多种方式之一来实现这一点，但最常见的方法只是存储一个已显示并"标记为已读"或类似状态的 GUID 列表。

因此，更改 GUID 将意味着许多订阅阅读器会突然在用户的阅读器中再次显示您的内容，就好像它是新内容一样，这可能会惹恼您的用户。

为了使 GUID 字段具有"全局"唯一性，一个公认的惯例是使用 URL 或 URL 的某种表示形式。因此，如果您拥有 `example.com`，那么您是唯一使用 `example.com` 的人，因此它对您和您的网站是唯一的。这就是 WordPress 使用固定链接或其某种形式作为 GUID 的原因。

然而，第二部分是 GUID **绝不能**更改。即使您更换了域名，文章仍然是同一篇文章，即使位于新位置。当您更改 URL 时，订阅阅读器切换到您的新订阅源时，仍应知道它们之前已阅读过您的某些文章，因此 GUID **必须**保持不变。

**在任何情况下，都切勿更改 GUID 列的内容。**

如果需要将默认的上传文件夹更改为其他位置，则需要在文章表的 `post_content` 列中更改任何媒体 URL。例如，如果默认上传文件夹从 `wp-content/uploads` 更改为 `images`：

`UPDATE wp_posts SET post_content = REPLACE(post_content,'www.domain.com/wp-content/uploads','www.domain.com/images');`

#### 多站点注意事项

请参阅 [迁移 WordPress 多站点](https://developer.wordpress.org/advanced-administration/upgrade/migrating/#moving-wordpress-multisite)

#### wp-cli

[wp-cli](https://wp-cli.org/) 是一个非常实用的命令行工具。

`wp search-replace 'example.dev' 'example.com' --skip-columns=guid`

或者，如果只想更改选项，可以执行：
```
wp option update home 'https://example.com'
wp option update siteurl 'https://example.com'
```

# 迁移 WordPress

无论您是将 WordPress 迁移到新服务器还是同一服务器的不同位置，都无需重新安装。WordPress 足够灵活，能够处理所有这些情况。

## 迁移至新服务器

若要将 WordPress 从一台服务器迁移至另一台，请先备份网站中的 WordPress 目录、图片、插件及其他文件，同时备份数据库。参阅 [WordPress 备份](https://developer.wordpress.org/advanced-administration/security/backup/) 与 [数据库备份](https://developer.wordpress.org/advanced-administration/security/backup/database/)。

### 保持域名和 URL 不变

在不更改 WordPress 站点主页和站点 URL 的情况下迁移域名非常简单，大多数情况下只需移动文件即可完成。

- 如果数据库和 URL 保持不变，只需复制文件和数据库即可迁移。
- 如果数据库名称或用户发生更改，请[编辑 wp-config.php](https://developer.wordpress.org/advanced-administration/wordpress/wp-config/) 以填入正确的值。
- 若想在切换前进行测试，必须临时更改数据库表 "wp_options" 中的 "siteurl" 和 "home"（通过 phpMyAdmin 或类似工具）。
- 如果设置了任何重写规则（固定链接），必须在站点上线时禁用 .htaccess 并重新配置固定链接。

### Changing Your Domain Name and URLs

Moving a website and changing your domain name or URLs (i.e. from https://example.com/site to https://example.com, or https://example.com to https://example.net) requires the following steps – in sequence.

1. Download your existing site files.
2. Export your database – go in to MySQL and export the database.
3. Move the backed up files and database into a new folder – somewhere safe – this is your site backup.
4. Log in to the site you want to move and go to Settings > General, then change the URLs. (ie from https://example.com/ to https://example.net) – save the settings and expect to see a 404 page.
5. Download your site files again.
6. Export the database again.
7. Edit `wp-config.php` with the new server's MySQL database name, user and password.
8. Upload the files.
9. Import the database on the new server.

When your domain name or URLs change there are additional concerns. The files and database can be moved, however references to the old domain name or location will remain in the database, and that can cause issues with links or theme display.

If you do a search and replace on your entire database to change the URLs, you can cause issues with data serialization, due to the fact that some themes and widgets store values with the length of your URL marked. When this changes, things break. To avoid that serialization issue, you have three options:

1. Use the [Velvet Blues Update URLs](https://wordpress.org/plugins/velvet-blues-update-urls/) or [Better Search Replace](https://wordpress.org/plugins/better-search-replace/) plugins if you can access your Dashboard.
2. Use [WP-CLI's search-replace](https://developer.wordpress.org/cli/commands/search-replace/) if your hosting provider (or you) have installed WP-CLI.
3. Use the [Search and Replace for WordPress Databases Script](https://interconnectit.com/products/search-and-replace-for-wordpress-databases/) to safely change all instances on your old domain or path to your new one. (**only use this option if you are comfortable with database administration** )

Note: Only perform a search and replace on the wp_posts table.
Note: Search and Replace from Interconnectit is a 3rd party script

## 在现有服务器上移动目录

将 WordPress 文件从服务器上的一个位置移动到另一个位置（即更改其 URL）需要特别注意。如果您想将 WordPress 移动到其自己的文件夹，但让它从您的域名根目录运行，请阅读《为 WordPress 设置独立目录》以获取详细说明。

以下是将您的 WordPress 站点移动到同一服务器上新位置的分步说明：

1. Create the new location using one of these two options:
   - If you will be moving your WordPress core files to a new directory, create the new directory.
   - If you want to move WordPress to your root directory, make sure all `index.php`, [.htaccess](https://wordpress.org/documentation/article/glossary/#htaccess), and other files that might be copied over are backed up and/or moved, and that the root directory is ready for the new WordPress files.
2. Log in to your site.
3. Go to the [Administration](https://wordpress.org/documentation/article/administration-screens/) > [Settings](https://wordpress.org/documentation/article/administration-screens/#settings-configuration-settings) > [General](https://wordpress.org/documentation/article/settings-general-screen/) screen.
4. In the box for **WordPress Address (URL)**: change the address to the new location of your main WordPress core files.
5. In the box for **Site Address (URL)**: change the address to the new location, which should match the WordPress (your public site) address.
6. Click **Save Changes**.
7. (Do not try to open/view your site now!)
8. Move your WordPress core files to the new location. This includes the files found within the original directory, such as https://example.com/wordpress, and all the sub-directories, to the new location.
9. Now, try to open your site by going to yourdomain.com/wp-admin. Note, you may need to go to yourdomain.com/wp-login.php
10. If you are using [Permalinks](https://wordpress.org/documentation/article/using-permalinks/), go to the Administration > Settings > [Permalinks](https://wordpress.org/documentation/article/settings-permalinks-screen/) panel and update your Permalink structure to your [.htaccess](https://wordpress.org/documentation/article/glossary/#htaccess), file, which should be in the same directory as the main `index.php` file.
11. Existing image/media links uploaded media will refer to the old folder and must be updated with the new location. You can do this with the [Better Search Replace](https://wordpress.org/plugins/better-search-replace/) or [Velvet Blues Update URLs](https://wordpress.org/plugins/velvet-blues-update-urls/) plugins, [WP-CLI's search-replace](https://developer.wordpress.org/cli/commands/search-replace/) if your hosting provider (or you) have installed WP-CLI, manually in your SQL database, or by using the 3rd party database updating tool [Search and Replace Databases Script](https://interconnectit.com/products/search-and-replace-for-wordpress-databases/) * **Note:** this script is best used by experienced developers.
12. In some cases your permissions may have changed, depending on your ISP. Watch for any files with "0000" permissions and change them back to "0644".
13. If your theme supports menus, links to your home page may still have the old subdirectory embedded in them. Go to Appearance > Menus and update them.
14. Sometimes you would need to restart your server, otherwise your server may give out an error. (happens in MAMP software (Mac)).
15. It is important that you set the URI locations BEFORE you move the files.

#### 如果您忘记更改位置

如果您在更改 URI 之前不小心移动了文件：您有两个选择。

1. 假设文件原本位于 /path/to/old/，您在更改 URI 之前将它们移动到了 /path/to/new。修复方法是使 
```
/path/to/old/ 成为指向 /path/to/new/ 的符号链接（对于 Windows 用户，“符号链接”等同于“快捷方式”），即
ln -s /path/to/new /path/to/old
```
然后正常按照上述步骤操作。之后，如果您愿意，可以删除该符号链接。

2. 如果您忘记更改 WordPress 地址和博客地址，您将无法通过 WordPress 界面进行更改。但是，如果您可以访问数据库，则可以修复此问题。进入您网站的数据并找到 wp_options 表。此表存储了您可以在界面中设置的所有选项。WordPress 地址和博客地址分别存储为 `siteurl` 和 `home`（option_name 字段）。您只需将 `option_name='siteurl‘` 或 `option_name='home‘` 记录的 option_value 字段更改为正确的 URL 即可。

注意：有时，WordPress 地址和博客地址存储在 [WordPress 瞬态](https://developer.wordpress.org/apis/handbook/transients/)中。搜索和替换脚本可能难以将它们修改为新地址，因此某些插件可能因此引用旧地址。瞬态是存储在 wp_options 数据库表中的临时（缓存）值，删除后可以按需重新创建。因此，从迁移的数据库副本中删除它们是安全的，可以让它们重新创建。此数据库查询（再次提醒，请先备份！）将清除所有瞬态：

```
DELETE FROM `wp_options` WHERE option_name LIKE '%\_transient\_%' 
```

#### 如果您意外更改了 WordPress 站点 URL

假设您意外更改了 URI，导致无法移动文件（但仍可通过重定向等方式访问登录页面）。

可以使用 `wp-login.php` 来（重新）设置 URI。找到这行代码：

```
require( dirname(__FILE__) . '/wp-load.php' );
```

并在其下方插入以下代码：

```
//FIXME：请务必注释/移除这些临时修复行。（数据库更新后立即操作）
update_option('siteurl', 'https://example.com/the/path' );
update_option('home', 'https://example.com/the/path' );
```

操作完成。请测试您的站点以确保其正常工作。如果更改涉及站点新地址，请务必告知用户新地址，并考虑在 `.htaccess` 文件中添加重定向指令，以引导访客访问新位置。

[更改站点 URL](https://developer.wordpress.org/advanced-administration/upgrade/migrating/) 也提供了此过程的详细说明。

## 管理您的旧网站

### 关闭旧网站
1. 从您的**旧**网站下载一份 WordPress 核心文件到硬盘，并根据新服务器情况[编辑 wp-config.php](https://developer.wordpress.org/advanced-administration/wordpress/wp-config/)。
2. 返回您的**旧**网站，进入[管理](https://wordpress.org/documentation/article/administration-screens/) > [设置](https://wordpress.org/documentation/article/administration-screens/#settings-configuration-settings) > [常规](https://wordpress.org/documentation/article/settings-general-screen/)页面，将两个 URL 都更改为新网站的地址。
3. 登录服务器，进入 phpMyAdmin，将数据库导出为文件并保存（但请保留旧数据库以防万一）。现在，将这个新数据库以及编辑过的 wp-config.php 和 WordPress 核心文件副本上传到新服务器即可！

#### 保持运行
警告：请确保在继续操作前已备份旧网站的 WordPress 数据库！

_第一部分 – 激活新网站_

1. 将整个 WordPress 安装文件下载到硬盘。为文件夹命名以明确表示这是旧网站的安装文件。
2. 下载数据库。
3. 返回旧网站，进入设置选项，将网址（两个都）更改为新网站的网址。
4. 再次将整个 WordPress 安装文件下载到硬盘。为文件夹命名以明确表示这是新网站的安装文件。
5. 再次下载数据库（但保留旧数据库）。将此数据库上传到新服务器。如果在新服务器上使用相同的数据库名称并创建与旧服务器相同登录凭据的用户，操作将最为简便。
6. 如果使用了不同的数据库名称和/或用户（参见上一步），请在新网站的安装文件夹中[适当编辑 wp-config.php](https://developer.wordpress.org/advanced-administration/wordpress/wp-config/)。
7. 将新网站的安装文件夹上传到新网站。完成！您的新网站应该可以正常工作了！

_第二部分 – 恢复旧网站_

1. 在原始服务器上，删除旧网站的数据库（请记住，您应该在最初已在本地计算机上保存了副本）。
2. 将旧网站的安装文件夹上传到原始服务器，覆盖当前存在的文件（您也可以删除服务器上的安装文件夹，然后直接重新上传旧网站的文件）。
3. 将本地计算机上的旧网站数据库上传到服务器。这样就完成了！

另一种便于复制文章、评论、页面、分类和自定义字段（文章状态、数据、固定链接、ping 状态等）的操作流程：

1. 安装一个新的 WordPress 网站
2. 进入旧网站的管理面板。在管理 > 导出中，在“限制作者”菜单中选择“全部”。
3. 点击“下载导出文件”
4. 在新网站中进入管理 > 导入，选择 WordPress 项目。
5. 在显示的页面上，选择刚刚导出的文件。点击“上传文件并导入”
6. 将出现一个新页面。在“分配作者”中，将作者分配给现有用户或创建新用户。
7. 点击“提交”
8. 最后，点击“开始使用”

_注意：使用此方法时，如果新网站中已有一些文章（如 Hello World、信息页面等），这些文章不会被删除。只会添加文章。而使用前一种方法时，新网站中的文章将被删除。_

## 迁移 WordPress 多站点

[多站点](https://developer.wordpress.org/advanced-administration/multisite/create-network/)的迁移稍显复杂，因为数据库本身包含多个对服务器名称和文件夹位置的引用。如果你只是将站点迁移到使用相同域名的新服务器，可以像处理传统安装一样，直接复制文件和数据库。

反之，如果你要更改域名，那么迁移多站点的最佳方式是：先移动文件，编辑 `.htaccess` 和 `wp-config.php`（如果包含多站点的文件夹名称发生了变化），然后手动编辑数据库。搜索所有包含你域名的实例，并根据需要进行更改。这一步目前还无法轻松实现自动化。安全起见，你可以搜索/替换任何 `wp_x_posts` 表，但切勿在没有使用 [WordPress 数据库搜索替换](https://github.com/interconnectit/Search-Replace-DB)脚本（又称 interconnectit 脚本）的情况下进行全局搜索/替换。

如果你要将多站点从一个文件夹迁移到另一个文件夹，需要确保编辑 `wp_blogs` 条目以正确更改文件夹名称。无论如何，你都应该手动检查 `wp_site` 和 `wp_blogs` 表，以确保所有站点都已正确更改。

此外，手动检查所有 wp_x_options 表，查找以下三个字段，并根据需要进行编辑：

- home
- siteurl
- fileupload_url

如果你正在从子域名迁移到子文件夹，或反之，请记得相应地调整 .htaccess 文件和 `wp-config.php` 文件中 SUBDOMAIN_INSTALL 的值。

### Related Links

- [Moving a blog from wordpress.com to self-hosted blog](https://problogger.com/how-to-move-from-wordpresscom-to-wordpressorg/)
- [Moving WordPress to a new domain or server](https://sltaylor.co.uk/blog/moving-wordpress-new-domain-server/)
- [Italian version of this article – Versione italiana dell'articolo](https://www.valent-blog.eu/2007/09/14/trasferire-wordpress/)
- [Search and Replace for WordPress Databases](https://interconnectit.com/search-and-replace-for-wordpress-databases/)
- [PHP script to replace site url in WordPress database dump, even with WPML](http://blog.lavoie.sl/2012/07/php-script-to-replace-site-url-in.html)
- [The Duplicator plugin helps administrators move a site from one location to another](https://wordpress.org/plugins/duplicator/)
- [Technical tutorial on moving your WordPress blog to Bitnami's AWS configuration](https://agileweboperations.com/2011/01/20/migrate-your-wordpress-blog-to-a-bitnami-ec2-instance/)

# 将多个博客迁移至 WordPress 多站点

本教程将说明如何将多个 WordPress 独立安装迁移至 WordPress 多站点安装。您既可以迁移使用自有域名的站点，也可以迁移使用主域名下子域名的站点。

本教程假设您在使用 cPanel 的服务器上托管 WordPress。如果您使用其他方案管理服务器，则需相应调整操作步骤。

### 操作步骤

#### 备份网站

在 cPanel 中生成完整的网站备份。通过 FTP 复制服务器上的所有文件也可能有所帮助，这样你可以方便地访问插件和主题文件，这在后续步骤中会用到。

#### 从现有 WordPress 安装中导出
在您现有的每个 WordPress 安装中，前往 WordPress 的“工具”>“导出”。下载包含每个站点所有文章和页面的 WXR 文件。请参阅 [工具导出屏幕](https://wordpress.org/documentation/article/tools-export-screen/) 上的说明。

确保您的导出文件确实包含所有文章和页面。您可以使用文本编辑器查看导出文件的最后一条记录来验证这一点。最后一条记录应为最新的文章。

某些插件可能会与导出过程冲突，导致生成空文件或不完整的文件。为稳妥起见，您可能应在执行导出前禁用所有插件。

首先删除所有隔离的垃圾评论也是个好主意，因为这些评论也会被导出，导致文件不必要地变大。

**注意：** 此方法不会导出小工具配置和博客/插件设置。如果您在单个托管账户内迁移，请在此阶段记录这些设置，因为当您删除旧域名时，它们将会消失。

#### 安装 WordPress
安装 WordPress。请按照 [安装 WordPress](https://developer.wordpress.org/advanced-administration/before-install/howto-install/) 的说明进行操作。

#### 启用多站点
在您的 WordPress 安装中启用多站点功能。这需要多次编辑 `wp-config.php` 文件。您需要选择子域名选项，而非子目录选项。请参阅关于如何 [创建网络](https://developer.wordpress.org/advanced-administration/multisite/create-network/) 的说明。

#### 为每个要导入的站点创建博客
为您想要托管在独立域名下的每个站点创建博客。例如，`importedblogdotorg.mydomain.com`。

注意：请仔细选择名称，因为更改名称会导致管理重定向问题。如果您在同一托管账户内迁移站点，这一点尤其重要。

#### 为每个博客导入 WXR 文件
进入每个博客的后台，导入为每个博客导出的 WXR 文件。将作者映射到正确的用户，或创建新用户。务必勾选导入照片和其他附件的选项。请参阅工具导入子面板上的说明。

**注意：** 如果选择将图片从源站点导入到目标站点，请确保它们已上传到正确位置，并在相应的文章或页面中正确显示。

#### 为每个站点编辑 WordPress 配置设置

编辑每个站点的配置设置、小工具等。在此步骤结束时，每个站点应看起来与之前完全一样，只是 URL 变为 `subdomain.example.com` 或 `example.com/subsite`，而非其正确、最终的 URL。

#### PHP 配置的限制
您可能会遇到主机上 PHP 配置的问题。存在两个潜在问题：一是 PHP 的 `max_upload_size` 对于 WXR 文件来说可能太小；二是 PHP 内存限制可能不足以导入所有文章。

有几种解决方法：一是请求您的主机提供商提高限制，即使是临时的；二是在您的 /wp-admin/ 和 /wp-includes 目录中放置一个 php.ini 文件来为您提高限制（php.ini 文件不递归生效，因此必须放在这些目录中）。例如，设置 10 MB 的上传限制和 128 MB 的内存限制应该可行，但请先与您的主机提供商确认，以免违反协议条款。

如需 PHP 配置问题的帮助，请在 [WordPress 论坛支持](https://wordpress.org/support/forums/) 中搜索。

#### 将附加域转换为停靠域

在 cPanel 中删除附加域并用停靠域替换，也会删除与这些域关联的所有域名转发器和电子邮件转发器。请注意这一点，以便在切换后可以恢复这些转发器。

#### 用户导入的限制

虽然存在上述将内容导入多站点博客实例的方法，但在导入多个用户时会遇到严重问题。用户会在导入过程中生成，但新博客不会获得任何角色或附加信息。

#### 设置丢失
如果旧站点已无法访问，且您发现忘记复制某些设置，或想确认所有配置是否正确，请通过谷歌搜索您的站点并点击查看缓存版本。此选项仅在您的新站点被爬取前可用，因此请尽快操作。

另一种选择是使用 [互联网档案馆 Wayback Machine](https://archive.org/web/)。他们可能已存档该站点（或部分内容）的副本。

# phpMyAdmin

## 什么是 phpMyAdmin？

phpMyAdmin 是一种管理员工具，它是一个 PHP 脚本，旨在让用户能够与他们的 MySQL 数据库进行交互。WordPress 将其所有信息存储在 MySQL 数据库中，并通过与数据库交互来生成 WordPress 站点内的信息。通过 phpMyAdmin，可以访问存储在 MySQL 数据库中的数据、表和字段的“原始”视图。

## 它有什么用处？

phpMyAdmin 程序便于对表执行维护操作、备份信息，以及在 WordPress 无法正常工作时直接编辑内容。有时，在[支持论坛](https://wordpress.org/support/welcome/#asking-for-support)中，有人会发布一些有用的 SQL 查询，这些查询可以使用 phpMyAdmin 运行。尽管许多相同的任务可以在 MySQL 命令行中执行，但对许多人来说，这并不是一个可行的选择。

## 在哪里可以获取它？

通常，主机控制面板（如 cPanel 和 Plesk）已预装了 phpMyAdmin，因此您无需进行特殊操作即可使用它。它通常从数据库页面链接。请咨询您的主机是否提供此功能。

您可以从主要的 [phpMyAdmin 项目页面](https://www.phpmyadmin.net/)自行下载并安装 phpMyAdmin。

# 升级 WordPress

## 升级 WordPress – 详细说明

本页面包含 [升级说明](https://wordpress.org/documentation/article/updating-wordpress/) 的更详细版本。

### 备份 WordPress {#backup-up-wordpress}

在开始之前，最好先备份您的网站。这样，如果出现任何问题，您可以恢复网站。完整的备份说明可在 WordPress 备份指南中找到。

### 一键升级 {#one-click-upgrade}

WordPress 允许您一键更新。您可以通过点击新版本横幅中的链接（如果有的话）或前往仪表盘 > 更新屏幕来启动更新。进入“更新 WordPress”页面后，点击“立即更新”按钮即可开始该过程。您无需执行其他操作，完成后您的网站将更新至最新版本。

一键更新适用于大多数服务器。如果遇到任何问题，很可能与文件系统的权限问题有关。

#### 托管服务工具 {#hosting-services-tools}

如果您的网站托管在 cPanel（请在左侧菜单栏中查找“WordPress 管理”）或 Plesk（请在左侧菜单栏中查找“WordPress”）中，您可能可以使用 WP-Toolkit。您可以在 WP-Toolkit 内对 WordPress 网站执行一键更新。您还可以在 WP-Toolkit 中配置自动更新。

如果您的网站托管在 WP Squared 服务器上，当有新更新可用时，您会看到通知和一个用于对 WordPress 网站执行一键更新的按钮。自动更新默认启用，您可以在 WP Squared 中配置是否启用或禁用自动更新。

_托管服务提供商：如果您的工具未在此列出，欢迎在 Github 上创建拉取请求以添加它。_

### 手动升级 {#manual-upgrade}

#### 升级流程概述 {#overview-of-the-upgrade-process}

1.  [备份您的数据库](https://developer.wordpress.org/advanced-administration/upgrade/upgrading/#step-1-back-up-your-database)。
2.  备份 WordPress 目录中的[所有 WordPress 文件](https://developer.wordpress.org/advanced-administration/upgrade/upgrading/#step-2-back-up-all-your-wordpress-files)。别忘了您的 [`.htaccess`](https://wordpress.org/documentation/article/wordpress-glossary/#.htaccess) 文件。
3.  [验证您创建的备份](https://developer.wordpress.org/advanced-administration/upgrade/upgrading/#step-3-verify-the-backups)是否存在且可用。这至关重要。
4.  [停用所有插件](https://developer.wordpress.org/advanced-administration/upgrade/upgrading/#step-4-deactivate-all-your-plugins)。
5.  [确保前四个步骤已完成](https://developer.wordpress.org/advanced-administration/upgrade/upgrading/#step-5-ensure-first-four-steps-are-completed)。除非您已完成前四个步骤，否则请勿尝试升级。
6.  从 [https://wordpress.org/download/](https://wordpress.org/download/) [下载并解压 WordPress 安装包](https://developer.wordpress.org/advanced-administration/upgrade/upgrading/#step-6-download-and-extract-the-wordpress-package)。
7.  [删除站点上的旧 WordPress 文件](https://developer.wordpress.org/advanced-administration/upgrade/upgrading/#step-7-delete-the-old-wordpress-files)，但**请勿删除**：
    – `wp-config.php` 文件；
    – `wp-content` 文件夹；特殊例外：应删除 `wp-content/cache` 和 `wp-content/plugins/widgets` 文件夹。
    – `.htaccess` 文件 – 如果您在 `.htaccess` 中添加了自定义规则，请不要删除它；
    – `robots.txt` 文件 – 如果您的博客位于站点根目录（即博客就是站点）并且您创建了此文件，请不要删除它。
8.  将新文件从您的计算机硬盘[上传到站点上相应的 WordPress 文件夹](https://developer.wordpress.org/advanced-administration/upgrade/upgrading/#step-8-upload-the-new-files)。
9.  [运行 WordPress 升级程序](https://developer.wordpress.org/advanced-administration/upgrade/upgrading/#step-9-run-the-wordpress-upgrade-program)并按照屏幕上的说明操作。
10. [更新固定链接和 .htaccess](https://developer.wordpress.org/advanced-administration/upgrade/upgrading/#step-10-update-permalinks-and-htaccess)。
11. [安装更新后的插件和主题](https://developer.wordpress.org/advanced-administration/upgrade/upgrading/#step-11-install-updated-plugins-and-themes)。
12. [重新激活插件](https://developer.wordpress.org/advanced-administration/upgrade/upgrading/#step-12-reactivate-plugins)。
13. [查看 WordPress 中的变更内容](https://developer.wordpress.org/advanced-administration/upgrade/upgrading/#step-14-review-what-has-changed-in-wordpress)。

以上就是升级过程的概述。请继续阅读详细的升级说明。

请记住，如果遇到问题，请重新阅读下面的说明以确保遵循了正确的步骤，并参考[故障排除：常见安装问题](https://developer.wordpress.org/advanced-administration/before-install/howto-install/#common-installation-problems)。

#### 跨多个版本升级 {#upgrading-across-multiple-versions}

_虽然下文给出的方法是“安全”的，但只要你拥有正确的备份，那么确实可以一步到位地从 WordPress 的第一个版本直接升级到最新版本。WordPress 支持此过程，并且在这方面具有极强的向后兼容性。话虽如此，如果你的网站规模较大，升级过程可能比预期更长，此时采用渐进式方法可能会有所帮助。只需记住保留一个正常运行的网站备份，以便始终有回退方案。_

如果你计划跨越**两个**以上主要版本进行升级，应考虑采用渐进式升级，以避免潜在的冲突并最大限度地降低数据库损坏的风险。旧版本的 WordPress 可以从[发布档案库](https://wordpress.org/download/release-archive/)下载。

WordPress 3.7 引入了一个易于使用的一键更新器，可直接将你带到当前版本。此更新步骤是安全的，并且可以从 3.7 版本一键更新到任何后续版本。

##### 从 WordPress 0.7 - 3.6 升级（通过迁移）

目标：
- WordPress：升级到 WordPress 6.2
- PHP：升级到 PHP 7.4
- SQL：升级到 MySQL 8.0 / MariaDB 10.11

损失：
- 内容：无
- 插件：全部
- 主题：全部

这些是最旧版本的 WordPress，并且已经多年不受支持。通常需要假设会有一些损失，虽然不是内容损失，但可能是主题和插件的某些功能损失。

考虑到目标是保留内容并假设其他元素会损失，可以采取以下步骤。

与任何升级一样，首先要做的是备份。从 WP < 3.6 升级的最佳方式是执行内容迁移。

1. 创建一个全新的 WordPress，不包含数据库。
2. 将旧 WordPress 文件从 "/wp-content/uploads/" 目录复制到新站点。
3. 使用旧数据库信息创建一个新数据库。最佳方式是使用 "mysqldump"。
4. 使用所有新数据配置 wp-config.php。
5. 访问 "/wp-admin/" 页面，并按照升级流程操作。

通过这种方式，WordPress 将能够维护和更新数据库中的内容，并能在更新版本的 WordPress 中使用这些内容。

现在应该可以使用默认主题的 WordPress，并且所有内容都可用。

恢复数据库时，字符编码通常会出现技术问题。备份数据可能不是以 UTF-8 编码，而是可能采用 ISO 或 ASCII 等"已弃用"格式。确保在恢复数据库时正确更新字符编码！更多关于[在 WordPress 数据库中转换字符集的信息可以在这里找到](https://codex.wordpress.org/Converting_Database_Character_Sets)。

##### 从 WordPress 3.7 - 4.0 升级

目标
- WordPress：升级到 WordPress 4.1
- PHP：升级到 PHP 5.6.20+
- SQL：升级到 MySQL 5.6 / MariaDB 10.0

可能的损失：
- 内容：无
- 插件：很可能有
- 主题：很可能有

WordPress 版本 <= 4.0 兼容的 PHP 版本如今已很难获得。这些版本可能从 PHP 5.2（甚至更早）到 PHP 5.5 不等。因此，主要目标是升级到一个在许多操作系统上仍然容易获得的版本。

数据库方面也会发生同样的情况。很可能存在 MySQL 5.5 或更早版本。根据您是想继续使用 MySQL 还是迁移到 MariaDB，选择升级路径并将数据库迁移到 MySQL 5.6 或 MariaDB 10.0。

请注意，WP-CLI 不适用于低于 PHP 5.6.20 的 PHP 版本，因此此过程仍需部分手动完成。

与任何升级一样，首先要做的是备份。

删除所有未激活的主题，只保留主主题。如果有子主题处于激活状态，请保留子主题和父主题。

安装并激活 [Twenty Ten](https://wordpress.org/themes/twentyten/) 主题。该主题适用于自 WordPress 3.7 以来的所有站点。

同样地，删除所有已停用（因此未运行）的插件。

停用所有剩余的激活插件。

现在，WordPress 将具有：
-	核心：任意版本（介于 WordPress 3.7 和 WordPress 4.0 之间）
-	主题：Twenty Ten 已激活，主主题已停用。
-	插件：所有应激活的插件都已停用。

此时，使用 [WordPress 4.1](https://wordpress.org/wordpress-4.1.zip)（可在[发布列表](https://wordpress.org/download/releases/)中找到）覆盖 WordPress 核心。安装 WordPress 4.1 主版本，或者如果可用且推荐，安装最新的 4.1.x 次版本。

将系统升级到 PHP 5.6.20+ 和 MySQL 5.6.x 或 MariaDB 10.0.x。请不要安装最新的主版本。

访问 "/wp-admin/" 页面，并按照升级流程操作。

WordPress 将能够维护和更新数据库中的内容，并能够处理这些内容。现在，使用默认主题和所有内容的 WordPress 应该可用且正常工作。

在恢复数据库时，字符编码通常会出现技术问题。备份数据可能不是以 UTF-8 编码，而是可能采用 ISO 或 ASCII 的“已弃用”格式。确保在恢复数据库时正确更新字符编码！更多关于[在 WordPress 数据库中转换字符集的信息可以在这里找到](https://codex.wordpress.org/Converting_Database_Character_Sets)。

继续下一步，即从 WordPress 4.1 升级到 WordPress 4.9。

##### 从 WordPress 4.1 - 4.8 升级

目标
- WordPress：升级到 WordPress 4.9
- PHP：升级到 PHP 7.2
- SQL：保持或升级到 MySQL 5.6 / MariaDB 10.0

可能的损失：
- 内容：无
- 插件：很可能有
- 主题：很可能有

_如果你尚未配置 PHP 5.6.20+，请先配置。很可能一切仍能正常工作。_

从 WordPress 4.1 和 PHP 5.6.20+ 开始，你可以继续手动更新过程，或者开始使用 [WP-CLI](https://wp-cli.org/)，这是一个可以直接通过控制台运行 WordPress 命令的工具，可以简化流程。

与任何升级一样，首先要做的是备份。

删除所有非活动的主题，只保留主主题。如果有活动的子主题，请保留子主题和父主题。

安装并激活 [Twenty Ten](https://wordpress.org/themes/twentyten/) 主题。该主题自 WordPress 3.7 起适用于所有站点。

同样地，删除所有已停用（因此不工作）的插件。

现在，WordPress 将具有：
-	核心：任意版本（在 WordPress 4.1 和 WordPress 4.8 之间）
-	主题：Twenty Ten 处于活动状态，主主题已停用。
-	插件：所有应处于活动状态的插件都已停用。

此时，用 [WordPress 4.9](https://wordpress.org/wordpress-4.9.zip) 覆盖 WordPress 核心，该版本可在[发布列表](https://wordpress.org/download/releases/)中找到。安装 WordPress 4.9 主版本，或者如果可用且推荐，安装最新的 4.9.x 次要版本。

将系统升级到 PHP 7.2，如果尚未升级，则升级到 MySQL 5.6.x 或 MariaDB 10.0.x。请不要安装最新的主版本。

访问 "/wp-admin/" 页面，并按照升级流程操作。

WordPress 将能够维护和更新数据库中的内容，并能够处理这些内容。使用默认主题和所有内容的 WordPress 应该可用且正常工作。

字符编码在恢复数据库时通常会出现技术问题。备份数据可能未以 UTF-8 编码，而是可能采用 ISO 或 ASCII 的“已弃用”格式。确保在恢复数据库时正确更新字符编码！更多关于[在 WordPress 数据库中转换字符集的信息可以在这里找到](https://codex.wordpress.org/Converting_Database_Character_Sets)。

继续下一步，即从 WordPress 4.9 升级到 WordPress 5.3。

##### WordPress 4.9 - 5.2

目标
- WordPress：升级至 WordPress 5.3
- PHP：升级至 PHP 7.4
- SQL：保持或升级至 MySQL 8.0 / MariaDB 10.3

损失：
- 内容：无
- 插件：可能无
- 主题：可能无

_如果尚未配置 PHP 7.4，请立即配置。很可能一切仍会正常运行。_

WordPress 4.9 是最后一个包含经典编辑器的版本，因此许多因害怕新编辑器而停止更新 WordPress。WordPress 5.0+ 完全兼容经典编辑器内容，因此升级不会丢失任何内容。

此外，WordPress 4.9 发布时，PHP 7.0+ 已非常稳定，且 WordPress 5.0 版本已提供支持。从 PHP 5.6.20+ 升级到 PHP 7.0+ 应该非常稳定。

从 WordPress 4.9 开始，您可以继续手动更新过程，或开始使用 [WP-CLI](https://wp-cli.org/)，该工具可直接通过控制台运行 WordPress 命令，从而简化流程。

与任何升级一样，首先要做的是备份。

删除所有未激活的主题，仅保留主主题。如果有子主题处于活动状态，请保留子主题和父主题。

安装并激活 [Twenty Ten](https://wordpress.org/themes/twentyten/) 主题。该主题自 WordPress 3.7 起适用于所有站点。

同样，删除所有已停用的插件。

现在，WordPress 将具有：
-	核心：任意版本（介于 WordPress 4.9 和 WordPress 5.2 之间）
-	主题：Twenty Ten 处于活动状态，主主题已停用。
-	插件：所有应处于活动状态的插件均已停用。

此时，使用 [WordPress 5.3](https://wordpress.org/wordpress-5.3.zip) 覆盖 WordPress 核心，该版本可在[发布列表](https://wordpress.org/download/releases/)中找到。安装 WordPress 5.3 主版本，或如果可用且推荐，安装最新的 5.3.x 次版本。

将系统升级至 PHP 7.4，如果尚未升级，则升级至 MySQL 8.0.x 或 MariaDB 10.3.x。请不要安装最新的主版本。

访问 "/wp-admin/" 页面，并按照升级流程操作。

WordPress 将能够维护和更新数据库中的内容，并能够处理这些内容。

到达此阶段后，请进行新的备份，因为将进行更多更新，此时 WordPress 处于良好状态。

WordPress 4.9+ 中可用的大多数插件应与 WordPress 5.3 兼容，因此请尝试更新插件列表中的所有可用插件。请逐一更新并检查所有警告和错误。如果出现重大错误，请尝试使用该插件的旧版本。通常，这些旧版本位于 wordpress.org 上每个插件页面的“开发者”选项卡末尾。

对主题进行相同操作。WordPress 4.9+ 中可用的大多数主题应与 WordPress 5.3 兼容。

继续下一步，即从 WordPress 5.3 升级到 WordPress 6.2。

##### WordPress 5.3 - 6.2

目标
- WordPress：升级至 WordPress 6.2
- PHP：升级至 PHP 7.4
- SQL：保持或升级至 MySQL 8.0 LTS / MariaDB 10.11 LTS

损失：
- 内容：无
- 插件：很可能无
- 主题：很可能无

_如果你尚未配置 PHP 7.4，请立即配置。很可能一切仍会正常运行。_

正常升级所有内容。一切应该都能正常工作。

##### WordPress 6.3 - 6.8

目标
- WordPress：升级到 WordPress 6.8
- PHP：至少升级到 PHP 8.1（WordPress 6.6+ 支持 PHP 8.2）
- SQL：维持或升级到 MySQL 8.0 LTS / MariaDB 10.11 LTS

可能的损失：
- 内容：无
- 插件：很可能无
- 主题：很可能无

_如果你尚未配置 PHP 8.1，请立即配置。很可能一切仍会正常运行。_

当 WordPress 6.3 发布时，停止了对 PHP 5.6 的支持，并将 PHP 7.0 确立为最低 PHP 版本。从 PHP 5.6.20+ 升级到 PHP 7.0+ 应该非常稳定。

当 WordPress 6.6 发布时，停止了对 PHP 7.0 和 7.1 的支持，并将 PHP 7.2.24 确立为最低 PHP 版本。从 PHP 7.0+ 或 PHP 7.1+ 升级到 PHP 7.2+ 应该非常稳定。WordPress 6.6 也支持 PHP 8.2，因此你可以在升级 WordPress 后尝试切换到 PHP 8.2。

正常升级所有内容。一切应该都能正常运行。

### 故障排除 {#troubleshooting}

**布局混乱或出现错误**

如果你的博客现在看起来布局混乱或出现行错误，罪魁祸首可能是一个与新代码不兼容的旧插件。在你的 WordPress [管理屏幕](https://wordpress.org/documentation/article/administration-screens)中，停用所有非 WordPress 默认自带的插件。然后逐个重新激活它们。

**进行过自定义修改/“黑客”操作？**

如果你修改过其他 WordPress 文件（即“黑入”过 WordPress），你应该记录下你的修改。你需要将你的编辑内容转移到新代码中。[WordPress 版本](https://codex.wordpress.org/WordPress_Versions)列出了每个版本中发生变化的文件。

**避免使用旧代码**

升级能让你获得最新、最好的代码。使用你的旧代码，无论你做了多少自定义，几乎肯定会引发问题。直接使用你修改过的旧代码的诱惑可能很大，但出现错误的可能性要大得多。

**可以回退到旧版本吗**

可以，但通常不建议将当前版本回滚（降级）到旧版本。这是因为新版本通常包含安全更新，回滚可能会让你的网站面临风险。其次，版本间数据库结构的差异可能导致在维护网站内容、文章、评论以及依赖数据库中存储信息的插件时出现复杂问题。如果你仍然执意要这样做，请自行承担风险。**请注意，如果没有在尝试升级前备份整个网站和数据库，成功回滚几乎是不可能的。** 删除除 `wp-config.php` 外的所有 WordPress 文件。[上传](https://developer.wordpress.org/advanced-administration/upgrade/ftp/filezilla/)备份文件到你的服务器，并[恢复数据库备份](https://wordpress.org/article/restoring-your-database-from-backup/)。记住，你必须拥有良好的备份才能使回滚生效。对于较旧的 WordPress 版本，回滚可能无法成功。

**获取更多帮助**

如果在升级后遇到任何错误，请查阅[故障排除：常见安装问题](https://developer.wordpress.org/advanced-administration/before-install/howto-install/#common-installation-problems)、[故障排除](https://codex.wordpress.org/Troubleshooting)以及[安装类文章](https://wordpress.org/documentation/category/installation/)。如果找不到答案，请在 [WordPress 支持论坛](https://wordpress.org/support/forums/)上清晰地描述你的问题。届时会有人询问你是否使用了任何旧代码。你将被要求修改它，所以不如现在就改掉 🙂。

## 配置自动后台更新

### 更新类型 {#update-types}

自动后台更新功能于 [WordPress 3.7](https://wordpress.org/documentation/wordpress-version/version-3-7/) 版本引入，旨在提升安全性并优化整体更新体验。在大多数站点上，WordPress 的自动更新功能默认处于启用状态。特殊情况下，插件和主题也可能自动更新。翻译文件默认会自动更新。

WordPress 包含四种自动后台更新类型：

1. 核心更新
2. 插件更新
3. 主题更新
4. 翻译文件更新

#### 核心更新 {#core-updates}

核心更新细分为三种类型：

1.  核心开发更新，称为“前沿版本”
2.  次要核心更新，例如维护和安全版本
3.  主要核心版本更新

在 WordPress 5.6 之前，默认情况下，每个站点仅对次要核心版本和翻译文件启用了自动更新。从 WordPress 5.6 及更高版本开始，每个新站点都对次要版本和主要版本启用了自动更新。

已运行开发版本的站点默认也启用了对后续开发版本的自动更新。

### 更新配置 {#update-configuration}

自动更新可通过以下两种方法之一进行配置：在 `wp-config.php` 中定义常量，或使用插件添加过滤器。

#### 通过 wp-config.php 配置 {#configuration-via-wp-config-php}

使用 `wp-config.php` 可以完全禁用自动更新，并可根据更新类型禁用或配置核心更新。

##### 用于禁用所有更新的常量 {#constant-to-disable-all-updates}

核心开发者经过慎重考虑，决定默认启用次要版本和翻译文件的自动更新。未来，这将是确保您的网站保持最新和安全的最佳方式之一，因此强烈不建议禁用这些更新。

要完全禁用所有类型的自动更新（无论是核心更新还是其他更新），请将以下代码添加到您的 `wp-config.php` 文件中：

```
define( 'AUTOMATIC_UPDATER_DISABLED', true );
```

##### 配置核心更新的常量 {#constant-to-configure-core-updates}

要为主版本或开发目的启用自动更新，可以从 `WP_AUTO_UPDATE_CORE` 常量开始。通过三种方式之一定义此常量，可以一次性批量启用或禁用多种类型的核心更新。

```
define( 'WP_AUTO_UPDATE_CORE', true );
```

`WP_AUTO_UPDATE_CORE` 可以用以下三个值之一定义，每个值会产生不同的行为：

* 值为 `true` – 开发版、次要版本和主要版本更新**全部启用**
* 值为 `false` – 开发版、次要版本和主要版本更新**全部禁用**
* 值为 `'minor'` – 次要版本更新**启用**，开发版和主要版本更新**禁用**

请注意，只有已运行开发版本的站点才会收到开发更新。

对于开发站点，`WP_AUTO_UPDATE_CORE` 的默认值为 `true`。对于其他站点，`WP_AUTO_UPDATE_CORE` 的默认值为 `minor`。

从 WordPress 5.6 开始，新 WordPress 安装的 `WP_AUTO_UPDATE_CORE` 默认值为 `true`。对于新网站，`WP_AUTO_UPDATE_CORE` 的默认值为 `minor`。

#### 通过过滤器配置 {#configuration-via-filters}

使用过滤器可以实现对自动更新的精细控制。

放置这些过滤器的最佳位置是在 [必须使用插件](https://developer.wordpress.org/advanced-administration/plugins/mu-plugins/) 中。

请*勿*在 `wp-config.php` 中直接添加 `add_filter()` 调用。此时 WordPress 尚未完全加载，可能导致与 WP-CLI 等其他应用程序冲突。

##### 通过过滤器禁用所有更新 {#disabling-all-updates-via-filter}

你也可以使用以下过滤器来禁用所有自动更新：

```
add_filter( 'automatic_updater_disabled', '__return_true' );
```

##### 通过过滤器进行核心更新 {#core-updates-via-filter}

要仅启用所有核心类型的更新，请使用以下过滤器：

```
add_filter( 'auto_update_core', '__return_true' );
```

但是，假设您不想简单地启用或禁用所有三种类型的核心更新，而是希望有选择地启用或禁用它们。这时就需要用到 `allow_dev_auto_core_updates`、`allow_minor_auto_core_updates` 和 `allow_major_auto_core_updates` 过滤器。

WordPress 内置了两个简写函数，允许您用单行代码启用或禁用特定类型的核心更新。它们是 [__return_true](https://developer.wordpress.org/reference/functions/__return_true) 和 [__return_false](https://developer.wordpress.org/reference/functions/__return_false)。以下是一些过滤器示例：

要单独*启用*它们（如需禁用，请使用 **false** 代替 **true**）：

```
add_filter( 'allow_dev_auto_core_updates', '__return_true' ); // 启用开发版本更新
add_filter( 'allow_minor_auto_core_updates', '__return_true' ); // 启用次要更新
add_filter( 'allow_major_auto_core_updates', '__return_true' ); // 启用主要更新
```

面向开发者：即使 WordPress 目录或其任何父目录中存在 VCS 文件夹（.git、.hg、.svn 等），也要*启用*自动更新：

```
add_filter( 'automatic_updates_is_vcs_checkout', '__return_false', 1 );
```

##### Plugin & Theme Updates via Filter {#plugin-theme-updates-via-filter}

By default, automatic background updates only happen for plugins and themes in special cases, as determined by the WordPress.org API response, which is controlled by the WordPress security team for patching critical vulnerabilities. To enable or disable updates in all cases, you can leverage the `auto_update_$type` filter, where `$type` would be replaced with "plugin" or "theme".

Automatic updates for All plugins

```
add_filter( 'auto_update_plugin', '__return_true' );
```

Automatic updates for All themes:

```
add_filter( 'auto_update_theme', '__return_true' );
```

You can use `__return_false` instead of `__return_true` to specifically disable all plugin & theme updates, even forced security pushes from the WordPress security team.

The `auto_update_$type` filters also allow for more fine-grained control, as the specific item to updated is also passed into the filter. If you wanted to enable auto-updates for specific plugins only, then you could use code like this:

```
function auto_update_specific_plugins ( $update, $item ) {
	// Array of plugin slugs to always auto-update
	$plugins = array (
		'akismet',
		'buddypress',
	);
	if ( in_array( $item->slug, $plugins ) ) {
		 // Always update plugins in this array
		return true;
	} else {
	 	// Else, use the normal API response to decide whether to update or not
		return $update;
	}
}
add_filter( 'auto_update_plugin', 'auto_update_specific_plugins', 10, 2 );
```

##### 通过过滤器更新翻译文件 {#translation-updates-via-filter}

与次要核心更新相同，默认已启用自动翻译文件更新。

如需禁用翻译文件更新，请使用以下代码：

```
add_filter( 'auto_update_translation', '__return_false' );
```

##### 通过过滤器禁用邮件 {#disable-emails-via-filter}

```
// 禁用更新邮件
add_filter( 'auto_core_update_send_email', '__return_false' );
```

此过滤器也可用于根据邮件 $type（成功、失败、严重）、更新类型对象 $core_update 或 $result 来操控更新邮件：

```
/* @param bool   $send        是否发送邮件。默认为 true。
@param string $type        要发送的邮件类型。可以是 'success'、'fail'、'critical' 之一。
@param object $core_update 尝试的更新提议。
@param mixed  $result      核心更新的结果。可以是 WP_Error。
*/
apply_filters( 'auto_core_update_send_email', true, $type, $core_update, $result );
```

### 资源 {#resources}

* 更多示例请访问：[https://make.wordpress.org/core/2013/10/25/the-definitive-guide-to-disabling-auto-updates-in-wordpress-3-7/](https://make.wordpress.org/core/2013/10/25/the-definitive-guide-to-disabling-auto-updates-in-wordpress-3-7/)
* 更多信息请见：[如何在 WordPress 3.7 中配置自动更新？](https://wordpress.stackexchange.com/questions/120081/how-do-i-configure-automatic-updates-in-wordpress-3-7)
* 关于 wp-cli 冲突的信息：[https://github.com/wp-cli/wp-cli/issues/1310](https://github.com/wp-cli/wp-cli/issues/1310)

# 常见的 WordPress 错误

如果你遇到 WordPress 错误信息或白屏，请不要惊慌。很可能之前已经有人遇到过相同的问题，并且可以轻松解决。

本页面列出了 WordPress 用户最常遇到的错误，并提供了修复它们的起点。在 [WordPress 支持](https://wordpress.org/documentation/)页面，你还可以找到指向更详细页面或论坛的链接，那里会有志愿者提供帮助。

## 白屏死机 {#the-white-screen-of-death}

PHP 错误和数据库错误都可能表现为白屏，即没有任何信息的空白屏幕，这在 WordPress 社区中通常被称为 _WordPress 白屏死机_ (WSOD)。

在采取极端措施之前，WordPress 白屏死机有多种原因：

* **插件导致兼容性问题**。如果您可以访问[管理屏幕](https://wordpress.org/documentation/article/administration-screens/)，请尝试停用所有插件，然后逐个重新激活。如果无法访问管理屏幕，请通过 [FTP](https://developer.wordpress.org/advanced-administration/upgrade/ftp/) 登录您的网站。找到 `wp-content/plugins` 文件夹，并将插件文件夹重命名为 `plugins_old`。这将停用所有插件。您可以在[故障排除常见问题解答](https://wordpress.org/documentation/article/faq-troubleshooting/#how-to-deactivate-all-plugins-when-not-able-to-access-the-administrative-menus)中阅读更多关于手动停用插件的信息。
* **您的主题可能导致问题**。如果您在刚刚激活新主题或在 WordPress 网络中创建新站点后遇到白屏死机，这种情况尤其可能发生。登录 WordPress 管理屏幕并激活默认的 WordPress 主题（例如 Twenty Twenty-One）。如果您使用的是 WordPress 5.8 及以下版本，请切换到 Twenty Twenty-One 主题，因为 Twenty Twenty-Two 主题需要 5.9 及以上版本。如果无法访问管理屏幕，请通过 FTP 访问您的网站并导航到 `/wp-content/themes/` 文件夹。重命名当前活动主题的文件夹。

[WP_DEBUG 功能](https://developer.wordpress.org/advanced-administration/debug/debug-wordpress/#wp_debug)通常能提供额外信息。

## 内部服务器错误 {#internal-server-error}

[![](https://wordpress.org/documentation/files/2018/11/internalservererror2.jpg)](https://wordpress.org/documentation/files/2018/11/internalservererror2.jpg)
内部服务器错误消息

导致内部服务器错误的原因有很多。以下是一些可以尝试的解决方法：

* 最可能的问题是 `.htaccess` 文件损坏。使用 FTP 登录到您的网站根目录，将 `.htaccess` 文件重命名为 `.htaccess_old`。然后尝试加载您的网站，看看问题是否解决。如果有效，请务必访问 [设置](https://wordpress.org/documentation/article/administration-screens/#settings-configuration-settings) > [固定链接](https://wordpress.org/documentation/article/administration-screens/#permalinks) 并重置您的 [固定链接](https://wordpress.org/documentation/article/using-permalinks/)。这将为您生成一个新的 `.htaccess` 文件。
* 尝试停用所有插件，以检查是否是插件问题。如果您无法访问 WordPress 管理后台，请按照 [这些说明](https://wordpress.org/documentation/article/faq-troubleshooting/#how-to-deactivate-all-plugins-when-not-able-to-access-the-administrative-menus) 通过 FTP 停用插件。
* 将主题切换到 WordPress 默认主题（例如 Twenty Twenty-One），以排除主题相关的问题。如果您使用的是 WordPress 5.8 及以下版本，请切换到 Twenty Twenty-One 主题，因为 Twenty Twenty-Two 主题需要 5.9 及以上版本。
* 增加 [PHP 内存限制](https://wordpress.org/documentation/article/editing-wp-config-php/#increasing-memory-allocated-to-php)
* 尝试从 [全新安装的 WordPress](https://wordpress.org/download/) 重新上传 `wp-admin` 和 `wp-includes` 文件夹。

## 建立数据库连接时出错 {#error-establishing-database-connection}

如果您看到页面显示“建立数据库连接时出错”的消息，这意味着连接到您的数据库时出现了问题，可能有多种原因。以下是可能的原因和解决方案。

### 错误的 wp-config.php 信息 {#incorrect-wp-config-php-information}

"建立数据库连接时出错"通常是由您的 [wp-config.php](https://wordpress.org/documentation/article/editing-wp-config-php/) 文件中的错误引起的。通过 FTP 客户端访问您的站点。打开 `wp-config.php` 并确保以下信息正确：

* 数据库名称
* 数据库用户名
* 数据库密码
* 数据库主机

了解更多关于 [编辑 wp-config.php](https://wordpress.org/documentation/article/editing-wp-config-php/) 的信息。

如果您确定配置正确，可以 [尝试手动重置 MySQL 密码](https://developer.wordpress.org/advanced-administration/before-install/howto-install/#common-installation-problems)。

### 您的网络主机问题 {#problems-with-your-web-host}

下一步是联系您的网络主机。以下主机问题可能导致此问题：

* 您的数据库已达到配额并已关闭。
* 服务器已关闭。

联系您的主机提供商，查看是否是这些问题导致了您的问题。

### 网站被入侵 {#compromised-website}

如果您已检查 `wp-config.php` 文件是否存在错误，并已向主机提供商确认无托管问题，那么您的网站可能已被黑客入侵。

请使用 [Sucuri SiteCheck](https://sitecheck.sucuri.net/) 扫描您的网站，以确保其未被入侵。如果确实被入侵，您应该查阅 [我的网站被黑了](https://wordpress.org/documentation/article/faq-my-site-was-hacked/)。

## 自动升级失败 {#failed-auto-upgrade}

在某些情况下，WordPress 自动更新功能可能会失败。常见症状包括：

* 出现空白白屏且无任何信息。
* 提示更新失败的警告。
* 显示 PHP 错误信息。

WordPress 自动升级功能失败的原因可能是：与主 WordPress 文件连接时出现故障、升级过程中网络连接问题，或是 [文件权限](https://developer.wordpress.org/advanced-administration/server/file-permissions/) 设置不正确。

如需手动更新 WordPress 站点，请参阅 [手动更新文章](https://wordpress.org/documentation/article/updating-wordpress/#manual-update)。

## 连接超时 {#connection-timed-out}

当您的网站尝试执行超出服务器处理能力的事务时，会出现连接超时错误。这在内存限制严格的共享主机上尤为常见。您可以尝试以下方法：

* **停用所有插件。** 如果停用您站点上的所有 WordPress 插件能解决问题，请逐个重新激活它们以找出导致问题的插件。如果您无法访问管理后台，[请阅读如何手动停用插件](https://wordpress.org/documentation/article/faq-troubleshooting/#how-to-deactivate-all-plugins-when-not-able-to-access-the-administrative-menus)。
* **切换到默认 WordPress 主题。** 如果您使用的是 WordPress 5.8 及以下版本，请切换到 Twenty Twenty-One 主题，因为 Twenty Twenty-Two 主题需要 5.9 及以上版本。这应能排除与主题相关的问题。
* **增加 [wp-config.php 中的内存限制](https://wordpress.org/documentation/article/editing-wp-config-php/#increasing-memory-allocated-to-php)。** 如果您使用的是共享主机，可能需要联系您的主机提供商为您增加内存限制。
* **增加 [php.ini](https://php.net/manual/en/ini.core.php) 文件中的最大执行时间。** 这不是 WordPress 核心文件，因此如果您不确定如何编辑，请联系您的主机提供商，请求他们增加最大执行时间。请参阅下方关于增加最大执行时间的说明。

## 升级后的维护模式 {#maintenance-mode-following-upgrade}

[![](https://wordpress.org/documentation/files/2018/11/maintenancemode1.jpg)](https://wordpress.org/documentation/files/2018/11/maintenancemode1.jpg)

当 WordPress 更新时，它会自动安装一个 `.maintenance` 文件。升级后，您可能会看到一条消息，提示“正在进行计划维护，暂时无法访问。请稍后再试。” 这可能是因为维护文件未被正确移除。

要清除此消息，请执行以下操作：

1.  使用您的 FTP 程序登录到您的网站
2.  删除位于您网站根目录下的 `.maintenance` 文件。

阅读更多关于[维护模式问题](https://wordpress.org/documentation/article/faq-troubleshooting/#how-to-clear-the-briefly-unavailable-for-scheduled-maintenance-message-after-doing-automatic-upgrade)的信息。

## 你做了更改但没有任何变化 {#you-make-changes-and-nothing-happens}

如果你对网站进行了修改，但在浏览器中看不到变化，可能需要清除[浏览器缓存](https://wordpress.org/support/topic/i-make-changes-and-nothing-happens/)。浏览器会存储你访问过的网站信息，这样再次访问时加载速度更快，因为浏览器只需重新加载已存储在电脑上的信息，而无需重新下载。

如果你对网站做了更改，但浏览器认为改动不重要，它就会直接从缓存加载数据，导致你看不到变化。要解决这个问题，只需[清空浏览器缓存](https://wordpress.org/support/topic/i-make-changes-and-nothing-happens/)或关闭标签页后重新打开链接。

## 美化固定链接 404 错误与图片无法显示问题 {#pretty-permalinks-404-and-images-not-working}

如果您在使用美化[固定链接](https://wordpress.org/documentation/article/using-permalinks/)时遇到 404 错误，并且上传图片时出现白屏，可能是 Apache 默认未启用 [mod_rewrite](https://wordpress.org/documentation/article/glossary#mod_rewrite)。Mod_rewrite 是 [Apache 网页服务器](https://wordpress.org/documentation/article/glossary#apache)软件的扩展模块，能够实时“重写”[URL](https://en.wikipedia.org/wiki/Url)。这是实现美化固定链接功能所必需的。

[WordPress 多站点](https://wordpress.org/documentation/article/glossary#multisite)网络通常会遇到此问题，但在共享主机提供商处或[网站迁移或服务器搬迁](https://wordpress.org/documentation/article/moving-wordpress/)后也可能发生。

请通过 **设置 > 固定链接** 重置您的固定链接。如果这不起作用，您可能需要手动编辑 `.htaccess` 文件。

```
# BEGIN WordPress  
<IfModule mod\_rewrite.c>  
RewriteEngine On  
RewriteBase /  
RewriteRule ^index\.php$ - [L]  
RewriteCond %{REQUEST_FILENAME} !-f  
RewriteCond %{REQUEST_FILENAME} !-d  
RewriteRule . /index.php [L]  
</IfModule>  
# END WordPress
```

如果您不熟悉如何编辑 `.htaccess` 文件，请联系您的主机提供商，请求他们启用 mod_rewrite 规则。更多关于[美化固定链接的信息可在 WordPress Codex 中找到](https://wordpress.org/documentation/article/using-permalinks/#using-pretty-permalinks)。

## 自定义文章类型 404 错误 {#custom-post-type-404-errors}

您可能会遇到 404 错误和[自定义文章类型](https://wordpress.org/documentation/article/post-types/#custom-types)相关的问题。请尝试以下步骤：

1.  确保您的自定义文章类型与单页面的名称没有重复。如果有，请重命名单页面，包括其[别名](https://wordpress.org/documentation/article/glossary/#post-slug)。
2.  登录 WordPress 管理后台，导航至 **设置 > 固定链接**。选择默认固定链接并保存。然后重新选择您偏好的固定链接。这将刷新重写规则，通常可以解决问题。

## 关键错误消息 {#critical-error-message}

如果您看到消息“此网站上发生了一个关键错误。请检查您的站点管理员电子邮件收件箱以获取说明。”，这表明您网站中的某些内容导致了关键错误，阻止了 WordPress 按预期运行。

首先，请检查您的电子邮件，查看 WordPress 是否已发送有关该错误的任何详细信息。接下来，在您的 [wp-config.php](https://developer.wordpress.org/advanced-administration/debug/debug-wordpress/#example-wp-config-php-for-debugging) 文件中启用调试模式。

启用后，请查看位于 wp-content/debug.log 的错误日志，以找出具体出了什么问题。

您可能发现的一些最常见原因包括：插件之间的冲突、与您的主题的兼容性问题、运行不兼容的 PHP 版本、达到内存限制或 WordPress 文件损坏。

## 特定错误信息 {#specific-error-messages}

您的错误日志中可能会出现多种不同的错误。要访问错误日志，您需要启用[调试模式](https://wordpress.org/documentation/article/editing-wp-config-php/#wp_debug)，然后通过 FTP 找到错误日志文件。以下信息将帮助您解读一些常见的错误信息。

### PHP 错误 {#php-errors}

以下是一些常见的 PHP 错误信息。

#### 致命错误与警告 {#fatal-errors-and-warnings}

##### 无法修改头部信息 – 头部信息已发送

如果您收到 WordPress 无法修改头部信息且头部信息已发送的警告，通常意味着您在开始标签之前或结束标签之后存在空格或字符。请阅读如何[修复头部信息已发送错误](https://wordpress.org/documentation/article/faq-troubleshooting/#how-do-i-solve-the-headers-already-sent-warning-problem)。

如果您在刚安装 WordPress 时遇到此问题，可能是 `wp-config.php` 文件中引入了语法错误。[这些说明将帮助您修复错误](https://developer.wordpress.org/advanced-administration/before-install/howto-install/#common-installation-problems)。

##### 调用未定义函数

出现“调用未定义函数”错误可能意味着某个 WordPress 插件正在尝试查找代码中不存在或无法访问的文件或数据。原因包括：

* 尝试自动安装或自动升级插件时出错。请尝试[手动安装或升级插件](https://wordpress.org/documentation/article/managing-plugins/#manual-plugin-installation)。
* 尝试自动安装或自动升级主题时出错。请尝试[手动安装或升级主题](https://wordpress.org/documentation/article/using-themes/#adding-new-themes)。
* 您可能正在使用[不兼容的 WordPress 插件](https://wordpress.org/documentation/article/managing-plugins/#plugin-compatibility)或不兼容的主题。这可能在旧版 WordPress 与新插件同时使用时发生，或尝试在单站点安装中使用 WordPress 多站点插件。升级 WordPress 以解决此问题。
* 您可能正在尝试调用不存在的函数。请检查 `functions.php` 中是否存在拼写错误。

尝试停用导致错误出现的 WordPress 插件或更换 WordPress 主题。如果无法通过管理界面操作，您可能需要[通过 FTP 手动处理](https://wordpress.org/documentation/article/faq-troubleshooting/#how-to-deactivate-all-plugins-when-not-able-to-access-the-administrative-menus)。

##### 允许的内存大小已耗尽

允许的内存大小已耗尽错误意味着您的 WordPress 安装没有足够的内存来完成您想要的操作。您可以尝试以下步骤：

* 在 [wp-config.php 中增加内存限制](https://wordpress.org/documentation/article/editing-wp-config-php/#increasing-memory-allocated-to-php)
* 通过编辑 `php.ini` 来增加内存限制。这不是 WordPress 自带的文件，因此如果您不熟悉它，应联系您的主机提供商来增加内存限制。

##### 超出最大执行时间

您可能会收到类似"超出 30 秒最大执行时间"或"超出 60 秒最大执行时间"的消息。这意味着某个进程完成所需时间过长，导致超时。有多种方法可以修复此错误。

**编辑 `.htaccess` 文件**

**编辑前请务必备份 `.htaccess` 文件。**

在 `.htaccess` 文件中添加以下行：

```
php_value max_execution_time 60
```

**编辑 `php.ini` 文件**

在 `php.ini` 文件中添加以下内容：

```
max_execution_time = 60
```

如果您不确定如何进行这些更改，或者您使用的是禁止自行修改的共享主机，则应联系您的主机提供商，请求他们增加最大执行时间。

#### 解析错误 {#parse-errors}

##### 语法错误

语法错误意味着您在创建 PHP 结构时出现了错误。例如，您可能：

* 在单行末尾缺少 `;`。
* 使用了花引号。
* 缺少花括号。

当此错误出现时，它会告诉您错误出现在哪个文件（例如 `functions.php`）以及代码中大约哪一行（可能不总是精确的行，因此请务必检查该行前后）。

##### 意外错误

如果你收到一个显示“解析错误：意外”的错误信息，这通常意味着你忘记包含某个字符。最常见的情况有：

* **意外的 '='**：引用变量时忘记包含 $ 符号
* **意外的 ')'**：忘记包含开括号 (
* **意外的 '('**：忘记包含闭括号 )
* **意外的 T_STRING**：忘记在前一行末尾添加引号或分号
* **意外的 T_ELSE**：存在 else 语句但没有对应的 if 语句

#### 使用未定义的常量 {#use-of-an-undefined-constant}

与解析错误类似，“使用未定义的常量”意味着您缺少某个字符。可能是以下情况之一：

* 引用变量时缺少 `$` 符号
* 数组键周围缺少引号

### 数据库错误 {#database-errors}

以下错误可能与您的 WordPress 数据库有关。

#### 错误 13 – 无法创建/写入文件 {#error-13-cannot-create-write-to-file}

出现此错误可能有多种原因。

**MySQL 无法创建临时文件。**

当使用 PHP 访问 MySQL 时，MySQL 变量 `tmpdir` 被设置为一个无法写入的目录。要验证这一点，请在命令行中输入 MySQL 并键入 `show variables`。您将看到一个很长的列表，其中一项会显示：**tmpdir = /某个目录/**（无论您的设置是什么）。

要解决此问题，请修改 **tmpdir** 变量，使其指向一个可写目录。

1.  找到 **my.cnf** 文件。在 *nix 系统上，该文件通常位于 **/etc/** 中。在 Windows 系统上，找到 **my.ini** 文件。
2.  找到后，用简单的文本编辑器打开它，并找到 **[mysqld]** 部分。
3.  在此部分下，找到 **tmpdir** 行。如果该行被注释掉了（开头有 **#**），请删除 **#** 并编辑该行，使其显示为：**tmpdir = /可写目录**，其中 **/可写目录** 是您可以写入的目录。有些人使用 **/tmp**，您也可以尝试 **/var/tmp** 或 **/usr/tmp**。在 Windows 上，使用 **C:/Windows/tmp**。
4.  保存文件。
5.  通过键入 `mysqlshutdown -u -p shutdown` 来关闭 MySQL。
6.  转到 MySQL 目录并键入 `./bin/safe_mysqld &` 来启动 MySQL。在 Linux 系统上，MySQL 目录通常在 **/usr/local** 中，有时在 **/usr/** 中。

**[文件权限](https://developer.wordpress.org/advanced-administration/server/file-permissions/) 不正确**

请更正[文件权限](https://developer.wordpress.org/advanced-administration/server/file-permissions/)。

如果以上内容您都不理解，并且有人为您管理系统，请将上述内容展示给他们，他们应该能够解决。

#### 用户被拒绝执行 CREATE 命令 {#create-command-denied-to-user}

当分配给数据库的用户没有足够的权限在数据库中执行创建列和表的操作时，会发生此错误。您需要登录 [CPanel](https://wordpress.org/documentation/article/using-cpanel/) 或 [Plesk](https://www.plesk.com/) 来授予数据库用户足够的权限。

或者，您可以[创建一个新用户并分配给数据库](https://wordpress.org/documentation/article/using-cpanel/#step-3-add-user-to-database)。如果创建了新用户，则需要确保在 `[wp-config.php](https://wordpress.org/documentation/article/using-cpanel/#editing-the-wordpress-config-file)` 文件中[更新此信息](https://wordpress.org/documentation/article/using-cpanel/#editing-the-wordpress-config-file)。

#### 错误 {#error-28}

可能的原因包括：

* `/tmp` 目录（无论 `tmpdir` 指向何处）空间不足，或
* `/tmp` 目录中文件过多（即使有大量可用空间），或
* 服务器上的缓存已满

这是一个 MySQL 错误，与 WordPress 没有直接关系；您应该就此问题联系您的主机服务商。一些用户报告称，在 [phpMyAdmin](https://developer.wordpress.org/advanced-administration/upgrade/phpmyadmin/) 中运行“修复表”命令解决了该问题。

#### 错误 145 {#error-145}

这表明您数据库中的某个表已损坏。如果您熟悉使用 [phpMyAdmin](https://developer.wordpress.org/advanced-administration/upgrade/phpmyadmin/)，可以按照[这些关于修复 MySQL 数据库表的说明](https://wordpress.org/documentation/article/faq-troubleshooting-2/#how-do-you-repair-a-mysql-database-table)进行操作。

**在对数据库执行任何操作之前，请务必[备份您的数据库](https://wordpress.org/documentation/article/backing-up-your-database/)。**

如果您以前从未使用过 phpMyAdmin，或对此感到不熟悉，请联系您的主机提供商，请他们对您的数据库运行 CHECK/REPAIR 命令。

#### 未知列 {#unknown-column}

未知列错误可能是由于数据库中缺少列引起的。如果您刚刚升级了 WordPress，请尝试再次手动升级。要手动更新您的 WordPress 站点，请参阅[更新文章](https://wordpress.org/documentation/article/updating-wordpress/#manual-update)。

如果您在运行数据库查询时遇到此错误，则可能是为标识符引号字符使用了不正确的引号。此[Stack Overflow 上的问题提供了更多详细信息](https://stackoverflow.com/questions/1346209/unknown-column-in-field-list-error-on-mysql-update-query)。另请参阅[MySQL 文档](https://dev.mysql.com/doc/refman/8.2/en/identifiers.html)。

## 资源 {#resources}

* [MySQL 错误代码与消息](https://dev.mysql.com/doc/refman/en/error-messages-server.html)

# CSS

[tip]自 WordPress 6.2 起，您可以在站点编辑器的样式区域添加自定义 CSS。了解更多关于[全站和按块自定义 CSS 编辑器](https://wordpress.org/documentation/article/styles-overview/#applying-custom-css)的信息。[/tip]

WordPress 高度依赖 CSS 中的呈现样式。通过使用[主题](https://wordpress.org/documentation/article/using-themes/)，您几乎拥有无限的选择来定制布局。WordPress 主题让更改网站外观变得简单，并为您[创建自己的主题](https://codex.wordpress.org/Theme_Development)和页面布局提供了广阔空间。

[CSS](https://wordpress.org/documentation/article/glossary/#css) 代表**层叠样式表**。它允许您将样式呈现信息（如颜色和布局）与 HTML 结构分开存储。这使您能够精确控制网站布局，并使页面更新更快、更容易。

本文简要描述了 CSS 在 WordPress 中的使用，并列出了进一步信息的参考资料。有关 CSS 本身的信息，请参阅[在 WordPress 上构建的资源#CSS](https://developer.wordpress.org/advanced-administration/resources/#CSS)。

## [WordPress 与 CSS](#wordpress-and-css)

WordPress 主题通过结合使用[模板文件](https://codex.wordpress.org/Templates)、[模板标签](https://codex.wordpress.org/Template_Tags)和 CSS 文件来生成您 WordPress 网站的外观。

### [模板文件](#template-files)

[模板文件](https://codex.wordpress.org/Stepping_Into_Templates)是构建您网站的基本模块。在[WordPress主题结构](https://developer.wordpress.org/advanced-administration/wordpress/site-architecture/)中，页眉、侧边栏、内容和页脚都包含在单独的文件中。它们组合在一起构成您的页面。这使您可以自定义这些构建模块。例如，在默认的WordPress主题中，您网站首页、分类、[归档](https://codex.wordpress.org/Creating_an_Archive_Index)和[搜索](https://codex.wordpress.org/Creating_a_Search_Page)网页上的多文章视图包含侧边栏。点击任何文章，您将进入单文章视图，侧边栏则会消失。您可以[选择页面上显示哪些部分](https://codex.wordpress.org/The_Loop_in_Action)，并单独自定义它们，例如在特定分类的所有页面上显示不同的页眉或侧边栏。更多内容请参阅[深入了解模板](https://codex.wordpress.org/Stepping_Into_Templates)。

### [模板标签](#template-tags)

模板标签是用于提供指令和请求存储在 WordPress 数据库中的信息的代码片段。其中一些标签具有高度可配置性，允许您自定义网站上显示的日期、时间、列表和其他元素。您可以在[深入了解模板标签](https://codex.wordpress.org/Stepping_Into_Template_Tags)中了解更多信息。

### [样式表](#stylesheet)

CSS 文件是所有设计元素的汇集之处。您网站中的每个模板文件都包含包裹着模板标签和内容的 HTML 元素。每个主题的样式表中都包含控制这些 HTML 元素设计和布局的规则。没有这些规则，您的页面将仅呈现为简单的长文本页面。通过这些规则，您可以调整页面结构模块的布局，使页头变得非常长且充满图形或照片，或者保持简洁窄小。您的网站可以“浮动”在浏览者屏幕中央，左右留有空白，也可以拉伸至全屏，填满整个页面。侧边栏可以位于右侧或左侧，甚至可以从页面中部开始。如何设计页面样式完全由您决定。但样式设计的指令都位于每个主题文件夹内的 `style.css` 文件中。

## [WordPress 中的自定义 CSS](#custom-css-in-wordpress)

自 WordPress 4.7 起，您可以直接通过[外观自定义屏幕](https://wordpress.org/documentation/article/appearance-customize-screen/)为您的主题添加自定义 CSS，无需额外插件或直接编辑主题及子主题。只需在自定义当前主题时选择 **附加 CSS** 标签页即可开始！

您所做的任何 CSS 修改都会在预览中显示，就像在定制器中进行的其他更改一样。这意味着您有充足时间调整和完善网站外观，在实际应用更改前可反复修改直至满意！

请注意，CSS 修改与您的主题绑定。这意味着如果您切换到新主题，您的自定义 CSS 样式将不再生效（当然，如果切换回之前的主题，它们会再次生效）。

### [为何使用自定义 CSS？](#why-use-custom-css)

原因如下：

* 若直接修改主题且主题后续更新，您的修改可能会丢失。使用自定义 CSS 可确保修改得以保留。
* 使用自定义 CSS 能加快开发速度。
* 自定义 CSS 在主题原始 CSS 之后加载，因此无需从头编写整套 CSS 即可覆盖特定样式声明。

## [WordPress Generated Classes](#wordpress-generated-classes)

Several classes for aligning images and block elements (`div`, `p`, `table` etc.) were introduced in WordPress 2.5: `aligncenter`, `alignleft` and `alignright`. In addition the class `alignnone` is added to images that are not aligned, so they can be styled differently if needed.

The same classes are used to align images that have a caption (as of WordPress 2.6). Three additional CSS classes are needed for the captions, and one more for accessibility. Together, the classes are:

```
/* WordPress Core
-------------------------------------------------------------- */
.alignnone {
  margin: 5px 20px 20px 0;
}

.aligncenter,
div.aligncenter {
  display: block;
  margin: 5px auto 5px auto;
}

.alignright {
  float:right;
  margin: 5px 0 20px 20px;
}

.alignleft {
  float: left;
  margin: 5px 20px 20px 0;
}

a img.alignright {
  float: right;
  margin: 5px 0 20px 20px;
}

a img.alignnone {
  margin: 5px 20px 20px 0;
}

a img.alignleft {
  float: left;
  margin: 5px 20px 20px 0;
}

a img.aligncenter {
  display: block;
  margin-left: auto;
  margin-right: auto;
}

.wp-caption {
  background: #fff;
  border: 1px solid #f0f0f0;
  max-width: 96%; /* Image does not overflow the content area */
  padding: 5px 3px 10px;
  text-align: center;
}

.wp-caption.alignnone {
  margin: 5px 20px 20px 0;
}

.wp-caption.alignleft {
  margin: 5px 20px 20px 0;
}

.wp-caption.alignright {
  margin: 5px 0 20px 20px;
}

.wp-caption img {
  border: 0 none;
  height: auto;
  margin: 0;
  max-width: 98.5%;
  padding: 0;
  width: auto;
}

.wp-caption p.wp-caption-text {
  font-size: 11px;
  line-height: 17px;
  margin: 0;
  padding: 0 4px 5px;
}

/* Text meant only for screen readers. */
.screen-reader-text {
  border: 0;
  clip: rect(1px, 1px, 1px, 1px);
  clip-path: inset(50%);
  height: 1px;
  margin: -1px;
  overflow: hidden;
  padding: 0;
  position: absolute !important;
  width: 1px;
  word-wrap: normal !important; /* Many screen reader and browser combinations announce broken words as they would appear visually. */
}

.screen-reader-text:focus {
  background-color: #eee;
  clip: auto !important;
  clip-path: none;
  color: #444;
  display: block;
  font-size: 1em;
  height: auto;
  left: 5px;
  line-height: normal;
  padding: 15px 23px 14px;
  text-decoration: none;
  top: 5px;
  width: auto;
  z-index: 100000;
  /* Above WP toolbar. */
}
```

Each Theme should have these or similar styles in its `style.css` file to be able to display images and captions properly. The exact HTML elements and class and ID values will depend on the structure of the Theme you are using.

## [模板与 CSS](#templates-and-css)

为了帮助您更深入地理解 CSS 与网页之间的关系，建议您阅读以下列表中的相关文章：

* [使用主题](https://wordpress.org/documentation/article/using-themes/) – 此列表中还包含许多进阶文章。
* [模板](https://codex.wordpress.org/Templates) – WordPress 主题与模板文章的完整列表。
* [主题开发](https://codex.wordpress.org/Theme_Development) – WordPress 主题开发指南与代码标准。

## [WordPress 布局帮助](#wordpress-layout-help)

如果您在使用 WordPress 主题或布局时遇到问题或有疑问，请首先查看主题作者的网站，看看是否有升级版本或您的问题是否有答案。以下是一些其他资源：

* [WordPress 网站设计教程](https://wordpress.org/documentation/article/wordpress-lessons/)
* [网站设计与布局](https://codex.wordpress.org/Site_Design_and_Layout) – 与 WordPress 网站设计相关的综合资源列表。
* [常见问题：布局与设计](https://codex.wordpress.org/FAQ_Layout_and_Design)

## [CSS 资源](#css-resources)

* [查找您的 CSS 样式](https://codex.wordpress.org/Finding_Your_CSS_Styles)
* [CSS 故障排除](https://codex.wordpress.org/CSS_Troubleshooting)
* [CSS 修复浏览器错误](https://codex.wordpress.org/CSS_Fixing_Browser_Bugs)
* [CSS 编码标准](https://developer.wordpress.org/coding-standards/wordpress-coding-standards/css/)
* [CSS 简写](https://codex.wordpress.org/CSS_Shorthand)
* [WordPress 开发资源#CSS](https://developer.wordpress.org/advanced-administration/resources/#CSS)
* [条件注释 CSS](https://codex.wordpress.org/Conditional_Comment_CSS)
* [验证网站](https://codex.wordpress.org/Validating_a_Website)

# 编辑文件

有时您需要编辑 WordPress 文件，特别是当您想更改 [WordPress 主题](https://wordpress.org/documentation/article/worik-with-themes/)时。WordPress 提供了一个[内置编辑器](https://developer.wordpress.org/advanced-administration/wordpress/edit-files/#using-the-theme-file-editor-and-plugin-file-editor)，允许您使用任何网络浏览器在线编辑文件。您也可以编辑复制或存储在计算机上的文件，然后使用 [FTP 客户端](https://developer.wordpress.org/advanced-administration/upgrade/ftp/)将其上传到您的网站。

在编辑任何 WordPress 文件之前，请务必执行以下操作：

* 尽可能使用备份文件的副本进行工作，并确保您频繁地[备份信息](https://developer.wordpress.org/advanced-administration/security/backup/)——在工作期间以及每次进行更改时。请记住将备份保存在安全的地方！
* 在线工作时，您需要设置适当的[文件权限](https://developer.wordpress.org/advanced-administration/server/file-permissions/)，以便修改和保存文件。如果您在 WordPress 编辑器面板底部看到一条提示，写着 *如果此文件可写，您可以编辑它…*，这意味着您需要先更改文件权限才能进行任何修改。
* 在内置插件和主题编辑器之外修改文件时，请使用[文本编辑器](https://wordpress.org/documentation/article/wordpress-glossary/#text-editor)。**强烈建议不要使用文字处理程序**。文字处理程序会将引号转换为特殊字符，有时会转换特定字符，并且还可能添加不需要的代码。这些更改可能导致文件损坏。出于类似原因，也不建议使用某些 HTML 生成器程序。

## 使用主题文件编辑器和插件文件编辑器

WordPress 内置了两个编辑器，允许您直接从浏览器编辑主题文件。它们被称为**主题文件编辑器**和**插件文件编辑器**。

请注意，根据您拥有的用户权限级别，您可能无法在博客管理面板中访问这些功能。请联系您的博客或网站管理员以调整您的权限。

### 在哪里可以找到这些编辑器？

根据您使用的主题类型，可以在以下位置找到这些编辑器：

* 如果您使用的是[区块主题](https://wordpress.org/documentation/article/block-themes/)，主题文件编辑器和插件文件编辑器都会列在“工具”菜单下。
* 如果您使用的是经典主题，主题文件编辑器会列在“外观”菜单下，而插件文件编辑器会列在“插件”菜单下。

您可以通过右侧边栏导航访问任一编辑器来查看文件。

有关编辑主题的更多信息，请参阅[主题开发者手册](https://developer.wordpress.org/themes/)。

请注意，如果您编辑的主题被更新，您的更改将被覆盖。为了更好地组织您的更改并防止其被更新覆盖，建议创建一个[子主题](https://developer.wordpress.org/themes/advanced-topics/child-themes/)来保存所有修改。

### 哪些文件可以被编辑？

以下文件类型（如果[可写](https://developer.wordpress.org/advanced-administration/server/file-permissions/)）可以在 WordPress 管理面板内置的插件编辑器中编辑：

* [HTML](https://wordpress.org/documentation/article/glossary#html)
* [PHP](https://wordpress.org/documentation/article/glossary#php)
* [CSS](https://wordpress.org/documentation/article/glossary#css)
* TXT（以及相关的类文本文件，如 RTF）

在主题编辑器中，只能编辑可写的 PHP 和 CSS 文件。

### 须知事项

#### 即时变更

使用 WordPress 编辑器对文件所做的更改是即时生效的。这些变更在线实时发生，您和网站访客将立即看到变更效果。

鉴于变更的即时性，通常更安全的做法是：离线编辑文件副本，测试副本文件，待验证无误后再上传更改。

编辑文件前，请务必确保您拥有最新的备份。

#### 编辑器功能

内置的 WordPress 插件和主题文件编辑器非常基础，允许您轻松查看和编辑网站上的插件和主题文件。请注意，这些编辑器不具备高级功能，例如搜索替换、行号显示、语法高亮或代码补全。

提示：您可以使用浏览器的内置搜索栏，在可视化编辑器中查找代码。

#### 文件权限

要使用内置的 WordPress 插件和主题编辑器编辑文件，该文件的权限必须设置为可写（至少 604）。您可以通过使用 [FTP 客户端程序](https://developer.wordpress.org/advanced-administration/upgrade/ftp/)、主机提供的基于 Web 的文件管理器，或通过 SSH（安全外壳）从[命令行](https://wordpress.org/documentation/article/glossary#shell)来[更改文件权限](https://developer.wordpress.org/advanced-administration/server/file-permissions/)。具体选项取决于您的主机提供的访问类型。

#### 操作失误？使用备份文件

编辑前请备份所有文件。如果操作失误导致错误、网站崩溃、出现空白屏幕或无法访问 WordPress 仪表盘，请删除已更改的文件，并用备份中的完好副本替换。

没有备份？从原始来源下载你编辑过文件的新副本，替换后重新开始。务必先备份。

#### 安全警告

默认情况下，任何拥有管理员权限的用户都可以访问 WordPress 插件和主题编辑器，并实时更改您网站上的任何主题或插件文件。

为防止意外操作、错误甚至黑客攻击，您可能希望禁用 WordPress 主题内编辑文件的功能。为此，只需将 [DISALLOW_FILE_EDIT](https://wordpress.org/documentation/article/editing-wp-config-php/#disable-the-plugin-and-theme-editor) 函数添加到您的 `wp-config.php` 文件中即可。

## 离线编辑文件

要离线编辑文件，你可以使用任何[推荐的文本编辑器](https://developer.wordpress.org/advanced-administration/wordpress/edit-files/#text-editors)来创建和编辑文件，并使用[FTP客户端](https://developer.wordpress.org/advanced-administration/upgrade/ftp/)上传它们。确保在浏览器中查看结果，以确认是否达到了预期的更改效果。

**注意**：不建议修改除[wp-config.php](https://wordpress.org/documentation/article/editing-wp-config-php/)之外的WordPress核心文件。如果必须修改其他文件，请记录你的更改，并将这些记录的副本存储在WordPress根目录的文本文件中。你还应该备份WordPress核心文件，以供将来参考和升级使用。

## 使用文本编辑器

### 应避免的编辑器

应避免的编辑器包括任何自助式即时网页制作软件（如 Adobe Dreamweaver）或文字处理软件（如 Google Docs 或 Microsoft Word）。

**注意：** 如果使用外部编辑器（如文字处理器）来创建和编辑文件，可能会损坏正在编辑的文件。请参阅术语表中的[文本编辑器](https://wordpress.org/documentation/article/wordpress-glossary/#text-editor)条目，了解为何应避免使用这些编辑器的简要说明。

### 文本编辑器

以下[文本编辑器](https://wordpress.org/documentation/article/wordpress-glossary/#text-editor)适用于文件编辑：

* [BBEdit](https://www.barebones.com/products/bbedit/) (Mac, 免费)
* [Crimson Editor](http://www.crimsoneditor.com/) (Windows, 免费)
* [CodeLobster](https://codelobster.com/) (Mac, Linux, Windows, 免费)
* [EditPad](https://www.editpadpro.com/) (Windows)
* [EditPlus](https://www.editplus.com/) (Windows)
* [emacs](https://www.gnu.org/software/emacs/emacs.html) (Mac, Linux, Windows) 开源, 免费
* [JEdit](https://jedit.org/) (Mac, Linux, Windows)
* [Notepad++](https://notepad-plus-plus.org/) (Windows) 开源, 免费
* [PSPad](https://www.pspad.com/) (Windows) 免费
* [Smultron](https://www.peterborgapps.com/smultron/) (Mac) $
* [SubEthaEdit](https://apps.apple.com/us/app/subethaedit/id728530824) (Mac) 开源, 免费
* [Sublime Text](https://www.sublimetext.com/) (Mac, Linux, Windows) $
* [TextMate](https://macromates.com/) (Mac) $
* [TextPad](https://www.textpad.com/home) (Windows)
* [UltraEdit-32](https://www.ultraedit.com/) (Mac, Linux, Windows) $
* [vim](https://www.vim.org/) (Mac, Linux, Windows) 开源, 免费
* [Visual Studio Code](https://code.visualstudio.com/) (Mac, Linux, Windows)
* [NetBeans](https://netbeans.apache.org/) (Mac, Linux, Windows)

# WordPress 订阅源

## WordPress 内置订阅源 {#wordpress-built-in-feeds}

默认情况下，WordPress 提供多种订阅源。它们通过 [bloginfo()](https://developer.wordpress.org/reference/functions/bloginfo/) 模板标签为每种订阅源类型生成，通常列在大多数 WordPress 主题的侧边栏和/或页脚中。它们看起来像这样：

[RDF/RSS 1.0 订阅源](https://web.resource.org/rss/1.0/) 的 URL

```
<?php bloginfo('rdf_url'); ?>
```

[RSS 0.92 订阅源](https://www.rssboard.org/rss-0-9-2) 的 URL

```
<?php bloginfo('rss_url'); ?>
```

[RSS 2.0 订阅源](https://www.rssboard.org/rss-specification) 的 URL

```
<?php bloginfo('rss2_url'); ?>
```

[Atom 订阅源](http://www.atomenabled.org/) 的 URL

```
<?php bloginfo('atom_url'); ?>
```

评论 RSS 2.0 订阅源的 URL

```
<?php bloginfo('comments_rss2_url'); ?>
```

前四个订阅源为不同的订阅阅读器显示您网站内容的最新更新和更改。其中，RSS 订阅源最为知名。最后一个订阅源示例供 RSS 2.0 订阅阅读器使用，不显示您网站的内容，仅显示您网站上的评论。

要跟踪特定文章的评论，可以在单篇文章页面上使用 [post_comments_feed_link()](https://developer.wordpress.org/reference/functions/post_comments_feed_link/) 模板标签，如下所示：

```
<?php post_comments_feed_link('RSS 2.0'); ?>
```

有多种方法可以修改这些订阅源，这些内容在 [自定义订阅源](https://codex.wordpress.org/Customizing_Feeds) 一文中有所介绍。

## 添加订阅源 {#adding-feeds}

并非所有 WordPress 主题都包含 WordPress 提供的所有 RSS 订阅源类型。要向您的网站添加订阅源，请先找到其他订阅源的位置，通常在您主题的 sidebar.php 或 footer.php 模板文件中。然后将上述列出的标签之一添加到列表中，如下例所示：

```
<ul class="feeds">
  <li><a href="<?php bloginfo('rss2_url'); ?>" title="<?php _e('Syndicate this site using RSS'); ?>"><?php _e('<abbr title="Really Simple Syndication">RSS</abbr>'); ?></a></li>
  <li><a href="<?php bloginfo('atom_url'); ?>" title="<?php _e('Syndicate this site using Atom'); ?>"><?php _e('Atom'); ?></a></li>
  <li><a href="<?php bloginfo('comments_rss2_url'); ?>" title="<?php _e('The latest comments to all posts in RSS'); ?>"><?php _e('Comments <abbr title="Really Simple Syndication">RSS</abbr>'); ?></a></li>
</ul>
```

### 为订阅链接添加图形标识 {#adding-graphics-to-feed-links}

许多人喜欢用图形而非文字来表示订阅源。目前已有这类图形或“按钮”的[标准规范](http://www.feedicons.com/)，但您也可以[自行制作](https://kalsey.com/tools/buttonmaker/)以匹配网站的外观和配色。![](https://wordpress.org/documentation/files/2019/03/rssfeed.gif)

要为订阅链接添加图形标识，只需将链接包裹在图形标签外，例如：

```
<a href="<?php bloginfo('rss2_url'); ?>" title="<?php _e('Syndicate this site using RSS'); ?>"><img src="https://example.com/images/feed-icon-14x14.png" alt="RSS Feed" title="RSS Feed"></a>
```

### 更改地址 {#changing-addresses}

如果您当前正在使用其他网志软件并打算切换到 WordPress，或者正在将您的网志迁移到新位置，您可以通过在 `.htaccess` 文件中使用文件重写和重定向来将 RSS 阅读器“转发”到您的新 RSS 源。

编辑您根目录中的 `.htaccess` 文件；如果文件不存在，请创建一个。

以下是一个 b2 源的示例：

```
RewriteRule ^b2rss2.php(.*)? /wordpress/?feed=rss2 [QSA]
```

以下是一个 MovableType 用户的示例：

```
RewriteRule ^index.xml(.*)? /wordpress/?feed=rss2 [QSA]
```

# 导入内容

使用 WordPress 导入工具，您可以将内容从另一个 WordPress 站点或其他发布系统导入到您的站点。

您可以在 WordPress [管理屏幕](https://wordpress.org/documentation/article/administration-screens/)左侧导航栏的 [工具](https://wordpress.org/documentation/article/administration-screens/#tools-managing-your-blog) -> [导入](https://wordpress.org/documentation/article/tools-import-screen/) 下找到此处描述的许多导入器。

您还可以从管理屏幕所列系统之外的发布系统导入内容。每个系统的操作步骤不同，因此请根据需要参考以下列出的步骤和插件。如果您是 WordPress 新手，请查看 [WordPress 功能](https://wordpress.org/about/features/) 和 [使用 WordPress](https://codex.wordpress.org/Working%20with%20WordPress) 页面以开始使用。

如果遇到问题，请在 [WordPress 支持论坛](https://wordpress.org/support/forums/) 中搜索解决方案，或尝试查看 [常见问题解答](https://wordpress.org/documentation/article/faq-work-with-wordpress/)。

## 导入前注意事项

如果导入的文件过大，服务器可能在导入时内存耗尽。若发生这种情况，您将看到类似“致命错误：允许的 8388608 字节内存大小已耗尽”的错误提示。

若您拥有服务器足够权限，可通过编辑 `php.ini` 文件来增加可用内存。或者，也可联系托管服务提供商协助处理。否则，您可以将导入文件拆分为多个较小文件分别导入。

若导入过程失败，仍可能已创建部分内容。当您解决问题后重新尝试时，可能会产生重复数据。请在导入失败后检查网站，必要时删除相关记录以避免此问题。

## b2evolution

有两种方法可以将 b2evolution 内容导入 WordPress。

* **Movable Type 导出格式**：您可以重新设计 b2evolution 博客的皮肤，使其在查看源代码时显示为 [Movable Type 导出格式](https://movabletype.org/documentation/appendices/import-export-format.html)。您可以保存导出文件并将其作为 Movable Type 数据导入。请参阅 Movable Type 和 TypePad。
* **BIMP 导入脚本**：您可以使用 [BIMP 导入脚本](https://wittyfinch.com/bimp-importer-migrate-b2evolution-to-wordpress/) 将 b2evolution 的博客、分类、文章、评论、文件和用户导入您的 WordPress 安装（v3 及以上版本）。请注意，此服务需要付费。

## Blogger

您可以从 Blogger 导入文章、评论、分类和作者。WordPress 包含一个专门用于从 Blogger 导入内容的导入工具。

1. 将您的 Blogger 内容导出为 XML 文件。
2. 在您的 WordPress 站点中，于管理屏幕左侧导航栏选择 工具 -> 导入。
3. 在 "Blogger" 下，如果您尚未安装 Blogger 导入器，请点击 "立即安装"。
4. 点击 "运行导入器" 链接。
5. 点击 "选择文件" 并找到您的 Blogger XML 文件。
6. 点击 "上传文件并导入"。

## Drupal

有多种资源可帮助您将内容从 Drupal 迁移到 WordPress。这里重点介绍几种，您可能还会在网上搜索到许多其他工具。

* [FG Drupal to WordPress](https://wordpress.org/plugins/fg-drupal-to-wp/)。兼容 Drupal 4、5、6、7、8 和 9。
* [Drupal2WordPress Plugin](https://github.com/jpSimkins/Drupal2WordPress-Plugin)。使用此插件可导入分类、内容、媒体、评论和用户。您 Drupal 站点中包含的任何外部图像都可以获取并添加到媒体库，并添加到您的页面和文章中。
* [Drupal to WordPress migration SQL queries explained](https://anothercoffee.net/drupal-to-wordpress-migration-sql-queries-explained/) 包含针对某些迁移问题（如重复分类、分类超过最大字符长度和重复 URL 别名）的解决方案。

## XML 与 CSV

以下资源可帮助您将 XML 或 CSV 内容导入 WordPress。

* [WP All Import](https://wordpress.org/plugins/wp-all-import/) 插件可导入任何 XML 或 CSV 文件，并与 [WP All Export](https://wordpress.org/plugins/wp-all-export/) 插件集成。

## Joomla

对于 Joomla，您可以使用 [FG Joomla to WordPress](https://wordpress.org/plugins/fg-joomla-to-wordpress/)。该插件已在大型数据库上通过 Joomla 1.5 至 4.0 版本测试，并兼容多站点安装。

## LiveJournal

WordPress 包含一个专门用于从 LiveJournal 导入内容的导入工具。

1. 在您的 WordPress 站点中，于管理屏幕左侧导航栏选择 工具 -> 导入。
2. 在 "LiveJournal" 下，如果您尚未安装 LiveJournal 导入器，请点击 "立即安装"。
3. 点击 "运行导入器" 链接。
4. 输入您的 LiveJournal 用户名和密码，然后点击 "连接到 LiveJournal 并导入"。

## Live Space

请参阅 [Live Space Mover](https://b2.broom9.com/?page_id=519) 了解如何使用 Python 脚本将博客文章从 Live Space 导入到 WordPress。

## Magento

[FG Magento to WooCommerce](https://wordpress.org/plugins/fg-magento-to-woocommerce/) 插件可将您的 Magento 产品和 CMS 页面迁移到 WooCommerce。

## Mambo

您可以使用插件 [FG Joomla to WordPress](https://wordpress.org/plugins/fg-joomla-to-wordpress/)。此 WordPress 插件适用于 Mambo 4.5 和 4.6。

## Movable Type 和 TypePad

WordPress 包含一个专门用于从 Movable Type 和 TypePad 导入内容的导入工具。

1. 在您的 WordPress 站点中，于管理屏幕左侧导航栏选择工具 -> 导入。
2. 在“Movable Type 和 TypePad”下，如果您尚未安装导入器，请点击“立即安装”。
3. 点击“运行导入器”链接。
4. 点击“选择文件”并导航到您的导出文件。
5. 点击“上传文件并导入”。

以下文章提供了有关此过程的更多信息：

* [从 Movable Type 导入到 WordPress](https://codex.wordpress.org/Importing%20from%20Movable%20Type%20to%20WordPress)
* [导入和导出内容](https://www.movabletype.org/documentation/administrator/maintenance/import-export.html)
* [关于大规模 WordPress 迁移的注意事项](https://blog.birdhouse.org/2008/02/07/notes-on-a-massive-wordpress-migration/)

## Nucleus CMS

以下资源可帮助您将内容从 Nucleus CMS 迁移到 WordPress。

* [从 Nucleus CMS 导入指南](https://mamchenkov.net/wordpress/2005/04/26/nucleus2wordpress/)
* [从 Nucleus CMS 导入的脚本](http://james.onegoodcookie.com/pub/import-nucleus.phps)
* [Nucleus 转 WordPress](https://github.com/AbdussamadA/nucleus-importer)

## PrestaShop

[FG PrestaShop to WooCommerce](https://wordpress.org/plugins/fg-prestashop-to-woocommerce/)。此 WordPress 插件兼容 PrestaShop 1.0 至 1.7 版本。

## Roller

参见 [从 Roller 导入](https://codex.wordpress.org/Importing%20From%20Roller)。

另请参阅 [将 Roller 博客迁移到 WordPress](https://nullpointer.debashish.com/migrating-a-roller-blog-to-wordpress)。

## RSS

WordPress 内置了一个专门用于从 RSS 导入内容的工具。

1.  在您的 WordPress 站点后台，从左侧导航栏选择 工具 -> 导入。
2.   在“RSS”下方，如果您尚未安装导入器，请点击“立即安装”。
3.   点击“运行导入器”链接。
4.   点击“选择文件”并找到您的 XML 文件。
5.   点击“上传文件并导入”。

## 机缘巧合

* [从 Serendipity 迁移到 WordPress – 文章导入](https://obviate.io/2010/06/11/serendipity-to-wordpress-post-import/).

## SPIP

插件 [FG SPIP to WordPress](https://wordpress.org/plugins/fg-spip-to-wp/) 可将分类、文章、新闻和图片从 SPIP 迁移到 WordPress。它已在 SPIP 1.8、1.9、2.0、3.0、3.1 和 3.2 版本上测试通过，并兼容多站点安装。

## Sunlog

1. 打开 [phpMyAdmin](https://developer.wordpress.org/advanced-administration/upgrade/phpmyadmin/) 查看您 Sunlog 安装的数据库。您只需要两个表："blogname_entries" 和 "blogname_comments"。
2. 使用 phpMyAdmin 将这两个表导出为 XML 文件。
3. 在您的 WordPress 站点上安装 [WP All Import](https://wordpress.org/plugins/wp-all-import/) 插件。
4. 创建以下字段映射：
  * `headline=title`
  * `content=entry+more`
  * `date=timestamp`（使用 Unix 时间戳格式）
  * `categories="cat,"`（每个值用分号分隔）。

## Textpattern

* [修复 Textpattern 导入](https://wordpress.org/support/topic/fix-textpattern-import/)
* [Textpattern 到 WordPress 导出工具](https://github.com/drewm/textpattern-to-wordpress)

## Tumblr

WordPress 包含一个专门为从 Tumblr 导入内容而设计的导入工具。

1.  在您的 WordPress 站点中，在管理屏幕的左侧导航栏选择 工具 -> 导入。
2.  在 "Tumblr" 下，如果您尚未安装导入器，请点击 "立即安装"。
3.  点击 "运行导入器" 链接。
4.  点击 "选择文件" 并导航到您的导出文件。
5.  点击 "上传文件并导入"。
6.  在 Tumblr 上创建一个应用程序，为您的博客和 Tumblr 服务器之间提供连接点。
7.  复制并粘贴 "OAuth Consumer Key" 和 "Secret Key"。
8.  点击 "连接到 Tumblr"。

## Twitter

有多种插件可将您的推文导入 WordPress，例如 [将您的 Twitter 时间线导入 WordPress](https://blog.birdhouse.org/2008/08/17/get-your-twitter-timeline-into-wordpress/)。

## TypePad

请参阅 [Movable Type 和 TypePad](#movable-type-and-typepad)。

## WooCommerce 产品 (CSV)

如果您已安装 WooCommerce 插件，此导入器将已安装。点击“运行导入器”以上传 CSV 文件。

## WooCommerce 税率（CSV）

如果您已安装 WooCommerce 插件，此导入工具将自动安装。点击“运行导入工具”上传 CSV 文件。

## WordPress

WordPress 包含一个专门用于从其他 WordPress 博客导入内容的工具。

1.  在您的 WordPress 站点中，于管理界面左侧导航栏选择 工具 -> 导入。
2.  在“WordPress”下方，如果您尚未安装导入工具，请点击“立即安装”。
3.  点击“运行导入工具”链接。
4.  点击“选择文件”，然后导航至从源站点导出的 WXR 文件。
5.  点击“上传文件并导入”。

系统将首先要求您将此导出文件中的作者映射到博客中的用户。对于每位作者，您可以选择映射到博客中的现有用户或创建新用户。然后，WordPress 会将上传文件中包含的每篇文章、评论和分类导入您的博客。此外，您可以通过勾选“下载并导入文件附件”选项来导入附件。

## Xanga

[xanga.r](https://www.timwylie.com/xword.html) 是一个解析 Xanga 页面以获取帖子和评论的程序。然后，它可以将其输出为 WordPress RSS 2.0 XML 格式，供 WordPress 导入。

# 回环

回环是指您自己的服务器或网站尝试连接到自身。

WordPress 使用此功能来触发定时发布文章，以及插件或主题可能引入的其他定时事件。

在插件或主题编辑器中修改时也会用到回环，通过重新连接到网站来确保所做的更改不会破坏您的网站。

## 排查回环问题 {#troubleshooting-loopback-issues}

如果您遇到定时发布文章或其他定时事件无法运行的问题，或者看到关于回环失败的站点健康警告，您可能需要排查这些问题。

回环失败最常见的原因是插件或主题冲突，您应该首先按照常规的故障排除步骤操作：

## 常见故障排除步骤 {#common-troubleshooting-steps}

* **停用所有插件**（是的，所有插件）以查看是否解决了问题。如果有效，请逐个重新激活插件，直到找到有问题的插件。如果无法进入管理后台，请尝试通过 [SFTP/FTP](https://developer.wordpress.org/advanced-administration/upgrade/ftp/) 或 phpMyAdmin 重置插件文件夹（如果需要帮助，请阅读[无法登录 wp-admin 时如何停用所有插件](https://wordpress.org/documentation/article/faq-troubleshooting/)）。有时，看似未激活的插件仍可能导致问题。同时请记得停用 `mu-plugins` 文件夹中的任何插件。最简单的方法是将该文件夹重命名为 `mu-plugins-old`。
* 切换到 Twenty-Something 主题以排除特定主题的问题。如果无法登录更改主题，可以通过 [SFTP/FTP](https://developer.wordpress.org/advanced-administration/upgrade/ftp/) 删除主题文件夹，只保留 `twentytwentythree`。这将强制您的网站使用该主题。
* 如果可以安装插件，请安装 [Health Check](https://wordpress.org/plugins/health-check/) 插件。在故障排除选项卡中，您可以点击按钮来禁用所有插件并为您更改主题，同时您仍保持登录状态，**且不会影响网站的正常访客**。

# 多语言 WordPress

WordPress 当前并不原生支持双语或多语言博客。不过，WordPress 社区开发的插件使得创建多语言博客变得简单。WordPress Gutenberg 项目的第四阶段也是最后阶段，将为核心添加多语言站点支持，具体内容已列入 [WordPress 路线图](https://wordpress.org/about/roadmap/)。

创建多语言博客，本质上是安装多个语言版本的 WordPress，并让插件在它们之间切换。这包括安装 .mo 语言文件，大多数插件会要求您手动完成此操作。更多详情，请参阅[以您的语言安装 WordPress](https://developer.wordpress.org/advanced-administration/before-install/in-your-language/)。

## 多语言插件的不同类型 {#different-types-of-multilingual-plugins}

多语言插件主要有以下几种基本类型：

1. 每种语言使用单独的文章来管理多语言内容，然后将翻译版本相互链接，表明一篇文章是另一篇的翻译。
2. 将每种语言的文章变体都存储在同一篇文章中。
3. 在生成的页面上管理翻译，而不是在文章上下文中处理。
4. 通过相互引用，将网络（多站点）安装中不同语言的独立 WordPress 站点链接在一起。

### 每篇文章一种语言 {#one-language-per-post}

支持多语言的插件若采用每篇文章对应一种语言的方案，会允许用户选择文章的语言，并将翻译内容作为新文章添加（页面、标签和分类同理）。

随后，同一内容的不同版本会被链接在一起，形成翻译组。这种分组方式使用户能够切换显示语言。

优点：

1. 文章在数据库中的内容保持不变（易于安装和卸载）。
2. 默认情况下所有内容都会被翻译。如果文章包含自定义字段，这些字段会附加到该文章上，因此它们已与语言关联。
3. 部分插件会使用可本地化主题自带的语言文件（.mo）来翻译主题显示的术语。在 WordPress 中，本地化基于 [GNU gettext](https://make.wordpress.org/polyglots/handbook/#Localization_Technology) 技术。因此，当单篇文章为法语时，插件会将主题的所有术语切换为同一语言（此处为法语）。这些文件可以补充网站特有的术语（分类标题、小工具、链接等）。无需全部重新翻译，只需添加特定术语及其目标语言翻译即可。
4. 其他分析内容的插件（如相关文章推荐）仍能正常工作。

缺点：

1. 架构更复杂。插件需要挂钩到许多 WordPress 函数并进行过滤，以确保仅返回与语言匹配的内容。
2. 部分插件需要额外的数据表——通常用于存储翻译分组信息。较新的插件可能改用自定义分类法或文章元字段。
3. 可能导致数据库过度增长并拖慢性能。例如，一个拥有 10 万种产品的 WooCommerce 网站在翻译成 5 种语言后，将产生 50 万条记录。所有产品元数据（每个产品可能有数十个，临时数据也会被复制）都会重复存储，数据库可能变得非常庞大。

### 单篇文章包含所有语言 {#all-languages-in-a-single-post}

在同一篇文章中存储所有语言内容的多语言插件，使用语言元标签来区分不同语言的内容。当文章显示时，会先进行处理，只保留当前激活语言的内容。

优点：

1. 易于实现并排编辑。
2. 出错可能性更低。没有额外的数据表，WordPress 中需要修改的内容也更少。
3. 无论使用哪种语言的关键词进行搜索，都能找到同一篇文章。
4. 数据库中的记录数量保持不变。

缺点：

1. 卸载可能比较复杂，因为需要从数据库中清理多语言内容。
2. 文章固定链接可能无法翻译。

### 管理生成页面的翻译 {#manage-translations-on-the-generated-page}

多语言插件利用 WordPress 生成的内容页面，并在这些页面上执行翻译。当任何页面在 WordPress 上显示时，插件（无论是离线还是在线）会尝试使用机器翻译创建该页面的翻译版本。之后，该翻译可以手动更改或修改。

优点：

1. 安装简单，并提供页面上任何内容的翻译。
2. 可以轻松编辑翻译。

缺点：

1. 自动翻译效果不够好，网站上的页面可能翻译得很差。
2. 内容与翻译之间存在强耦合，原始内容的更改可能会破坏翻译。

### 将您导向外部翻译服务的插件 {#plugins-that-direct-you-to-external-translation-services}

这类多语言插件通常用于创建一个小组件，该组件为使用在线翻译服务（如 Google 翻译）提供快捷方式。内容由第三方引擎按需自动翻译。

优点：

1.  安装简单，并提供页面上任何内容的翻译。
2.  翻译过程是自动化的这一点非常明确，因此用户的期望值会降低。

缺点：

1.  自动翻译质量不够好，网站上的页面可能翻译得很差。
2.  由于无法修改翻译，这些插件限制了内容发布者提供高质量翻译内容的能力。

### 每种语言使用独立的 WordPress 安装 {#each-language-in-its-own-wordpress-installation}

为每种需要翻译的语言创建独立站点（例如在 [WordPress 多站点](https://developer.wordpress.org/advanced-administration/multisite/create-network/) 安装中）。所有站点需运行相同的主题和插件。当翻译保存时，源文章会收到翻译文章的关联通知，系统会通过独立数据表维护翻译关系。

优势：

1. 每个语言站点都是标准的 WordPress 安装，使用常规文章格式（翻译数据通过文章元数据和外部数据库存储）
2. 停用插件后内容仍可正常使用，仅失去与源文章/翻译的关联信息

劣势：

1. 独立站点会增加管理需求，这可能带来不便

## 语言协商 {#language-negotiation}

语言协商是指如何确定用户查看网站时使用的语言。

无论采用何种存储多语言内容的解决方案，多语言插件也需要能够选择显示哪种语言。

通常，URL 会指示显示语言。编码语言信息的不同 URL 策略包括：

* 将语言名称作为参数添加：example.com/?lang=en 或 example.com/?lang=es
* 添加虚拟“目录”作为语言名称：example.com/en/ 或 example.com/es/
* 对不同语言使用不同的域名：www.example.com 或 es.example.com

## 如何选择正确的多语言解决方案 {#how-to-choose-the-right-multilingual-solution}

为您的需求选择最合适的多语言插件需要一些时间。请查看 [WordPress 插件目录](https://wordpress.org/plugins/search/multilingual) 以获取多语言插件列表。

没有唯一的方法，只有适应内容策略、数据模型、文章和页面数量以及访客预期行为/体验的方法。对于 WordPress 网络（多站点），还需要具备良好的服务器管理知识。

无论如何，安装多语言插件对任何网站来说都是一项重大变更。最好先创建一个测试站点，验证所有必需的插件与主题之间一切运行正常，然后再进行安装。

由于许多多语言插件会显著改变数据库，因此在尝试前需要进行[数据库备份](https://developer.wordpress.org/advanced-administration/security/backup/database/)。

## 相关 {#related}

* [WordPress 本地化版本](https://developer.wordpress.org/advanced-administration/before-install/in-your-language/)

# oEmbed

简易嵌入功能主要由 oEmbed 协议驱动，该协议允许消费者（如您的博客）向提供者（如 YouTube）请求嵌入内容所需的 HTML。

oEmbed 旨在避免从托管您希望嵌入的媒体网站复制粘贴 HTML。它支持不同类型的内容，如视频、图像、文本等。

## 这适用于任何 URL 吗？

不，默认情况下不行。出于安全原因，WordPress 核心有一个[内部白名单](https://developer.wordpress.org/reference/hooks/oembed_providers/)，仅允许特定 URL 可嵌入。好消息是白名单可以修改，可以通过注册其句柄来添加新的网站和 URL。

## 如何添加或更改对网站的支持？

添加对额外网站的支持取决于该网站是否支持 oEmbed。[oEmbed.com](https://oembed.com/) 提供了数百个[支持的提供者](https://oembed.com/providers.json)的列表。

### 添加对支持 oEmbed 的网站的支持

如果网站支持 oEmbed，您需要调用 [`wp_oembed_add_provider()`](https://developer.wordpress.org/reference/functions/wp_oembed_add_provider/) 将网站和 URL 格式添加到内部白名单。

### 添加对不支持 oEmbed 的网站的支持

您需要使用 [`wp_embed_register_handler()`](https://developer.wordpress.org/reference/functions/wp_embed_register_handler/) 注册一个处理程序，并提供一个生成 HTML 的回调函数。

### 移除对支持 oEmbed 的网站的支持

如果您希望移除一个支持 oEmbed 的提供者，您需要调用 [`wp_oembed_remove_provider`](https://developer.wordpress.org/reference/functions/wp_oembed_remove_provider/)。

## oEmbed 发现功能呢？

自 4.4 版本起，WordPress 支持 oEmbed 发现，但对可通过非白名单网站嵌入的内容类型有严格限制。

具体来说，HTML 和视频内容被过滤为仅允许链接、块引用和 iframe，并且这些内容还会被额外过滤以防止恶意内容的插入。然后，HTML 会被修改以进行沙盒化，并对其施加额外的安全限制。

但是，如果您认为自己足够了解，不需要这种级别的安全性，您可以授予 `unfiltered_html` 用户（管理员和编辑者）从在其 `<head>` 中包含 oEmbed 发现标签的网站嵌入内容的能力。

对于“链接”和“照片”类型的 oEmbed 发现内容，过滤方式并不那么严格；然而，出于安全考虑并防止任何恶意内容在网站上显示，它会进行适当的转义。

# 文章格式

## 简介

**文章格式**是随 [3.1 版本](https://wordpress.org/documentation/wordpress-version/version-3-1/)引入的一项[主题功能](https://codex.wordpress.org/Theme_Features)。文章格式是一种元信息，主题可利用它来自定义文章的呈现方式。文章格式功能提供了一个标准化的格式列表，所有支持此功能的主题均可使用。主题无需支持列表中的所有格式。新格式不能由主题甚至插件引入。该列表的标准化既保证了众多主题间的兼容性，也为外部博客工具提供了一致访问此功能的途径。

简而言之，使用支持文章格式的主题时，博主可通过单选按钮列表选择文章格式，从而改变每篇文章的显示效果。

以**日志**为例，过去需要创建一个名为“日志”的分类，将文章分配至该分类，然后基于 [post_class()](https://developer.wordpress.org/reference/functions/post_class/) 或 [in_category('asides')](https://developer.wordpress.org/reference/functions/in_category/) 的样式规则进行差异化显示。通过**文章格式**，新方法允许主题添加对文章格式的支持（例如 [add_theme_support('post-formats', array('aside'))](https://developer.wordpress.org/reference/functions/add_theme_support/)），随后在保存文章时即可通过发布元框选择文章格式。可通过调用 [get_post_format($post->ID)](https://developer.wordpress.org/reference/functions/get_post_format/) 函数确定格式，且 [post_class()](https://developer.wordpress.org/reference/functions/post_class/) 还会生成“format-asides”类，以便进行纯 CSS 样式设计。

## 支持的格式

如果主题启用了支持，用户可以选择以下文章格式。

请注意，虽然实际的文章内容输入不会改变，但主题可以根据用户选择的格式，使用此选择以不同方式显示文章。例如，主题可以不为“状态”文章显示标题。具体如何显示完全由主题决定，但以下是一些通用指南。

* **aside（日志）**：通常不显示标题。类似于 Facebook 的笔记更新。
* **gallery（相册）**：一个图片库。文章可能包含一个相册短代码，并附有图片附件。
* **link（链接）**：指向另一个网站的链接。主题可能希望使用文章内容中的第一个 `<a href="">` 标签作为该文章的外部链接。另一种方法是，如果文章仅包含一个 URL，则该 URL 将成为链接地址，而标题 (`post_title`) 将成为该链接锚点的名称。
* **image（图像）**：单张图片。文章中的第一个 `<img>` 标签可被视为图片。或者，如果文章仅包含一个 URL，则该 URL 将成为图片地址，文章标题 (`post_title`) 将成为图片的标题属性。
* **quote（引语）**：一段引文。可能包含一个包含引文内容的块引用。或者，引文可能只是内容，而来源/作者作为标题。
* **status（状态）**：简短的状态更新，类似于 Twitter 的状态更新。
* **video（视频）**：单个视频或视频播放列表。文章内容中的第一个 `<video>` 标签或 object/embed 可被视为视频。或者，如果文章仅包含一个 URL，则该 URL 将成为视频地址。如果博客启用了视频支持（例如通过插件），也可能包含作为文章附件的视频。
* **audio（音频）**：音频文件或播放列表。可用于播客。
* **chat（聊天）**：聊天记录，例如：
```
John: foo
Mary: bar
John: foo 2
```

注意：在撰写或编辑文章时，“标准”用于表示未指定文章格式。此外，如果指定的格式无效，则将使用标准（无格式）。

## 函数参考

**主要函数**：[set_post_format()](https://developer.wordpress.org/reference/functions/set_post_format/)、[get_post_format()](https://developer.wordpress.org/reference/functions/get_post_format/)、[has_post_format()](https://developer.wordpress.org/reference/functions/has_post_format/)。

**其他函数**：[get_post_format_link()](https://developer.wordpress.org/reference/functions/get_post_format_link/)、[get_post_format_string()](https://developer.wordpress.org/reference/functions/get_post_format_string/)。

## 添加主题支持

主题需要在 _functions.php_ 文件中使用 [add_theme_support()](https://developer.wordpress.org/reference/functions/add_theme_support/) 函数，通过传递格式数组来告知 WordPress 支持哪些文章格式，例如：

```
add_theme_support( 'post-formats', array( 'aside', 'gallery' ) );
```

请注意，必须在 [init](https://developer.wordpress.org/reference/hooks/init/) 钩子被调用之前执行此操作！推荐使用 [after_setup_theme](https://developer.wordpress.org/reference/hooks/after_setup_theme/) 钩子。

## 添加文章类型支持

文章类型需要在 _functions.php_ 文件中使用 [add_post_type_support()](https://developer.wordpress.org/reference/functions/add_post_type_support/) 来告知 WordPress 支持哪些文章格式：

```
// 为文章类型 'page' 添加文章格式支持
add_post_type_support( 'page', 'post-formats' );
```

下一个示例注册了自定义文章类型 `my_custom_post_type`，并添加了文章格式支持。

```
// 注册自定义文章类型 'my_custom_post_type'
add_action( 'init', 'create_my_post_type' );
function create_my_post_type() {
  register_post_type( 'my_custom_post_type',
    array(
      'labels' => array( 'name' => __( 'Products' ) ),
      'public' => true
    )
  );
}

// 为文章类型 'my_custom_post_type' 添加文章格式支持
add_post_type_support( 'my_custom_post_type', 'post-formats' );
```

或者，在函数 [register_post_type()](https://developer.wordpress.org/reference/functions/register_post_type/) 中，将 `post-formats` 添加到 `supports` 参数数组中。下一个示例与上一个等效。

```
// 使用 'supports' 参数注册自定义文章类型 'my_custom_post_type'
add_action( 'init', 'create_my_post_type' );
function create_my_post_type() {
  register_post_type( 'my_custom_post_type',
    array(
      'labels' => array( 'name' => __( 'Products' ) ),
      'public' => true,
      'supports' => array('title', 'editor', 'post-formats')
    )
  );
}
```

## 使用文章格式

在主题中，使用 [get_post_format()](https://developer.wordpress.org/reference/functions/get_post_format/) 来检查文章的格式，并相应地改变其呈现方式。请注意，使用默认格式的文章将返回 FALSE 值。或者使用 [has_post_format()](https://developer.wordpress.org/reference/functions/has_post_format/) [条件标签](https://codex.wordpress.org/Conditional_Tags)：

```
if ( has_post_format( 'video' )) {
  echo 'this is the video format';
}
```

另一种使用格式的方式是通过样式规则。主题应在包裹文章的包装代码中使用 [post_class()](https://developer.wordpress.org/reference/functions/post_class/) 函数来添加动态样式类。文章格式会以这种方式添加额外的类，使用 "format-foo" 这样的命名。

例如，可以通过在主题的样式表中添加以下代码，来隐藏状态格式文章的标题：

```
.format-status .post-title {
  display:none;
}
```

### 推荐样式

虽然你可以按需自定义格式的显示样式，但根据现代使用惯例，每种格式都有其适合的"风格"。牢记每种格式的预期用途很重要，这有助于读者直观地将其识别为特定类型的内容。

例如，旁注、链接和状态格式通常不显示标题或作者信息。它们简洁、短小且次要。旁注可能包含一两个段落，而链接可能只是一句带URL链接的话。链接和旁注可能包含指向单篇文章页面的链接（使用[the_permalink()](https://developer.wordpress.org/reference/functions/the_permalink/)）从而允许评论，但状态格式很可能没有此类链接。

另一方面，图片文章通常只包含单张图片，可配说明文字。音频/视频文章类似但包含音视频内容。这三种格式都可以使用插件或标准[嵌入功能](https://wordpress.org/documentation/article/embeds/)来显示内容。它们也可能不显示标题和作者信息，因为内容本身已能说明问题。

引用格式特别适合展示不带额外信息的简单引述。如果将引文放在文章内容中，将被引用者姓名设为文章标题，就可以将[the_content()](https://developer.wordpress.org/reference/functions/the_content/)重新设计为引用块样式单独显示，并用[the_title()](https://developer.wordpress.org/reference/functions/the_title/)将被引用者姓名显示为署名行。

聊天记录尤其适合等宽字体显示。通过对`.format-chat`添加样式，可以用等宽字体显示文章内容（例如置于灰色背景div中），从而在视觉上将其区分为聊天会话。

### 子主题中的文章格式

[子主题](https://developer.wordpress.org/themes/advanced-topics/child-themes/)会继承父主题定义的文章格式。在子主题中调用 [add_theme_support()](https://developer.wordpress.org/reference/functions/add_theme_support/) 来设置文章格式时，必须使用比父主题更高的优先级，并且会**覆盖**现有列表，而非追加到其中。

```
add_action( 'after_setup_theme', 'childtheme_formats', 11 );
function childtheme_formats() {
  add_theme_support( 'post-formats', array( 'aside', 'gallery', 'link' ) );
}
```

调用 [remove_theme_support('post-formats')](https://developer.wordpress.org/reference/functions/remove_theme_support/) 则会完全移除文章格式支持。

## 向后兼容性

如果您的插件或主题需要与早期版本的 WordPress 兼容，您需要向 `post_format` 分类法添加名为 `post-format-$format` 的术语。例如，

```
wp_insert_term( 'post-format-aside', 'post_format' );
```

您还必须使用 [register_taxonomy()](https://developer.wordpress.org/reference/functions/register_taxonomy/) 注册 `post_format` 分类法。

## 源文件

* [wp-includes/post-formats.php](https://core.trac.wordpress.org/browser/tags/4.4.2/src/wp-includes/post-formats.php#L0)

## 外部资源

* [使用 WordPress 自定义文章格式样式化聊天记录](https://www.narga.net/styling-wordpress-chat-transcript/)
* [文章类型、格式与分类法，我的天！](http://ottopress.com/2010/post-types-and-formats-and-taxonomies-oh-my/)
* [论标准化的文章格式](https://nacin.com/2011/01/27/on-standardized-post-formats/)
* [文章格式 vs. 文章类型](https://markjaquith.wordpress.com/2010/11/12/post-formats-vs-custom-post-types/)
* [更智能的文章格式？](https://dougal.gunters.org/blog/2010/12/10/smarter-post-formats/)
* [WordPress 主题支持生成器](https://generatewp.com/theme-support/)

# 站点架构 (v1.5)

以下是对 WordPress 1.5 通用站点架构的描述。鼓励但不强制 WordPress 主题开发者沿用 XHTML 标签和 CSS 选择器的核心站点架构。因此，您可以将其视为通用大纲，因为您的主题可能有所不同。

## 模板驱动页面

在深入了解 WordPress 页面架构的[核心结构](#Core_Structure)之前，您需要理解 WordPress 使用[模板文件](https://codex.wordpress.org/Templates)来生成最终页面的"外观"和内容。例如，当您查看 WordPress 网站的前端页面时，实际上看到的是多个模板文件的组合：

* index.php
* header.php
* sidebar.php
* footer.php

当您查看单篇文章页面时，可能涉及以下模板文件：

* single.php
* header.php
* sidebar.php
* footer.php
* comments.php

在分类、归档和搜索等多文章页面中，您可能看到以下模板文件的任意组合：

* index.php
* category.php
* 404.php
* search.php
* header.php
* sidebar.php
* footer.php

在接下来的架构规范中，我们将尽可能明确指定哪些 CSS 选择器属于哪些模板文件。

## 核心结构

WordPress 网站的核心结构代表了承载页面内容的主要容器。一个 WordPress 网站的核心结构至少包含：

*   页眉
*   侧边栏/菜单
*   内容
*   页脚

这些是包含页面最重要部分的主要容器。请记住，核心结构就像一组积木，每个单元都依赖于其他单元。如果你改变其中一个，就必须改变其他部分。

**经典主题**

```
<body>
  <div id="rap">
    <h1 id="header"></h1>
    <div id="content"></div>
    <div id="menu"></div>
    <p class="credit"></p>
  </div>
</body>
```

**默认主题**

```
<body>
  <div id="page">
    <div id="header"></div>
    <div id="content" class="narrowcolumn"></div>
    <div id="sidebar"></div>
    <div id="footer"></div>
  </div><!-- end page -->
</body>
```

请注意，虽然两个主题都使用了侧边栏，但第一个主题将其称为菜单，而另一个主题则称之为侧边栏。

这两个主题核心结构的主要区别可能在于页眉和页脚的使用。对于经典主题，页眉位于 h1 标签内，页脚则包含在段落标签中。而在默认主题中，页眉被放置在一个名为 header 的 div 中，页脚则被放置在一个 footer div 中。

两个主题都有一个容器来包围或"包裹"整个页面。这个容器（通常与 body HTML 标签结合使用）允许对整个结构进行更明确的控制。根据所使用的 WordPress 主题，这个容器也可以被称为：

*   page
*   wrap
*   rap

有些主题可能会添加第二个、第三个甚至第四个侧边栏，以创建列效果。它们也可能在整个页面周围或特定容器周围包含额外的包装器。然而，在所有情况下，基本的核心结构本质上保持不变。

### 模块化模板文件

基于构建块的理念，WordPress 主题将核心结构划分为独立的块，称为[模板文件](https://codex.wordpress.org/Templates)。以下是这些模板文件：

* 页眉 - header.php
* 侧边栏/菜单 - sidebar.php
* 内容 - index.php、single.php、page.php、category.php、author.php、search.php 等
* 页脚 - footer.php

在每个模板文件中，都可以使用 body div 作为内容的整体容器。

当查看使用特定 WordPress 主题的网页时，生成的特定模板文件取决于用户的请求。如果用户点击分类标签，将使用分类模板。如果用户查看[页面](https://wordpress.org/documentation/article/create-pages/)，将使用页面模板。

当这些核心模板文件与[WordPress 循环](https://codex.wordpress.org/The_Loop)和查询结合加载时，可以生成各种模板。这使得网页开发者能够为每个特定模板创建独特且个性化的样式。

## 内部结构

在这些核心结构容器内部，存在着更小的构建模块，它们承载着父容器内的具体内容。WordPress 主题可以包含多种此类结构，但我们将重点关注 WordPress 自带的两个主题。（大多数 WordPress 主题模板都基于这两个主题。）

### 页眉

页眉是传统上位于网页顶部的结构。它包含网站标题。有时也可称为刊头、头部、标题或横幅。在所有 WordPress 主题中，页眉都位于 header.php 模板文件中。

经典主题具有最简单的页眉代码：

```
<h1 id="header"></h1>
```

默认主题的页眉代码更为复杂：

```
<div id="header">
  <div id="headerimg">
    <h1></h1>
    <div class="description"></div>
  </div>
</div>
```

经典主题的样式位于主题的 style.css 文件中，而默认主题的样式既位于 style.css 文件中，也位于 header.php [模板文件](https://codex.wordpress.org/Templates) 的 <head> 部分。文章 [设计页眉](https://codex.wordpress.org/Designing_Headers) 详细介绍了如何处理这些样式。

### 内容

WordPress 中的内容容器扮演着至关重要的角色，因为它承载着 [WordPress 循环](https://codex.wordpress.org/The_Loop)。WordPress 循环会处理当前页面上将要显示的每一篇文章。然后，这些文章会根据它们如何匹配循环标签内的特定条件进行格式化。

经典主题拥有最简单的结构：

```
<div id="content">
  <h2>日期</h2>
  <div class="post" id="post-1">
    <h3 class="storytitle">文章标题</h3>
    <div class="meta">文章元数据</div>
    <div class="storycontent">
      <p>欢迎使用 WordPress。</p>
    </div>
    <div class="feedback">评论 (2)</div>
  </div>
</div>
```

经典主题为日期、标题、文章元数据、文章内容和反馈（评论数量）提供了容器。它还展示了一个强大的功能：能够单独设置单篇文章的外观样式。

```
<div class="post" id="post-1">
```

`post` 这个 CSS 类选择器将文章样式应用到这个容器上。需要注意的是，`post` 类选择器还有一个由 WordPress 自动生成的 ID。以下是一个可用于显示类选择器 ID 的代码示例：

```
<div class="post" id="post-<?php the_ID(); ?>">
```

使用模板标签 [the_ID()](https://developer.wordpress.org/reference/functions/the_ID/) 可以显示文章的 ID 号。这个唯一标识符可以用于内部页面链接以及样式。例如，单篇文章可以拥有针对 `post-1` 以及 `post-2` 的样式。虽然为每篇文章都设置一个样式有点过度，但可能有一两篇文章你需要它们看起来有点不同。一些插件也可能使用这个标识符来自动改变不同文章的外观。

默认主题的内容容器具有**多文章视图**（例如，用于首页、分类、归档和搜索）以及用于单篇文章的**单文章视图**。多文章视图如下所示：

```
<div id="content" class="narrowcolumn">
  <div class="post" id="post-1">
    <h2>文章标题</h2>
    <small>日期</small>
    <div class="entry">
      <p>文章内容。</p>
    </div>
    <p class="postmetadata">文章元数据部分</p>
  </div>
  <div class="navigation">
    <div class="alignleft">上一篇文章</div>
    <div class="alignright">下一篇文章</div>
  </div>
</div>
```

这里包含了很多内容。让我们来分解一下。

### 内容结构示例解析

```
<div id="content" class="narrowcolumn">
```

**多篇文章视图**的内容容器使用名为 `narrowcolumn` 的类，而**单篇文章视图**则使用名为 `widecolumn` 的类。单篇文章视图页面不会生成侧边栏，这使得文章能够占据整个内容区域的宽度。

```
<div class="post" id="post-1">
```

与经典主题类似，这个分区设置了文章的样式和 `post-X` 的标识符，其中 `X` 代表文章的唯一 ID 号。这允许用户自定义特定文章的外观。

```
<h2>文章标题</h2>
```

这部分包含文章的标题代码，由 `<h2>` 标签定义样式。

```
<small>日期</small>
```

日期代码由 `small` 标签包裹并定义样式。

```
<div class="entry">
```

文章内容由 `entry` CSS 选择器内的样式和段落标签组合定义样式。

```
<p class="postmetadata">文章元数据部分</p>
```

[文章元数据部分](https://codex.wordpress.org/Post_Meta_Data_Section)包含关于文章的详细数据，例如日期、时间以及文章所属的分类。

```
<div class="navigation">
```

[上一篇和下一篇链接](https://codex.wordpress.org/Next_and_Previous_Links)在 `navigation` div 中定义样式。它们还包含 `alignleft`（用于上一篇）和 `alignright`（用于按时间顺序的下一篇）类。

在**单篇文章视图**的内容结构中，这些元素的排列发生了变化：

```
<div id="content" class="widecolumn">
  <div class="navigation">
    <div class="alignleft"></div>
    <div class="alignright"></div>
  </div>
  <div class="post" id="post-1">
    <h2>文章标题</h2>
    <div class="entrytext">
      <p>文章内容。</p>
      <p class="postmetadata alt">
        <small>文章元数据</small>
      </p>
    </div>
  </div>
</div>
```

由于没有侧边栏，`widecolumn` 类被设置为让内容横跨整个页面。`navigation` div 被移到了顶部。文章元数据现在被整合到 `entrytext` 父容器中，并且使用了不同的样式，添加了 `alt` 类选择器。

默认主题中的这两个示例，仅仅让您窥见了 WordPress 站点可以进行自定义的无数种方式。

#### 评论

评论可以显示在单篇文章视图中（使用 comments.php 模板文件），也可以显示在弹出窗口中（使用 comments-popup.php 模板文件）。这两种评论的整体样式基本相同。

##### Classic Theme Comments

```
<h2 id="comments">1 Comment
  <a href="#postcomment" title="Leave a comment">»</a></h2>
  <ol id="commentlist">
    <li id="comment-1">
      <p>Hi, this is a comment.</p>
      <p><cite>Comment by Person</cite> </p>
    </li>
  </ol>
  <p>
    <a href='https://example.com/archives/name-of-post/feed/'><abbr title="Really Simple Syndication">RSS</abbr> feed for comments on this post.</a>
    <a href="https://example.com/name-of-post/trackback/" rel="trackback">TrackBack <abbr title="Uniform Resource Identifier">URI</abbr></a>
  </p>
  <h2 id="postcomment">Leave a comment</h2>
  <form action="https://example.com/blog/wp-comments-post.php" method="post" id="commentform">
    <p>
      <input type="text" name="author" id="author" value="" size="22" tabindex="1">
      <label for="author"><small>Name (required)</small></label>
    </p>
    <p>
      <input type="text" name="email" id="email" value="" size="22" tabindex="2">
      <label for="email"><small>Mail (will not be published) required)</small></label>
    </p>
    <p>
      <input type="text" name="url" id="url" value="" size="22" tabindex="3">
      <label for="url"><small>Website</small></label>
    </p>
    <p>
      <small><strong>XHTML:</strong> List of Tags you can use in comments</small>
    </p>
    <p>
      <textarea name="comment" id="comment" cols="100%" rows="10" tabindex="4"></textarea>
    </p>
    <p>
      <input name="submit" type="submit" id="submit" tabindex="5" value="Submit Comment">
      <input type="hidden" name="comment_post_ID" value="1">
    </p>
  </form>
</div>
```

While individual sections of the comments feature styling reference, the Classic Theme has no general comment division or group style reference, one could be easily added.

**#comments h2**

Styles the title at the top of the comments list which says "Comments 4 Leave a Comment", with the latter part of the sentence in a link that jumps to `<h2 id="postcomment">Leave a comment</h2>`.

**#comment-n**

Comments are given a unique ID number, signified here by the letter n. This allows them to be styled individually.

**#comments ol**

This begins the **ordered list** of the comments, counting down from one, and sets the overall style of the comments list.

**#comments li**

Style reference for each comment on the list.

**#comments p**

This paragraph tag styles the actual comments on the comment list.

**#comment cite**

This use of the cite controls the look of the commenter's name. It usually states "Name says:" in the comments list.

**#comments h2** or **#postcomment**

The h2 heading can be styled two ways, as #comments h2 or #postcomment. The latter is used by the "Leave a Comment" link from the top of the comments section, too.

**#commentform**

Style reference for the overall "form" for inputting comments. Each input area has it's own ID.

**#author**

ID reference for the comment author's input area.

**#comments small**

`<small>` 标签在经典主题中的多个位置被使用。这种用法环绕着**评论提交表单**中的文本以及评论中可用的**标签列表**文本。

**#email**

评论作者电子邮件的 ID 引用。

**#url**

评论作者网址的 ID 引用。

**#comment**

评论输入文本区域的 ID 引用。它并不样式化最终生成的评论，仅样式化输入框。

**#comment #submit**

经典主题中有两个提交按钮，分别用于搜索和评论提交。这是提交评论的按钮。

##### 默认主题评论

默认主题的评论功能在 comments.php 和 comments-popup.php 中使用循环查询，根据评论是否开放、关闭以及是否存在来改变部分信息。如果评论开放或关闭且尚未有任何评论，此信息将显示在 `<h3 id="comments">` 标签内。

```
<h3 id="comments">One Response to "Hello world!"</h3> 
<ol class="commentlist">
  <li class="alt" id="comment-1">
    <cite>
      <a href="https://example.org/" rel="external nofollow">Mr WordPress</a>
    </cite> Says:<br>
    <small class="commentmetadata">
      <a href="#comment-1" title="">Date and Time</a>
    </small>
    <p>Hi, this is a comment.</p>
  </li>
</ol>
<h3 id="respond">Leave a Reply</h3>
<form action="https://example.com/blog/wp-comments-post.php" method="post" id="commentform">
  <p>
    <input name="author" id="author" value="" size="22" tabindex="1" type="text">
    <label for="author">
      <small>Name (required)</small>
    </label>
  </p>
  <p>
    <input name="email" id="email" value="" size="22" tabindex="2" type="text">
    <label for="email">
      <small>Mail (will not be published) required)</small>
    </label>
  </p>
  <p>
    <input name="url" id="url" value="" size="22" tabindex="3" type="text">
    <label for="url">
      <small>Website</small>
    </label>
  </p>
  <p>
    <small><strong>XHTML:</strong> You can use these tags:....</small>
  </p>
  <p>
    <textarea name="comment" id="comment" cols="100" rows="10" tabindex="4">
    </textarea>
  </p>
  <p>
    <input name="submit" id="submit" tabindex="5" value="Submit Comment" type="submit">
    <input name="comment_post_ID" value="1" type="hidden">
  </p>
</form>
</div>
```

虽然评论功能的各个部分都有样式引用，但默认主题没有通用的评论分区或组样式引用，不过可以轻松添加。

**h3 #comments**

为"文章回复数量"标题的 `<h3>` 标签设置样式。

**#commentlist ol**

为评论列表的"有序列表"设置样式。

**.alt li** 和 **#comment-n**

评论列表项有两个样式引用。第一个是类 `alt`，第二个是评论 ID 号，此处用字母 n 表示。这允许对它们进行单独样式设置。

**cite**

`cite` 标签包裹"姓名说："以及指向评论作者 URL 的链接。

**.commentmetadata small**

`<small>` 标签具有 `commentmetadata` 类，允许设置文章日期和时间的样式。

**ol #commentlist p**

为评论有序列表内的段落设置样式。

**#respond h3**

为"发表回复"标题设置样式。

**#commentform**

用于输入评论的整体"表单"的样式引用。每个输入区域都有自己的 ID。

**#author**

评论作者输入区域的 ID 引用。

**#comments small**

`<small>` 标签在经典主题中的多个位置被使用。这种用法包裹了**评论提交表单中的文本 _以及_** _标签列表的文本_，这些标签可在评论中使用。

**#email**

评论作者电子邮件的 ID 引用。

**#url**

评论作者网址的 ID 引用。

**#comment**

评论输入文本区域的 ID 引用。它并不样式化最终生成的评论，仅样式化输入框。

**#comment #submit**

经典主题中有两个提交按钮，分别用于搜索和评论提交。这是提交评论的按钮。

##### 弹窗评论

经典主题和默认主题的 `comments-popup.php` 模板文件基本相同。它们都采用[经典主题评论结构](#Default_Theme_Comments)的布局。虽然经典主题使用 `<h2>` 标题，而默认主题在其评论中使用 `<h3>` 标题作为标题，但在 comments-popup.php 模板文件中，两者都使用 `<h2>` 标题标签。

```
<body id="commentspopup">
  <h1 id="header"></h1>
  <h2 id="comments">评论</h2>
  ....经典主题评论部分.....
  ...经典主题页脚....
```

body 标签通过 `#commentspopup` 设置整个页面的样式。`<h2>` 标题开启了评论部分。

如果您对整体主题的页眉和页脚内的标签结构进行了修改，请确保这些结构更改也应用于评论弹窗模板，特别是如果您打算[向公众发布该主题](https://codex.wordpress.org/Designing_Themes_for_Public_Release)。

### 侧边栏

正如您在默认主题中所见，侧边栏是否可见取决于正在使用的模板文件。一般来说，侧边栏可以简单也可以复杂。WordPress 主题通常在侧边栏中以**嵌套列表**的形式展示信息。关于侧边栏的定制，有一份逐步指南：[自定义您的侧边栏](https://codex.wordpress.org/Customizing_Your_Sidebar)，还有更多关于[使用 CSS 样式化列表](https://codex.wordpress.org/Styling_Lists_with_CSS)的信息。

通常，WordPress 侧边栏在一个列表中展示各个部分的标题，而该部分的项目则以嵌套列表的形式显示在标题下方。

经典主题的侧边栏看起来像下面这样（为简化起见，链接已移除）：

```
<div id="menu">
  <ul>
    <li class="pagenav">Pages
      <ul>
        <li class="page_item">Contact</li>
        <li class="page_item">About</li>
      </ul>
    </li>
    <li id="linkcat-1"><h2>Blogroll</h2>
      <ul>
        <li>Blogroll Link 1</li>
        <li>Blogroll Link 1</li>
        <li>Blogroll Link 1</li>
      </ul>
    </li>
    <li id="categories">Categories:
      <ul>
        <li>Category Link 1</li>
        <li>Category Link 2</li>
      </ul>
    </li>
    <li id="search">
      <label for="s">Search:</label>   
      <form id="searchform" method="get" action="/index.php">
        <div>
          <input type="text" name="s" id="s" size="15"><br>
          <input type="submit" id="searchsubmit" value="Search">
        </div>
      </form>
    </li>
    <li id="archives">Archives: 
      <ul>
        <li>Archives Month Link 1</li>
        <li>Archives Month Link 2</li>
      </ul>
    </li>
    <li id="meta">Meta:
      <ul>
        <li>RSS Feed Link</li>
        <li>RSS Comments Feed Link</li>
        <li>XHTML Validator</li>
        <li>XFN Link</li>
        <li>WordPress Link</li>
      </ul>
    </li>
  </ul>
</div>
```

这些内容大多不言自明。每组链接都有其自己的 CSS 选择器：[页面](https://wordpress.org/documentation/article/create-pages/)、分类、归档、搜索和元信息。

#### 页面与链接分类

标记为"博客链接"的[页面](https://wordpress.org/documentation/article/create-pages/)与[链接](https://codex.wordpress.org/Links_Manager)分类，使用[<?php get_links_list(); ?>](https://developer.wordpress.org/reference/functions/get_links_list/)和[<?php wp_list_pages(); ?>](https://developer.wordpress.org/reference/functions/wp_list_pages/)模板标签自动生成标题。

对于**链接**分类，它会为该组链接生成h2标题。这意味着您可以将菜单h2标题的样式设置为与其他标题不同，或者，如果您希望它们看起来一致，请确保菜单h2样式与未自动生成的其他分类样式*匹配*。

**页面**模板标签生成pagenav作为标题，并以新方式标识页面。在多文章和单文章视图中，页面列表项具有class="page_item"来设置这些链接的样式。查看单个页面时，该页面的链接将变为class="current_page_item"，从而可以将其样式设置为与其余页面链接不同。

#### 分类、归档与元数据

其他侧边栏区块的标题，如 _categories_、_archives_、_meta_ 等，并未使用会自行生成标题的模板标签。这些标题是通过 PHP 语句在页面中“打印”出来的。虽然它们可以放入[标题标签](https://codex.wordpress.org/Designing_Headings)内，但 WordPress 使用 `_e()` 函数来显示或 `echo` 这些文本标题，同时标记这些文本为可能的翻译目标。如果你打算[开发主题](https://codex.wordpress.org/Theme_Development)并[公开发布](https://codex.wordpress.org/Designing_Themes_for_Public_Release)，强烈建议使用 echo 函数。

你可以单独或统一为这些标题设置样式。一些主题，如默认主题，将所有这类标题放在 `<h2>` 标签中，使列表标题看起来一致。因此，它们可能为每个区块使用样式引用，也可能不使用。如果你需要改变每个链接区块的外观，可以自行添加样式。

#### Search Form

The search form is found within the searchform.php. It may be found in different locations within the sidebar. To style the overall search form, use the search ID. Here is a list of the individual areas of the search form which may be styled by default. You may add style classes to gain more control over the look of your search form.

```
<li id="search">
  <label for="s">Search:</label>   
  <form id="searchform" method="get" action="/index.php">
    <div>
      <input type="text" name="s" id="s" size="15"><br>
      <input type="submit" id="searchsubmit" value="Search">
    </div>
  </form>
</li>
```

**#search**

The overall style for the search form.

**#search label**

Used to style the label tag, if necessary.

**#searchform**

Used to style the form itself.

**#search div**

This unlabeled div is a child container of the parent container search and maybe styled from within that selector.

**#searchform input**

To style the input area for the search, this selector combination will work.

**#searchsubmit**

_Used by the Default Theme_, this selector may be used to style the **search** or **submit** button.

The search form area, input, and button can be styled in many ways, or left with the default input and "button" look.

#### 元信息源链接

元链接可以显示为文本或代表各类链接的图标。XHTML 和 CSS 验证链接可使用 W3 图标。各类信息源也可用图标表示，或保留为文本形式。具体选择由您决定。侧边栏中使用文本或图标形式的信息源，相关说明详见文章 [WordPress 信息源](https://wordpress.org/documentation/article/wordpress-feeds/)。

### 页脚

页脚位于 footer.php 模板文件中。在默认主题和经典主题中，页脚包含的信息都很少。

**经典主题**

```
<p class="credit">
  <!--15 queries. 0.152 seconds. -->
  <cite>Powered by <a href='https://wordpress.org' title='Powered by WordPress, state-of-the-art semantic personal publishing platform.'> <strong>WordPress</strong></a></cite>
</p>
</div>
```

页脚内容通过 `credit` 类以及 `<p>` 和 `<cite>` 标签进行样式设置。

该标签以 HTML 注释代码的形式显示页面使用的 MySQL 查询次数和页面加载时间。这是为了方便管理员使用，仅在页面源代码中可见。如果您希望将其显示在页面上，请移除[注释](https://codex.wordpress.org/Commenting_Code)。其外观将受到 `<p>` 标签的 `credit` 类样式影响。在模板文件中，它看起来像这样：

```
<!--<?php echo $wpdb->num_queries; ?> queries. 
<?php timer_stop(1); ?> seconds. -->
```

**默认主题**

```
<div id="footer">
  <p>Blogging in the WordPress World is proudly powered by <a href="https://wordpress.org/">WordPress</a><br>
    <a href="feed:http://example.com/feed/">Entries (RSS)</a> and <a href="feed:https://example.com/comments/feed/"> Comments (RSS)</a>.
    <!-- 18 queries. 0.186 seconds. -->
  </p>
</div>
```

默认主题的页脚通过 `footer` ID 和 `<p>` 标签进行样式设置。虽然页脚区域本身可能由 `footer` 设置样式，但 `<p>` 标签控制其中的文本。要为页脚内的 `<p>` 标签设置与页面其他部分不同的样式：

**#footer p {styles}**

## 资源

* [CSS](https://developer.wordpress.org/advanced-administration/wordpress/css/)
* [查找您的 CSS 样式](https://codex.wordpress.org/Finding_Your_CSS_Styles)
* [CSS 故障排除](https://codex.wordpress.org/CSS_Troubleshooting)
* [使用主题](https://wordpress.org/documentation/article/worik-with-themes/)
* [主题开发](https://codex.wordpress.org/Theme_Development)
* [为公开发布设计主题](https://codex.wordpress.org/Designing_Themes_for_Public_Release)
* [WordPress 课程](https://learn.wordpress.org/)
* [博客设计与布局](https://codex.wordpress.org/Blog_Design_and_Layout)
* [深入了解模板标签](https://codex.wordpress.org/Stepping_Into_Template_Tags)

# Update Services

Update Services are tools you can use to let other people know you've updated your blog. WordPress automatically notifies popular Update Services that you've updated your blog by sending a [XML-RPC](https://xmlrpc.com/) [ping](https://wordpress.org/documentation/article/glossary/#pingback) each time you create or update a post. In turn, Update Services process the ping and updates their proprietary indices with _your_ update. 

## Common Usage

Most people use [Ping-o-Matic](https://pingomatic.com/) which, with just one "ping" from you, will let many other services know that you've updated. As for why, Ping-O-Matic puts it best:

> Ping-O-Matic is a service to update different search engines that your blog has updated.
> We regularly check downstream services to make sure that they're legit and still work. So while it may appear like we have fewer services, they're the most important ones.

If you do not want the update services to be pinged, remove all the update service URIs listed under "Update Services" on the [Settings](https://wordpress.org/documentation/article/administration-screens/#settings-configuration-settings)->[Writing](https://wordpress.org/documentation/article/settings-writing-screen/) administration screen of your WordPress installation.

![Screenshot of the Update Services screen.](https://wordpress.org/documentation/files/2025/06/update_service.png)

Certain web hosts – particularly free ones – disable the PHP functions used to alert update services. If your web host prevents pings, you should stop WordPress from attempting to ping.

## XML-RPC Ping Services

```
https://rpc.pingomatic.com/
https://rpc.twingly.com/
http://ping.blo.gs/
```

## Alternatives
An alternative is [Feed Shark](https://feedshark.brainbliss.com/), which pings over 60 services for free.

## WordPress Multisite Network
By default, editing the Ping Services field is disabled for individual sites in a WordPress Multisite network. To restore this option, you can add a small custom plugin or must-use plugin with the following code:

```
add_action( 'init', function() {
    if ( is_multisite() ) {
        // Allow the Update Services configuration screen to appear.
        add_filter( 'enable_update_services_configuration', '__return_true', 11 );

        // Whitelist the 'ping_sites' option so changes can be saved to the database.
        add_filter( 'whitelist_options', function( $options ) {
            $options['writing'][] = 'ping_sites';
            return $options;
        }, 11 );
    }
} );
```

# 编辑 wp-config.php 文件

WordPress 安装中最重要的文件之一是 `wp-config.php` 文件。该文件位于 WordPress 文件目录的根目录，包含网站的基本配置信息，例如数据库连接信息。

首次下载 WordPress 时，`wp-config.php` 文件并不包含在内。WordPress 安装过程会根据您在[安装](https://developer.wordpress.org/advanced-administration/before-install/howto-install/)过程中提供的信息为您创建 `wp-config.php` 文件。

非开发人员通常不需要编辑 wp-config.php 文件，但如果您正在按照技术人员或网络主机提供的故障排除步骤操作，此[页面](https://developer.wordpress.org/advanced-administration/wordpress/wp-config/)应该会有所帮助。

# wp-config.php

临时说明：这可能链接到简单部分，指向：
* https://developer.wordpress.org/advanced-administration/wordpress/wp-config/
* https://developer.wordpress.org/advanced-administration/debug/debug-wordpress/

## 高级选项 {#advanced-options}

以下部分可能包含高级信息，某些更改可能导致不可预见的问题。在修改这些设置前，请确保您已进行[定期备份](https://developer.wordpress.org/advanced-administration/security/backup/)并了解如何恢复。

### table_prefix {#table-prefix}

**$table_prefix** 是放置在数据库表名称前的值。如果您不想使用 **wp_** 作为数据库表前缀，请更改此值。通常在以下情况会修改此值：在同一数据库中[安装多个 WordPress 站点](https://developer.wordpress.org/advanced-administration/before-install/multiple-instances/)，例如使用多站点功能时。

如果为每个安装设置唯一的前缀，则可以在一个数据库中拥有多个安装。如果选择这样做，请务必注意安全性。

```
$table_prefix = 'example123_'; // 请仅使用数字、字母和下划线！
```

### WP_SITEURL {#wp-siteurl}

WP_SITEURL 允许定义 WordPress 地址（URL）。所定义的值是 WordPress 核心文件所在的地址。它也应包含 https:// 部分。末尾不要加斜杠 "**/**"。在 `wp-config.php` 中设置此值会覆盖 **siteurl** 在 [wp_options 表](https://codex.wordpress.org/Database_Description#Table:_wp_options) 中的值。定义这些常量会将您网站的 URL 配置硬编码，从而提高可移植性，并有助于防止因仪表盘中的拼写错误或配置错误导致的问题。**注意：** 这**不会**更改数据库中存储的值。如果从 `wp-config.php` 中移除此行，URL 将恢复为旧的数据库值。[使用 **RELOCATE** 常量](https://developer.wordpress.org/advanced-administration/upgrade/migrating/) 来更改数据库中的 **siteurl** 值。

如果 WordPress 安装在 [域名](https://en.wikipedia.org/wiki/Domain_name_system) example.com 下名为 "wordpress" 的目录中，请像这样定义 `WP_SITEURL`：

```
define( 'WP_SITEURL', 'https://example.com/wordpress' );
```

基于 $_SERVER['HTTP_HOST'] 动态设置 WP_SITEURL

```
define( 'WP_SITEURL', 'https://' . $_SERVER['HTTP_HOST'] . '/path/to/wordpress' );
```

**注意：** HTTP_HOST 是由 PHP 根据请求中 HTTP HOST 标头的值动态创建的，因此可能允许 [文件包含漏洞](https://en.wikipedia.org/wiki/File_inclusion_vulnerability)。SERVER_NAME 也可能是动态创建的。但是，当 Apache 配置为 UseCanonicalName "on" 时，SERVER_NAME 由服务器配置设置，而不是动态生成。在这种情况下，使用 SERVER_NAME 比 HTTP_HOST 更安全。

基于 `$_SERVER['SERVER_NAME']` 动态设置 `WP_SITEURL`

```
define( 'WP_SITEURL', 'https://' . $_SERVER['SERVER_NAME'] . '/path/to/wordpress' );
```

### 博客地址 (URL) {#blog-address-url}

与 WP_SITEURL 类似，WP_HOME _会覆盖数据库 [wp_options 表](https://codex.wordpress.org/Database_Description#Table:_wp_options) 中_ home _的值，但不会在数据库中更改它。_ **home** 是您希望用户在浏览器中输入以访问您的 WordPress 博客的地址。它应包含 https:// 部分，并且末尾不应有斜杠 "**/**"。定义这些常量会硬编码您网站的 URL 配置，这可以提高可移植性，并有助于防止因仪表盘中的拼写错误或配置错误导致的问题。

```
define( 'WP_HOME', 'https://example.com/wordpress' );
```

如果您正在使用 [为 WordPress 设置独立目录](https://developer.wordpress.org/advanced-administration/server/wordpress-in-directory/) 中描述的技术，请遵循以下示例。请记住，如果您使用类似这样的设置，您还需要在网站根目录中放置一个 `index.php` 文件。

```
define( 'WP_HOME', 'https://example.com' );
```

基于 `$_SERVER['HTTP_HOST']` 动态设置 `WP_HOME`

```
define( 'WP_HOME', 'https://' . $_SERVER['HTTP_HOST'] . '/path/to/wordpress' );
```

### 移动 wp-content 文件夹 {#moving-wp-content-folder}

您可以将存放主题、插件和上传文件的 `wp-content` 目录移出 WordPress 应用程序目录。

将 WP_CONTENT_DIR 设置为该目录的完整**本地路径**（末尾不加斜杠），例如：

```
define( 'WP_CONTENT_DIR', dirname(__FILE__) . '/blog/wp-content' );
```

将 WP_CONTENT_URL 设置为该目录的完整**URL**（末尾不加斜杠），例如：

```
define( 'WP_CONTENT_URL', 'https://example/blog/wp-content' );
```

### 移动插件文件夹 {#moving-plugin-folder}

将 WP_PLUGIN_DIR 设置为该目录的完整**本地路径**（不带尾部斜杠），例如：

```
define( 'WP_PLUGIN_DIR', dirname(__FILE__) . '/blog/wp-content/plugins' );
```

将 WP_PLUGIN_URL 设置为该目录的完整**URI**（不带尾部斜杠），例如：

```
define( 'WP_PLUGIN_URL', 'https://example/blog/wp-content/plugins' );
```

如果插件存在兼容性问题，请将 PLUGINDIR 设置为该目录的完整**本地路径**（不带尾部斜杠），例如：

```
define( 'PLUGINDIR', dirname(__FILE__) . '/blog/wp-content/plugins' );
```

### 移动主题文件夹 {#moving-themes-folder}

您无法移动主题文件夹，因为其路径是相对于 `wp-content` 文件夹硬编码的：

```
$theme_root = WP_CONTENT_DIR . '/themes';
```

但是，您可以使用 [register_theme_directory](https://developer.wordpress.org/reference/functions/register_theme_directory/) 注册额外的主题目录。

了解如何[移动 wp-content](https://developer.wordpress.org/advanced-administration/wordpress/wp-config/) 文件夹。有关主题文件夹如何确定的更多详细信息，请参阅 `wp-includes/theme.php`。

### 移动上传文件夹 {#moving-uploads-folder}

将 UPLOADS 设置为：

```
define( 'UPLOADS', 'blog/wp-content/uploads' );
```

此路径不能是绝对路径。它始终相对于 ABSPATH，因此不需要前导斜杠。

### 修改自动保存间隔 {#modify-autosave-interval}

在编辑文章时，WordPress 会使用 Ajax 自动保存修订版本。您可能希望增加此设置以延长自动保存之间的间隔，或减少此设置以确保不会丢失更改。默认值为 60 秒。

```
define( 'AUTOSAVE_INTERVAL', 180 ); // 秒
```

### 文章修订版本 {#post-revisions}

默认情况下，WordPress 会保存对文章或页面所做的每次编辑的副本，从而允许恢复到该文章或页面的先前版本。可以禁用修订版本的保存，也可以指定每个文章或页面的最大修订版本数。

#### 禁用文章修订版本 {#disable-post-revisions}

如果您**不**设置此值，WordPress 默认会将 WP_POST_REVISIONS 设为 _true_（启用文章修订版本）。如果您想禁用这个强大的修订功能，请使用此设置：

```
define( 'WP_POST_REVISIONS', false );
```

注意：部分用户需要将此命令移至 `wp-config.php` 文件初始块注释后的第一行才能使其生效。

#### 指定文章修订版本数量 {#specify-the-number-of-post-revisions}

若要指定 WordPress 存储的修订版本最大数量，请将 _false_ 更改为整数/数字（_例如_，3 或 12）。

```
define( 'WP_POST_REVISIONS', 3 );
```

注意：部分用户需要将此命令移至 `wp-config.php` 文件初始块注释后的首行，方可使其生效。

### 设置 Cookie 域名 {#set-cookie-domain}

可为具有特殊域名配置的用户指定 WordPress cookie 中设置的域名。例如，如果使用子域名提供静态内容，您可以将 cookie 域名设置为仅限您的非静态域名，以防止每次向子域上的静态内容发送请求时附带 WordPress cookie。

```
define( 'COOKIE_DOMAIN', 'www.example.com' );
```

### 启用多站点/网络功能 {#enable-multisite-network-ability}

WP_ALLOW_MULTISITE 是用于启用多站点功能的特性。如果 `wp-config.php` 文件中缺少此设置，则默认值为 false。

```
define( 'WP_ALLOW_MULTISITE', true );
```

### 重定向不存在的博客 {#redirect-nonexistent-blogs}

如果访问者尝试访问不存在的子域名或子文件夹，可以使用 NOBLOGREDIRECT 来重定向浏览器。

```
define( 'NOBLOGREDIRECT', 'https://example.com' );
```

### 致命错误处理程序 {#wp-disable-fatal-error-handler}

WordPress 5.2 引入了[恢复模式](https://make.wordpress.org/core/2019/04/16/fatal-error-recovery-mode-in-5-2/)，当插件导致致命错误时，会显示错误信息而非白屏。

_网站遇到技术困难。请检查您的站点管理员邮箱收件箱以获取说明。_

白屏和 PHP 错误信息不再向用户显示。但在开发环境中，如果您想启用 WP_DEBUG_DISPLAY，则必须通过将 WP_DISABLE_FATAL_ERROR_HANDLER 设为 true 来禁用恢复模式。

```
define( 'WP_DISABLE_FATAL_ERROR_HANDLER', true ); // 5.2 及更高版本
define( 'WP_DEBUG', true );
define( 'WP_DEBUG_DISPLAY', true );
```

### WP_DEBUG {#wp-debug}

[WP_DEBUG](https://developer.wordpress.org/advanced-administration/debug/debug-wordpress/) 选项控制某些错误和警告的报告，并启用 WP_DEBUG_DISPLAY 和 WP_DEBUG_LOG 设置。默认布尔值为 false。

```
define( 'WP_DISABLE_FATAL_ERROR_HANDLER', true ); // 5.2 及更高版本
define( 'WP_DEBUG', true );
```

[仅当 WP_DEBUG 设置为 true 时才会打印数据库错误](https://trac.wordpress.org/ticket/5473)。数据库错误由 [wpdb](https://developer.wordpress.org/reference/classes/wpdb/) 类处理，不受 [PHP 错误设置](https://www.php.net/errorfunc) 影响。

将 WP_DEBUG 设置为 true 还会将 [错误报告级别](https://www.php.net/manual/en/errorfunc.configuration.php#ini.error-reporting) 提升至 E_ALL，并在使用已弃用的函数或文件时激活警告；否则，WordPress 会将错误报告级别设置为 E_ALL ^ E_NOTICE ^ E_USER_NOTICE。

### WP_ENVIRONMENT_TYPE {#wp-environment-type}

WP_ENVIRONMENT_TYPE 选项控制网站的环境类型：`local`、`development`、`staging` 和 `production`。

环境类型的值按以下顺序处理，每种后续方法会覆盖之前的值：WP_ENVIRONMENT_TYPE [PHP 环境变量](https://www.php.net/manual/en/reserved.variables.environment.php) 和 WP_ENVIRONMENT_TYPE 常量。

对于这两种方法，如果提供的环境类型值不在允许的环境类型列表中，将返回默认值 `production`。

最简单的设置方法可能是通过定义常量：

```
define( 'WP_ENVIRONMENT_TYPE', 'staging' );
```

注意：当 [wp_get_environment_type()](https://developer.wordpress.org/reference/functions/wp_get_environment_type/) 返回 `development` 时，如果网站的 `wp-config.php` 文件中未定义 WP_DEBUG，它将被设置为 `true`。

### SCRIPT_DEBUG {#script-debug}

[SCRIPT_DEBUG](https://developer.wordpress.org/advanced-administration/debug/debug-wordpress/) 是一个相关常量，它会强制 WordPress 使用 `wp-includes/js`、`wp-includes/css`、`wp-admin/js` 和 `wp-admin/css` 目录中的“开发”版本脚本和样式表，而不是加载 `.min.css` 和 `.min.js` 版本。如果你计划修改 WordPress 内置的 JavaScript 或层叠样式表，应在配置文件中添加以下代码：

```
define( 'SCRIPT_DEBUG', true );
```

### 禁用 JavaScript 合并 {#disable-javascript-concatenation}

为了提升管理后台页面的加载速度，所有 JavaScript 文件会被[合并](https://en.wikipedia.org/wiki/Concatenation)至一个 URL。若管理后台页面的 JavaScript 功能失效，可尝试禁用此功能：

```
define( 'CONCATENATE_SCRIPTS', false );
```

### 配置错误日志记录 {#configure-error-logging}

配置错误日志记录可能有点棘手。首先，默认的 PHP 错误日志和显示设置是在 php.ini 文件中配置的，你可能有权访问也可能无权访问该文件。如果你有权访问，则应将其设置为面向公众的线上 PHP 页面所需的设置。强烈建议不要向公众显示错误消息，而是将其路由到错误日志。此外，错误日志不应位于服务器可公开访问的部分。推荐的 php.ini 错误设置示例：

```
error_reporting = 4339
display_errors = Off
display_startup_errors = Off
log_errors = On
error_log = /home/example.com/logs/php_error.log
log_errors_max_len = 1024
ignore_repeated_errors = On
ignore_repeated_source = Off
html_errors = Off
```

**关于错误报告值 4339** 这是一个自定义值，仅记录影响网站功能的问题，并忽略可能甚至不是错误的通知等。有关 1000011110011（即等于 4339 的二进制数）每个二进制位含义的信息，请参阅 [PHP 错误常量](https://www.php.net/manual/en/errorfunc.constants.php)。最左边的 1 表示报告任何 E_RECOVERABLE_ERROR。下一个 0 表示不报告 E_STRICT（当使用草率但功能正常的代码时会抛出），依此类推。你可以随意确定自己的自定义错误报告编号以替代 4339。

显然，你会希望为开发环境设置不同的配置。如果你的测试副本在同一服务器上，或者你无法访问 `php.ini`，则需要在运行时覆盖默认设置。你是希望错误记录到日志文件，还是希望立即收到任何错误通知，或者两者兼而有之，这取决于个人偏好。以下是一个立即报告所有错误的示例，你可以将其插入到 `wp-config.php` 文件中：

```
@ini_set( 'log_errors', 'Off' );
@ini_set( 'display_errors', 'On' );
define( 'WP_DISABLE_FATAL_ERROR_HANDLER', true ); // 5.2 及更高版本
define( 'WP_DEBUG', true );
define( 'WP_DEBUG_LOG', false );
define( 'WP_DEBUG_DISPLAY', true );
```

因为 `wp-config.php` 会为每个未从缓存文件加载的页面视图加载，所以它是设置控制 PHP 安装的 `php.ini` 设置的绝佳位置。如果你无法访问 `php.ini` 文件，或者只是想动态更改某些设置，这会很有用。一个例外是 'error_reporting'。当 WP_DEBUG 定义为 true 时，无论你在 wp-config.php 中尝试设置什么，WordPress 都会将 'error_reporting' 设置为 E_ALL。如果你确实需要将 'error_reporting' 设置为其他值，则必须在 `wp-settings.php` 加载后执行，例如在插件文件中。

如果你启用了错误日志记录，请记得之后删除该文件，因为它通常位于可公开访问的位置，任何人都可以访问你的日志。

以下是一个开启 PHP 错误日志记录并将其保存到指定文件的示例。如果 WP_DEBUG 被定义为 true，错误也会被记录到这个文件中。只需将此代码放在任何 _require_once_ 或 _include_ 命令之前。

```
@ini_set( 'log_errors', 'On' );
@ini_set( 'display_errors', 'Off' );
@ini_set( 'error_log', '/home/example.com/logs/php_error.log' );
/* 就这些，停止编辑！祝您博客愉快。 */
```

另一个记录错误的示例，由 Mike Little 在 [wp-hackers 邮件列表](https://lists.automattic.com/pipermail/wp-hackers/2010-September/034830.html) 中建议：

```
/**
 * 这会将所有错误、通知和警告记录到 wp-content 目录下名为 debug.log 的文件中
 * （如果 Apache 没有写入权限，您可能需要先创建该文件并设置适当的权限（例如使用 666））
 */
define( 'WP_DEBUG', true );
define( 'WP_DEBUG_LOG', true );
define( 'WP_DEBUG_DISPLAY', false );
@ini_set( 'display_errors', 0 );
```

来自 Mike Little 在 [曼彻斯特 WordPress 用户组](https://groups.google.com/g/manchester-wordpress-user-group/c/tHJxMGhcnZs/m/dn-8yjYIq9wJ) 的一个改进版本：

```
/**
 * 这仅在 WP_DEBUG 为 true 时，将所有错误、通知和警告记录到 wp-content 目录下名为 debug.log 的文件中。
 * 如果 Apache 没有写入权限，您可能需要先创建该文件并设置适当的权限（例如使用 666）。
 */
define( 'WP_DEBUG', true ); // 或 false
if ( WP_DEBUG ) {
	define( 'WP_DEBUG_LOG', true );
	define( 'WP_DEBUG_DISPLAY', false );
	@ini_set( 'display_errors', 0 );
}
```

令人困惑的是，WordPress 有三个 (3) 看起来功能相似的常量。首先，请记住，如果 WP_DEBUG 为 false，它和另外两个 WordPress DEBUG 常量将不起作用。PHP 指令（无论是什么）将起主导作用。除了 'error_reporting'，如果 WP_DEBUG 被定义为 false，WordPress 会将其设置为 4983。其次，即使 WP_DEBUG 为 true，其他常量也只有在它们也被设置为 true 时才起作用。如果它们被设置为 false，PHP 指令将保持不变。例如，如果您的 `php.ini` 文件中有指令 ('display_errors' = 'On')；但您在 `wp-config.php` 文件中有语句 define( 'WP_DEBUG_DISPLAY', false );，错误仍然会显示在屏幕上，即使您试图通过将 WP_DEBUG_DISPLAY 设置为 false 来阻止它，因为这是 PHP 配置的行为。这就是为什么在任何相关的 WP 常量被设置为 false 的情况下，将 PHP 指令设置为您需要的值非常重要。为了安全起见，请明确设置/定义这两种类型。关于 WP 常量的更详细描述，请参阅 [WordPress 中的调试](https://developer.wordpress.org/advanced-administration/debug/debug-wordpress/)。

对于您公开的生产环境 WordPress 安装，您可能考虑在 `wp-config.php` 文件中放置以下内容，即使它可能部分冗余：

```
@ini_set( 'log_errors', 'On' );
@ini_set( 'display_errors', 'Off' );
define( 'WP_DISABLE_FATAL_ERROR_HANDLER', false ); // 5.2 and later
define( 'WP_DEBUG', false );
define( 'WP_DEBUG_LOG', false );
define( 'WP_DEBUG_DISPLAY', false );
```

The default debug log file is `/wp-content/debug.log`. Placing error logs in publicly accessible locations is a security risk. Ideally, your log files should be placed above you site's public root directory. If you can't do this, at the very least, set the log file permissions to 600 and add this entry to the `.htaccess` file in the root directory of your WordPress installation:

```
<Files debug.log>
  Order allow,deny
  Deny from all
</Files>
```

This prevents anyone from accessing the file via HTTP. You can always view the log file by retrieving it from your server via FTP.

### 增加分配给 PHP 的内存 {#increasing-memory-allocated-to-php}

**WP_MEMORY_LIMIT** 选项允许你指定 PHP 可以消耗的最大内存量。当你收到类似“允许的内存大小 xxxxxx 字节已耗尽”的消息时，可能需要此设置。

此设置仅针对 WordPress 增加 PHP 内存，不影响其他应用程序。默认情况下，WordPress 会尝试将分配给 PHP 的内存增加到 40MB（代码位于 `/wp-includes/default-constants.php` 开头），多站点则为 64MB。因此，`wp-config.php` 中的设置应反映高于 40MB 或 64MB 的值，具体取决于你的配置。

在使用此功能之前，WordPress 会自动检查 PHP 分配的内存是否少于输入的值。例如，如果 PHP 已分配 64MB，则无需将此值设置为 64M，因为 WordPress 会在需要时自动使用全部 64MB。

注意：某些主机不允许自动增加 PHP 内存限制。在这种情况下，请联系你的主机提供商以增加 PHP 内存限制。此外，许多主机将 PHP 限制设置为 8MB。

调整 WordPress 内存限制也可能带来问题。随着你添加更多插件或功能，你可能会掩盖问题的根源，导致问题在以后发生。

如果你在提高了内存限制后仍然遇到内存不足问题，你应该正确调试你的安装。很可能你有太多内存密集型函数绑定到特定操作，应该将这些函数移动到定时任务中。

将 PHP 内存增加到 64MB

```
define( 'WP_MEMORY_LIMIT', '64M' );
```

将 PHP 内存增加到 96MB

```
define( 'WP_MEMORY_LIMIT', '96M' );
```

管理任务可能需要比常规操作更多的内存。在管理区域时，可以通过定义 WP_MAX_MEMORY_LIMIT 来从 WP_MEMORY_LIMIT 增加或减少内存。

```
define( 'WP_MAX_MEMORY_LIMIT', '128M' );
```

注意：这必须放在包含 wp-settings.php 之前。

### 缓存 {#cache}

**WP_CACHE** 设置项若为 true，则在执行 `wp-settings.php` 时会包含 `wp-content/advanced-cache.php` 脚本。

```
define( 'WP_CACHE', true );
```

### 自定义用户与用户元数据表 {#custom-user-and-usermeta-tables}

**CUSTOM_USER_TABLE** 与 **CUSTOM_USER_META_TABLE** 用于指定 WordPress 通常使用的用户表和用户元数据表将被替换，转而使用这些值/表来存储用户信息。

```
define( 'CUSTOM_USER_TABLE', $table_prefix.'my_users' );
define( 'CUSTOM_USER_META_TABLE', $table_prefix.'my_usermeta' );
```

注意：即使手动设置了 'CUSTOM_USER_META_TABLE'，系统仍会为每个数据库创建一个用户元数据表，并为每个实例分配相应的权限。默认情况下，WordPress 安装程序会为第一个用户（ID #1）添加权限。您还需要通过插件或自定义函数来管理每个站点的权限。如果未进行此设置，将会遇到权限错误和登录问题。

CUSTOM_USER_TABLE 在初始设置第一个 WordPress 实例时最容易采用。第一个实例的 `wp-config.php` 中的 define 语句指向 `wp_users` 数据默认存储的位置。完成第一个站点设置后，将可正常工作的 `wp-config.php` 复制到下一个实例仅需更改 `$table_prefix` 变量。请勿使用原始安装中已使用的电子邮件地址。完成设置过程后，使用自动生成的管理员账户和密码登录。接着，将您的普通账户提升为管理员级别并退出管理员账户。重新以您自己的账户登录，删除管理员账户并根据需要提升其他用户账户的权限。

### 语言与语言目录 {#language-and-language-directory}

WordPress [4.0 版本](https://wordpress.org/documentation/wordpress-version/version-4-0/) 允许您在 WordPress [管理界面](https://wordpress.org/documentation/article/administration-screens/) 中更改语言。要更改管理设置界面的语言，请前往 [设置](https://wordpress.org/documentation/article/administration-screens/#settings-configuration-settings) > [常规](https://wordpress.org/documentation/article/settings-general-screen/) 并选择站点语言。

#### WordPress v3.9.6 及更低版本 {#wordpress-v3-9-6-and-below}

**WPLANG** 定义了语言翻译 (.mo) 文件的名称。**WP_LANG_DIR** 定义了 WPLANG .mo 文件所在的目录。如果未定义 WP_LANG_DIR，WordPress 会先在 wp-content/languages 中查找，然后在 `wp-includes/languages` 中查找由 WPLANG 定义的 .mo 文件。

```
define( 'WPLANG', 'de_DE' );
define( 'WP_LANG_DIR', dirname(__FILE__) . 'wordpress/languages' );
```

要查找 WPLANG 语言代码，请[参考此处](https://make.wordpress.org/polyglots/teams/)。WP Local 列中的代码就是您需要的。

### 保存查询以供分析 {#save-queries-for-analysis}

**SAVEQUERIES** 定义会将数据库查询保存到一个数组中，并且可以显示该数组以帮助分析这些查询。该信息会保存每条查询、调用它的函数以及查询执行所花费的时间。**注意：** 这会对您的网站性能产生影响，因此请确保在非调试时关闭此功能。

首先，将此添加到 `wp-config.php` 文件中：

```
define( 'SAVEQUERIES', true );
```

然后在您主题的页脚中添加此代码：

```
if ( current_user_can( 'administrator' ) ) {
  global $wpdb;
  echo "<pre>";
  print_r( $wpdb->queries );
  echo "</pre>";
}
```

或者，可以考虑使用 [Query Monitor](https://wordpress.org/plugins/query-monitor/)

### 覆盖默认文件权限 {#override-of-default-file-permissions}

**FS_CHMOD_DIR** 和 **FS_CHMOD_FILE** 定义语句允许覆盖默认文件权限。这两个变量的开发是为了解决核心更新功能在运行于 [suexec](https://en.wikipedia.org/wiki/SuEXEC) 环境下的主机上失败的问题。如果主机对所有用户文件使用限制性文件权限（例如 400），并拒绝访问设置了组或全局权限的文件，这些定义可以解决该问题。

```
define( 'FS_CHMOD_DIR', ( 0755 & ~ umask() ) );
define( 'FS_CHMOD_FILE', ( 0644 & ~ umask() ) );
```

提供 setgid 的示例：

```
define( 'FS_CHMOD_DIR', ( 02755 & ~umask() ) );
```

注意：'**0755′** 和 '**02755**' 是八进制值。八进制值必须以 0 为前缀，并且不使用单引号（'）分隔。另请参阅：[更改文件权限](https://developer.wordpress.org/advanced-administration/server/file-permissions/)

### WordPress 升级常量 {#wordpress-upgrade-constants}

**注意：请根据解决更新问题的实际需要，尽可能少地定义以下常量。**

需要定义这些常量最常见的原因是：

*   主机运行在涉及符号链接的特殊安装配置下。您可能需要定义与路径相关的常量（FTP_BASE、FTP_CONTENT_DIR 和 FTP_PLUGIN_DIR）。通常，仅定义基础路径就足够了。
*   某些 PHP 安装附带的 PHP FTP 扩展与某些 FTP 服务器不兼容。在这些罕见情况下，您可能需要将 FS_METHOD 定义为 "ftpsockets"。

以下是适用于 WordPress 更新的有效常量：

*   **FS_METHOD** 强制指定文件系统方法。它只能是 "direct"、"ssh2"、"ftpext" 或 "ftpsockets"。通常，只有在遇到更新问题时才应更改此设置。如果更改后没有帮助，**请改回或移除它**。在大多数情况下，如果自动选择的方法无效，将其设置为 'ftpsockets' 会起作用。
    *   **（首选）"direct"** 强制使用 PHP 内部的直接文件 I/O 请求，这在配置不当的主机上容易引发安全问题，在适当时会自动选择此方法。
    *   **（次选）"ssh2"** 强制使用已安装的 SSH PHP 扩展。
    *   **（第三选择）"ftpext"** 强制使用 FTP PHP 扩展进行 FTP 访问。
    *   **（第四选择）"ftpsockets"** 利用 PHP Sockets 类进行 FTP 访问。
*   **FTP_BASE** 是 WordPress 安装的"基础"（ABSPATH）文件夹的完整路径。
*   **FTP_CONTENT_DIR** 是 WordPress 安装的 wp-content 文件夹的完整路径。
*   **FTP_PLUGIN_DIR** 是 WordPress 安装的 plugins 文件夹的完整路径。
*   **FTP_PUBKEY** 是您的 SSH 公钥的完整路径。
*   **FTP_PRIKEY** 是您的 SSH 私钥的完整路径。
*   **FTP_USER** 是 FTP 或 SSH 用户名。很可能两者相同，但请根据您希望执行的更新类型使用相应的用户名。
*   **FTP_PASS** 是为 **FTP_USER** 输入的用户名的密码。如果使用 SSH 公钥认证，可以省略此项。
*   **FTP_HOST** 是您的 SSH/FTP 服务器的 主机名:端口 组合。默认 FTP 端口是 21，默认 SSH 端口是 22。这些无需特别说明。
*   **FTP_SSL** 如果**底层传输支持**（并非所有服务器都可用），则设为 TRUE 以使用 SSL 连接。这用于"安全 FTP"，而非 SSH SFTP。

```
define( 'FS_METHOD', 'ftpext' );
define( 'FTP_BASE', '/path/to/wordpress/' );
define( 'FTP_CONTENT_DIR', '/path/to/wordpress/wp-content/' );
define( 'FTP_PLUGIN_DIR ', '/path/to/wordpress/wp-content/plugins/' );
define( 'FTP_PUBKEY', '/home/username/.ssh/id_rsa.pub' );
define( 'FTP_PRIKEY', '/home/username/.ssh/id_rsa' );
define( 'FTP_USER', 'username' );
define( 'FTP_PASS', 'password' );
define( 'FTP_HOST', 'ftp.example.org' );
define( 'FTP_SSL', false );
```

Some configurations should set FTP_HOST to localhost to avoid 503 problems when trying to update plugins or WP itself.

#### 启用 SSH 升级访问 {#enabling-ssh-upgrade-access}

有两种使用 SSH2 进行升级的方法。

第一种是使用 [SSH SFTP 更新器支持插件](https://wordpress.org/plugins/ssh-sftp-updater-support/)。第二种是使用内置的 SSH2 升级器，这需要安装 pecl SSH2 扩展。

要安装 pecl SSH2 扩展，您需要执行类似以下的命令，或者联系您的网络托管提供商进行安装：

```
pecl install ssh2
```

安装 pecl ssh2 扩展后，您需要修改 PHP 配置以自动加载此扩展。

在大多数 Linux 发行版中，pecl 由 pear 包提供。要在 Redhat/Fedora/CentOS 中安装 pecl：

```
yum -y install php-pear
```

要在 Debian/Ubuntu 中安装 pecl：

```
apt-get install php-pear
```

建议使用不受密码短语保护的私钥。有许多报告称受密码短语保护的私钥无法正常工作。如果您决定尝试使用受密码短语保护的私钥，则需要将私钥的密码短语作为 FTP_PASS 输入，或者在安装更新时在显示的凭据字段的“密码”字段中输入。

### 替代性 Cron 任务调度 {#alternative-cron}

在某些情况下可能需要为 WP 使用替代性 Cron。最常见的原因是预定发布的文章未能按预期发布。这种替代方法采用重定向机制：当需要执行 cron 时，用户浏览器会收到重定向指令，使其立即返回网站，而 cron 则在他们刚中断的连接中继续运行。此方法存在特定风险，因为它依赖于非原生的 WordPress 服务。

```
define( 'ALTERNATE_WP_CRON', true );
```

### 禁用 Cron 和 Cron 超时设置 {#disable-cron-and-cron-timeout}

通过将 DISABLE_WP_CRON 设置为 true 来完全禁用 cron。

```
define( 'DISABLE_WP_CRON', true );
```

确保 cron 进程在 WP_CRON_LOCK_TIMEOUT 秒内不会重复运行。

```
define( 'WP_CRON_LOCK_TIMEOUT', 60 );
```

### 其他可定义常量 {#additional-defined-constants}

以下是其他可以定义的常量。除非已尝试过其他方法，否则可能不应设置这些常量。如果您有特殊的域名设置，Cookie 定义可能会特别有用。

```
define( 'COOKIEPATH', preg_replace( '|https?://[^/]+|i', '', get_option( 'home' ) . '/' ) );
define( 'SITECOOKIEPATH', preg_replace( '|https?://[^/]+|i', '', get_option( 'siteurl' ) . '/' ) );
define( 'ADMIN_COOKIE_PATH', SITECOOKIEPATH . 'wp-admin' );
define( 'PLUGINS_COOKIE_PATH', preg_replace( '|https?://[^/]+|i', '', WP_PLUGIN_URL ) );
define( 'TEMPLATEPATH', get_template_directory() );
define( 'STYLESHEETPATH', get_stylesheet_directory() );
```

### 清空回收站 {#empty-trash}

此常量控制 WordPress 在多少天后将永久删除回收站中的文章、页面、附件和评论。默认值为 30 天：

```
define( 'EMPTY_TRASH_DAYS', 30 ); // 30 天
```

要禁用回收站功能，请将天数设置为零。

```
define( 'EMPTY_TRASH_DAYS', 0 ); // 零天
```

**注意：** 使用此设置时，当有人点击“永久删除”时，WordPress 将不会要求确认。

### 自动数据库优化 {#automatic-database-optimizing}

系统支持自动数据库修复功能，您可以通过在 `wp-config.php` 文件中添加以下定义来启用。

注意：此功能仅在需要时启用，问题解决后应禁用。启用后，用户无需登录即可访问该功能，因为其主要目的是修复损坏的数据库，而数据库损坏时用户通常无法登录。

```
define( 'WP_ALLOW_REPAIR', true );
```

该脚本位于 `{$your_site}/wp-admin/maint/repair.php`。

### DO_NOT_UPGRADE_GLOBAL_TABLES {#do-not-upgrade-global-tables}

**DO_NOT_UPGRADE_GLOBAL_TABLES** 常量定义可阻止 [dbDelta()](https://developer.wordpress.org/reference/functions/dbdelta/) 和升级函数对全局表执行高开销查询。

对于拥有大型全局表（特别是用户表和用户元数据表）的站点，以及那些与 bbPress 或其他 WordPress 安装共享用户表的站点，可以通过将 **DO_NOT_UPGRADE_GLOBAL_TABLES** 定义为 true 来防止升级过程中修改这些表。由于 ALTER 操作或无限制的 DELETE 或 UPDATE 操作可能需要很长时间才能完成，大型站点通常希望避免在升级过程中运行这些查询，以便自行处理。此外，如果多个 bbPress 和 WordPress 安装之间共享用户表，您可能希望指定一个站点作为升级主控。

```
define( 'DO_NOT_UPGRADE_GLOBAL_TABLES', true );
```

### 查看所有已定义的常量 {#view-all-defined-constants}

PHP 提供了一个函数，可以返回包含所有当前已定义常量及其值的数组。

```
print_r( @get_defined_constants() );
```

### 禁用插件和主题文件编辑器 {#disable-the-plugin-and-theme-file-editor}

有时您可能希望禁用插件或主题文件编辑器，以防止过度热心的用户编辑敏感文件并可能导致网站崩溃。如果黑客获得了高权限用户账户的访问权限，禁用这些功能还能提供额外的安全层。

```
define( 'DISALLOW_FILE_EDIT', true );
```

**注意**：某些插件的功能可能会因其代码中使用 `current_user_can('edit_plugins')` 而受到影响。插件作者应避免检查此权限，或至少检查是否设置了此常量并显示适当的错误消息。请注意，如果插件无法正常工作，这可能是原因。

### 禁用插件和主题更新与安装 {#disable-plugin-and-theme-update-and-installation}

这将阻止用户在 WordPress 管理区域使用插件和主题的安装/更新功能。设置此常量也会禁用插件和主题文件编辑器（即您无需同时设置 DISALLOW_FILE_MODS 和 DISALLOW_FILE_EDIT，因为单独设置 DISALLOW_FILE_MODS 会产生相同效果）。

```
define( 'DISALLOW_FILE_MODS', true );
```

### 为管理员和登录强制使用 SSL {#require-ssl-for-admin-and-logins}

**注意：** WordPress [4.0 版本](https://wordpress.org/documentation/wordpress-version/version-4-0/)已弃用 FORCE_SSL_LOGIN。请使用 FORCE_SSL_ADMIN。

FORCE_SSL_ADMIN 用于保护登录和管理区域，确保密码和 Cookie 永远不会以明文形式发送。更多详情请参阅 [HTTPS](https://developer.wordpress.org/advanced-administration/security/https/)。

```
define( 'FORCE_SSL_ADMIN', true );
```

### 阻止外部 URL 请求 {#block-external-url-requests}

通过将 WP_HTTP_BLOCK_EXTERNAL 定义为 true 来阻止外部 URL 请求，这将只允许本地主机和您的博客发出请求。常量 WP_ACCESSIBLE_HOSTS 将允许额外的主机通过以进行请求。WP_ACCESSIBLE_HOSTS 常量的格式是以逗号分隔的允许主机名列表，支持通配符域名，例如 `*.wordpress.org` 将允许联系 wordpress.org 的所有子域名。

```
define( 'WP_HTTP_BLOCK_EXTERNAL', true );
define( 'WP_ACCESSIBLE_HOSTS', 'api.wordpress.org,*.github.com' );
```

### 禁用 WordPress 自动更新 {#disable-wordpress-auto-updates}

网站可能因某些原因（如自定义修改或主机提供的更新）需要禁用自动更新。在重大版本发布前，也可先禁用自动更新，以便在开发或测试环境中进行充分测试，再在生产站点执行更新。

```
define( 'AUTOMATIC_UPDATER_DISABLED', true );
```

### 禁用 WordPress 核心更新 {#disable-wordpress-core-updates}

控制核心更新的最简单方法是使用 `WP_AUTO_UPDATE_CORE` 常量：

**禁用所有核心更新：**
```
define( 'WP_AUTO_UPDATE_CORE', false );
```

**启用所有核心更新，包括次要版本和主要版本：**
```
define( 'WP_AUTO_UPDATE_CORE', true );
```

**仅为次要版本启用核心更新（默认设置）：**
```
define( 'WP_AUTO_UPDATE_CORE', 'minor' );
```

参考：[在 WordPress 3.7 中禁用自动更新](https://make.wordpress.org/core/2013/10/25/the-definitive-guide-to-disabling-auto-updates-in-wordpress-3-7/)

### 清理图片编辑 {#cleanup-image-edits}

默认情况下，WordPress 每次编辑图片时都会创建一组新的图片，并且在恢复原始图片时，会将所有编辑版本保留在服务器上。将 IMAGE_EDIT_OVERWRITE 定义为 true 可以改变此行为。系统只会创建一组图片编辑版本，并且在恢复原始图片时，编辑版本会从服务器上移除。

```
define( 'IMAGE_EDIT_OVERWRITE', true );
```

## 保存前请仔细检查 {#double-check-before-saving}

_**请务必检查您输入的上述任何值前后是否有空格，并且不要删除单引号！**_

在保存文件之前，请务必**仔细检查**您是否意外删除了参数值周围的任何单引号。确保文件中的 PHP 结束标签后没有任何内容。文件的最后内容应为 **?>**，别无其他。没有空格。

要保存文件，请选择**文件 > 另存为 > wp-config.php**，并将文件保存在 WordPress 安装的根目录中。将文件上传到您的 Web 服务器，您就可以安装 WordPress 了！