影响最近帖子的自定义帖子

时间:2014-09-09 作者:fisicx

我构建了一个使用自定义帖子类型的插件。除了按类别列出帖子外,一切都正常工作;最近的帖子小部件只显示最近的自定义帖子类型。

http://testblog.co.uk/events-list/ - 一切正常(这些是自定义帖子)

http://testblog.co.uk/category/derek/ - 仅显示最近的自定义帖子

该插件有一个wp\\u查询调用:

$args = array(\'post_type\'=>\'event\',\'orderby\'=>\'meta_value_num\',\'meta_key\'=>\'event_date\',\'order\'=>\'asc\',\'posts_per_page\'=>-1);
query_posts( $args );
但我看不出这会对事情产生什么影响。关于我应该从哪里开始寻找,有什么建议吗?

编辑:

不使用pre\\u get\\u post,所以这不是问题所在。我确实使用:

$output_string = ob_get_contents();
ob_end_clean();
return $output_string;
在清除查询后,但当我删除此查询时,它没有任何影响。

是一个用户提醒我这个问题,所以这不是我的主题(尽管我已经使用2014和所有其他停用的插件进行了测试)。

这必须是一次重置,没有在正确的地方开火。。。

编辑2:

调试现在已打开,除了一些未定义的变量外,没有任何报告。

编辑3:

出现的“最近帖子”列表似乎完全是随机的。它显示帖子、事件和已删除的项目-最奇怪,

调试完成-有一个与另一个插件相关的警告可以忽略。

分类法是

$args = array(\'taxonomies\' => array(\'category\',\'post_tag\'));register_post_type(\'event\',$args);
显然,plug8in中有更多的标签和参数,但这是对类别的唯一引用。

使用“标签”和存档查询以及al lis ok进行测试。因此,这只是“分类”查询。从CPT分类中删除该类别没有什么区别。

1 个回复
最合适的回答,由SO网友:Pieter Goosen 整理而成

我不太理解你的问题,但我发现有几个问题可能会对其他查询产生负面影响

首先,query_posts 不应使用Note: 此功能不适用于插件或主题。如后文所述,有更好、性能更好的选项来更改主查询。query\\u posts()是一种过于简单且有问题的方法,通过将页面的主查询替换为新的查询实例来修改它。它效率低下(重新运行SQL查询),并且在某些情况下会彻底失败(尤其是在处理POST分页时)。

始终使用WP_Queryget_posts 如果无法使用更改主查询,请创建自定义查询pre_get_posts 满足您的需求。

干扰其他查询的最可能原因是您没有重置自定义查询。这对于任何尚未重置的自定义查询都非常重要will 对同一页上的任何其他查询都有负面影响。您可以使用重置查询wp_reset_postdata() 在自定义查询之后

有关更多信息,请阅读this post 我最近做过

EDIT

从您的评论来看,这个问题似乎与所讨论的代码无关

。。。我现在已将插件更改为使用wp\\u query,并添加了wp\\u reset\\u postdata(),但问题仍然存在

您需要调试这个,我将查找以下内容

任何pre_get_posts. 使用时要记住一件事pre_get_posts, 它改变了all 查询,主查询和自定义查询,如果未正确使用。如果每个实例只针对主查询,请确保其中包含以下代码if( $query->is_main_query())

您是否可以运行自定义查询来代替类别页面上的主查询。如果是这样,不要这样做。请阅读this post 这可以解释一切。

此外,打开调试并检查是否有任何错误。尝试切换到捆绑主题,停用所有其他插件,并检查您的问题是否与您的插件或您正在使用的主题相关。如果你在切换主题后遇到同样的问题,很可能是你的插件

EDIT 2

正如我所怀疑的,这是pre_get_posts 这就是问题的根源。请查看quick event manager中的以下几行。php

Line 28: add_filter( \'pre_get_posts\', \'qem_add_custom_types\' );

Line 106: function qem_add_custom_types( $query ) {
Line 107:     if( is_category() || is_tag() ) {
Line 108:                   $query->set( \'post_type\', array(\'post\', \'event\',\'nav_menu_item\'));
Line 109:             return $query;
Line 110:      }
Line 111: } 
pre_get_posts 不仅要更改主查询,还要更改自定义查询。这不仅发生在前端,也发生在后端。所以使用时要非常小心pre_get_posts , 否则你最终会遇到问题

LETS DISSECT WHAT IS HAPPENING

最近发表的文章小部件使用自定义查询在侧栏中显示最近发表的文章。您的代码所做的是,当您在类别或标记页上时,它会将以下帖子类型添加到所有查询中\'post\', \'event\',\'nav_menu_item\'.

正如我所说,pre_get_posts 作用于all 查询、主查询和自定义查询。这就是为什么你在分类页面上看到奇怪的行为,实际上,如果你检查一下,你在标签页面上也会遇到同样的问题。此外,在访问类别和标记页面时,您还应该在后端看到奇怪的行为。

THE SOLUTION

ALWAYS 使用时pre_get_posts, 仅将其定向到主查询(is_main_query()), 其次,始终检查您是否在管理页面(后端)或前端页面上,并仅对前端进行更改(!is_admin())

您应该将代码更改为

function qem_add_custom_types( $query ) {
    if( !is_admin() && $query->is_category() || $query->is_tag() && $query->is_main_query() ) {
            $query->set( \'post_type\', array(\'post\', \'event\',\'nav_menu_item\'));
        return $query;
        }
    }
这应该解决这个问题。

结束

相关推荐