thbighead / wordless
为厌倦WordPress的开发者设计的无头WordPress CMS
Requires
- php: ~8.2.0
- composer/installers: ^2.1
- roots/wordpress: ~6.4.0
- thbighead/wordless-framework: ~8.2.0
Requires (Dev)
- phpunit/phpunit: ^10.4
- psy/psysh: ^0.11.22
- symfony/var-dumper: ^6.3
- dev-main
- v8.3.3
- v8.3.2
- v8.3.1
- v8.3.0
- v8.2.2
- v8.2.1
- v8.2.0
- v8.1.3
- v8.1.2
- v8.1.1
- v8.1.0
- v8.0.19
- v8.0.18
- v8.0.17
- v8.0.16
- v8.0.15
- v8.0.14
- v8.0.13
- v8.0.12
- v8.0.11
- v8.0.10
- v8.0.9
- v8.0.8
- v8.0.7
- v8.0.6
- v8.0.5
- v8.0.4
- v8.0.3
- v8.0.2
- v8.0.1
- v8.0.0
- v5.1.3
- v5.1.2
- 5.1.1
- v5.1.0
- v5.0.3
- v5.0.2
- v5.0.1
- v5.0.0
- v4.0.2
- v4.0.1
- 4.0.0
- v3.4.2
- v3.4.1
- v3.4.0
- v3.3.0
- v3.2.3
- v3.2.2
- v3.2.1
- v3.2.0
- v3.1.1
- v3.1.0
- v3.0.3
- v3.0.2
- v3.0.1
- v3.0.0
- v2.0.2
- v2.0.1
- v2.0.0
- v1.5.4
- v1.5.3
- v1.5.2
- v1.5.1
- v1.5.0
- v1.4.0
- v1.3.3
- v1.3.2
- v1.3.1
- v1.3.0
- v1.2.0
- v1.1.2
- v1.1.1
- v1.1.0
- v1.0.6
- v1.0.5
- v1.0.4
- v1.0.3
- v1.0.2
- v1.0.1
- v1.0.0
- v0.10.0
- v0.9.1
- v0.9.0
- v0.8.1
- v0.8.0
- v0.7.1
- v0.7.0
- v0.6.1
- v0.6.0
- v0.5.4
- v0.5.3
- v0.5.2
- v0.5.1
- v0.5.0
- v0.4.0
- v0.3.1
- v0.3.0
- v0.2.2
- v0.2.1
- v0.2.0
- v0.1.0
- dev-development
This package is auto-updated.
Last update: 2024-09-17 14:49:18 UTC
README
为厌倦WordPress的开发者打造的无头WordPress项目
快速行动
新建项目
composer create-project thbighead/wordless example-app
cd example-app
cp .env.example .env
cp docker/nginx/sites/app.conf.example docker/nginx/sites/app.conf
- 编辑
.env
的第3行,使用你的应用程序主机值。 - 编辑
docker/nginx/sites/app.conf
的第11行,与.env
中的APP_HOST
值完全相同。 - 将你的主机添加到本地hosts文件中(这取决于你的操作系统)。
docker compose up -d
docker compose exec --user=laradock workspace bash
现在在你的工作区容器内
composer install php console wordless:install
初始化克隆的项目
cp .env.example .env cp docker/nginx/sites/app.conf.example docker/nginx/sites/app.conf
- 编辑
.env
的第3行,使用你的应用程序主机值。 - 编辑
docker/nginx/sites/app.conf
的第11行,与.env
中的APP_HOST
值完全相同。 - 将你的主机添加到本地hosts文件中(这取决于你的操作系统)。
docker compose up -d
docker compose exec --user=laradock workspace bash
现在在你的工作区容器内
composer install php console wordless:install
下载Wordless
只需运行以下代码
composer create-project thbighead/wordless example-app
cd example-app
Wordless Docker
如你所见,我们基于Laradock项目构建了这些容器。
下载后,你应该启动Wordless提供的默认容器。要实现这一点,首先你应该创建一个新的docker/nginx/sites/app.conf
,从docker/nginx/sites/app.conf.example
复制,然后,只需编辑第11行,使用你想要的应用程序URL作为服务器名。这个值应该与你在稍后讨论的.env
文件中设置的APP_HOST
值相同。
接下来,只需运行docker compose up -d
(我们推荐Docker Compose版本2)。
现在为了继续Wordless安装,我们建议使用内置的workspace
容器,你可以通过以下命令访问
docker compose exec --user=laradock workspace bash
就是这样。在这个容器内,你可以使用wordless:install
命令安装项目。
关于开发者和WordPress
如果你是WordPress爱好者,请确保你理解WordPress 不是 任何为开发者制作的工具。我们将在下面进一步讨论。
如果你是PHP开发者,请确保你理解WordPress 是 一个过时的项目,并且经常通过大规模更新来维持其生命力。你不应该害怕旧代码,你可以解决这个问题:你只需要时间。
WordPress是一个强大的CMS,经过多年的发展,现在可以为任何非IT人员提供一个完全创建和自定义类似博客网站的机会。但除了维护内容外,管理面板还让你能够改变整个页面的代码。这就是魔法的开始,也是问题的起源。
WordPress建立在插件和主题之上,它们不需要遵循任何项目结构。你所需要做的就是通过WordPress钩子进行冒险,有时也称为过滤器和/或动作,然后做你想要做的事情。尽管WordPress试图引入一些概念来组织和命名主题文件,如摘要、文章、页面、分类、分类法等,但每个主题都有一个完全不同的目录组织和项目结构。最后,当我们谈到插件时,项目组织变得更加复杂,我们意识到即使WordPress不断更新,其代码仍然缺乏一些重构。
那么,WordPress是不是很糟糕呢?不是。
最后,它就像魔法一样运作。但这并不是一个帮助开发者的工具!相反,WordPress是一个具有知名管理面板的可扩展CMS应用程序。我们这些IT人士必须理解的是,我们应该尊重它的本来面目。
对于开发者来说,整个问题在于WordPress中的行为变化可能发生在任何地方。真的。任何地方。所以当你让我们更改网站上某个元素的颜色时,它可能已经在CSS文件、PHP文件、通过管理面板管理的数据库中,或者CLI命令中完成。甚至一个JS文件也可能在更改它。没有规则,没有层次结构可以开始搜索,我们只是在谈论一个颜色更改。现在想象一下,如果用户以前从未以其他方式登录,那么通过他们的Facebook账户登录并填写表单的API消费。
说了这么多,一个更好地与WordPress协作的方法是定义这些层次结构,我们从将视图与业务代码分离开始。实现它的一个很好的方法是将其用作一个无头 CMS。
无头策略
我们这里的箴言是
让WordPress像应用一样工作,并在其他地方开发你的自定义功能。
为了实现它,我们将WordPress安装为无头CMS,这意味着它不再负责管理页面视图。相反,我们将使用WordPress REST API来作为前端项目的客户端。此外,为了准备整个WordPress项目,我们使用了由Composer、Symfony和WP-CLI构建的控制台安装程序。
无头引入了一个空白主题,它只是...嗯...什么也不做。但您甚至可以安装任何已知(或未知)的主题,并通过网络使用它来提供内容。
WordPressic主题
有时您可能希望使用Wordless作为后端构建项目,使用Wordless工具来提供页面,就像任何WordPress项目一样。为了实现这一点,我们还有一个扩展了空白主题的主题,称为SSR(就像最知名的前端框架中众所周知的“服务器端渲染”策略)。
目录和文件组织
| app (Composer initializes everything inside this directory)
| \
| | Commands (Custom project commands to run through console)
| | Controllers (Custom project Controllers to add routes to API)
| | Hookers (WordPress action/filter done through an easy-to-use class)
| | \
| | | Ajax (Wordless hookers for easy defining WordPress AJAX functions)
| | Menus (WordPress menu registration classes)
| | Scripts (WordPress front-end scripts registration classes)
| | Styles (WordPress front-end styles registration classes)
| cache (Internal cache files)
| config (Published project configuration files)
| docker (Easy to use development environment containers based on Laradock)
| \
| | adminer (Adminer container for database access through browser GUI)
| | logs (Where all container log files shall be created)
| | mariadb (MariaDB container as our default database)
| | php-fpm (PHP container as our default programming language)
| | workspace (Our developing container which we access to use Composer, NPM, etc.)
| | nginx (MariaDB container as our default database)
| | \
| | | sites (Where you should place your app config file for NGINX)
| | | \
| | | | ssl (where your app cresencial for SSL access (HTTPS) shall be generated)
| | | |>app.conf.example (a good start of NGINX config file for your app)
| migrations (Where we store our migration files)
| packages (Used by Wordless oficial package development)
| public (Websystem entrypoint where we place some symbolic links to WordPress folders)
| \
| |>robots.txt (auto-generated after wordless:install)
| wp
| \
| | wp-content
| | \
| | | languages (Just like WordPress. Everything inside is ignored by Git)
| | | mu-plugins (Just like WordPress. Place any handmade or modified plugin here)
| | | plugins (Just like WordPress. Everything inside is ignored by Git. Installation controlled by Composer)
| | | themes (Just like WordPress. Ships with wordless theme)
| | | uploads (For built-in WordPress filesystem. Everything inside is ignored by Git)
| | |>debug.log (WordPress log file)
| | wp-core (WordPress core files (anything but wp-content))
| |>index.php (Just like WordPress)
|>.env.example (Used to create new .env files)
|>composer.json (Composer)
|>console (Wordless CLI file)
|>docker-compose.yml (Docker Compose file to up application containers)
|>wp-cli.yml (WP-CLI config file)
Wordless CLI
console
有许多命令可以帮助您安装和保持项目运行。要检查可用的命令,只需运行php console list
。要获取有关每个命令的更多信息,请运行php console {command:alias} --help
。您可以在Commands
目录中创建自己的命令,扩展\Wordless\Infrastructure\ConsoleCommand
。
运行WP-CLI命令
通过运行php console wp:run "command with arguments and options here"
,Wordless将执行任何WP-CLI命令。只需注意使用引号来包围命令,例如
php console wp:run "cache flush"
Wordless通过Composer保持WP-CLI,并将根据您的操作系统选择正确的脚本文件来执行。
安装Wordless
预配置文件
在运行任何命令之前,您应该检查以下预配置文件
.env
.env
是一个文件,用于保存每个环境中可能不同的值(例如,如果您有一个产品,您还有本地和预发布环境)。因此,它永远不应该由GIT进行版本控制。您可以根据需要添加更多值,但请记住,已存在于.env.example
中的值是Wordless的核心值。
您可以通过整个项目使用Environment::get()
辅助函数来访问.env
值。
use Wordless\Helpers\Environment; // ... $admin_mail = Environment::get('WP_ADMIN_EMAIL', 'A default value');
重要:如您所见,
.env
定义了SALT值。它们通过https://api.wordpress.org/secret-key/1.1/salt/自动生成。
docker/nginx/sites/app.conf
该文件应基于docker/nginx/sites/app.conf.example
创建。请记住,在行11处,server_name
应与您的.env
APP_HOST
变量具有相同的值。
.htaccess
由于我们使用NGINX而不是Apache,这些文件都被忽略。
运行console
命令
新鲜启动后,在通过composer install
命令安装所有Composer包之后,只需在项目根目录中运行php console wordless:install
。
如果您想检查脚本运行时的过程,请使用
-v
标志:php console wordless:install -v
。
此命令将按以下顺序解决以下内容
解决强制模式(-f
)
此步骤负责在带有-f
标志的安装命令运行时解决以下需求
- 删除
wp/wp-content/mu-plugins/wordless-plugin.php
; - 删除
wp/wp-core/wp-config.php
; - 删除
public/robots.txt
。
如果这些文件中的任何一个不存在,我们将忽略它。如果我们无法删除文件,将引发FailedToDeletePath
异常。
加载配置
将盐值填充到.env
WordPress盐值保存在.env
变量中,并且如果它们尚未评估,此过程部分将评估它们。此外,在此步骤之后,过程已将所有环境变量加载到内存中。您可以在此处了解更多信息。
生成内部缓存
通过php console cache:create
命令,所有配置的缓存都将创建在cache
目录中。您可以在此处了解更多关于缓存的信息。
加载语言
Wordless将尝试通过,
字符explode
在config/wordpress.php
中返回的languages
键,并将它们安装到插件和核心中。
发布文件
发布步骤是将文件从存根复制到具有特定名称的特定位置。
发布wp-config.php
该过程调用php console publish:wp-config.php
命令,在wp/wp-core
处插入新的wp-config.php
文件。如果该文件已存在,则此步骤将被跳过。
自定义
wp-config.php
默认情况下,该文件应根据
vendor/thbighead/wordless-framework/assets/stubs/wp-config.php
创建。如果您想更改wp-config.php
的行为,请在stubs/wp-config.php
中创建自定义版本,该过程步骤将使用它。
发布robots.txt
将根据vendor/thbighead/wordless-framework/assets/stubs/robots_non_prod.txt
创建基本的robots.txt
,如果没有在public
中创建,则根据vendor/thbighead/wordless-framework/assets/stubs/robots_prod.txt
创建。您可以像修改自定义wp-config.php
一样修改存根文件,并且甚至可以通过将它们用括号括起来来引用.env
值(就像我们在其中对Sitemap值所做的)。为此,您只需创建一个与自定义wp-config.php
相同的文件即可。
发布Wordless必须使用的插件文件
Wordless通过必须使用插件加载到WordPress环境中。应谨慎修改此存根文件。我们建议不要修改它,以便Wordless可以正常工作。
安装WordPress数据库
将数据库凭据填入.env
后,Wordless能够检查您的服务器是否已安装必要的数据库以进行安装。如果数据库不存在,它将首先创建一个空的(目前没有表)数据库。
之后,Wordless将检查您的数据库并在必要时进行修复。
这里的一切都是由WP-CLI命令完成的,以下命令可能按以下顺序使用:
db check
;db create
;core is-installed
;core install --url={如.env中的APP_URL} --locale={列出的第一种语言} --title={如.env中的APP_NAME} --admin_email={无效的已知电子邮件} --admin_user=temp --skip-email
根据您的应用程序配置;
核心步骤
以下步骤是在维护模式下完成的。我们通过以下WP-CLI命令来控制它:
修复数据库URL
众所周知的选项siteurl
和home
将根据您的应用程序配置进行更新。
之后,通过WP-CLI执行数据库优化。
因此,以下WP-CLI命令将按以下顺序执行:
option update siteurl {如.env中的APP_URL与您的管理面板URI配置连接}
option update home {如.env中的APP_URL}
db optimize
刷新重写规则
根据您的固定链接配置,WP-CLI通过以下命令从数据库中刷新旧规则:
激活主题和插件
激活来自config/wordpress.php
中的theme
键的主题。默认是我们的空白主题:wordless
。
然后,激活所有插件。
同样,一切均通过以下顺序的WP-CLI命令进行控制:
安装WordPress语言
为插件安装所有语言,但WordPress核心只应安装第一个,所以请务必仔细选择要列出的语言**。如果languages
配置键为空,则将跳过此过程。
同样,一切均通过以下顺序的WP-CLI命令进行控制:
language core is-installed {languages配置键中列出的第一个区域设置}
language core install {languages配置键中列出的第一个区域设置} --activate
language core update
site switch-language {languages配置键中列出的第一个区域设置}
- 对于
languages
配置键中列出的每个语言:
使WordPress博客公开
如果您的.env
变量APP_ENV
为production
,我们将数据库值blog_public
设置为true
,否则将其设置为false
。这是通过以下option update blog_public {如前所述}
WP-CLI命令完成的。
更新WordPress数据库
生成符号链接
此步骤在public
目录内生成符号链接,该目录由config/wordless.php
中的public-symlinks
键配置。您可以在此处了解更多信息。
应用WordPress管理配置
管理面板配置在此预先配置如下:
- 使用
php console options:date
命令配置日期。
注册计划
使用 php console schedule:register
命令注册 WordPress CRON 调度。您可以在这里了解更多有关调度的信息。
运行迁移
使用 php console migrate
命令将缺失的迁移运行到您的 migrations
目录中。有关迁移的更多信息,请参阅这里。
同步用户角色
同步您的应用程序管理员用户角色,这些角色位于 config/wordpress.php
中的 permissions
配置键。有关用户角色同步的更多信息,请参阅这里。
WordPress 配置文件权限
为了避免在生产环境中(APP_ENV=production
)出现任何问题,我们将 wp/wp-core/wp-config.php
文件的权限设置为 660
。
WordPress插件
通过环境常量 DISALLOW_FILE_MODS
设置为 true
安装 Wordless blocks 插件。为了维护您的插件(以及主题),您应使用 Composer。您可以在https://wpackagist.org/ 查找可用的主题和插件。
WordPress 核心
要下载 WordPress 核心文件(从常规 WordPress 文件夹中的一切,除了 wp-content
,我们已经在我们创建在 wp
内的文件夹中),我们同样使用 Composer。它们保存在 wp/wp-core
中。有关如何维护 WordPress 版本的更多信息,请参阅这里。
重要: 此过程不会完全安装 WordPress,只会下载其核心文件。
更改 WordPress 版本
要更改项目使用的 WordPress 版本,您必须更改项目 composer.json
文件中 roots/wordpress
包的版本约束,并运行以下命令
composer update roots/wordpress -W
Wordless 公共入口点和符号链接
WordPress 建议您的服务器使用其根目录作为入口点。在 NGINX 中,这意味着您的配置文件应该定义一个根,其绝对路径指向项目根目录。这里的主要问题是,当客户端通过互联网访问您的网站时,它可能会尝试访问项目中的任何目录/文件,这可能会成为严重的安全问题。为了避免这种情况,WordPress 会持续更新以正确阻止对敏感目录/文件的直接访问。然而,第三方插件目录/文件也必须持续更新以阻止这些问题。
正如我们所看到的,我们必须信任所有这些目录/文件都被正确地阻止了。此外,由于我们的代码将位于项目根目录中,我们也必须关注这个安全问题。为了帮助解决这个问题,Wordless 在其根目录中引入了一个 public
入口点目录。只有其中的目录/文件才能通过互联网直接由客户端访问。
要使必要的目录/文件对客户端可访问,您只需在 config/wordless.php
中配置 public-symlinks
键,它应该是一个数组,其键是客户端访问的 URI,其值是从 public
目录到相应可访问文件/目录的相对路径。
配置 public-symlinks
如前所述,要将符号链接包含在 public
目录中,您只需要将 public
内部的相对符号链接路径映射到给定的文件/目录相对路径,就像以下示例所示
use Wordless\Application\Commands\GeneratePublicWordpressSymbolicLinks; return [ // ... GeneratePublicWordpressSymbolicLinks::PUBLIC_SYMLINK_KEY => [ // ... 'index.php' => '../wp/index.php', // ... ], // ... ];
上面的代码将创建一个名为 index.php
的符号链接,链接到 public/../wp/index.php
(意味着 wp/index.php
)文件。请注意,由于我们已经将 public
目录作为 NGINX 服务器的入口点,index.php
成为了网站的合法 URI(https://example.test/
index.php)。
让我们看看另一个示例,这次使用目录作为符号链接的目标
use Wordless\Application\Commands\GeneratePublicWordpressSymbolicLinks; return [ // ... GeneratePublicWordpressSymbolicLinks::PUBLIC_SYMLINK_KEY => [ // ... 'wp-content/uploads' => '../wp/wp-content/uploads', // ... ], // ... ];
上面的代码将创建一个名为 uploads
的符号链接,链接到 public/../wp/wp-content/uploads
(意味着 wp/index.php
)文件。请注意,由于我们已经将 public
目录作为 NGINX 服务器的入口点,index.php
成为了网站的合法 URI(https://example.test/
index.php)。
.wlsymlinks
文件
待定。
缓存
待定。
数据库迁移
待定。
WordPress 抽象
由于 WordPress 不是面向对象的,为了帮助开发者,我们引入了一些类来管理其抽象,如下所示。
自定义文章类型
待定。
定时任务
待定。
用户角色同步
待定。
WordPress 管理面板
诊断小部件
此面板可能会让通过信息如“自动更新已禁用”或“缺少默认主题”登录管理面板的用户感到烦恼。这些消息对那些没有开发者的用户管理自己的网站是有用的,但对于 Wordless 来说,这只是一个烦恼或者不重要的事情。因此,您可以通过在 config/wordpress.php
中管理可以查看此小部件的用户角色,来添加或删除 show_diagnostics_only_to
数组键中的用户角色别名。
常见问题
- 在 Windows 中进入工作区容器时出现 Bash 错误:有时您的 Git for Windows 可能会绕过我们为
docker
目录配置的.gitattributes
,并以 CRLF 行结束符(Windows 风格)克隆其文件。如果您使用\r\n
作为行结束符构建工作区容器,则会显示以下警告bash: $'\r': command not found bash: $'\r': command not found bash: /home/laradock/aliases.sh: line 118: syntax error near unexpected token `$'{\r'' 'ash: /home/laradock/aliases.sh: line 118: `function mkd() {
要解决这个问题,请将docker
目录内所有文件的行结束符更改为 LF(Unix 风格),然后使用docker compose build --no-cache
重新构建容器。 - WSL 上的缓慢互联网连接(这也使得 Docker 容器也具有有限的互联网连接):[https://townsyio.medium.com/wsl2-how-to-fix-download-speed-3edb0c348e29#2b4c](https://townsyio.medium.com/wsl2-how-to-fix-download-speed-3edb0c348e29#2b4c)。
- WSL 上没有互联网连接(这也使得 Docker 容器也断开互联网连接):[基于:https://askubuntu.com/a/1401317](https://askubuntu.com/a/1401317)。
- 打开 WSL2 终端;
- 在
/etc/wsl.conf
中创建或追加文件:sudo vim /etc/wsl.conf
; - 在其中写入以下行
[network] generateResolvConf = false
- 关闭 WSL2 终端并打开 PowerShell 终端;
- 运行
wsl --shutdown
; - 再次打开 WSL2 终端;
- 删除旧的
/etc/resolv.conf
:sudo rm -rf /etc/resolv.conf
; - 创建一个新的
/etc/resolv.conf
:sudo vim /etc/resolv.conf
; - 在其中写入以下行
nameserver 8.8.8.8 nameserver 1.1.1.1
- 创建 Docker 网络失败:如果在执行
docker compose up -d
或类似命令时遇到类似于“无法创建网络 your_network_name:从默认中找不到可用且不重叠的 IPv4 地址池以分配给网络”的错误,可能是 Docker 已经达到了可共存网络的最大数量。只需运行docker network prune
并回答y
即可。不要担心,当您将它们启动时,任何其他容器所需的网络都应该再次启动(如果它们没有,可能您的 Docker 容器配置只是乱糟糟的)。[基于:https://stackoverflow.com/questions/43720339/docker-error-could-not-find-an-available-non-overlapping-ipv4-address-pool-am#comment100438100_43720339](https://stackoverflow.com/questions/43720339/docker-error-could-not-find-an-available-non-overlapping-ipv4-address-pool-am#comment100438100_43720339)。 - 守护进程无法找到网络:如果您使用
docker network prune
或类似命令修剪了网络,则需要重新挂载容器,为此,按顺序运行以下命令docker compose down docker compose up -d
- 启动容器时网络警告:只需忽略如下警告
WARN[0000] a network with name wordless-frontend-network exists but was not created for project "your-project-name". Set 'external: true' to use an existing network`
Docker Compose 团队似乎不喜欢像我们一样在项目之间共享网络的想法,但这确实工作得很好。 - 构建时敏感数据警告:在构建开发环境时,您可能可以忽略如下警告
WARN: SecretsUsedInArgOrEnv: Do not use ARG or ENV instructions for sensitive data
这是一个开发环境,如果您将其用于预发布/生产,请随意自定义以提高其安全性,但您将自行承担风险。