当前在我的主题中使用了QUERY_POSTS()--我想使用请求过滤器来代替

时间:2012-05-13 作者:elgehelge

在显示自定义帖子类型my\\u post\\u type的内容之前,我当前正在我的主题中使用此代码:

$title = $post->post_title;
query_posts( array (
    \'post_type\' => \'page\', 
    \'posts_per_page\' => -1,
    \'my_taxonomy\' => $title
    ));
这意味着当我去/my\\u post\\u type/some\\u title,我看到所有被指定“some\\u title”作为my\\u分类的页面。

现在我想在插件中做同样的事情,而不是在主题中。这意味着(我猜)我必须使用“请求”过滤器?我尝试过这样做:

add_filter( \'request\', \'alter_the_query\' );
function alter_the_query( $request ) {
    $request[\'post_type\'] = \'page\';
    $request[\'my_taxonomy\'] = \'some_title\'; // just hardcoded so far while testing
    $request[\'posts_per_page\'] =  -1;
    return $request;
}
但它根本不会返回任何页面。即使这样也不行:

add_filter( \'request\', \'alter_the_query\' );
function alter_the_query( $request ) {
    $request[\'post_type\'] = \'page\';
    return $request;
}
我做错了什么,或者如何通过调用query\\u posts()实现与我相同的功能?

非常感谢!

2 个回复
SO网友:Jeremy

您提供的代码实际上并没有打印出页面列表;它只是为它们创建查询。假设您有额外的代码来显示它们,在插件中实现所需功能的最简单方法是构建该列表,然后使用the_content 滤器我可能会在一个函数中创建页面列表,将这些页面添加到the_content 在过滤器中添加了第二个函数。以下是一些有助于您起步的内容:

function my_posts_list() {
    global $post;

    query_posts( array (
        \'post_type\' => \'page\', 
        \'posts_per_page\' => -1,
        \'my_taxonomy\' => $post->post_title
    ));

    // Build your HTML list of posts from the query.
}

function filter_the_content($content) {
    // Only filter the content if we\'re on a single \'my_post_type\' page.
    if (is_singular(\'my_post_type\')) {
        $postsList = my_posts_list();
        $content = $postsList . $content;
    }
    return $content;
}

add_filter(\'the_content\', \'filter_the_content\');
当然,你还可以做很多其他的事情,比如检查帖子列表是否为空。

SO网友:mrwweb

WordPress提供了一个很好的钩子,pre_get_posts 我想你正想做什么。

下面是您的代码可能的样子

add_action( \'pre_get_posts\', \'alter_the_query\' );
function alter_the_query() {
    if( is_main_query() && get_post_type() == \'my_post_type\' ) {
        global $post;
        $title = $post->post_title;
        $query->set(\'post_type\', \'page\');
        $query->set(\'posts_per_page\', -1);
        $query->set(\'my_taxonomy\', $title);
    }
}
Nacin和其他人建议pre_get_posts 替换使用query_posts() 不管怎样,希望这对你有用,让你朝着正确的方向前进。

结束

相关推荐

Search options/filters

我正在尝试向侧栏搜索框添加一些复选框选项,similar to this, 用户可以选择是否搜索All Words, Some Word, 或者Entire phrase.我确实在搜索后找到了这个-Wordpress Search Phrases. “句子”选项似乎很有效,但其他选项则不太好。下面的代码是我目前正在处理的,但如果能得到一些帮助使其正常工作,我将不胜感激。非常感谢S(我不想为此使用插件)。<form action=\"<?php bloginfo(\'home\'); ?>