CakePHP扩展WordPress功能

时间:2012-12-01 15:30:07

标签: wordpress cakephp components

我希望能够从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);

但两者都无济于事。

  • 知道怎么摆脱那个警告吗?
  • 是否有正确的方法使CakePHP扩展WordPress功能?

我找到了这个组件(shama/CakePHP-Wordpress-Component),但最后一次更改是2年前,作者在3个月前宣布该组件已被弃用。此外,它还使用cURL与WP API进行交互。我只是想扩展它。

1 个答案:

答案 0 :(得分:0)

我找到了解决方案。不确定这是否是正确的方法。我会发布整件事,以防有人想要这样做。

请记住,这是我提出的解决方案。我认为这在很多层面打破了MVC工作流程,您应该使用此解决方案,风险自负。

  1. 将WordPress正常安装在/app/webroot/
  2. 内的子文件夹中
  3. 在控制器中,在操作中,您希望使用您称之为的WP函数:

    require_once('full/path/to/wp-load.php');

  4. 调用操作以查看是否存在任何冲突。就我而言,两者中都存在函数__()stripslashes_deep()。所以,我不得不避免重新声明它们。

    if(!function_exists('FUNCTION_NAME_HERE')) { function ... }

  5. 此时,您已经可以访问控制器内的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' );

  6. 现在,您可以像在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');

    的内容访问WP,它可能也会有效

    管理员已损坏

    这是由于第4步,当我们注释掉所有小部件功能时。为了解决这个问题,你必须包含这样的条件:

    if (is_admin()) {
       require( ABSPATH . WPINC . '/widgets.php' );
    }
    

    当然,这个条件必须应用于步骤4中注释的所有行。如果您不使用WP管理区域,则不需要使用此条件。