dreimus / wordpress-bundle
使用 WordPress 5 作为 Symfony 应用的后端
Requires
- php: >=5.6.1
- ext-fileinfo: *
- ext-json: *
- ext-mbstring: *
- ext-zip: *
- ext-zlib: *
- dflydev/dot-access-data: ~1.0
- enshrined/svg-sanitize: 0.*
- ifsnop/mysqldump-php: 2.*
- intervention/image: 2.*
- johnpbloch/wordpress-core: 5.*
- metabolism/package-actions: 1.1.*
- metabolism/wordpress-core-installer: 1.0.*
Suggests
- elliotcondon/advanced-custom-fields-pro: Customise WordPress with powerful, professional and intuitive fields.
- metabolism/acf-extensions: Component extension for ACF
- wpackagist-plugin/classic-editor: Restores the previous (« classic ») WordPress editor and the « Edit Post » screen.
- wpackagist-plugin/multisite-language-switcher: Add multilingual support using a WordPress multisite
- wpackagist-plugin/wordpress-seo: The favorite WordPress SEO plugin of millions of users worldwide!
- wpackagist-plugin/wp-smartcrop: Set the 'focal point' of any image, right from the media library
This package is auto-updated.
Last update: 2024-09-29 05:42:52 UTC
README
简介
使用 WordPress 5 作为 Symfony 应用的后端
主要思想是利用 Symfony 的力量来实现前端/网关服务,同时结合 WordPress 的易用性来处理后端。
它是如何工作的?
当 WordPress 扩展包被加载时,它会加载一小部分 WordPress 核心文件,以便在 Symfony 控制器内部使用 WordPress 函数。
然后通过 mu 文件夹中的插件将 WordPress 连接到扩展包。
由于它是一个 Symfony 扩展包,WordPress 中没有主题管理,整个路由都由 Symfony 控制。
特性
从 Composer
- 通过 composer 安装/更新 WordPress
- 通过 composer 安装/更新插件
从 Symfony
- 模板引擎
- 文件夹结构
- Http 缓存
- 路由
- 通过 Composer 安装 WordPress 核心和插件
- YML 配置(甚至对于 WordPress)
- DotEnv
- 增强安全(WordPress 被隐藏)
- 动态图片缩放
从扩展包本身
- WordPress 的 YML 配置(见下文)
- 自定义文章类型和分类的永久链接设置
- ACF 数据清理
- SF 缓存失效(Varnish 兼容)
- 文章/图片/菜单/术语/用户/评论/查询实体
- 从管理界面下载备份(上传 + 数据库)
- 维护模式
- 多站点图片同步(用于多站点多语言)
- SVG 支持
- 在自定义文章类型存档页面的工具栏中编辑文章按钮
- WordPress 预定义路由通过 permastruct
- 上下文助手
- 相对 URL
- 术语错误修复(排序)
- 表单助手(获取/验证/发送)
- 多站点文章深度复制(使用多站点语言切换插件)
- 上传图片文件名清理
- 在管理界面中自定义数据表支持,带有查看和删除操作
- 可扩展,实体,控制器和扩展包插件可以在应用中扩展
- 网站健康检查器
缺点
由于 WordPress 的设计,函数在全局命名空间中可用,这并不完美,但 WordPress 一定会很快改变这一点。
某些插件可能无法直接使用,WooCommerce 提供者需要一些重工作
演示
演示可在 https://github.com/wearemetabolism/wordpress-bundle-demo 获取
,它是 WordPress 5 的 Twenty Nineteen 主题的实现。
安装
1 - 开始一个新的项目
symfony new --full my_project
或
composer create-project symfony/website-skeleton my_project
2 - 准备 composer 以与 WordPress 一起工作
编辑 composer.json
添加 https://wpackagist.org 仓库
"repositories": [
{
"type":"composer", "url":"https://wpackagist.org"
}
],
定义与 WordPress 相关的包的安装路径
"extra": {
...
"installer-paths": {
"public/wp-bundle/mu-plugins/{$name}/": ["type:wordpress-muplugin"],
"public/wp-bundle/plugins/{$name}/": ["type:wordpress-plugin"],
"public/edition/": ["type:wordpress-core"]
}
...
}
使用优化的自动加载器
"config": {
...
"optimize-autoloader": true,
"apcu-autoloader": true,
...
}
3 - 配置数据库
编辑 .env
###> metabolism/wordpress-bundle ###
DATABASE_URL=mysql://user:pwd@host:3306/dbname
TABLE_PREFIX=wp_
###< metabolism/wordpress-bundle ###
仅支持 mysql
4 - 需要WordPress 扩展包
composer require metabolism/wordpress-bundle
如果您想使用开发版本(不推荐),请在之前编辑 composer.json
"license": "GPL-3.0-or-later",
...
"prefer-stable": true,
"minimum-stability": "dev",
...
然后
composer require metabolism/wordpress-bundle:dev-develop
5 - 添加 WordPress 路由
编辑 routes.yaml
_wordpress:
resource: "@WordpressBundle/Routing/permastructs.php"
清除缓存
./bin/console cache:clear
6 - 更新 gitignore
编辑 .gitignore
/public/uploads/*
!/public/uploads/acf-thumbnails
/public/edition
/public/cache
/public/wp-bundle
7 - 启动服务器
配置一个挂载到 /public
的 vhost,或启动内置的 Symfony 服务器
./bin/console server:start
访问服务器 URL 将启动 WordPress 安装程序
8 - 开发您的网站!
查看 src/Controller/BlogController.php
、templates/generic.html.twig
和 config/wordpress.yml
,并继续阅读下文文档。
WordPress 配置
当安装包时,默认的 wordpress.yml
文件会被复制到 /config/
此文件允许您管理
- 密钥和盐
- 图片选项
- 维护支持
- 删除管理页面
- 所见即所得 MCE 编辑器
- 功能支持
- 多站点配置
- 常量
- ACF 配置
- 菜单
- 自定义帖子类型
- 自定义分类法
- 页面、帖子、分类模板
- 页面状态
- 帖子格式
- 外部表格查看器
- 角色
- 优化
- 域名
- 控制器名称
插件安装
请使用 https://wpackagist.org 查找您的插件。
编辑 composer.json
"require": {
...
"wpackagist-plugin/classic-editor":"1.*"
...
}
ACF Pro 安装
编辑 composer.json
声明一个新的仓库
"repositories": [
{
"type": "package",
"package": {
"name": "elliotcondon/advanced-custom-fields-pro",
"version": "5.8.4",
"type": "wordpress-plugin",
"dist": {"type": "zip", "url": "https://connect.advancedcustomfields.com/index.php?p=pro&a=download&k={%ACF_PRO_KEY}&t={%version}"},
"require": {
"ffraenz/private-composer-installer": "^2.0",
"composer/installers": "^1.0"
}
}
},
{
"type":"composer", "url":"https://wpackagist.org"
}
]
添加 ACF
"require": {
"elliotcondon/advanced-custom-fields-pro": "5.*",
...
}
编辑 .env
以设置 ACF_PRO_KEY
ACF_PRO_KEY=Your-Key-Here
上下文服务
上下文服务是 WordPress 数据包装器,允许查询帖子、术语、分页、面包屑、评论和网站地图。
关键数据会自动添加,例如当前帖子或存档帖子、区域设置、主页 URL、搜索 URL 等
使用方法
public function articleAction(Context $context) { $context->addPosts(['category__and' => [1,3], 'posts_per_page' => 2, 'orderby' => 'title'], 'portraits'); $context->addSitemap(); return $this->render( 'page/article.twig', $context->toArray() ); }
预览
要预览/调试上下文,只需将 ?debug=context
添加到任何 URL,它将输出自身的 JSON 表示。
{ "debug": false, "environment": "prod", "locale": "fr", "language": "fr-FR", "languages": [], "is_admin": false, "home_url": "http://brilliant-wordpress-site.fr/", "search_url": "/search", "privacy_policy_url": "", "maintenance_mode": false, "tagline": "Un site utilisant WordPress", "posts_per_page": "10", "body_class": "fr-FR home page-template-default page page-id-38", "page_title": "Home", "system": "-- Removed from debug --", "menu": [...], "post": { "excerpt": "", "thumbnail": "", "link": "/", "template": "", "ID": 38, "comment_status": "closed", "menu_order": 0, "comment_count": "0", "author": "1", "date": "15 January 2019", "date_gmt": "2019-01-15 11:45:59", "content": "", "title": "Home", "status": "publish", "password": "", "name": "home", "modified": "17 January 2019", "modified_gmt": "2019-01-17 14:07:13", "parent": 0, "type": "page", "splashscreen": { "text": "La France et le Japon partagent les valeurs ...", "partner": { "link": "http://www.japon.fr" } } }, "portraits": [...], "sitemap": [...], "layout": "default" }
实体
帖子
//BlogController.php public function articleAction(Context $context) { $article = $context->addPost(12, 'article'); return $this->render( 'page/article.twig', $context->toArray() ); }
{# page/article.twig #} <h1>{{ article.title }}</h1> {% set next_article = article.next() %} {% if next_article %} <a href="{{ next_article.link }}">next</a> {% endif %}
ACF 字段直接可用,例如,如果您添加了一个 版权
文本字段
<h1>{{ post.title }}</h1> <small>{{ post.copyright }}</small>
可用函数
- next($in_same_term = false, $excluded_terms = '', $taxonomy = 'category')
- prev($in_same_term = false, $excluded_terms = '', $taxonomy = 'category')
- getTerm( $tax='' )
- getTerms( $tax='' )
- getParent()
图片
图片实体提供了一个很好的即时调整大小的功能,向裁剪-调整大小添加宽度和高度,将宽度和高度设置为 0 以调整大小
要调试图片,只需将 ?debug=image
添加到任何 URL,它将用占位符替换图片。
wp-smartcrop 插件支持
<h1>{{ post.title }}</h1> <img src="{{ post.thumbnail.resize(800, 600) }}" alt="{{ post.thumbnail.alt }}"> <img src="{{ post.thumbnail.resize(0, 600) }}" alt="{{ post.thumbnail.alt }}"> <img src="{{ post.thumbnail.resize(800, 0, 'webp') }}" alt="{{ post.thumbnail.alt }}">
生成图片元素(宽度、高度、媒体查询),如果 PHP 中启用了 wepb,则使用 wepb
data.image.toHTML(664, 443, {'max-width: 1023px':[438,246]})|raw
编辑图片
调整大小/插入/着色/模糊/亮度/伽马/像素化/灰度/限制颜色/遮罩/文字/旋转 查看:http://image.intervention.io/
data.image.edit({resize:[260,224], insert:['/newsletter/dots.png','bottom-right', 10, 10]})
如果图片不存在,则使用占位符
<img src="{{ (post.thumbnail|default|placeholder).resize(800, 0) }}" alt="{{ post.thumbnail.alt }}">
自定义帖子
自定义帖子可以扩展 Post
实体以添加一些预处理或新功能,在 /src
文件夹中,添加一个 Entity
文件夹,然后为帖子类型创建一个新类,使用 Pascal 大写
namespace App\Entity; use Metabolism\WordpressBundle\Entity\Post; use Metabolism\WordpressBundle\Entity\Image; class Guide extends Post { public function __construct($id = null) { parent::__construct($id); if( isset($this->picto) && $this->picto instanceof Image) $this->picto = $this->picto->getFileContent(); } }
其他实体
菜单、评论、菜单项、产品、术语和用户可以通过在 /src/Entity
文件夹中创建相同的文件进行扩展。
附加路由
站点健康
您可以使用 /_site-health
检查站点健康,URL 选项如下
- 输出:1 | json
- 完整:0 | 1
缓存
您可以使用 /_cache/purge
清除缓存,URL 或使用后台办公室中的清除缓存按钮
您可以使用 /_cache/clear
完全删除和清除缓存,URL
路线图
- 创建 Symfony 菜谱
- 提供更多示例
- Woo-commerce 提供商重构
- 多站点的全局维护模式
- 单元测试
为什么不使用 Bedrock?
因为 Bedrock "仅" 提供了文件夹组织以及 composer 依赖关系管理。顺便说一下,这个 Bundle 来自多年的 Bedrock 使用 + Timber 插件...
为什么不使用 Ekino WordPress Bundle?
其哲学不同,Ekino 使用 Symfony 操作 WordPress 数据库。另外,最后一个版本是在 2015 年...
WordPress 经典主题很糟糕吗?
我们不打算评判任何人,这更像是一种编码哲学,一旦选择了Symfony,就无法回头。
此外,安全性对我们来说是必需的,而WordPress因为其庞大的用户群而未能在这方面提供良好的解决方案。
许可证
GNU AGPL
维护者
本项目由Metabolism(http://metabolism.fr)制作
当前维护者
- Jérôme Barbato - jerome@metabolism.fr
- Paul Coudeville - paul@metabolism.fr