Php 使用WP\u查询按父分类筛选WordPress子帖子?

Php 使用WP\u查询按父分类筛选WordPress子帖子?,php,filtering,wordpress,Php,Filtering,Wordpress,我在WordPress中有一个自定义事件发布类型,重复事件被保存为主事件的子事件。我设置了一些自定义分类,只将自定义分类数据保存到父事件发布, 但我想弄清楚的是如何通过自定义分类法过滤结果,包括重复出现的子帖子。 目前,我有一些类似于: $args = array( 'post_type' => 'incsub_event', 'posts_per_page' => 50, 'post_status' => array( 'recurren

我在WordPress中有一个自定义事件发布类型,重复事件被保存为主事件的子事件。我设置了一些自定义分类,只将自定义分类数据保存到父事件发布, 但我想弄清楚的是如何通过自定义分类法过滤结果,包括重复出现的子帖子。 目前,我有一些类似于:

$args = array(
    'post_type'     => 'incsub_event',
    'posts_per_page'    => 50,
    'post_status' => array( 'recurrent', 'publish'),
    'meta_query'        => array(
        array(
            'key' => 'incsub_event_start',
            'value' => array( $date_1, $date_2 ),
            'type' => 'DATETIME',
            'compare' => 'BETWEEN'
        ),
        array(
            'key' => 'incsub_event_fee',
            'value' => array( '10', '1000' ),
            'type' => 'NUMERIC',
            'compare' => 'BETWEEN'
        ),
        array(
            'key' => 'incsub_event_status',
            'value' => 'open',
            'type' => 'BINARY',
            'compare' => '='
        ),
    ),
    'tax_query' => array(
        array(
            'taxonomy' => 'location',
            'field'    => 'slug',
            'terms'    => 'uk',
        ),
    ),
    'order'     => 'ASC',
    'orderby'   => 'meta_value',
    'meta_key'  => 'incsub_event_start' 
);

但它只会返回家长的帖子,而不会返回孩子的帖子,我会感谢任何能在这件事上提供帮助的人吗

我不久前就遇到了这个问题,解决方案并不完美。据我所知,Wordpress的get_posts函数不支持“parent has x-attribute”的嵌套查询。要访问子帖子,您必须使用自己的get_posts-style函数,使用$wpdb访问数据库。我为您创建了一个函数,它将作为此类查询的基础。可能需要进行一些改进和添加,以包括其他常见的搜索变量,但是对于您当前的查询,它将完成任务

function customGetPosts($args) {
    global $wpdb;
    $wpdb->show_errors();
    extract($args);

    $limit = isset($posts_per_page) ? $posts_per_page : 50;
    $post_type = isset($post_type) ? $post_type : "post";
    $post_status = isset($post_status) ? $post_status : "publish";
    $post_status = is_array($post_status) ? "IN ('" . implode("' ,'", $post_status) . "')" : "= '$post_status'";
    $order = isset($order) && in_array($order, ["ASC", "DESC"]) ? $order : "DESC";
    $order = isset($orderby) && isset($meta_key) ? "ORDER BY $meta_key $order" : "";

    if (isset($meta_query) && is_array($meta_query) && count($meta_query) > 0) {
        $meta_query_string = ", ";
        $meta_query_where_string = "";
        $is_first = true;

        foreach($meta_query as $query) {
            if ($is_first) {
                $is_first = false;
                $meta_query_where_string .= "WHERE ";
            } else {
                $meta_query_where_string .= "AND ";
            }

            $meta_query_string .= "MAX(IF(wpm.meta_key = '{$query['key']}', wpm.meta_value, NULL)) AS {$query['key']}, ";

            switch($query['type']) {
                case("NUMERIC"):
                    $delimiter = "";
                    break;
                default: 
                    $delimiter = "'";
            } 

            switch ($query['compare']) {
                case("BETWEEN"):
                    $meta_query_where_string .= "{$query['key']} {$query['compare']} $delimiter{$query['value'][0]}$delimiter AND $delimiter{$query['value'][1]}$delimiter ";   
                    break;
                default: 
                    $meta_query_where_string .= "{$query['key']} {$query['compare']} $delimiter{$query['value']}$delimiter ";   
            }
        }
        $meta_query_where_string = substr($meta_query_where_string, 0, strlen($meta_query_where_string) - 1);
        $meta_query_string = substr($meta_query_string, 0, strlen($meta_query_string) - 2);
    }

    if (isset($tax_query) && is_array($tax_query) && count($tax_query) > 0) {

        foreach($tax_query as $query) {
            $terms = is_array($query['terms']) ? "'" . implode("', '", $query['terms']) . "'" : "'{$query['terms']}'";

            $tax_query_string .= "AND wtt.taxonomy = '{$query['taxonomy']}' AND wt.{$query['field']} IN ({$terms}) ";
        }

    }


    return $wpdb->get_results("
        SELECT * FROM
        (
            SELECT wp.*$meta_query_string
            FROM wp_posts wp
            JOIN wp_term_relationships wtr ON wp.ID = wtr.object_id
            JOIN wp_term_taxonomy wtt ON wtt.term_taxonomy_id = wtr.term_taxonomy_id
            JOIN wp_terms wt ON wtt.term_id = wt.term_id
            JOIN wp_postmeta wpm ON wpm.post_id = wp.ID
            WHERE wp.post_status $post_status
                $tax_query_string
                AND wp.post_type = '$post_type'
            GROUP BY wp.ID

            UNION ALL

            SELECT wp.*$meta_query_string 
            FROM wp_posts wp 
            JOIN wp_postmeta wpm ON wpm.post_id = wp.post_parent
            WHERE wp.post_parent IN (    
                SELECT wp.ID FROM wp_posts wp
                JOIN wp_term_relationships wtr ON wp.ID = wtr.object_id
                JOIN wp_term_taxonomy wtt ON wtt.term_taxonomy_id = wtr.term_taxonomy_id
                JOIN wp_terms wt ON wtt.term_id = wt.term_id
                JOIN wp_postmeta wpm ON wpm.post_id = wp.ID
                WHERE wp.post_status $post_status
                    $tax_query_string
                    AND wp.post_type = '$post_type'
            )
            GROUP BY wp.ID

        ) as main
        $meta_query_where_string
        $order
        LIMIT $limit"
    );
}
作为旁注,可以通过getCustomPosts输出中的元键访问元值,例如:在迭代结果时,$post->incsub_event_start