エス技研

WordPress、CakePHP、PHP、baserCMSなどの Web系システムを中心に情報を提供します!


ショートコードで簡単解決!WordPress固定ページにカテゴリ一覧を編集する方法

      2016/03/26

プラグインなしでカテゴリ一覧を作成

 

ショートコードでカテゴリ一覧を作成

 
WordPressをブログとして使う分には関数を作って、ショートコードを作成して、といったことが発生する機会はほぼないワケですが、ブログじゃない見せ方のサイトを作ろうかなぁと思った時にはショートコードは非常に強い味方となってくれる仕組みなのです。
 
というわけで、今回は、ショートコードを利用して、固定ページや特定の投稿に特定のカテゴリの投稿一覧を作成する処理を作ってみましたので、解説しようと思います。
 
 
ショートコードの記載の方法については、「WordPress投稿にPHPを記述するショートコードの使い方add_shortcode」に記事を書いていますので、参考にしてみてください。
 
また、上記の記事内でショートコードをテンプレート内で実装する方法も記載しています。
一度ショートコードを作っておけば、記事内だけではなくてテンプレート内でも使えますので、覚えておいて損はない仕組みですね。
 
 
ただ、そのままではウィジェットでは使えませんので、ウィジェットにも編集したいという場合には「WordPressのウィジェットでショートコードを使う方法add_filter」の記事を読んでみてください。
ちょっとした処理を追加することで対応できるようになります。
 
 

カテゴリ一覧を編集するソース

 
対応する内容は、「functions.php」にプログラムを記述し、それを呼び出すショートコードを固定ページや投稿に記述する、という内容になります。
 
 

functions.phpに関数を追加

 
functions.phpに下記のソースを記載します。(2016.03.26 修正)
 

// ショートコードで呼び出す関数
function Category_List ( $arg = array () ) {
  extract ( shortcode_atts ( array (
    'category'       => '1',
    'posts_per_page' => '5'
  ), $arg ) );

  $blog_posts = get_posts ( array ( 
    'posts_per_page' => $posts_per_page,
    'category'       => $category
  ));

  $html = Create_Html($blog_posts);
  return $html;
}
add_shortcode('categorylist', 'Category_List');

// HTMLを生成する関数
function Create_Html ( $blog_posts ) {
  $html = '<div>';
  foreach ( $blog_posts as $post ) {
    // 投稿日の場合
    $html .= '<p>' . date ( 'Y.m.d', strtotime ( $post->post_date ) ) . '</p>';
    // 更新日の場合
    $html .= '<p>' . date ( 'Y.m.d', strtotime ( $post->post_modified ) ) . '</p>';
    $html .= '<p><a href="' . get_permalink($post->ID) . '">' . $post->post_title . '</a></p>';
  }
  $html .= '</div>';
  return $html;
}

 
 
「functions.phpって何?」っていう方には「WordPressの functions.phpがある場所」という記事を書いていますので、こちらも読んでみてください。
 
 

記事に記載するショートコード

 
実際にカテゴリ一覧を編集する場合には、投稿に下記のソースコードを記載します。
 

[categorylist category='2' posts_per_page='5']

 
「category」は、カテゴリの IDになります。表示したいカテゴリを編集します。
「posts_per_page」は、表示する件数を編集します。
 
この仕組みではページ送りの処理は含まれていませんので、「最新 5件」を表示するといった想定になっています。
 
また、「posts_per_page => -1」の様に「-1」を指定すると、1ページの表示制限をなくすことができます(全件表示になります)。
 
 


 

カテゴリ一覧を編集するソースの解説

 
ショートコードの基本的な理解は最初にも書きましたが、「WordPress投稿にPHPを記述するショートコードの使い方add_shortcode」に記載していますので、そちらを読んでください。
 
ショートコードで、「Category_List」という関数を呼び出します。
引数として、「category」「posts_per_page」を受け取ります。
引数がない場合は、「category => 1(未分類)」、「posts_per_page => 5」(5件表示)がデフォルト値として設定されます。
 
7行目の「get_posts()」で、引数で受け取ったカテゴリから件数分の記事を取得します。
それを、12行目の「Create_Html関数」に送って HTMLを生成します。
 
決まりきった HTMLを生成できればいいのならば、「Create_Html関数」は関数化する必要はないのですが、カテゴリごとに編集する HTMLを変えたい場合には、下記のような感じで「Create_Html関数」を分けておく方が便利なんじゃないかな、ということで関数を分けています。
 

  if ( $category == '3' ) {
    $html = Create_Html3($blog_posts);
  } else {
    $html = Create_Html($blog_posts);
  }

 
まぁ、ショートコードの引数に HTMLの区分を追加して、その区分で「Create_Html関数」を振り分けるようにしておく方が使い勝手はよさそうですね。
 
 
また、投稿から取得する値として、「タイトル」を「$post->post_title」として取得していますが、同様にいろいろな値が取得可能です。
下記のサイトが参考になりましたので、併せて紹介しておきます。
 http://weble.org/2012/04/23/wordpress-post-data
 
 

