我希望能够从CakePHP控制器访问WordPress' functions。我从一个动作尝试了这个:
require_once('path/to/wp-load.php');
需要对WP核心进行一些更改,以避免重新声明WP和CakePHP共有的几个函数。
但我仍然收到错误:
Strict(2048):为类WP_Widget重新定义已经定义的构造函数[APP \ webroot \ WP \ wp-includes \ widgets.php,第93行]
尽管有错误,如果我致电The Loop,它仍然有效。调用wp_insert_post()
也有效。基本上我已经可以访问WP功能了。但重新定义的错误不会消失。
我试过了:
error_reporting(-1);
Configure::write('debug', 0);
但两者都无济于事。
我找到了这个组件(shama/CakePHP-Wordpress-Component),但最后一次更改是2年前,作者在3个月前宣布该组件已被弃用。此外,它还使用cURL与WP API进行交互。我只是想扩展它。
答案 0 :(得分:0)
我找到了解决方案。不确定这是否是正确的方法。我会发布整件事,以防有人想要这样做。
请记住,这是我提出的解决方案。我认为这在很多层面打破了MVC工作流程,您应该使用此解决方案,风险自负。
/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
上的beforeFilter()
似乎不起作用,除非您在beforeFilter()
内执行所有WP工作并将结果保存在变量中。否则,当移动到操作时,CakePHP似乎卸载wp-load.php
,您无法再访问WP功能。
如果将此hack转换为组件然后您可以使用类似$this->Wordpress->query_posts('showposts=10');
管理员已损坏
这是由于第4步,当我们注释掉所有小部件功能时。为了解决这个问题,你必须包含这样的条件:
if (is_admin()) {
require( ABSPATH . WPINC . '/widgets.php' );
}
当然,这个条件必须应用于步骤4中注释的所有行。如果您不使用WP管理区域,则不需要使用此条件。