dreimus/wordpress-bundle

使用 WordPress 5 作为 Symfony 应用的后端

安装: 0

依赖: 0

建议者: 0

安全: 0

星标: 0

关注者: 1

分支: 17

类型:symfony-bundle

1.4.9 2020-08-28 13:35 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.phptemplates/generic.html.twigconfig/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)制作

当前维护者