「query_posts」ではなく「get_posts」関数を使おう

 
最初に参考にしたサイトでは、投稿情報を取得する際に「query_posts」が使われていました。
 
ですが、下記の様に「query_posts」関数は推奨されていない関数ですので、「get_posts」関数を使いましょう。
 http://notnil-creative.com/blog/archives/1688
 
実際に「query_posts」のままでは想定した動きになりませんでしたからね。
 
 
この記事では一覧表示をすることを主眼に解説しましたが、カスタムフィールドも利用した抽出条件、ソート条件を設定する方法を含めた解説記事を「ショートコードで簡単解決!カスタムフィールドでソート、抽出条件設定方法」に書きましたのであわせて参考にしてください。
(2015.05.25 追記)

 - WordPress

最後までお読みいただきましてありがとうございます。
この記事が参考になったと思いましたらソーシャルメディアで共有していただけると嬉しいです!

Comment

  1. あっきー より:

    大変参考にさせて頂いております。
    ソースをそのまま使ってみたのですが
    投稿した日付けが全て一緒になります。

    何か私の設定が間違っているのでしょうか?

    • エス技研 より:

      あっきーさん、ご連絡ありがとうございます。

      ご連絡の件ですが、私が間違えていますね。失礼いたしました。
      「get_post_time()」関数は表示しているページの投稿日時を取得しますので、表示している固定ページの投稿日が表示されていると思われます。

      22行目を下記の様に書き換えてください。

      投稿日の場合
      $html .= '

      ' . date ( 'Y.m.d', strtotime ( $post->post_date ) ) . '

      '; 更新日の場合 $html .= '

      ' . date ( 'Y.m.d', strtotime ( $post->post_modified ) ) . '

      ';
  2. あっきー より:

    エス技研様

    変更したところ無事表示されました!
    ワードプレスを扱い始めたばかりで少しずつ勉強しておりますが
    いつも参考にさせて頂いております。
    すぐに対応頂き有難う御座いました

    • エス技研 より:

      あっきーさん、ご連絡ありがとうございます。
      無事に対応できたとのことで安心しました。
      ご指摘いただいていた箇所の記事は修正させていただきました。

      でも、まぁ、このブログにも質問をくださる方も少なからずいらっしゃいますが、お礼まで書き込んでくださる方は限りなく少ないので、対応した甲斐があったと嬉しくなりますね。^^

Message

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

下記の空欄を埋めてください。 * Time limit is exhausted. Please reload CAPTCHA.

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

※入力いただいたコメントは管理者の承認後に掲載されます。

  関連記事

WordPressのおすすめの確認画面付きお問い合わせフォームプラグイン・MW WP Form

MW WP Formは確認画面が付いているオススメのフォームプラグインです。企業サイトを CMSとして構築する際にも利用できる実力派です。

WordPressの投稿プレビューのURLを変更する方法

プレビューを表示する際のURLを変更する方法の解説。「サイトアドレス (URL)」に基づいて編集されるURLを任意のURLに変更する場合の方法とその解説を行います。

WordPress初心者向け フォルダ構成・データベース構成解説

BackWPupその11。バックアップを取るために必要なファイル、データベースの解説をします。

WordPressのログイン画面 URLを変更する 管理画面に Basic認証を設定する

ログインURLは誰でも知っています。そのまま使うとリスクが高まりますのでログインURLを変更し Basic認証で二重チェックをする方法を解説。

XAMPP環境で WP-DBMANAGERでの復元でDBが壊れる

XAMPP環境で WordPressの WP-DBMANAGERを利用して DBの復元をしたら DBが壊れた。

Unveil Lazy LoadでWordPressを高速化!SEO効果絶大でPVもアップ!

WordPressの表示を高速化するUnveil Lazy Loadの紹介。利用するJSを見直し高速化を徹底的に追求したプラグイン。入れるだけで高速化するので使わない手はない!

Search RegexでWordPress投稿の文字列を検索・置換する使い方解説

WordPressの投稿テキストを検索、置換するプラグイン Search Regexの使い方の詳細解説です。

カスタムフィールドの検索処理をget_posts()関数のmeta_queryで作成しそれを解説

カスタムフィールドを条件検索・抽出する機能開発の解説。サンプルソースをコピペすればOK。詳細解説もあるのでカスタマイズもできる!

XAMPPのWordPressの更新でFatal error: Maximum execution time of 30 seconds exceededのエラーが発生して失敗する場合の対処方法

XAMPP環境のWordPressアップデート時に「Maximum execution time of 30 seconds exceeded」のエラーが出る。「max_execution_time」を変更して解決する方法の解説。

WordPressプラグインの3つのインストール方法解説

プラグインのインストール方法の特徴とおススメの方法を理由を含めて解説していきます。


Warning: Trying to access array offset on null in /home/ss-giken/s-giken.net/public_html/blog/wp-content/plugins/amazonjs/amazonjs.php on line 637