過去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 DAY
をINTERVAL 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日間の投稿ですが、フロントエンドの表示は変わりませんでした。
これがスクリーンショットです。スクリーンショットは私のコードが間違っている場所を見つけるのに役立つかもしれません。
カテゴリとタグの付いたブログ投稿
上記の記事のID
を含むwp_posts
テーブル
使用されたタグのwp_terms
を含むterm_id
テーブル /
タグwp_term_taxonomy
をterm_id
として持つterm_taxonomy_id
wp_term_relationships
がterm_taxonomy_id
として投稿に割り当てられたobject_id
私は問題を解決したと思いますが、それを修正する方法がわかりません。
SQLクエリは実際のタグIDではなくterm_taxonomy_id
を取得し、get_tag_link
はterm_id
を使用します。
問題は、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>
このクエリは過去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';
}
これを行うには、おそらくもっと効率的な方法があります。
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>';
}
}
あなたは "番号"パラメータを使用してタグを制限することができます...
$tags = get_tags( array('orderby' => 'count', 'order' => 'DESC','number'=>28) );
Get_tags関数の参照についてはこれを読んでください http://codex.wordpress.org/Function_Reference/get_tags