首先,我的问题与此非常相似:https://stackoverflow.com/questions/10629245/wordpress-menu-disappears-when-query-query-varsmeta-key-is-set 然而,出于某种原因,这个问题的答案对我没有帮助。
我在函数中使用以下代码。php文件,用于根据页面URL中设置的自定义字段筛选帖子:
function my_pre_get_posts( $query )
{
// validate
if( is_admin() )
{
return;
}
if( isset($_GET[\'county\']) )
{
$query->set(\'meta_key\', \'venue_county\');
$query->set(\'meta_value\', $_GET[\'county\']);
}
}
return;
}
add_action(\'pre_get_posts\', \'my_pre_get_posts\');
我复制了本教程中的代码
http://www.advancedcustomfields.com/resources/tutorials/creating-wp-archive-custom-field-filter/如果URL中设置了county,则上述代码可以过滤场馆存档页面上的结果。但是,这会中断wordpress主导航菜单。
当我尝试对代码应用修复时,通过添加
if( ! $query->is_main_query()) return;
这修复了菜单,但破坏了URL过滤,因此所有帖子都会返回,而不仅仅是那些将venue\\u county自定义字段设置为某物的帖子。
这很令人沮丧,任何帮助都将不胜感激!
例如,是否有一种方法可以检查查询是否针对导航菜单,如果是,则不触摸它,但仍然允许修改第二个查询以实际获取页面上的帖子?我想这就是if( ! $query->is_main_query()) return;
应该做。。。
谢谢
SO网友:Jake
我在一个自定义帖子类型的归档页面上遇到了完全相同的问题,还有一个不必要的额外查询;由于分页原因。搜索相同的解决方案时,我在堆栈溢出上找到了这篇文章https://stackoverflow.com/questions/21303743/new-wp-query-or-pre-get-posts-to-view-all-posts-for-custom-post-type
我玩了一个游戏,在函数中添加了这行代码。
if( ! $query->is_post_type_archive()) return;
我的最终代码如下所示。我对此进行了测试,它似乎不会以任何方式影响任何其他页面,并为我解决了问题。
add_action(\'pre_get_posts\', \'my_pre_get_posts\');
function my_pre_get_posts( $query )
{
// validate
if( is_admin() )
{
return $query;
}
if( ! $query->is_post_type_archive() ) return;
// allow the url to alter the query
if( isset($_GET[\'status\']) )
{
$query->set(\'meta_key\', \'status\');
$query->set(\'meta_value\', $_GET[\'status\']);
}
// always return
return $query;
}