1

我希望能够从 CakePHP 控制器访问WordPress 的功能。我从一个动作中尝试了这个:

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 进行交互。我只是想扩展它。

4

1 回答 1

0

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

请记住,这是我想出的解决方案。我认为这在很多层面上都破坏了 MVC 工作流程,因此您应该自担风险使用此解决方法。

  1. 将WordPress正常安装在里面的子文件夹中/app/webroot/
  2. 在控制器中,在动作中,您想使用您称之为的 WP 函数:

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

  3. 调用操作以查看是否存在任何冲突。在我的情况下,功能__()stripslashes_deep()两者都存在。所以,我不得不避免重新声明它们。

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

  4. 此时,您已经可以访问控制器内的 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.phponbeforeFilter()似乎不起作用,除非您在内部完成所有 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 管理区域,则不需要使用此条件。

于 2012-12-02T13:06:00.860 回答