我有一个项目,我希望能够在一个页面上调用 wp_list_pages() ,该页面还使用 Zend 框架来支持一些复杂的接口,管理 wordpress 之外的自定义数据。
如果用户尚未使用适当的授权级别登录,此页面还应将用户重定向到 wordpress 登录屏幕。
这将如何在高级别工作,即我是否需要编辑 wordpress 引导文件以根据特定 URL 或其他内容有条件地实现自定义界面,但仍包含某些文件以便能够在该自定义界面上调用 wp_list_pages() ?
我有一个项目,我希望能够在一个页面上调用 wp_list_pages() ,该页面还使用 Zend 框架来支持一些复杂的接口,管理 wordpress 之外的自定义数据。
如果用户尚未使用适当的授权级别登录,此页面还应将用户重定向到 wordpress 登录屏幕。
这将如何在高级别工作,即我是否需要编辑 wordpress 引导文件以根据特定 URL 或其他内容有条件地实现自定义界面,但仍包含某些文件以便能够在该自定义界面上调用 wp_list_pages() ?
我开发了几个 WordPress 插件,我发现它很容易扩展。虽然没有与 Zend 合作过。
您应该检查 WordPress 插件 api。主要是关于动作、过滤器和钩子的部分: http: //codex.wordpress.org/Plugin_API
您甚至可以覆盖某些功能(不确定是否可覆盖wp_list_pages()
)。
它有很好的文档记录,并且在 IRC、论坛等上有一个庞大的开发者社区。
谢谢费尔南多。
我刚刚阅读了这个帖子,它建议您可以在任何脚本中使用 Zend,只需包括:
require_once('Zend/Loader.php');
Zend_Loader::registerAutoload();
因此,鉴于我只需要在一个页面上使用 Zend,我是否可以将该代码包含在我分配给导航中相应页面的自定义模板文件中?如果我使用 javascript 通过 XHR 提交表单,请求的 URL 将采用“/controller/action”形式——但 Zend 不知道控制器目录。
我可以将 Zend 代码放入 wordpress 引导程序中,即上面的代码加上 frontController 配置,然后在任何地方使用 Zend 吗?
因此,我在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——我希望它适用于任何通过引导程序重写/路由请求的现有应用程序。
我想你可以做到这一点,只需将框架导入你需要它的一页。我不知道 Zend 是如何工作的,但请检查放置目录的路径,以便 Zend 找到它们。正如我所说,我猜你可以这样做,只需进行实验并告诉我们它是如何进行的!
注意函数和/或变量的名称冲突,这应该不是来自 WordPress 和 Zend 等流行产品的大问题......(理论上应该编码良好)
我想你可以做到这一点,只需将框架导入你需要它的一页。我不知道 Zend 是如何工作的,但请检查放置目录的路径,以便 Zend 找到它们。正如我所说,我猜你可以这样做,只需进行实验并告诉我们它是如何进行的!
注意函数和/或变量的名称冲突,这应该不是来自 WordPress 和 Zend 等流行产品的大问题......(理论上应该编码良好)
我已经为 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 数据库表 where 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/ 如果成功,你' ll 也可能想要 die(),所以一旦它完成,Wordpress 将不会尝试再次接管。