mukadi/wordpress-bundle

在同一个应用程序中集成wordpress和symfony

2.0.1 2019-12-25 10:14 UTC

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类,因此请参阅文档以了解如何处理。