4

我正在寻找一种方法来在我的棒球博客上显示过去 30 天内最常用的标签,该博客基于 Wordpress。我不是编码员,但我想出了这个 mashup 来显示最常用的 28 个标签的列表(首选适合我的主题)。在我的一生中,我无法弄清楚如何将标签限制为过去 30 天内最常用的标签。

这是我所拥有的:

<ul id="footer-tags">
<?php
global $wpdb;
$term_ids = $wpdb->get_col("
   SELECT DISTINCT term_taxonomy_id FROM $wpdb->term_relationships
      INNER JOIN $wpdb->posts ON $wpdb->posts.ID = object_id
      WHERE DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= $wpdb->posts.post_date");

if(count($term_ids) > 0){

  $tags = get_tags(array(
    'orderby' => 'count',
    'order'   => 'DESC',
    'number'  => 28,
    'include' => $term_ids,
  ));
foreach ( (array) $tags as $tag ) {
echo '<li><a href="' . get_tag_link ($tag->term_id) . '" rel="tag">' . $tag->name . '</a></li>';
}
}
?>
</ul>

该网站的创建时间略短于约 4 周,因此为了进行测试,我更改INTERVAL 30 DAYINTERVAL 3 DAY,返回的标签似乎是随机的,有些已超过 2 周未使用,并且仅使用过一次。同样,仅显示了 8 个标签,而更多标签已被使用。

为了检查是否查询了正确的天数,我执行了以下操作:

完全删除垃圾箱中的所有帖子和页面项目,我没有任何自定义帖子类型。

对草稿做了同样的事情。

在 phpmyadmin 中运行查询以删除所有帖子修订 -DELETE FROM wp_posts WHERE post_type = "revision";

在 phpmyadmin 中运行查询以检查结果是否是过去 3 天的帖子 -SELECT * from wp_posts WHERE DATE_SUB(CURDATE(), INTERVAL 3 DAY) <= post_date

phpmyadmin 查询的结果实际上是最近 3 天的帖子,但前端显示没有改变。

更新

这是一些屏幕截图。也许屏幕截图可以帮助找到我的代码错误的地方。

带有类别和标签的博客文章

博文图片

wp_postsID上述职位的职位表

wp_posts

wp_terms带有所term_id用标签的表

wp_terms

wp_term_taxonomy标签term_idterm_taxonomy_id

wp_term_taxonomy

wp_term_relationships分配term_taxonomy_id为发布为object_id

wp_term_relationships

更新 2

我想我找到了问题所在,但不知道如何解决。

SQL 查询获取term_taxonomy_id,而不是实际的标签 ID 并get_tag_link使用term_id

更新 3

我最近创建了一个插件来显示最近使用的最流行的标签 - https://wordpress.org/plugins/recent-popular-tags/

4

2 回答 2

1

您在 SQL 字符串中插入的 PHP 变量是PHP 对象,可用于从 PHP中访问 WordPress 表;而您在从 SQL中访问数据的表和列的名称之后。

你想要:

"SELECT DISTINCT term_taxonomy_id FROM wp_term_relationships
  INNER JOIN wp_posts ON wp_posts.ID = wp_term_relationships.object_id
  WHERE DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= wp_posts.post_date"

顺便说一句:如果您需要将 PHP 变量的值插入到 SQL 语句中,请务必先将其转义,以防止注入任何恶意代码

于 2012-04-22T17:43:52.550 回答
0

问题是 SQL 查询代码获取的是term_taxonomy_id,而不是实际的标签 ID。

我使用该表添加了一个额外的 INNER JOINterm_taxonomy来获取term_id. 这似乎有效,但如果一个模组可以改善这一点,请做!

<ul id="footer-tags">
<?php $wpdb->show_errors(); ?> 
<?php
global $wpdb;
$term_ids = $wpdb->get_col("
    SELECT term_id FROM $wpdb->term_taxonomy
    INNER JOIN $wpdb->term_relationships ON $wpdb->term_taxonomy.term_taxonomy_id=$wpdb->term_relationships.term_taxonomy_id
    INNER JOIN $wpdb->posts ON $wpdb->posts.ID = $wpdb->term_relationships.object_id
    WHERE DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= $wpdb->posts.post_date");

if(count($term_ids) > 0){

  $tags = get_tags(array(
    'orderby' => 'count',
    'order'   => 'DESC',
    'number'  => 28,
    'include' => $term_ids,
  ));
foreach ( (array) $tags as $tag ) {
echo '<li><a href="' . get_tag_link ($tag->term_id) . '" rel="tag">' . $tag->name . '</a></li>';
}
}
?>
</ul>

更新

我最近创建了一个插件来显示最近使用的最流行的标签 - https://wordpress.org/plugins/recent-popular-tags/

于 2012-04-24T05:33:52.360 回答