4

Wordpress上に構築されたBaseballブログで、過去30日間に最も使用されたタグを表示する方法を探しています。私はコーダーではありませんが、最も使用されている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 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日間の投稿でしたが、フロントエンドの表示は変更されていません。

アップデート

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

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

ブログ投稿の画像

wp_postsID上記の投稿の投稿のあるテーブル

wp_posts

wp_termsterm_id使用されたタグのテーブル

wp_terms

wp_term_taxonomyタグterm_id付きterm_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内からWordPressテーブルにアクセスするために使用できるPHPオブジェクトです。一方、 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ではなくを取得していたことでした。

term_taxonomyテーブルを使用して内部結合を追加し、を取得しましたterm_id。これは機能しているようですが、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>

アップデート

最近、最も人気のある最近使用されたタグを表示するプラグインを作成しました-https ://wordpress.org/plugins/recent-popular-tags/

于 2012-04-24T05:33:52.360 に答える