古い記事(ニュースなど)を関連記事に表示しないようにしたい

Simplicityの特徴 フォーラム Simplicity2に関する話題何でも 古い記事(ニュースなど)を関連記事に表示しないようにしたい

  • このトピックには6件の返信、1人の参加者があり、最後にBryanesoawsにより3ヶ月、 4週前に更新されました。
6件の返信スレッドを表示中
  • 投稿者
    投稿
    • #51669 返信
      koiitirou2
      ゲスト

      いつも楽しく使わせて頂いております。

      タイトルの通りですが、一番簡単な方法は何かな?と考えています。
      一つは「古いニュース」カテゴリーをつくってひとつひとつ移動させていくのがいいかなあと考えています。

      もし何かいい方法があれば教えてください!

    • #51672 返信
      Hidekichi
      ゲスト

      > 古い記事(ニュースなど)を

      古い記事とはどのように定義されてますか?
      1年前の記事は表示しないとかそういう感じですか?

      方法的には、子テーマfunctions.phpに、親テーマfunctions.phpの493行目あたりのget_related_wp_query_args()をコピーして、中身を変更します。

      日付のパラメーターは、こちらを参考に。
      今日から任意の期日までを取り出せれば、言われているようなことはできるのではなかろうかと思います。

      functions.phpの変更でできますが、ここは危険なファイルなので十分に検証しつつ、バックアップを取りftp等ですぐに修復できるように準備して下さい。

      検索するなら、「wp_query 日付で指定」などでしょうか。

    • #51688 返信
      koiitirou2
      ゲスト

      いつもご丁寧に教えてくださりありがとうございます。
      とりあえず下記のように(1か月以内)実装してみましたが、これに加えて

      「特定の子カテゴリーID(例えば16, 17)」のみ、1か月以内のもののみ返す。
      「それ以外(16,17以外)」は、全期間のものを返す。

      ようにしたいのですが、また何かヒントなど頂ければ嬉しく思います。

      //WP_Queryの引数を取得
      function get_related_wp_query_args(){
        global $post;
        if ( is_related_entry_association_category() ) {
          //カテゴリ情報から関連記事をランダムに呼び出す
          $categories = get_the_category($post->ID);
          $category_IDs = array();
          foreach($categories as $category):
            array_push( $category_IDs, $category -> cat_ID);
          endforeach ;
          if ( empty($category_IDs) ) return;
          return $args = array(
            'post__not_in' => array($post -> ID),
            'posts_per_page'=> intval(get_related_entry_count()),
            'category__in' => $category_IDs,
            'orderby' => 'rand',
            'date_query' => array(
            'column' => 'post_date_gmt',
            'after' => '1 month ago',
          ),
      
          );
        } else {
          //タグ情報から関連記事をランダムに呼び出す
          $tags = wp_get_post_tags($post->ID);
          $tag_IDs = array();
          foreach($tags as $tag):
            array_push( $tag_IDs, $tag -> term_id);
          endforeach ;
          if ( empty($tag_IDs) ) return;
          return $args = array(
            'post__not_in' => array($post -> ID),
            'posts_per_page'=> intval(get_related_entry_count()),
            'tag__in' => $tag_IDs,
            'orderby' => 'rand',
          );
        }
      }
    • #51692 返信
      Hidekichi
      ゲスト

      "category__not_in" => array(10,20)

      みたいな感じですかね。

      参考: WP Query カテゴリーのパラメータ

    • #51697 返信
      koiitirou2
      ゲスト

      ご返答ありがとうございます。
      冗長ですが、以下のように実装してみました。

      //WP_Queryの引数を取得
      function get_related_wp_query_args(){
        global $post;
        if ( is_related_entry_association_category() ) {
          //カテゴリ情報から関連記事をランダムに呼び出す
          $categories = get_the_category($post->ID);
          $category_IDs = array();
          foreach($categories as $category):
            array_push( $category_IDs, $category -> cat_ID);
          endforeach ;
          if ( empty($category_IDs) ) return;
          $args1 = array(
            'post__not_in' => array($post -> ID),
            'posts_per_page'=> intval(get_related_entry_count()),
            'category__in' => $category_IDs,
            'orderby' => 'rand',
             'category__not_in' => array(22,16),
          );
      
          $args2 = array(
            'post__not_in' => array($post -> ID),
            'posts_per_page'=> intval(get_related_entry_count()),
            'category__in'=>array( 22, 16 ),
            'orderby' => 'rand',
             'date_query' => array(
             'column' => 'post_date_gmt',
             'after' => '3 month ago',
              ),
      
          );
      
          return $args = shuffle(array_merge($args1, $args2) );
        } else {
          //タグ情報から関連記事をランダムに呼び出す
          $tags = wp_get_post_tags($post->ID);
          $tag_IDs = array();
          foreach($tags as $tag):
            array_push( $tag_IDs, $tag -> term_id);
          endforeach ;
          if ( empty($tag_IDs) ) return;
          return $args = array(
            'post__not_in' => array($post -> ID),
            'posts_per_page'=> intval(get_related_entry_count()),
            'tag__in' => $tag_IDs,
            'orderby' => 'rand',
          );
        }
      }
      
    • #51710 返信
      Hidekichi
      ゲスト

      shuffleとか久しぶりに見たので、PHPマニュアル見直しました(笑)
      これ正しく動作してますかね?
      $argsの返り値は配列で来てますか?

      また、date_queryは、

      'date_query' => array(
          array(
             'column' => 'post_date_gmt',
             'after' => '3 month ago',
          ),
      )

      こんな感じじゃないでしょうか?

      で、色々考えてみたんですが、質問にある、

      > 「特定の子カテゴリーID(例えば16, 17)」のみ、1か月以内のもののみ返す。
      > 「それ以外(16,17以外)」は、全期間のものを返す。

      この条件のそれぞれは1回のwp_queryで取れると思うんです。
      ・16、もしくは17のカテゴリは1ヶ月以内のものを返す
      ・16、もしくは17以外は全期間のものを返す

      ただカテゴリーって色々とくっついてて、仮にですが、

      RPG
       ├ moRPG
       ├ mmoRPG
       ├ actionRPG
       ├ onlineRPG
       └ browserRPG

      こういうカテゴリがあったとして、ドラゴンネストのようなものであれば、RPG、moRPG、actionRPG、onlineRPGというようなカテゴリが考えられます。

      onlineRPGは1ヶ月以内の記事だけども、actionRPGは全期間の記事を拾いたいとした時、この記事はどちらで抽出されますかね?
      そこらが問題点かと思ったりするんです。

      Simplicityのデフォルトではひとまず、タグかカテゴリーかいずれかですが、今見ているページのカテゴリーからランダムに10件拾うということがされています。
      今見ている記事のカテゴリーの中に抽出したくないカテゴリーが含まれている場合、それを含む記事は抽出されないように思うんですけどどうでしょうか?

      もう少し簡単に書くと、
      ・春、桜、未分類
      ・春、桜
      このようなカテゴリーがいくつかの記事についているとします。未分類のは表示したくないという場合は、category__not_inで未分類を指定すれば、「春、桜」の記事のみ表示できると言うことです。

      全体的なデータがあって、除外してしまったカテゴリをその残ったクエリーから再抽出するのはムリかと思うので、おそらくは、それぞれのクエリーを別で作って(この考え方は作成された$args1やらと同じ)、別のwp_queryに投げる必要があるのではなかろうかと思います。

      例えば、

      $arg_a = function_a();
      $arg_b = function_b();
      
      $query_a = new WP_Query($arg_a);
      //$query_aのループ
      wp_reset_postdata();
      
      $query_b = new WP_Query($arg_b);
      //$query_bのループ
      wp_reset_postdata();

      このような感じでしょうか。除外するカテゴリーのループ($arg_a)と、除外したカテゴリーのループ($arg_b)は、期間が違うだけで同じ記事を参照することがありますから、仮に5件ずつ拾ったとしてそれぞれのループで同じ記事を抽出するかも知れません(ランダムなので必ず抽出されるとは限りませんが)。

      記事_10
      記事_21
      記事_69  //ここ
      記事_105
      記事_243
      ---------
      記事_8
      記事_34
      記事_69  //ここ
      記事_128
      記事_193

      このような事が起こるかも知れないというわけです。この重複を取るためには、最初のループの時に抽出されたpostIDを配列にできる何かしらのアイデアがあれば、それを最後の$argで除外すれば良いわけですが、それができるかは何ともわかりません。
      もしくは、もう少し数を抽出しておいて、jQueryで重複しているものを取り除くというようなことが必要になるかも知れません。

      また別の考え方として、全期間から抽出するのをやめて、例えば半年以内に投稿した記事もしくは、3ヶ月以内に更新した記事という条件等で絞るのが、除外したいカテゴリも含まれてしまいますが比較的新しい投稿だけを抽出できるのではなかろうかと思います。

    • #51888 返信
      koiitirou2
      ゲスト

      丁寧にご指導頂きありがとうございます。
      ご指摘のとおり、Shuffleは実装できておらず、最新の記事がかえされておりました。

      色々自分でも考えてみたのですが、一番の目的は
      「古い記事、ニュース」を関連記事に表示したくない
      ということでした。

      ただ古い記事というのは3か月前で必要十分かというとそうでもなく、とりあえず定期的に移動させるという原始的な方法を選びました。

      現在主要カテゴリーが相互排他的に1,2,3に設定しており、それらを包括してとってくるように、
      またカテゴリー4をいらないニュースなどに定期的に付加させることで、目的を達成するようにしてみました。

      
      //WP_Queryの引数を取得
      function get_related_wp_query_args(){
        global $post;
        if ( is_related_entry_association_category() ) {
          //カテゴリ情報から関連記事をランダムに呼び出す
          $categories = get_the_category($post->ID);
          $category_IDs = array();
          foreach($categories as $category):
            array_push( $category_IDs, $category -> cat_ID);
          endforeach ;
          if ( empty($category_IDs) ) return;
          return $args = array(
            'post__not_in' => array($post -> ID),
            'posts_per_page'=> intval(get_related_entry_count()),
            'category__in' => array(1, 2, 3),
            'category__not_in' => array(4),
            'orderby' => 'rand',
          );
      
        } else {
          //タグ情報から関連記事をランダムに呼び出す
          $tags = wp_get_post_tags($post->ID);
          $tag_IDs = array();
          foreach($tags as $tag):
            array_push( $tag_IDs, $tag -> term_id);
          endforeach ;
          if ( empty($tag_IDs) ) return;
          return $args = array(
            'post__not_in' => array($post -> ID),
            'posts_per_page'=> intval(get_related_entry_count()),
            'tag__in' => $tag_IDs,
            'orderby' => 'rand',
          );
        }
      }
      
6件の返信スレッドを表示中
返信先: 古い記事(ニュースなど)を関連記事に表示しないようにしたい
あなたの情報:




スポンサーリンク
アドセンス(大)
アドセンス(大)