我有一个项目,我希望能够在一个页面上调用wp_list_pages(),该页面也使用Zend Framework为一些复杂的接口提供动力,以管理wordpress之外的自定义数据。
如果用户尚未使用适当级别的授权登录,则此页面还应将用户重定向到wordpress登录屏幕。
如何在高级别工作,即我是否需要编辑wordpress引导文件以根据特定的URL或其他条件有条件地实现自定义界面,但仍然包含某些文件以便能够调用wp_list_pages()那个自定义界面?
答案 0 :(得分:1)
我开发了几个WordPress插件,我发现它很容易扩展。但是没有和Zend合作过。
你应该检查WordPress插件api。主要是关于动作,过滤器和钩子的部分:http://codex.wordpress.org/Plugin_API
您甚至可以覆盖某些功能(不确定wp_list_pages()
是否可以覆盖)。
它有很好的文档记录,在IRC,论坛等背后有一个庞大的开发者社区。 p>
答案 1 :(得分:1)
谢谢Fernando。
我刚刚阅读this thread,这表明您可以在任何脚本中使用Zend,只需包括:
require_once('Zend/Loader.php');
Zend_Loader::registerAutoload();
所以我只需要在一个页面上使用Zend for,我可以将该代码包含在我分配给导航中相应页面的自定义模板文件中吗?如果我使用javascript通过XHR提交表单,请求的URL将采用'/ controller / action'形式 - 但Zend不会知道控制器目录。
我可以将Zend代码放入wordpress引导程序,即上面的代码加上frontController配置,然后在任何地方使用Zend吗?
答案 2 :(得分:1)
所以我在 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 /'返回'No input file selected'。尝试访问网址http://www.domain.com/Users/getUser/会生成Wordpress 404页面。
有解决方法吗?它当然不仅适用于wordpress - 我希望它适用于通过引导程序重写/路由请求的任何现有应用程序。
答案 3 :(得分:1)
我想你可以这样做,只需将框架导入到你需要的一个页面中。我不知道Zend是如何工作的,但是检查路径到哪里放置你的目录,以便Zend找到它们。正如我说的,我想你可以做到这一点,只是试验并告诉我们它是怎么回事!
请注意函数和/或变量的名称冲突,这不应该是来自像WordPress和Zend这样的流行产品的问题......(理论上应该在编码上很好)
答案 4 :(得分:0)
我想你可以这样做,只需将框架导入到你需要的一个页面中。我不知道Zend是如何工作的,但是检查路径到哪里放置你的目录,以便Zend找到它们。正如我说我猜你可以做到这一点,只是试验并告诉我们它是怎么回事去!
请注意函数和/或变量的名称冲突,这不应该是来自像WordPress和Zend这样的流行产品的问题......(理论上应该在编码上很好)
答案 5 :(得分:0)
我已经为wordpress构建了一个插件,其目标与你的目标类似,但更多的是以CodeIgniter为蓝本。不知道Zend非常好,我认为这应该有所帮助:
使用以下代码在plugins目录中创建名为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 db表中option_name
='rewrite_rules'的记录。
接下来,使用以下代码制作另一个插件:
add_action( 'template_redirect', 'bootstrap' );
function bootstrap(){
global $cPath;
echo( "cPath : $cPath" );
if( $cPath ){
dosomethingwith( $cPath );
}
}
将所有代码放入dosomethingwith()函数中。您需要弄清楚所请求的网址是否可以映射到zend控制器等。http://www.domain.com/Users/getUser/会给你$ cPath = Users / getUser /如果成功,你也可能想要死(),所以一旦完成,Wordpress将不会尝试再次接管。