【问题标题】:Can I integrate a Zend-Framework powered web application into a wordpress site?我可以将 Zend-Framework 支持的 Web 应用程序集成到 wordpress 站点中吗?
【发布时间】:2008-12-18 11:57:42
【问题描述】:

我有一个项目,我希望能够在一个页面上调用 wp_list_pages(),该页面也使用 Zend 框架来支持一些复杂的接口,管理 wordpress 之外的自定义数据。

如果用户尚未使用适当的授权级别登录,此页面还应将用户重定向到 wordpress 登录屏幕。

这将如何在高层次上工作,即我是否需要编辑 wordpress 引导文件以根据特定 URL 或其他内容有条件地实现自定义界面,但仍包含某些文件以便能够调用 wp_list_pages()那个自定义界面?

【问题讨论】:

  • 我目前正在处理这个问题,需要一个解决方案,所以当我完成后我会在这里发布。

标签: zend-framework wordpress


【解决方案1】:

我已经开发了几个 WordPress 插件,我发现它真的很容易扩展。虽然没有与 Zend 合作过。

您应该检查 WordPress 插件 api。主要是关于动作、过滤器和钩子的部分:http://codex.wordpress.org/Plugin_API

您甚至可以覆盖某些函数(不确定wp_list_pages() 是否可覆盖)。

它有很好的文档记录,并且在 IRC、论坛等上有一个庞大的开发者社区。​​p>

【讨论】:

    【解决方案2】:

    谢谢费尔南多。

    我刚刚阅读了this thread,这表明您可以在任何脚本中使用 Zend,只需包括:

    require_once('Zend/Loader.php');
    Zend_Loader::registerAutoload();
    

    既然我只需要在一个页面上使用 Zend,我是否可以将该代码包含在我分配给导航中相应页面的自定义模板文件中?如果我使用 javascript 通过 XHR 提交表单,请求的 URL 将采用“/controller/action”形式——但 Zend 不知道控制器目录。

    我可以把 Zend 代码放入 wordpress 引导程序中,即上面的代码加上 frontController 配置,然后在任何地方使用 Zend 吗?

    【讨论】:

      【解决方案3】:

      所以我在 Wordpress 中创建了一个页面,并为该页面创建了一个自定义模板,我在其中放置了以下 Zend Framework 代码:

      require_once('Zend/Loader.php');
      Zend_Loader::registerAutoload();
      
      $db = Zend_Db::factory('Pdo_Mysql', array(
          'host'      => 'localhost',
          'username'  => 'username',
          'password'  => 'password',
          'dbname'    => 'dbname'
      ));
      Zend_Db_Table::setDefaultAdapter($db);
      
      class Users extends Zend_Db_Table_Abstract {
          protected $_name = 'wp_users';
      }
      
      $users = new Users();
      $users = $users->fetchAll()->toArray();
      
      print_r($users[0]['user_login']);
      

      这一切都很好,因此至少在某种程度上可以将 Zend 与 Wordpress 结合使用。

      越来越明显的是,问题在于谁控制 URL 重写、路由或引导(不确定术语是否正确)。如果我将上述代码的结尾,从 $users = new Users(); 开始,放入控制器中,如下所示:

      class UsersController extends Zend_Controller_Action {
          function getUserAction() {
              $this->_helper->viewRenderer->setNoRender();
      
              $users = new Users();
              $users = $users->fetchAll()->toArray();
      
              echo $users[0]['user_login'];
          }
      }
      

      然后我将如何调用该函数?我的意图是通过 XHR 请求从 javascript 调用它以响应页面上的事件,但请求 URL 'index.php/Users/getUser/' 返回 '未选择输入文件'。尝试访问 URL http://www.domain.com/Users/getUser/ 会产生一个 Wordpress 404 页面。

      有没有办法解决这个问题?当然,它不仅仅适用于 wordpress - 我希望它适用于任何通过引导程序重写/路由请求的现有应用程序。

      【讨论】:

        【解决方案4】:

        我想你可以这样做,只需将框架导入到你需要它的一页中。我不知道 Zend 是如何工作的,但是请检查路径以将目录放在哪里,以便 Zend 找到它们。正如我所说,我猜你可以这样做,只需进行实验并告诉我们它是如何进行的!

        注意函数和/或变量的名称冲突,虽然这不应该是来自 WordPress 和 Zend 等流行产品的问题......(理论上应该编码良好)

        【讨论】:

          【解决方案5】:

          我想你可以做到这一点,只需将框架导入你需要它的一页。我不知道 Zend 是如何工作的,但请检查放置目录的路径,以便 Zend 找到它们。正如我所说的 我猜 你可以这样做,只需试验并告诉我们它是如何工作的去了!

          注意函数和/或变量的名称冲突,虽然这不应该是来自 WordPress 和 Zend 等流行产品的问题......(理论上应该编码良好)

          【讨论】:

            【解决方案6】:

            我已经为 wordpress 构建了一个与您的目标相似的插件,不过更多的是模仿 CodeIgniter。不太了解 Zend,我认为这应该会有所帮助:

            使用以下代码在您的插件目录中创建一个名为 routes.php 的文件:

            add_action( 'init', 'add_custom_urls' );
            
            function add_custom_urls(){
                global $wp, $wp_rewrite;
            
                $wp_rewrite->add_rule( '(.*)$', 'index.php?&cPath=$matches[1]', 'top' );
                $wp->add_query_var( 'cPath' );
            }
            

            请务必在您的管理员中激活这两个插件。这两个文件将允许您在 Wordpress 试图弄清楚如何处理它之前捕获 url。您可以使用正则表达式更好地控制要捕获的页面。在此之前,您可能必须删除 _options 数据库表中 option_name = 'rewrite_rules' 的记录。

            接下来,使用以下代码制作另一个插件:

            add_action( 'template_redirect', 'bootstrap' );
            
            function bootstrap(){
                global $cPath;
                echo( "cPath : $cPath" );
                if( $cPath ){
                    dosomethingwith( $cPath ); 
                }
            }
            

            将所有代码放入 dosomethingwith() 函数中。您需要弄清楚请求的 url 是否可以映射到 zend 控制器等。http://www.domain.com/Users/getUser/ 会给您 $cPath = Users/getUser/ 如果成功,您可能还想死(),所以一次它已完成 Wordpress 不会尝试再次接管。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-04-15
              • 1970-01-01
              • 1970-01-01
              • 2019-02-25
              • 1970-01-01
              相关资源
              最近更新 更多