我看到许多人更喜欢使用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' );

。有一个简单的方法吗?

#1 楼


我看到很多人更喜欢使用pre_get_posts挂钩而不是query_posts


是的!通过pre_get_posts可以通过WP_Queryquery_posts()进行。特别是,我们可以利用$query->set()属性(请参阅Codex):

$meta_query = array(
                 array(
                    'key'=>'featured',
                    'value'=>'yes',
                    'compare'=>'!=',
                 ),
);
$query->set('meta_query',$meta_query);


但是..它将替换原始的“元查询”(如果有的话)。因此,除非您想完全替换原始的元查询,否则我建议: />您可能/不想将$query->get()meta_query属性设置为relation$meta_query(以返回满足所有或至少一个元查询的帖子)。

*注意:这种类型的查询将返回带有“功能”元键的帖子,但其值不是AND。它不会包含“功能”元键不存在的帖子。您将可以在3.5版中执行此操作。

评论


因此,没有办法检查帖子的met​​a_key是否存在/是否为空?我将不得不等待3.5。然后。感谢您的回复。

–卡莱尔
2012年10月10日12:57

我将简单地创建一个具有“是”和“否”选项的元框,默认情况下将选择“否”。当我想发表帖子时,我将选择是。但是,我希望最后5个帖子保持特色,而其他帖子继续显示在主查询中。我不想回去每次更改选择,所以我必须找到一种方法仅排除最近的5个帖子。我在stackexchange上看到许多类似的问题,应该有一种简单的方法来管理这些特色帖子。 (一种不影响整体性能,不创建大量查询或不需要混合sql查询的方式)

–卡莱尔
2012年10月10日13:38

顺便说一句,我不确定是否为所有帖子创建一个带有yes或No值的额外meta_key是个好主意。排除那些仅缺少功能键的帖子将是很棒的。

–卡莱尔
2012年10月10日13:44



升级到PHP 7后,此函数刚刚在我的网站上崩溃,引发了Uncaught错误:[]字符串错误不支持[]运算符,因为原始meta_query返回为null。您可以通过退回到一个空数组(如果不存在)来解决此问题,方法是退出$ meta_query = $ query-> get('meta_query');。为$ meta_query =(is_array($ query-> get('meta_query')))吗? $ query-> get('meta_query'):[];。

–凯文·纽金特(Kevin Nugent)
18-2-22在11:59

#2 楼

我想为特色帖子发布我的临时解决方案,以防某些人使用它。我在这里不使用pre_get_posts钩子,但也不使用query_posts。问题是我必须使用主查询并必须运行一个sql查询。
如果有任何专家可以检查代码并让我知道它是否正常并且不会导致任何性能,我将很高兴问题。如果有人有更好的方法并与我们分享,这也将非常棒。 ,排除具有meta_key特征的帖子,将排除范围限制为5个最新帖子,并显示所有其他帖子。

<?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(); 

?>


#3 楼

作为对@Carlisle的回应,如果您想排除标记为精选的最近5条最新帖子,则可以执行以下操作。将posts_per_page更改为要排除的数量,将meta_query更改为您指定特色类别的方式。

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' );