1

WordPress 用のflickerRSS RUプラグインを使用しているクライアントのために働いています。ただし、ページごとに複数の関数呼び出しを配置し​​ようとすると、error_log に次のエラーが記録されます。

PHP Fatal error:  Cannot redeclare get_and_delete_option() (previously declared 
in .../wp-content/plugins/flickrrss-ru/flickrrssRU.php:21) in 
.../wp-content/plugins/flickrrss-ru/flickrrssRU.php on line 21

プラグイン呼び出しの最初は次のとおりです。

get_flickrRSSRU(array(
    'set' => '72157624558519886',
    'num_items' => 3,
    'type' => 'set',
    'html' => ' <a href="%flickr_page%" title="%title%"><img src="%image_square%" alt="%title%"/ height="68px" ></a>'));

に続く:

get_flickrRSSRU(array(
    'set' => '72157624558519886',
    'num_items' => 11,
    'type' => 'set',
    'html' => ' <a href="%flickr_page%" title="%title%"><img src="%image_square%" alt="%title%"/ height="75" ></a>'));

プラグインが WordPress 経由で読み込まれた場合に、これら 2 つの呼び出しがプラグインを再度初期化しようとする理由がわかりません。

使用されているこの特定の機能がプラグインにあることがわかりました。

$flickrRSSRU = new flickrRSSRU();
add_action( 'admin_menu', array(&$flickrRSSRU, 'setupSettingsPage') );
add_action( 'plugins_loaded', array(&$flickrRSSRU, 'setupWidget') );
register_activation_hook( __FILE__, array( &$flickrRSSRU, 'setupActivation' ));

function get_flickrRSSRU($settings = array()) {
    global $flickrRSSRU;
    $flickrRSSRU->printGallery($settings);
}
4

2 に答える 2

2

さまざまな理由により、関数が 2 回定義される (または定義されようとする) 可能性があります。を使用function_exists()して、関数が既に宣言されているかどうかを確認して確認し、宣言されていない場合にのみ宣言できます。

if ( ! function_exists('get_and_delete_option') ) {
    function get_and_delete_option( $foo, $bar ){
        return $foo . $bar;
    }
}

考えてみれば、WordPress ではそもそもこれが標準的なアプローチだと思います。

含む、または 1 回要求する

この機能を含める場合は、代わりにinclude_onceorを使用してみてください。require_onceこれにより、同じファイルが複数回追加されることはありません。

于 2012-05-29T17:09:12.740 に答える
1

私の推測では、flickrrssRU.php の 49 行目です。

if (!get_option('flickrRSSRU_settings')) $this->setupActivation();

これはおそらく両方の回を呼び出しており、そのメソッド内で関数を$this->setupActivation()宣言しています。プラグインがアクティブ化されたときにオプションを作成しているはずですが、アクセスに問題があるようget_and_delete_option()です

テーブルを見てwp_options、そこに「flickrRSSRU_settings」キーがあるかどうかを確認してください。

別の解決策は、同じファイルの 21 行目を次のように変更することです。

function get_and_delete_option($setting) { $v = get_option($setting); delete_option($setting); return $v; }

if(!function_exists('get_and_delete_option')) {
    function get_and_delete_option($setting) { $v = get_option($setting); delete_option($setting); return $v; }
}

ただし、設定が見つからない場合は、後で別の問題が発生する可能性があります。

于 2012-05-29T17:15:55.713 に答える