高级或不高级的PRE_GET_POSTS查询

时间:2015-02-23 作者:Kobus Beets

我只想显示那些有“现在和未来”孩子使用pre_get_posts 行动挂钩。有人知道如何做到这一点吗?

function pre_get_posts($query) {        
    if(!is_admin() && $query->is_main_query()) {
        //check if the query matches this post type
        if(is_post_type_archive(\'event\')) {
            $query->set(\'post_parent\', 0); //only show parent posts
            //should only display posts that have children from now to future
        }
    }
}
应显示parent\\u id为0的所有事件,但应排除没有链接子事件的事件。

示例:

事件1有5个子项。(包括)事件2没有子项。(排除)事件3有2个子项。(包括)事件4有一个子项。(包括)事件5没有子项。(排除)我还没有找到任何有用的方法,但会继续寻找解决方案。

感谢您的回复。

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

修改前$query 我们首先要找出哪些帖子需要排除,哪些帖子需要两个查询(如果我能想出一种方法,我会更新答案)。

第一个将获取所有父事件的不同ID的列表,例如-

SELECT DISTINCT wp_posts.post_parent FROM wp_posts WHERE wp_posts.post_type = "event" AND wp_posts.post_type = "publish" AND wp_posts.post_parent != 0
下一步将获取所有没有任何子级的顶级事件的ID(例如,那些不在我们使用上一个查询生成的列表中的事件),例如-

SELECT fgw_2_posts.ID FROM wp_posts WHERE wp_posts.post_type = "event" AND wp_posts.post_type = "publish" AND wp_posts.post_parent = 0 AND wp_posts.ID NOT IN (1,2,3)
最后,我们可以根据需要设置$查询-

$query->set(\'post__not_in\', $loners);
$query->set(\'post_parent\', 0);
这是完整的代码-

add_action(\'pre_get_posts\', \'my_exclude_parents_without_children\');
function my_exclude_parents_without_children($query){

    global $wpdb;

    if($query->is_main_query() && !is_admin()) :

        if(is_post_type_archive(\'event\')) :

            /** First grab the ID\'s of all post parents */
            $my_query = $wpdb->prepare(\'SELECT DISTINCT %1$s.post_parent FROM %1$s WHERE %1$s.post_type = "event" AND %1$s.post_status = "publish" AND %1$s.post_parent != 0\', $wpdb->posts);
            $parents = $wpdb->get_col($my_query);

            /** Next grab the ID of all posts who do not have children (we\'ll call them \'loners\') */
            $my_query = $wpdb->prepare(\'SELECT %1$s.ID FROM %1$s WHERE %1$s.post_type = "event" AND %1$s.post_status = "publish" AND %1$s.post_parent = 0\', $wpdb->posts, join(\',\', $parents));
            if(!empty($parents)) : // Ensure that there are events with children to exclude from this query
                $my_query.= $wpdb->prepare(\' AND %1$s.ID NOT IN (%2$s)\', $wpdb->posts, join(\',\', $parents));
            endif;
            $loners = $wpdb->get_col($my_query);

            /** Now exclude the \'loners\' */
            $query->set(\'post__not_in\', $loners);
            $query->set(\'post_parent\', 0);

        endif;

    endif;

}

结束

相关推荐

Taxonomy filter all children

我有一个自定义分类过滤器,它将过滤选定分类中的所有页面。我希望代码能够选择该分类法中的页面,以及千页的子页面。这是密码。add_action(\'restrict_manage_posts\', \'restrict_manage_posts_section\'); function restrict_manage_posts_section() { global $post_type; if ( is_object_in_taxonomy( $post_t