仅排除父自定义帖子类型帖子

时间:2011-12-19 作者:remi90

不确定如果没有某种形式的硬编码,这是否可行,但我有一个自定义的帖子类型,叫做“city”。在“城市”帖子类型中,我有一些母帖子(如英国、美国和中国)和一些子帖子(伦敦、华盛顿特区和北京)。

我有一个查询,显示“城市”下的所有帖子。但对于这个特殊的查询,我想实际上忽略任何父帖子(即英国、美国和中国),而只显示子帖子(伦敦、华盛顿和北京)。

以下是我对查询进行编码的方式:

<?php $city = new WP_Query(array(\'post_type\' => \'city\', \'orderby\' => \'name\', \'order\' => \'ASC\', \'posts_per_page\' => -1 )); ?>
                            <?php while ($city->have_posts() ) : $city->the_post(); ?>
                                <?php the_title(); ?>
                            <?php endwhile; ?>
那么这有可能吗?我本以为做相反的事情更像是一个流行的问题(只显示父母,不包括孩子),但我希望我的问题是可能的!

谢谢

2 个回复
最合适的回答,由SO网友:Rutwick Gangurde 整理而成

根据the codex for WP_Query, 解决方案可能是使用post_parent 作为顶级职位的id。但由于您的案例中有很多顶级CPT,我认为此解决方案应该可以帮助您:How to display only top level posts in loop via WP_Query?.

Update:

<?php
    $all = get_posts(array(\'post_type\'=> \'city\', \'posts_per_page\' => -1));
    $parents = array();
    foreach ($all as $single)
    {
        $kids = get_children($single->ID);  
        if(isset($kids) && !empty($kids) && count($kids) >= 1)
        {
            $parents[] = $single->ID;
        }
    }

    $args = array(\'post_type\' => \'city\', \'orderby\' => \'name\', \'order\' => \'ASC\', \'posts_per_page\' => -1, \'post__not_in\' => $parents );

    $city = new WP_Query($args);
    while ($city->have_posts() ) : $city->the_post();
            echo get_the_title()."<br />";
    endwhile;
    wp_reset_postdata();
?>
这是一个很长的切口,但很有效。在将$parents数组包括在查询中之前,请确保检查它是否为空。

SO网友:chrisguitarguy

我想你想要的是posts_where 过滤器,允许您添加其他WHERE SQL查询的子句get_posts 生成。这将节省您访问数据库的时间,以便只获取父帖子。

挂钩函数将接收两个参数:WHERE 子句本身和查询对象。检查该查询是否用于city post类型,然后从那里修改where子句。

<?php
add_filter( \'posts_where\', \'wpse29897_no_parents\', 10, 2 );
function wpse29897_no_parents( $where, $query )
{
    if( isset( $query->query_vars[\'post_type\'] ) && \'city\' == $query->query_vars[\'post_type\'] )
    {
        if( \'\' != $where )
        {
            $where .= \' AND post_parent !=  0\';
        }
        else
        {
            $where .= \' post_parent != 0\';
        }
    }
    return $where;
}
我猜您不希望每个涉及city 然而,post类型。所以你最好还是坚持add_filter 在创建新WP\\U查询对象的正上方调用。然后贴上wpse29897_no_parents 在您的functions.php 文件或插件。

<?php 
add_filter( \'posts_where\', \'wpse29897_no_parents\', 10, 2 );
$city = new WP_Query(array(\'post_type\' => \'city\', \'orderby\' => \'name\', \'order\' => \'ASC\', \'posts_per_page\' => -1 ));
while ($city->have_posts() ) : $city->the_post(); 
?>
    <?php the_title(); ?>
<?php endwhile; ?>
您甚至可以在循环后移除过滤器,以确保安全。

<?php remove_filter( \'posts_where\', \'wpse29897_no_parents\', 10, 2 ); ?>

结束

相关推荐

为什么‘EXCLUDE_FROM_SEARCH’从WP_QUERY中排除自定义帖子类型?

在WP 3.1中,似乎设置\'exclude_from_search\' = TRUE 对于自定义帖子类型,不仅从前端的搜索中排除帖子类型,而且从使用\'post_type\' = \'all\'.我可以想象很多情况下,插件开发人员希望访问所有帖子类型,甚至是那些被排除在前端搜索之外的帖子类型。这是一个bug,还是只是文档记录不足?背景故事:我有一个自定义的帖子类型,使用自定义的“帖子到期日期”字段。为了自动取消发布过期的自定义帖子,我创建了一个内容过期插件,该插件使用wp\\u schedule\\u