如何将 Symfony2 操作嵌入到 WordPress 中?

2024-01-02

我已经做了很多研究并尝试过,但我有点困惑。

我想在 WordPress 中设置一个网站,这对与我一起工作的另一个人很有帮助。该网站将为我们的产品做广告并提供信息。然后用户可以通过一系列表格进行注册。我想在 Symfony2 中编写这个自定义部分(表单等),因为它不需要绑定到 WordPress,并且它会有可重用的 Doctrine2 实体来在用户注册后显示数据(无论如何显示都发生在 WordPress 之外) )。

但是,从设计角度来看,我们希望整个过程不间断,并且具有相同的外观和感觉。因此,表单实际上应该在 WordPress 页面中呈现。我们正在使用自定义的非自由主题,我不想将一堆 WordPress CSS 和标头复制粘贴到 Symfony 视图中。

理想情况下,我只想在 WordPress 中定义可以呈现 Symfony2 操作的页面。因此,操作本身可能会显示和处理表单(这应该独立于 WordPress 工作,例如http://example.com/app.php/signup http://example.com/app.php/signup),但它们通常应该显示在 WordPress 站点中(例如在类似的页面中http://example.com/index.php?page_id=2 http://example.com/index.php?page_id=2或永久链接)。

我一直在研究 LowPress 作为一种集成方式 (http://www.lowpress.com/),但通过完全删除 WordPress 主题并用 Twig 主题替换它们,它的效果超出了我的预期。我试图从中借鉴一些想法,所以现在我有 WordPresswebSymfony 项目的文件夹和我的wp-config.php:

// ...code omitted
define('WP_DEBUG', true);

define('SYMFONY_DIR', __DIR__.'/../app/');

require_once SYMFONY_DIR.'/bootstrap.php.cache';
require_once SYMFONY_DIR.'/AppKernel.php';
//require_once SYMFONY_DIR.'/AppCache.php';

use Symfony\Component\EventDispatcher\Event;
use Symfony\Component\HttpFoundation\Request;

$kernel = new AppKernel((WP_DEBUG) ? 'dev' : 'prod', WP_DEBUG);
$kernel->loadClassCache();
$kernel->boot();
$GLOBALS['sf2_kernel'] = $kernel;
// save request before WordPress messes with it
$GLOBALS['sf2_request'] = Request::createFromGlobals();

$doctrine = $kernel->getContainer()->get('doctrine');
$conn = $doctrine->getConnection($doctrine->getDefaultConnectionName());

// ** MySQL settings - You can get this info from your web host ** //
/** The name of the database for WordPress */
define('DB_NAME',       $conn->getDatabase());

/** MySQL database username */
define('DB_USER',       $conn->getUsername());

/** MySQL database password */
define('DB_PASSWORD',   $conn->getPassword());

/** MySQL hostname */
define('DB_HOST',       $conn->getHost());

/** Database Charset to use in creating database tables. */
define('DB_CHARSET', 'utf8');

/** The Database Collate type. Don't change this if in doubt. */
define('DB_COLLATE', '');

// ...code omitted

所以我现在所拥有的只是一个共享数据库配置parameters.ini在交响乐中。接下来,我一直在尝试制作一个使用短代码的简单插件,以便我可以在 WordPress 页面中呈现 Symfony2 操作。这是我到目前为止的一个想法(它依赖于上面的引导并且它不完整):

use Symfony\Component\HttpFoundation\Request;

class Symfony2Page
{
    public function render($atts)
    {
        extract(shortcode_atts(array(
            'controller' => 'CroltsMainBundle:Default:index',
        ), $atts));
        $kernel = $GLOBALS['sf2_kernel'];
        $request = $GLOBALS['sf2_request'];
        $request->headers->set('X-Php-Ob-Level', ob_get_level());
        $attributes = array();
        // @TODO fix this

        $kernel->getContainer()->enterScope('request');
        $kernel->getContainer()->set('request', $request, 'request');

        try {
            $response = $kernel->getContainer()->get('http_kernel')->render($controller, $attributes)->getContent();
        } catch (\Exception $e) {
            $kernel->getContainer()->leaveScope('request');

            throw $e;
        }

        $kernel->getContainer()->leaveScope('request');

        return $response;
    }
}

add_shortcode('sf_action', array('Symfony2Page', 'render'));

我的第一个问题是我不知道如何实际渲染一些 Symfony2 路由,它可能有参数,当给定$request不会有我需要的信息。另一个问题是,如果我想要提交表单,它可能不起作用,因为它会将用户重定向到 WordPress 之外,而实际上我可能想要一系列都存在于 WordPress 页面中的表单。同时,我希望这些表单独立于 WordPress,这样它们就可以独立工作。

所以我想知道这是否只是一个行不通的坏/黑客想法,或者是否有某种方法可以让它发挥作用。

我还考虑使用 AJAX 在 WordPress 中加载 Symfony2 代码(假设我的所有用户都启用了 Javascript)。作为后备方案,该页面可以直接转到仅限 Symfony2 的应用程序,而不是位于 WordPress 页面中。那会更好/更容易吗?我能看到的唯一缺点是我必须使 ajax 代码与我的 Symfony2 代码保持同步。


由于您不想“..只是将一堆 WordPress CSS 和标头复制粘贴到 Symfony 视图中”,因此我建议您以编程方式将 WordPress 页眉和页脚嵌入到所有 Symfony 视图中。

还看一下Silex http://silex.sensiolabs.org/因为它的开销比 Symfony 低,并且可以与 Symfony 表单一起使用。

  1. 安装 Symfony2 或 Silex
  2. 将 WordPress 文件放入您的 web/ 文件夹中
  3. wp-config.php 可以位于composer.json 旁边的一个文件夹中,无论如何,这对安全性更好 https://wordpress.stackexchange.com/questions/58391/is-moving-wp-config-outside-the-web-root-really-beneficial
  4. 将您的 Symfony 或 Silex 前端控制器移动到子文件夹,在您的情况下可能名为 signup/
  5. 修复前端控制器顶部的 require / include 路径
  6. 在前端控制器的顶部添加一行以包含父文件夹中的 wp-load.php - 该文件会启动 WordPress 并使所有 WordPress 功能可供您使用 - 请注意,它必须包含在全局范围内,而不是包含在全局范围内从函数内部
  7. 调用 WordPress 方法get_header(); and get_footer();前端控制器中 Symfony 或 Silex 代码的上方和下方。在 Silex 中,就在上面和下面$app->run();

您的文件结构应如下所示:

vendor/
  |-- Third party libraries 
web/
  |-- WordPress files
  |-- signup/
       |-- Symfony2 or Silex front controller
composer.json
wp-config.php

受此启发post http://wpengineer.com/1038/embed-wordpress-functions-outside-wordpress/.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将 Symfony2 操作嵌入到 WordPress 中? 的相关文章

随机推荐