2012-12-01 65 views
1

我希望能夠從CakePHP控制器訪問WordPress' functions。我想這從一個動作:CakePHP擴展WordPress功能

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

這是必須做的WP核心進行一些更改,以避免重新宣佈了幾個是WP和CakePHP有常用功能。

但我仍然得到一個錯誤:

Strict (2048): Redefining already defined constructor for class WP_Widget [APP\webroot\WP\wp-includes\widgets.php, line 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進行交互。我只想擴展它。

+0

你使用的是什麼版本的cakephp? Risnandar的答案在這裏幫助你嗎? http://stackoverflow.com/questions/12134285/strict-standards-redefining-already-defined-constructor-for-class-object-in-pat –

+0

@TimJoyce不,這沒有幫助。我正在使用CakePHP 2.2.1。 WP是最新版本。 – rlcabral

+0

我們可以看到第93行的widgets.php是什麼嗎? –

回答

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.phpbeforeFilter()似乎不起作用,除非您在beforeFilter()內部完成所有WP工作並將結果保存在變量中。否則CakePHP似乎在移動到動作時卸載wp-load.php,並且不能再訪問WP函數。

它可能會工作太多,如果將這個攻入一個組件,然後你可以用一些訪問WP像$this->Wordpress->query_posts('showposts=10');

聯繫被打破

這是由於第4步,當我們註釋掉所有的小部件都起作用。爲了解決這個問題,你必須包括這樣的條件:

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

這種情況,當然,必須在步驟4中註釋的所有行被應用。如果你不會使用WP管理區,你不需要使用這個條件。