タイトルが長すぎですが^^;
WordPress案件などでよく出てくるのが「特定のカテゴリーの記事だけサイドバーに表示させたい」というご要望です。
もちろん、サイドバーやトップページなど、テンプレート内に直接記述することは可能ですが、
今回はウィジェットとして追加作成してしまおうという話です。
メリットとしては、利用するテーマ内のウィジェットエリアがいくつかある場合、
自分で好きな場所に設定することが可能ということ。
/*---------------------------------------------------------------------------------*/ /* 特定カテゴリの最新の投稿タイトル一覧用サイドバーウィジェット */ ※当方がカスタマイズしているものです /*---------------------------------------------------------------------------------*/ // WP_Widget クラスを継承するサブクラスとして定義 class My_RecentPosts_Widget extends WP_Widget { // コンストラクタ function My_RecentPosts_Widget() { // ウィジェットの初期設定 $widget_opts = array('classname' => 'my_recent_posts_widget', 'description' => '特定カテゴリの最新の投稿タイトル一覧を表示。カテゴリーIDを指定してください。' ); $control_opts = array('width' => 200, 'height' => 300); $this->WP_Widget('MyRecentPostsWidget', '特定のカテゴリー最近の投稿', $widget_opts, $control_opts); } // 管理画面にフォームを表示する処理 // $instance : 保存されているオプション値の連想配列 function form($instance) { // 設定が保存されていない場合はデフォルト値を設定 $instance = wp_parse_args((array)$instance, array('title' => 'Recent Posts', 'number' => 5, 'category' => 1)); // それぞれの設定値を取得 $title = strip_tags($instance['title']); // タイトル $number = $instance['number']; // 表示する投稿数 $category = $instance['category']; // カテゴリID // フォーム用の name 属性および id 属性の値を取得 $titlename = $this->get_field_name('title'); $titleid = $this->get_field_id('title'); $numbername = $this->get_field_name('number'); $numberid = $this->get_field_id('number'); $categoryname = $this->get_field_name('category'); $categoryid = $this->get_field_id('category'); // フォームの出力 echo '<p><label for="'.$titleid.'">タイトル:</label><br />'; echo '<input type="text" name="'.$titlename.'" id="'.$titleid.'" value="'.$title.'" style="width:100%;" /></p>'; echo '<p><label for="'.$numberid.'">表示する投稿数:</label>'; echo '<input type="text" name="'.$numbername.'" id="'.$numberid.'" value="'.$number.'" style="width:60px;" /></p>'; echo '<p><label for="'.$categoryid.'">カテゴリーID:</label>'; echo '<input type="text" name="'.$categoryname.'" id="'.$categoryid.'" value="'.$category.'" style="width:60px;" /></p>'; } // 管理画面でオプションを保存する処理 // $new_instance : 入力されたオプション値の連想配列 // $old_instance : 保存されているオプション値の連想配列 // 戻り値 : 新たに保存されたオプション値の連想配列 function update($new_instance, $old_instance) { $instance['title'] = strip_tags($new_instance['title']); $instance['number'] = $new_instance['number']; $instance['category'] = $new_instance['category']; // 例えばエラーチェックしたい場合は以下のような感じで if (!$instance['title']) { // タイトルが空白の場合、元の値に戻してエラー表示 $instance['title'] = strip_tags($old_instance['title']); $this->m_error = '<span style="color:#ff0000;">タイトルが空白です。元の値に戻します。</span>'; } return $instance; } // サイトで表示する処理 // $args : 出力用文字列の連想配列 // $instance : 保存されているオプション値の連想配列 function widget($args, $instance) { extract($args); $instance = wp_parse_args((array)$instance, array('title' => '', 'number' => 5, 'category' => 1)); // タイトルはフィルタ処理 $title = $instance['title']; $title = apply_filters('widget_title', $title); $number = $instance['number']; $category = $instance['category']; echo $before_widget."n"; echo $before_title.$title.$after_title."n"; echo '<ul class="recentEntries">'; // 最新の投稿タイトルを件数とカテゴリを指定して取得&出力 query_posts('&showposts='.$number.'&cat='.$category); if (have_posts()) { while (have_posts()) { the_post(); echo '<li><a href="'.get_permalink().'">'.the_title('', '', false).'</a></li>'; } } echo '</ul>'; echo $after_widget."n"; // WordPress のループ用クエリをリセット wp_reset_query(); } } // ウィジェットを widgets_init フックで登録 add_action('widgets_init', create_function('', 'return register_widget("My_RecentPosts_Widget");'));
メリットとしては、利用するテーマ内のウィジェットエリアがいくつかある場合、
自分で好きな場所に設定することが可能ということ。
上記のタグをfunction.phpに追記すると、オリジナルウィジェットが追加されます。
●カテゴリーの指定
●投稿数の指定
が可能です。(おそらく)コピペでいける(…はずです)ので、一度お試しくださいませ!!