【WordPress】特定のカテゴリーの最新記事リストをウィジェットエリアに追加する方法

タイトルが長すぎですが^^;

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に追記すると、オリジナルウィジェットが追加されます。

●カテゴリーの指定
●投稿数の指定

が可能です。(おそらく)コピペでいける(…はずです)ので、一度お試しくださいませ!!



コメントを残す

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