Wordpress 自定义查询以获取特定类别的最后编辑 post

Wordpress custom query to get last edited post with specific category

我正在尝试获取标记为标记为特定类别的投资组合的 post 列表。对于该类别,然后我需要限制每个类别的每个结果集,并且还只获取每个 post.

的最新更新 post

我当前的查询是这样的:

SELECT $wpdb->posts.*, $wpdb->terms.slug
                    FROM $wpdb->posts
                    LEFT JOIN $wpdb->postmeta ON($wpdb->posts.ID = $wpdb->postmeta.post_id)
                    LEFT JOIN $wpdb->term_relationships ON($wpdb->posts.ID = $wpdb->term_relationships.object_id)
                    LEFT JOIN $wpdb->term_taxonomy ON($wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_taxonomy_id)
                    LEFT JOIN $wpdb->terms ON($wpdb->term_taxonomy.term_id = $wpdb->terms.term_id)
                    WHERE $wpdb->posts.post_status = 'publish' 
                    AND $wpdb->posts.post_type = 'portfolio'
                    AND $wpdb->posts.post_date < NOW()
                    AND $wpdb->term_taxonomy.taxonomy = 'category'
                    AND $wpdb->terms.slug IN ('".implode("','", $category_array)."')
                    ORDER BY
                        Case When $wpdb->terms.slug = 'residential' Then 1 
                            When $wpdb->terms.Slug = 'recreational' Then 1 
                            When $wpdb->terms.Slug = 'civic' Then 1 
                            When $wpdb->terms.Slug = 'contact' Then 2 
                            When $wpdb->terms.Slug = 'blog' Then 3 
                            When $wpdb->terms.Slug = 'services' Then 4 
                            When $wpdb->terms.Slug = 'team' Then 5
                            Else 6
                        End

我将使用类似这样的方法 (MySQL limit results per category) 为每个类别设置限制。

但是,目前 returns 每个版本都相同 post。我不太确定如何只获取最新版本的 post。我知道我 "could" 是如何做到这一点的,但我非常怀疑这是最好的方法。有谁知道通过这样的自定义查询获取最新 post 的标准化方法?

此外,我不一定致力于自定义查询。我只是不知道如何使用带有 WP_Query() 函数的参数来创建此查询。

谢谢, 詹姆斯

所以我最终使用了子查询。这是我用的。

$querystr = "SELECT x.*
                        FROM (
                            SELECT y.*,
                                CASE
                                    WHEN @category != y.slug THEN @rownum := 1 
                                    ELSE @rownum := @rownum + 1
                                END AS rank,
                                @category := y.slug
                                FROM (
                                    SELECT $wpdb->posts.*,
                                        $wpdb->terms.slug
                                    FROM $wpdb->posts
                                        LEFT JOIN $wpdb->postmeta ON($wpdb->posts.ID = $wpdb->postmeta.post_id)
                                        LEFT JOIN $wpdb->term_relationships ON($wpdb->posts.ID = $wpdb->term_relationships.object_id)
                                        LEFT JOIN $wpdb->term_taxonomy ON($wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_taxonomy_id)
                                        LEFT JOIN $wpdb->terms ON($wpdb->term_taxonomy.term_id = $wpdb->terms.term_id)
                                    WHERE $wpdb->posts.post_status = 'publish' 
                                        AND $wpdb->posts.post_type = 'portfolio'
                                        AND $wpdb->posts.post_date < NOW()
                                        AND $wpdb->terms.slug IN ('".implode("','", $category_array)."')
                                        AND $wpdb->posts.ID NOT IN
                                            (
                                                SELECT $wpdb->posts.ID
                                                    FROM $wpdb->posts
                                                    LEFT JOIN $wpdb->postmeta ON($wpdb->posts.ID = $wpdb->postmeta.post_id)
                                                    LEFT JOIN $wpdb->term_relationships ON($wpdb->posts.ID = $wpdb->term_relationships.object_id)
                                                    LEFT JOIN $wpdb->term_taxonomy ON($wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_taxonomy_id)
                                                    LEFT JOIN $wpdb->terms ON($wpdb->term_taxonomy.term_id = $wpdb->terms.term_id)
                                                    WHERE $wpdb->posts.post_status = 'publish' 
                                                    AND $wpdb->posts.post_type = 'portfolio'
                                                    AND $wpdb->posts.post_date < NOW()
                                                    AND $wpdb->terms.slug IN ('".implode("','", $category_array)."')
                                                    AND $wpdb->posts.post_type = 'revision'
                                                    GROUP BY $wpdb->posts.ID
                                            )
                                    GROUP BY $wpdb->posts.ID
                                    ORDER BY $wpdb->terms.slug
                                ) y
                                LEFT JOIN (SELECT @rownum := 0, @category := NULL) r ON (1 = 1)
                        ) x
                        WHERE x.rank <= 10
                        ORDER BY
                            Case When x.slug = 'residential' Then 1 
                                When x.Slug = 'recreational' Then 1 
                                When x.Slug = 'civic' Then 1 
                                When x.Slug = 'contact' Then 2 
                                When x.Slug = 'blog' Then 3 
                                When x.Slug = 'services' Then 4 
                                When x.Slug = 'team' Then 5
                                Else 6
                            End,
                            rand()";