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 加载插件,我不确定为什么这两个调用会尝试再次初始化插件。

我发现正在使用的这个特定功能在插件中是这样的:

$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

各种事情可能导致函数被定义两次(或试图定义)。您可以使用function_exists()来检查函数是否已经被声明,如果还没有声明,则只声明它。

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

想一想,我认为这是 WordPress 一开始的标准方法。

包括或要求一次

如果您包含此功能,请尝试使用include_onceorrequire_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 回答