我需要你的帮助!我无法使用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 );
我有一种感觉,我的第二种方法不是技术上的,但我可能是错的,这就是为什么我在这里张贴,希望有人可以提供一些方向。 如果我错过了可以帮助您的信息,请告诉我。
提前感谢您帮助我。
仅供参考:我已阅读这些帖子但未找到解决方案。也许它在那里我错过了吗?请让我知道。
答案 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;
}