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()";
我正在尝试获取标记为标记为特定类别的投资组合的 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()";