【发布时间】:2010-06-04 08:26:23
【问题描述】:
我根本不熟悉 wordpress 架构,我需要从 wordpress 数据库中的任何帖子中获取最新标签的列表或数组。
我只需要主页上的可用数据,然后我就可以对其进行操作。
所有功能似乎都设计为在每个帖子的基础上工作。
(Wordpress 真的让我为经常使用 wordpress 的程序员感到难过。)
【问题讨论】:
我根本不熟悉 wordpress 架构,我需要从 wordpress 数据库中的任何帖子中获取最新标签的列表或数组。
我只需要主页上的可用数据,然后我就可以对其进行操作。
所有功能似乎都设计为在每个帖子的基础上工作。
(Wordpress 真的让我为经常使用 wordpress 的程序员感到难过。)
【问题讨论】:
这不是很漂亮,也许 MySQL 迷可以稍微优化一下;
SELECT $wpdb->terms.term_id, $wpdb->terms.name, $wpdb->terms.slug
FROM $wpdb->terms
INNER JOIN $wpdb->term_taxonomy ON ($wpdb->terms.term_id = $wpdb->term_taxonomy.term_id)
INNER JOIN $wpdb->term_relationships ON ($wpdb->terms.term_id = $wpdb->term_relationships.term_taxonomy_id)
INNER JOIN $wpdb->posts ON ($wpdb->term_relationships.object_id = $wpdb->posts.ID)
WHERE $wpdb->term_taxonomy.taxonomy = 'post_tag'
ORDER BY $wpdb->posts.post_date DESC
这基本上将术语、术语分类、术语关系和帖子表连接在一起,获取属于分类“post_tag”且当前与帖子有关系的术语,然后按帖子的日期降序排列。
您可能会在结果集中多次获得相同的术语,但我不知道如何使用GROUP BY 或HAVING 来解决此问题,而不会弄乱日期顺序。
所以一个可能正在使用的例子可能是;
$tags= $wpdb->get_results($query); // $query being the above SQL
foreach ($tags as $tag) {
if (!isset($stack[$tag->term_id]))
$stack[$tag->term_id] = $tag;
}
print_r($stack); // should print an array of all tags, ordered by last used
【讨论】:
SELECT name, slug, tag_history.tagdate
FROM (SELECT wp_term_relationships.term_taxonomy_id AS tagid,
substr(wp_posts.post_date_gmt,1,10) AS tagdate
FROM wp_term_relationships
INNER JOIN wp_term_taxonomy ON wp_term_taxonomy.term_taxonomy_id=wp_term_relationships.term_taxonomy_id
INNER JOIN wp_posts ON wp_posts.ID=wp_term_relationships.object_id
WHERE taxonomy='post_tag' ORDER BY post_date_gmt DESC, wp_posts.post_title)
AS tag_history
INNER JOIN wp_terms ON wp_terms.term_id=tag_history.tagid
GROUP BY tag_history.tagid
ORDER BY tag_history.tagdate DESC
这是我写的解决方法 - 确保可以使它更清晰! - 根据关联标签发布的日期构建标签站点地图(XML,需要<LOC&> 和<LASTMOD>...)。您可以在查询末尾添加 LIMIT 0,10 以仅查看最后 10 个关联的标签。
此查询将返回三列(名称、slug 和单个标签的 LAST 关联日期),您可能会以多种方式使用。
请记住,wp_ 是 WordPress 中默认的 dB 前缀。您必须使用$wpdb-> 更改每一个匹配项(请参阅TheDeadMedic's answer)并确保在查询之前设置$wpdb。
【讨论】: