web-dev-qa-db-ja.com

過去30日間に最も使用されたタグのリストを表示する

過去30日間に最も使用されたタグを表示する方法を探しています。私はコーダーではありませんが、最も使用されている28個のタグのリストを表示するためにこのマッシュアップを思い付きました(私のテーマに合うようにしたい)。私の人生では、タグを過去30日間で最も使用されたものに限定する方法を理解することはできません。

これは私が持っているものです:

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

更新

これは私が今使っている完全なコードで、以下のOne Trick Ponyのコードに続きます。

<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週間以上使用されていないものが1回しか使用されていません。さらに、もっと多くのタグが使用されている場合は、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日間の投稿ですが、フロントエンドの表示は変わりませんでした。

アップデート2

これがスクリーンショットです。スクリーンショットは私のコードが間違っている場所を見つけるのに役立つかもしれません。

カテゴリとタグの付いたブログ投稿

Image of blog post

上記の記事のIDを含むwp_postsテーブル

wp_posts

使用されたタグのwp_termsを含むterm_idテーブル /

wp_terms

タグwp_term_taxonomyterm_idとして持つterm_taxonomy_id

wp_term_taxonomy

wp_term_relationshipsterm_taxonomy_idとして投稿に割り当てられたobject_id

wp_term_relationships

アップデート3

私は問題を解決したと思いますが、それを修正する方法がわかりません。

SQLクエリは実際のタグIDではなくterm_taxonomy_idを取得し、get_tag_linkterm_idを使用します。

6
Travis Pflanz

問題は、SQLクエリコードが実際のタグIDではなくterm_taxonomy_idを取得していたことです。

term_taxonomyを取得するためにterm_idテーブルを使って追加のINNER JOINを追加しました。これはうまくいくようですが、modがこれを改善することができるならば、してください!

<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>
4
Travis Pflanz

このクエリは過去30日間の投稿で使用された用語IDを取得するのに役立ちます。

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

次に、これらのIDをget_tags()の "include"引数に渡します。


フルコード:

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($term_ids > 0){

  $tags = get_tags(array(
    'orderby' => 'count',
    'order'   => 'DESC',
    'number'  => 28,
    'include' => $term_ids,
  ));

  // your foreach loop here...

}else{
  print 'no posts were tagged in the last 30 days';

}

これを行うには、おそらくもっと効率的な方法があります。

1
onetrickpony

get_tags->countは実際には範囲内のタグを数えないと思います。私はこの解決策を実行しました、これがあなたのために働くかどうか私に知らせてください:

global $wpdb;
$term_ids = $wpdb->get_col("
    SELECT term_id , count(*) cont 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 7 DAY) <= $wpdb->posts.post_date AND  $wpdb->term_taxonomy.taxonomy='post_tag'
    GROUP BY term_id
    ORDER BY cont DESC
    LIMIT 5
");    
if ( count( $term_ids ) > 0 ) {
    $tags = get_tags( array(
        'orderby' => 'count',
        'order'   => 'DESC',
        'number'  => 5,
        'include' => $term_ids,
    ) );
    foreach ( (array) $tags as $tag ) {
        echo '<li><a href="' . get_tag_link ($tag->term_id) . '" rel="tag">' . 
            $tag->name . '</a></li>';
    }
}
0
maza23

あなたは "番号"パラメータを使用してタグを制限することができます...

 $tags = get_tags( array('orderby' => 'count', 'order' => 'DESC','number'=>28) );

Get_tags関数の参照についてはこれを読んでください http://codex.wordpress.org/Function_Reference/get_tags

0
Rajeev Vyas