覆盖wp_get_ages()应用过滤器()

时间:2012-10-05 作者:Ian Jamieson

我已经在google上搜索了一段时间,但我不确定如何才能做到这一点。

在里面wp-includes/general-template.php 我正在查看函数wp_get_archives() 其中包含以下代码行:

$where = apply_filters( \'getarchives_where\', "WHERE post_type = \'post\' AND post_status = \'publish\'", $r );

我想做的是:

$where = apply_filters( \'getarchives_where\', "WHERE post_type = \'post\' OR post_type = \'events\' AND post_status = \'publish\'", $r );

然而,我不知道如何连接到这个过滤器并在函数中重写它。php

感谢您的建议。

谢谢

伊恩

3 个回复
最合适的回答,由SO网友:EAMann 整理而成

WordPress筛选器是一个函数,它接收字符串、数组或对象,对其执行某些操作,并返回经过筛选的字符串、数组或对象。

所以你要做的是"WHERE post_type = \'post\' AND post_status = \'publish\'" 进入"WHERE post_type = \'post\' OR post_type = \'events\' AND post_status = \'publish\'". 这相当简单。

从表面上看getarchives_where 筛选器接受两个参数。因此,您将像这样钩住过滤器:

add_filter( \'getarchives_where\', \'my_fancy_filter_function\', 10, 2 );
然后,您需要编写一个函数,该函数接受两个参数,对它们进行过滤,并返回一个字符串:

function my_fancy_filter_function( $text, $r ) {
    return "WHERE post_type = \'post\' OR post_type = \'events\' AND post_status = \'publish\'";
}
现在,此函数将接收任何输入,但它将始终返回指定过滤器的字符串。有很多更高级的方法可以添加查询参数,但这将完全满足您的问题。

SO网友:fuxia

在插件或主题中functions.php 只需写下:

add_filter( \'getarchives_where\', \'wpse_67264_filter_getarchives_where\' );

/**
 * Add post type \'events\' to wp_get_archives() query.
 * 
 * No parameters needed because we ignore them anyway.
 * 
 * @wp-hook getarchives_where
 * @return  string New WHERE clause
 */
function wpse_67264_filter_getarchives_where()
{
    return "WHERE post_type = \'post\' OR post_type = \'events\' AND post_status = \'publish\'";
}
这比习惯好WP_Query在我看来,您甚至不需要接受回调中的任何参数,因为您不使用主题。:)

要了解过滤器的工作原理,请阅读Codex on the Plugin API. 基本上,回调返回值将替换apply_filters().

SO网友:Jared Cobb

实际上,您要做的是使用名为WP_Query. 这样,您就不会改变WordPress的实际核心功能(这在升级时会给您带来很大的麻烦)。

在存档页面中,将当前循环替换为自定义查询,如下所示:

$args = array(); // setup the custom posts you want in here
$custom_query = new WP_Query($args); // build a custom query
while($custom_query->have_posts()) : $custom_query->the_post();
    // inside the loop, show your posts
endwhile;
wp_reset_postdata(); // reset the query
The$args 数组只是您的自定义逻辑,在这个循环中应该显示哪些帖子。请参见WP_Query documentation 获取可放入此阵列的内容的完整列表。

例如,您希望根据帖子类型进行筛选,因此see this section 您将注意到,您可以$args 类似这样的阵列:

$args = array(\'post_type\' => array(\'post\', \'events\'))
希望有帮助!

[edit]

我刚刚意识到,您可能希望获得存档中简单无序的帖子列表(而不必显示帖子本身,因为实际上就是这样wp_get_archives 行为)。

只需将循环包装在<ul> 标记,然后在循环输出内部<li> 周围的标记the title 归档后的the permalink 到存档的帖子。

结束

相关推荐

Ajax, filters and shortcodes

您能理解为什么我无法在ajax帖子包含中应用短代码过滤器吗?让我更好地解释一下:我已经设法在另一篇文章中包含一篇文章,通过admin-ajax.php, 正如著名的5 tips.很明显,我不想显示快捷码标签,也不想去掉它们,所以我在回应do_shortcode($post->post_content)此时,虽然我正在运行“Cleaner gallery”插件,但post gallery会被渲染,但未被过滤add_filter( \'post_gallery\', \'cleaner_gallery\