我找到了解决方案。不确定这是否是正确的方法。我会发布整个事情,以防有人想做同样的事情。
请记住,这是我想出的解决方案。我认为这在很多层面上都破坏了 MVC 工作流程,因此您应该自担风险使用此解决方法。
- 将WordPress正常安装在里面的子文件夹中
/app/webroot/
在控制器中,在动作中,您想使用您称之为的 WP 函数:
require_once('full/path/to/wp-load.php');
调用操作以查看是否存在任何冲突。在我的情况下,功能__()
和stripslashes_deep()
两者都存在。所以,我不得不避免重新声明它们。
if(!function_exists('FUNCTION_NAME_HERE')) { function ... }
此时,您已经可以访问控制器内的 WP 功能。但是 WP_Widget 类的问题可能会引发警告。所以,这里是你如何解决它:
4.1 打开wp-settings.php
(它在 WP 的根目录中)并注释这些行:
require( ABSPATH . WPINC . '/widgets.php' );
$GLOBALS['wp_widget_factory'] = new WP_Widget_Factory();
4.2 打开wp-includes/functions.php
并注释这一行:
require_once( ABSPATH . WPINC . '/default-widgets.php' );
4.3 打开wp-content/themes/twentyeleven/inc/functions.php
评论:
require( get_template_directory() . '/inc/widgets.php' );
您现在可以像在 WP 主题中一样从操作内部正常调用 WP:
query_posts('showposts=10');
while (have_posts()):
the_title();
endwhile;
要求wp-load.php
onbeforeFilter()
似乎不起作用,除非您在内部完成所有 WP 工作beforeFilter()
并将结果保存在变量中。否则,当移动到动作时,CakePHP 似乎会卸载wp-load.php
,并且您无法再访问 WP 功能。
如果将这个黑客转换成一个组件,它可能也会起作用,然后你可以使用类似的东西访问 WP$this->Wordpress->query_posts('showposts=10');
管理员坏了
这是由于第 4 步,我们注释掉了所有的小部件功能。为了修复它,您必须包含这样的条件:
if (is_admin()) {
require( ABSPATH . WPINC . '/widgets.php' );
}
当然,此条件必须应用于步骤 4 中注释的所有行。如果您不使用 WP 管理区域,则不需要使用此条件。