直接自定义发布查询与页面上的其他查询冲突

时间:2013-02-19 作者:Soyo

在前面的一个问题中,我一直在努力解决如何在执行标准类别/标记查询时显示我的自定义帖子类型,因为默认情况下Wordpress在这些查询中不包含CPT。经过一番打猎,我发现答案是:

add_filter(\'pre_get_posts\', \'query_post_type\');
function query_post_type($query) {
  if($query->is_category() || $query->is_tag() || $query->is_home() && $query->is_main_query()) {
     $post_type = get_query_var(\'post_type\');
     if($post_type)
        $post_type = $post_type; 
     else
        $post_type = array(\'post\',\'my_custom_post_type\'); 
     $query->set(\'post_type\',$post_type);
     return $query;
  }
}
而且,它工作得很好。。。现在,我可以将类别/标签分配给我的自定义帖子类型,然后查询它们并查看结果。然而,有了这段代码,我现在有了一个全新的问题,只有当上面的代码就位时,才会出现这个问题。。。如果我现在直接查询或查看我的自定义帖子类型(即,不通过类别/标记),那么页面上的标准查询项(例如,页脚中的类别列表)突然变为空白。

我不明白这是怎么发生的,因为我正在检查以确保$query->is_main_query(), 因此,最初的if语句似乎是错误的。。。。

我现在是否必须编写另一个单独的函数,以便当我直接查询或查看自定义帖子类型时,我可以允许标准帖子类型在同一页面上运行??感谢您的帮助。。。

感谢您的评论,我已经找到了问题的原因:

当我有了我的初始解决方案(这篇文章中没有显示)时,从标准和CPT的基本查询中,一切都很好——但当我进入多个查询时,我意识到在某些情况下,例如在主页中,一些查询分散在页脚中的页面,突然我遇到了交叉效应——比如我的菜单有时会消失,等等。

所以当&& $query->is_main_query() 添加了(请参阅上面的完整代码)-当然,它的效果更好,因为我只将其应用于主查询,从而避免了菜单/页脚问题。。。至少我是这么想的。

自从添加这个新版本的代码以来,一切似乎都很好-直到我“直接”查询我的CPT。。。当我这样做时,我的一个标准页脚小部件(调用一个简单的类别查询)变成了空白。

当我开始研究这一点时,我可以看到,在上面代码中我的初始IF查询中,它正在执行一个“OR或AND”-从技术上讲,要将此代码仅保留在主查询中,我需要执行类似于“((OR或)AND)”的操作,或者将整个函数包装在if ($query->is_main_query() {

所以,我继续做了这件事(见下文)。。。当我这样做的时候,这就解决了“直接CPT”调用问题——现在我可以直接查询CPT,而不必破坏页脚查询。

add_filter(\'pre_get_posts\', \'query_post_type\');
function query_post_type($query) {
if ($query->is_main_query()) {
if($query->is_category() || $query->is_tag() || $query->is_home() ) {
$post_type = get_query_var(\'post_type\');
if($post_type)
    $post_type = $post_type; 
else
    $post_type = array(\'post\',\'my_custom_post_type\'); 
$query->set(\'post_type\',$post_type);
return $query;
    }
      }
}
所以,这看起来很好,对吗??但事实并非如此。。。因为我的第一个版本并没有按照我的预期进行设置,所以它允许在不在main\\u查询中的时候将我的CPT添加到标准类别/标记查询中。。。因此,现在我已经正式过滤了它,因此它在所有情况下都只能影响main\\u查询,我的页上选项卡查询调用都失败了。。。(他们通过每页jquery选项卡中的类别调用我的CPT)。

因此,我的新问题是:考虑到上面代码的第二个版本,它允许我将我的CPT合并到标准的cat/tag查询中,并直接查询我的CPT,而不会对页面上的其他查询产生不良影响-我现在如何确定我的TAB调用正在进行的查询?因为它显然不是main\\u查询,因此,我现在需要以这些查询为目标,以便可以包含我的CPT,就像我对main查询所做的那样?

2 个回复
SO网友:paul

您可能正在查找wp\\u reset\\u查询

您可以在返回后插入此内容。

add_filter(\'pre_get_posts\', \'query_post_type\');
function query_post_type($query) {
  if($query->is_category() || $query->is_tag() || $query->is_home() && $query->is_main_query()) {
 $post_type = get_query_var(\'post_type\');
 if($post_type)
    $post_type = $post_type; 
 else
    $post_type = array(\'post\',\'my_custom_post_type\'); 
 $query->set(\'post_type\',$post_type);
 return $query;
  }
wp_reset_query;
}
我真的希望这能有所帮助。

SO网友:Scott Porco

我使用了您的第一段代码,它在Sahifa Theme. 和你一样,我的导航在自定义贴子页面上消失了。在分析代码后,我意识到以下几行:

$post_type = get_query_var(\'post_type\');
不包括其他标准岗位;在post\\u类型页面上的页面。

因此,我将其改为以下内容,它似乎包含了每种类型&;到处都是帖子,包括导航。

$post_type = get_query_var( \'post_type\' || \'posts\' && \'page\' );
对于在这里遇到同样问题的任何其他人,以下是我为使其发挥作用所做的工作。

function query_post_type($query) {
if($query->is_category() || $query->is_post_type() || $query->is_tag() && $query->is_main_query()) {
$post_type = get_query_var( \'post_type\' || \'posts\' && \'page\' );
if($post_type)
$post_type = $post_type;
else
$post_type = array(\'post\', \'business\', \'nav_menu_item\');
$query->set(\'post_type\',$post_type);
return $query;
}
}
add_filter(\'pre_get_posts\', \'query_post_type\');
谢谢你,

结束

相关推荐

使用新的WP-Query()从循环中过滤后期格式;

嗨,我目前正在为我的博客构建一个主题。下面的代码指向最新的帖子(特色帖子)。因为这将有一个不同的风格比所有其他职位。然而我想过滤掉帖子格式:链接使用我在循环中定义的WP查询,因为它给我带来了更多的灵活性。我该怎么做呢? <?php $featured = new WP_Query(); $featured->query(\'showposts=1\'); ?> <?php while ($featured->have_post