我可以使用PRE_GET_POSTS函数通过元键排除POST吗?

时间:2012-11-09 作者:Carlisle

我看到很多人更喜欢使用pre_get_posts 钩子代替query_posts. 下面的代码可以工作并显示所有具有元键“特色”的帖子

function show_featured_posts ( $query ) {
    if ( $query->is_main_query() ) {
       $query->set( \'meta_key\', \'featured\' );
       $query->set( \'meta_value\', \'yes\' );
    }
}

add_action( \'pre_get_posts\', \'show_featured_posts\' );
但是我想要那些有\'featured\' meta\\u密钥为excluded 从主查询。有没有简单的方法?

3 个回复
SO网友:Stephen Harris

我看到很多人喜欢使用pre\\u get\\u posts挂钩而不是query\\u posts

耶!

所以pre_get_posts 过滤器aWP_Query object 这意味着你可以通过query_posts() 您可以通过$query->set()$query->get(). 特别是我们可以利用meta_query 属性(请参见Codex):

$meta_query = array(
                 array(
                    \'key\'=>\'featured\',
                    \'value\'=>\'yes\',
                    \'compare\'=>\'!=\',
                 ),
);
$query->set(\'meta_query\',$meta_query);
但是。。这将替换原始的“元查询”(如果有)。因此,除非您想完全替换原来的元查询,否则我建议:

//Get original meta query
$meta_query = $query->get(\'meta_query\');

//Add our meta query to the original meta queries
$meta_query[] = array(
                    \'key\'=>\'featured\',
                    \'value\'=>\'yes\',
                    \'compare\'=>\'!=\',
                );
$query->set(\'meta_query\',$meta_query);
通过这种方式,我们将元查询与现有的元查询一起添加。

您可能/可能不想设置relation 的属性$meta_queryANDOR (返回满足所有或至少一个元查询的帖子)。

*Note: 这种类型的查询将返回带有“featured”元键的帖子,但其值不是yes. 它将不包括“特色”元键不存在的帖子。You\'ll be able to do this in 3.5.

SO网友:Carlisle

我想发布我的特色帖子的临时解决方案,以防有人会利用它。我不使用pre_get_posts 钩住这里但不要query_posts 任何一个问题是我必须处理主查询,并且必须运行一段sql查询。如果有专家能检查代码,让我知道它是否正常,不会导致任何性能问题,我会很高兴。如果有人有更好的方法并与我们分享,那也太好了。

创建特色帖子查询

<?php 

$featured_query = new WP_query( array(
    \'meta_key\'       =>\'featured\', 
    \'meta_value\'     =>\'yes\', 
    \'posts_per_page\' => 5, 
    \'no_found_rows\'  => true
    )
);

while ($featured_query->have_posts()) : 

    $featured_query->the_post(); 
    //Stuff...

endwhile; 
wp_reset_postdata(); 

?>
创建主查询,排除具有特色meta\\u键的帖子,将排除限制为5篇最新帖子,并显示所有其他帖子。

<?php 

$excludeposts = $wpdb->get_col( "SELECT post_id FROM $wpdb->postmeta WHERE meta_key = \'featured\' AND meta_value != \'\' ORDER BY post_id DESC LIMIT 0, 5" );

$main_query = new WP_Query( array(
    \'post__not_in\' => $excludeposts, 
    \'paged\' => $paged 
    ) 
);  

while ($main_query->have_posts()) : 

    $main_query->the_post();
    //Stuff...

endwhile;

?>

SO网友:cpeckens

作为对@Carlisle的回应,如果您想排除最近5篇标记为“特色”的帖子,您可以执行以下操作。将posts\\u per\\u页面更改为要排除的数量,将meta\\u查询更改为指定特色类别的方式。

function cmp_exclude_featured_posts($query) {
    $exclude = array();  //Create empty array for post ids to exclude
    if ( $query->is_main_query() ) {
            $featured = get_posts(array(
                \'post_type\' => \'post\',
                \'meta_query\' => array(
                    array(
                        \'key\' => \'featured\',
                        \'value\' => \'1\',
                        \'compare\' => \'==\',
                    ),
                ),
                \'posts_per_page\' => 2
            ));

            foreach($featured as $hide) {
                $exclude[] = $hide->ID;
            }   

            $query->set(\'post__not_in\', $exclude);
        }
}

add_filter( \'pre_get_posts\', \'cmp_exclude_featured_posts\' );

结束

相关推荐

列出分类法:如果分类法没有POST,就不要列出分类法--取决于定制的POST-META?

这可能很难解释,我不知道是否有解决办法!?我有一个名为“wr\\u event”的自定义帖子类型和一个名为“event\\u type”的分层自定义分类法。自定义帖子类型有一个元框,用于event_date 并且与此帖子类型关联的所有帖子都按以下方式排序event_date. 我在循环中有一个特殊的条件来查询event_date 已经发生了-在这种情况下,它没有显示,但只列在我的档案中。就像你可以使用wp_list_categories() 我编写了一个自定义函数,它以完全相同的方式列出所有分类术语。现在