1

CakePHPコントローラーからWordPressの機能にアクセスできるようにしたい。私はアクションからこれを試しました:

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

WPとCakePHPに共通するいくつかの関数を再宣言しないように、WPコアにいくつかの変更を加える必要がありました。

しかし、まだエラーが発生しています。

厳密(2048):クラスWP_Widgetの定義済みコンストラクターを再定義します[APP \ webroot \ WP \ wp-includes \ widgets.php、93行目]

エラーにもかかわらず、私がループを呼び出すと、それは機能します。呼び出しwp_insert_post()も機能します。基本的に、私はすでにWP機能にアクセスできます。しかし、その再定義エラーは解消されません。

私はこれを試しました:

error_reporting(-1);
Configure::write('debug', 0);

しかし、どちらも役に立ちませんでした。

  • その警告を取り除く方法はありますか?
  • CakePHPをWordPress関数を拡張する正しい方法はありますか?

このコンポーネント(shama / CakePHP-Wordpress-Component)を見つけましたが、最後の変更は2年前であり、作成者は3か月前にコンポーネントが非推奨になると発表しました。また、cURLを使用してWPAPIと対話します。私はそれを拡張したいだけです。

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.2wp-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作業を行い、結果を変数に保存しない限り、 wp-load.phponを要求するbeforeFilter()ことは機能しないようです。beforeFilter()そうしwp-load.phpないと、アクションに移動するときにCakePHPがアンロードされたように見え、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 に答える