我一直在研究它并尝试它,但我有点难过。
我想在 WordPress 中建立一个网站,这对与我一起工作的另一个人很有帮助。该站点将宣传我们的产品并提供信息。然后用户可以通过一系列表格进行注册。我想在 Symfony2 中编写这个自定义部分(表单等),因为它不需要绑定(bind)到 WordPress,并且它将具有可重用的 Doctrine2 实体以在用户注册后显示数据(无论如何显示发生在 WordPress 之外).
但是,在设计方面,我们希望整个过程不间断并具有相同的外观。所以表单实际上应该在 WordPress 页面中呈现。我们正在使用自定义的非免费主题,我不想将一堆 WordPress CSS 和 header 复制粘贴到 Symfony View 中。
理想情况下,我只想在 WordPress 中定义可以呈现 Symfony2 操作的页面。因此,操作本身可能会显示和处理表单(它们应该独立于 WordPress 工作,例如 http://example.com/app.php/signup),但它们通常应该显示在 WordPress 站点中(例如在像 http://example.com/index.php?page_id=2 或永久链接这样的页面中)。
我一直在研究将 LowPress 作为一种集成方式 (http://www.lowpress.com/),但是通过完全删除 WordPress 主题并用 Twig 主题替换它们,它所做的比我想要的要多。我试图从中借鉴一些想法,所以现在我在 Symfony 项目的 web
文件夹中有了 WordPress,而这个在我的 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
所以我现在得到的只是通过 Symfony 中的 parameters.ini
共享的数据库配置。接下来,我一直在尝试制作一个使用短代码的简单插件,以便我可以在 WordPress 页面中呈现 Symfony2 操作。到目前为止,这是我的一个想法(它取决于上述 Bootstrap 并且不完整):
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'));
我的第一个问题是当给定的 $request
没有我需要的信息时,我不知道如何实际渲染一些可能有参数的 Symfony2 路由。另一个问题是,如果我想要提交表单,它可能不会工作,因为它会将用户重定向到 WordPress 之外,而实际上我可能想要一系列表单,这些表单都存在于 WordPress 页面中。同时,我希望表单独立于 WordPress,以便它们独立工作。
所以我想知道这是否只是一个行不通的糟糕/骇人听闻的想法,或者是否有某种方法可以让它发挥作用。
我还考虑只使用 AJAX 在 WordPress 中加载 Symfony2 代码(假设我的所有用户都启用了 Javascript)。作为后备,该页面可以只转到仅 Symfony2 的应用程序,而不是在 WordPress 页面中。那会更好/更容易吗?我能看到的唯一缺点是我必须使 ajax 代码与我的 Symfony2 代码保持同步。
最佳答案
因为您不想“..只是将一堆 WordPress CSS 和标题复制粘贴到 Symfony View 中”,我建议您以编程方式将 WordPress 页眉和页脚嵌入到所有 Symfony View 中。
另请查看 Silex因为这比 Symfony 的开销更低,并且适用于 Symfony 表单。
- 安装 Symfony2 或 Silex
- 将 WordPress 文件放在您的 web/文件夹中
- wp-config.php 可以放在composer.json 旁边的一个文件夹中,which is better for security anyway
- 将您的 Symfony 或 Silex 前端 Controller 移动到一个子文件夹,在您的情况下可能名为 signup/
- 修复前端 Controller 顶部的 require/include 路径
- 在前端 Controller 的顶部添加一行以包含父文件夹中的 wp-load.php - 此文件启动 WordPress 并使所有 WordPress 功能可供您使用 - 注意它必须包含在不是来自函数内部的全局范围
- 在前端 Controller 中的 Symfony 或 Silex 代码之上和之下调用 WordPress 方法
get_header();
和get_footer();
。在 Silex 中,它位于$app->run();
的上方和下方
你的文件结构应该是这样的:
vendor/
|-- Third party libraries
web/
|-- WordPress files
|-- signup/
|-- Symfony2 or Silex front controller
composer.json
wp-config.php
受此启发post .
关于php - 如何将 Symfony2 Action 嵌入到 WordPress 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10843410/