カスタム投稿タイプの新着記事を取得して別ページに表示するショートコードの作り方【WordPressプラグイン無し】

WordPressに追加できる特徴的な機能として、カスタム投稿タイプというオリジナルの投稿機能を追加することができる機能があります。

企業のホームぺージに必要な「NEWS(お知らせ)」だけを通常の「投稿」とは分けて「お知らせ」にまとめて書いておけば管理がしやすいです。

しかも、TOPページには「NEWS(お知らせ)」を載せることが多いので、PHPで「NEWS(お知らせ)」 を自動取得して新着お知らせを数件順番に表示するととても便利。

プラグインを使わずにこれをショートコードにしてどこでも簡単に使える方法を紹介します。

では、参りましょう。

カスタム投稿タイプを作る

まずは、カスタム投稿タイプで「お知らせ」と表示されるものを作ります。

functions.phpに追記

function add_custom_post() {
    register_post_type(
    'infopage', // 他のカスタム投稿タイプと識別するID
    array(
      'label' => 'お知らせ', // 管理画面に表示されるテキスト
      'public' => true,
      'has_archive' => true,
      'menu_position' => 5, // 管理画面に表示する順番
      'supports' => array( // 投稿画面で表示される項目
                      'title', // タイトル
                      'editor', // 内容の編集
                      'thumbnail', // サムネイル
                      'revisions', // リビジョンを保存する
                      'excerpt', // 抜粋テキスト
                      'custom-fields', // カスタムフィールド
                      )
    )
  );
}
add_action('init', 'add_custom_post');

コメントを入れていますが、補足で説明します。

add_action('init', 'add_custom_post');

でフックします。

register_post_type( 'id名', array() );

この一文でカスタム投稿タイプを設定できます。

今回は「お知らせ」というカスタム投稿タイプだけ作りますが、いくつも作りたい場合はid名が被らないようにすれば複数作れます。

配列array()の中身は 「ワードプレスCodexの関数リファレンス」が参考になります。

カスタム投稿の記事だけを取得する

次に、カスタム投稿「お知らせ」の記事を新着で取り出します。

functions.phpに追記

<?php
/* 新着記事を読みこむショートコード[add_new_infopage] */
function add_new_infopage_func($atts){
    ob_start();
?>
<ul>
  <?php $args = array(
    'numberposts' => 5, // 表示する記事の数
    'post_type' => 'infopage' // 投稿タイプ名
    // 条件を追加する場合はここに追記
  );
  $customPosts = get_posts($args);
  if($customPosts) : foreach($customPosts as $post) : setup_postdata( $post );
  ?>
  <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>

  <?php endforeach; ?>

  <?php else : //記事が無い場合 ?>
    <p>表示する記事がありません。</p>
  <?php endif;
  wp_reset_postdata(); //クエリのリセット ?>
</ul>
<?php
    return ob_get_clean();
}
add_shortcode('add_new_infopage', 'add_new_infopage_func');

コメントを入れていますが、補足で説明します。

ショートコードというのは投稿のビジュアル編集に[ショートコード名]と書くだけでphpの関数を実行できる機能です。

今回は

    表示する記事がありません。

というショートコードを自作します。

add_shortcode('add_new_infopage', 'add_new_infopage_func');

ショートコードはこのようにフックすることで

    表示する記事がありません。

を書いたところでadd_new_infopage_func()が実行されます。

そこで以下のように関数を作っていきます。

function add_new_infopage_func($atts){
    ob_start();

ob_start(); は計算した結果をすぐに表示せずに、一旦別の場所に置いておこうというバッファリングをするための関数です。

この下でHTML構造を構築します。

今回は

<ul>
  <li><a href="記事URL">記事タイトル</a></li>
  …
  'numberposts'の設定数だけ<li>を繰り返します。
  …
</ul>

というシンプルなリストを出力するようにしています。