mukadi / wordpress-bundle
在同一个应用程序中集成wordpress和symfony
Requires
- php: ^7.1.3
- composer/installers: ^1.5
- doctrine/doctrine-bundle: ^1.0||^2.0
- doctrine/orm: ^2.2
- hautelook/phpass: 0.3
- illuminate/support: 5.7.*||6.7.*
- johnpbloch/wordpress: 5.1
- mukadi/doctrine-crud: ^1.0
- phpoption/phpoption: ^1.7
- symfony/dotenv: >=3.4
- symfony/framework-bundle: ^3.4||^4.0||^5.0
- symfony/security-core: >=3.4
- vlucas/phpdotenv: ^2.4||3.6.*
Suggests
- doctrine/doctrine-migrations-bundle: For a best management of your database schema
README
这是对 EkinoWordpressbundle 的分支,这个bundle将EkinoWordpressBundle适配到symfony >= 4 的新架构和功能。一些功能已被移除(例如在Wordpress中认证时自动进行symfony认证...),这些功能将作为独立的bundle安装,如果需要的话将重新集成。
以下是保留的功能
- 在Wordpress中使用自定义的Symfony服务(注意:仅限公开服务),
- 使用Symfony操作Wordpress数据库,
- 从Wordpress创建自定义的Symfony路由,
- 从Wordpress向Symfony派发事件(需要mukadi-symfony-bridge Wordpress插件)
安装
在安装bundle之前,编辑您的composer.json文件并指定以下选项
"extra": { ... "symfony": { ... "allow-contrib": "true" # allow symfony flex to install recipe (if your are using symfony flex) } ... # set installation path for wordpress themes and plugins "installer-paths": { "public/mu-plugins/{$name}": ["type:wordpress-muplugin"], "public/plugins/{$name}": ["type:wordpress-plugin"], "public/themes/{$name}": ["type:wordpress-theme"] }, # install wordpress in a public sub-directory "wordpress-install-dir": "public/wp" },
运行 php composer.phar require mukadi/wordpress-bundle
并让Symfony Flex配置bundle。
Bundle配置
如果您不使用symfony flex,您需要手动配置bundle,以下是bundle的最小配置
mukadi_wordpress: table_prefix: "%env(WP_PREFIX)%" wordpress_directory: '%kernel.project_dir%/public/%env(WP_DIR)%'
添加一个public/wp-config.php文件
在您的public/wp-config.php文件中放入以下内容
declare(strict_types=1); require_once __DIR__.'/../vendor/autoload.php'; $config = new \Mukadi\WordpressBundle\Config( realpath(__DIR__) ); // define('WP_ALLOW_MULTISITE', env('WP_ALLOW_MULTISITE', true)); $table_prefix = env('WP_PREFIX', 'wp_'); /* That's all, stop editing! Happy blogging. */ $config->apply(); /** Sets up WordPress vars and included files. */ require_once(ABSPATH . 'wp-settings.php');
更新public/index.php文件
如果您未对public/index.php文件进行修改,您只需将生成的'sf-wp-bootstrap.php'的内容(见下面代码)复制到index.php文件中,否则根据该文件相应地更新index.php。
您的index.php文件应如下所示
use App\Kernel; use Symfony\Component\ErrorHandler\Debug; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\Dotenv\Dotenv; require dirname(__DIR__).'/config/bootstrap.php'; function run(){ if ($_SERVER['APP_DEBUG']) { umask(0000); Debug::enable(); } # setup WP_DEBUG $env = $_SERVER['APP_ENV'] ?? 'dev'; $debug = (bool) ($_SERVER['APP_DEBUG'] ?? ('prod' !== $env)); define('WP_DEBUG', $debug); if ($trustedProxies = $_SERVER['TRUSTED_PROXIES'] ?? $_ENV['TRUSTED_PROXIES'] ?? false) { Request::setTrustedProxies(explode(',', $trustedProxies), Request::HEADER_X_FORWARDED_ALL ^ Request::HEADER_X_FORWARDED_HOST); } if ($trustedHosts = $_SERVER['TRUSTED_HOSTS'] ?? $_ENV['TRUSTED_HOSTS'] ?? false) { Request::setTrustedHosts([$trustedHosts]); } $kernel = new Kernel($_SERVER['APP_ENV'], (bool) $_SERVER['APP_DEBUG']); # inject SF container in WP $GLOBALS['sf'] = function ($id) use (&$kernel) { return $kernel->getContainer()->get($id); }; $request = Request::createFromGlobals(); $response = $kernel->handle($request); $response->send(); $kernel->terminate($request, $response); } run();
将Wordpress路由添加到symfony
在您的config/routes.yaml
中将WordpressBundle路由文件添加到自定义路由之后,以捕获所有Wordpress路由
... mukadi_wordpress: resource: "@MukadiWordpressBundle/Resources/config/routing.xml"
通过Composer安装Wordpress插件
编辑您的composer.json文件以添加自定义仓库
... "repositories": [ { "type": "composer", "url": "https://wpackagist.org" } ]
现在您可以安装wordpress插件,只需运行 php composer.phar require wpackagist-plugin/<the-plugin-name>
。
避免Doctrine删除自定义Wordpress表
当您在Wordpress中安装插件时,插件可以创建自定义表来存储特定数据。默认情况下,此类表将由doctrine:migrations:diff
命令删除。您必须配置doctrine/dbal以忽略这些表,只需将以下配置选项添加到您的doctrine配置中即可
... doctrine: dbal: schema_filter: '~^(?!%env(WP_PREFIX)%)~'
在Symfony中操作Wordpress数据库
您可以通过调用以下服务来在Symfony中调用Wordpress表管理器
所有这些服务都扩展了Mukadi\Doctrine\CRUD\CRUD
类,因此请参阅文档以了解如何处理。