※社内専用

WP内の投稿とrssの投稿をまとめて表示する

  • HOME
  • EPRESS-BS
  • WP内の投稿とrssの投稿をまとめて表示する
WP内の投稿とrssの投稿をまとめて新着順に表示する方法です。
EC案件のオプション商材「新着情報一括表示ソース」のイメージです。
超過です。

注意点

・最大件数

ソース上は10件になっています。
変更する場合はrssにより引き出される件数を必ず確認してください。
現在アメブロは最大10記事なので、最大件数を増やすことはできません。

・ラベル部分

投稿タイトルの前に「カテゴリー名:」か「ブログ:」と出るようになっています。見た目は案件ごとに調整してください。

方法

何も表示されない場合はrssのURL・スラッグが正しいかを確認の後、それぞれデフォルトのショートコード(news/rss)で表示されるかも確認してください。

・ショートコード

[mix_list url="表示させたいURL" slug="表示させたいカテゴリー" per="10"]

・php

作成してサーバーにアップしてください。
/public_html/wp-content/themes/テーマ/functions/custom
shortcode-mix_list.php
<?php
  //[mix_list url="表示させたいURL" slug="表示させたいカテゴリー" per="10"]
  add_shortcode('mix_list', function ($atts) {
      extract(shortcode_atts(array(
        'url' => '',
        'per' => '10',
        'slug' => null,
    ), $atts));

      $mix_list = array();

      //RSSデータ取得
      include_once(ABSPATH . WPINC . '/feed.php');
      $rss = fetch_feed($url);

      $maxitems = 0;
      if (! is_wp_error($rss)) :
      $maxitems = $rss->get_item_quantity();
      $rss_items = $rss->get_items(0);
      endif;
      // SimplePieのget_dateでWordPressのUTCに変換してしまうので、一時的にTokyoにセット。デフォルト値をストックし最下部で書き戻し。
      $tz = date_default_timezone_get();
      date_default_timezone_set('Asia/Tokyo');
      ob_start();


      //取得投稿データ設定
      $paged = get_query_var('paged');
      $args = array(
        'paged' => $paged,
        'category_name' => $slug,
        'post_type' => 'post'
      );
      $the_query = new WP_Query( $args );


      //RSSデータを配列に追加
      if ($maxitems != 0){
        foreach ($rss_items as $item) {
          $esc_url = esc_url($item->get_permalink());
          $esc_html = esc_html($item->get_title());
          $mix_list[] = array($esc_url, $item->get_date('Y/m/d'), $esc_html, "ブログ");
        }
      }

      //投稿データの取得及び配列への追加
      if($the_query->have_posts()) {
        ob_start();
        while ( $the_query->have_posts() ) {
          $the_query->the_post();
          $categories = get_the_category();
          $category_name = $categories[0]->name;
          $mix_list[] = array(get_the_permalink(), get_the_time('Y/m/d'), get_the_title(), $category_name);
        }
        wp_reset_postdata();
      }

      //配列のソート実行
      foreach ($mix_list as $key => $row) {
        $date[$key] = $row[1];
      }
      array_multisort($date, SORT_DESC, $mix_list);
      ?>
      <dl>
        <?php
        $count = 1;
        foreach($mix_list as $item):
          if($count > $per){
            break;
          }
        ?>
        <dt><p><?= $item[1] ?></p></dt>
        <dd><p><a href="<?= $item[0] ?>"title="<?= $item[2] ?>" <?php if($item[3] == "ブログ"){ ?>target="_blank"<?php } ?>><?= $item[3] ?><?= $item[2] ?></a></p></dd>
        <?php
          $count++;
        endforeach;
        ?>
      </dl>
    <?php
    date_default_timezone_set($tz);
    return ob_get_clean();
  });