在微件中使用筛选器会导致致命错误

时间:2014-01-21 作者:enam

我正在小部件中为WordPress查询添加一个过滤器。我补充如下:

function filter_where( $where = \'\' ) {

}
add_filter( \'posts_where\', \'filter_where\' );
$query = new WP_Query( $args );
remove_filter( \'posts_where\', \'filter_where\' );
它工作得很好,但是如果我使用同一个小部件超过1次,那么我会得到一个致命错误,即无法重新声明相同的过滤器。如何使用过滤器,以便同一个小部件可以多次使用?

这正是我得到的错误:

Fatal error: Cannot redeclare filter_where() (previously declared in xxx.php:70)
谢谢。

2 个回复
SO网友:Eric Holmes

您的代码应该如下所示:

class my_Widget extends WP_Widget {

...

function filter_where( $where = \'\' ) {
    ...
}

function widget( $options ) {
    ...
    add_filter( \'posts_where\', array( $this, \'filter_where\' ) );
    $query = new WP_Query( $args );
    remove_filter( \'posts_where\', array( $this, \'filter_where\' ) );
}
}
这将使函数保持在类中,在类级别访问它,并避免任何命名空间问题。

SO网友:s_ha_dum

您必须在小部件系统重用的函数中定义回调函数——我猜是在widget 方法

在小部件外部定义回调,并且仅应用(apply_filter) 小部件内部。

换句话说,将回调添加为类方法,并添加如下内容:

add_filter(\'posts_where\', array($this,\'filter_where\'));
您应该能够使用类似的语法删除它。

在上下文中看不到您的代码,这是我所拥有的最好的。

结束

相关推荐

从图像路径中删除‘wp-Content/Themes/Themename/’

我目前正在将一个基于其他CMS的旧网站移动到一个新服务器上,使用WordPress。然而,这个网站在Google上排名很好,我必须保留所有的链接结构,包括来自图片的链接结构。因此,在旧CMS中,图像链接如下:http://www.domain-name.de/images/image1.jpg 现在,他们是这样的:http://www.domain-name.de/wp-content/themes/theme-name/images/image1.jpg 但它们必须与第一个示例中的一