麻烦将参数传递给WordPress pre_get_posts

时间:2013-11-29 15:06:19

标签: php wordpress post

我需要你的帮助!我无法使用pre_get_posts将参数传递给函数。

传递参数的目的:
我有一个自定义taxonony- $ taxonomy.php页面,我用它来列出与指定分类中的特定类别相关的帖子。在这个页面上我还检索&从自定义非分层分类法分配给每个帖子的设置标记,并将它们列为侧面的链接。我有另一个分类 - $ taxonomy.php(对于上面提到的自定义非分层分类法)设置,所以当用户选择他/她点击标签的链接时,它会将它们引导到这个分类页面。这一切都很好。

然而,这是我遇到问题的地方。非分层分类页面上列出的帖子是与特定标签相关联的帖子,但来自多个类别。我想要实现的是将帖子关联列出到所选标签和之前正在查看的类别。例如:假设用户点击“会计”类别,然后选择“创意服务”标签。列出的所有帖子不仅应与“创意服务”相关联,还必须仅分配给“会计”类别。这是我一直试图将参数传递给pre_get_posts使用的函数。

我如何尝试传递参数?:

1-设置全局变量:这样就不会通过被调用的函数过去任何参数。它不起作用,因为时间关闭。调用动作时尚未设置全局变量。下面是我的代码,其中包含示例post_type和taxonomy。注意$ category是全局变量,用于保存该分类中的类别。

// Alter main query on doc_tag taxonomy templates
function only_query_doc_tag_posts( $query ) {
    global $category;
    if ( is_tax(array('doc_tag')) && !is_admin() ) {
        if($query->is_main_query()) {
            $query->set( 'post_type', 'post_type' );
            $query->set( 'taxonomy', 'taxonomy_array' );
            $query->set( 'taxonomy_name', $category ); //global
        }
    }
}
add_action( 'pre_get_posts', 'only_query_doc_tag_posts' );

结果: 当我查看主查询时,它显示除使用全局的更改之外的所有更改。如果我手动将值插入到函数中,而不是使用全局变量,那么它可以工作。但是,我希望能够在飞行中改变它。只是因为你知道我确实得到了与标签相关的帖子,而不是那些只与全局指示的类别相关的帖子(当使用全局时)。

2- do_action:

// Alter main query on doc_tag taxonomy templates
function only_query_doc_tag_posts( $query,
                                   $post_types,  //array
                                   $taxonomies,  //array
                                   $category     //global var
                                   ) {
    global $category;
    if ( is_tax(array('doc_tag')) && !is_admin() ) {
        if($query->is_main_query()) {
            $query->set( 'post_type', $post_types );
            $query->set( 'taxonomy',  $taxonomies );
            $query->set( 'taxonomy_name', $category ); //global
        }
    }
}
add_action( 'pre_get_posts', 'only_query_doc_tag_posts', 10, 4 );

然后在自定义非分层分类页面模板上添加以下内容:

do_action( 'pre_get_post', $post_types, $taxonomies, $category );

我有一种感觉,我的第二种方法不是技术上的,但我可能是错的,这就是为什么我在这里张贴,希望有人可以提供一些方向。 如果我错过了可以帮助您的信息,请告诉我。

提前感谢您帮助我。

仅供参考:我已阅读这些帖子但未找到解决方案。也许它在那里我错过了吗?请让我知道。

1 个答案:

答案 0 :(得分:0)

我想我明白你要做什么。 简而言之 - 不,你不能自己做(do_action),它是由wp查询部分调用的。

如果您尝试传递参数,则需要查看[$ query-> query_vars]。 我认为一个合适的解决方案,就是你需要的,是写一个正确的url重写规则,它可以自动选择分类,并将其放入url列表,然后值可以自动显示在[$ query-> query_vars]中。 哪个是[add_filter('rewrite_rules_array','set_url_rule');]

您可能还需要安装插件[rewrite-rules-inspector]来帮助您检查重写状态。

无论如何,它可能需要你一个下午来找到它背后的逻辑,但是,这一切都是有道理的。

如果您只是寻找快速解决方案,可以在query_vars中注入一些代码,您只需要:

add_filter('query_vars', 'insert_query_vars');
function insert_query_vars( $vars ){
    array_push($vars, 'c_type');
    array_push($vars, 'c_tax');
    array_push($vars, 'c_term');
    return $vars;
}