Warning: Declaration of FEE_Field_Terms::wrap($content, $taxonomy, $before, $sep, $after) should be compatible with FEE_Field_Post::wrap($content, $post_id = 0) in /home/twfs/serverkurabe.com/public_html/blog/wp-content/plugins/front-end-editor/php/fields/post.php on line 0

Warning: Declaration of FEE_Field_Tags::wrap($content, $before, $sep, $after) should be compatible with FEE_Field_Terms::wrap($content, $taxonomy, $before, $sep, $after) in /home/twfs/serverkurabe.com/public_html/blog/wp-content/plugins/front-end-editor/php/fields/post.php on line 0

Warning: Declaration of FEE_Field_Category::wrap($content, $sep, $parents) should be compatible with FEE_Field_Terms::wrap($content, $taxonomy, $before, $sep, $after) in /home/twfs/serverkurabe.com/public_html/blog/wp-content/plugins/front-end-editor/php/fields/post.php on line 0

Warning: Declaration of FEE_Field_Post_Thumbnail::wrap($html, $post_id, $post_thumbnail_id, $size) should be compatible with FEE_Field_Post::wrap($content, $post_id = 0) in /home/twfs/serverkurabe.com/public_html/blog/wp-content/plugins/front-end-editor/php/fields/post.php on line 0

Warning: Declaration of FEE_Field_Post_Meta::wrap($data, $post_id, $key, $ui, $single) should be compatible with FEE_Field_Post::wrap($content, $post_id = 0) in /home/twfs/serverkurabe.com/public_html/blog/wp-content/plugins/front-end-editor/php/fields/post.php on line 0

Warning: Declaration of FEE_Field_Widget::wrap($params) should be compatible with FEE_Field_Base::wrap($content, $data) in /home/twfs/serverkurabe.com/public_html/blog/wp-content/plugins/front-end-editor/php/fields/widget.php on line 0

Warning: Declaration of FEE_Field_Comment::wrap($content) should be compatible with FEE_Field_Base::wrap($content, $data) in /home/twfs/serverkurabe.com/public_html/blog/wp-content/plugins/front-end-editor/php/fields/other.php on line 0

Warning: Declaration of FEE_Field_Term_Field::wrap($content, $term_id, $taxonomy) should be compatible with FEE_Field_Base::wrap($content, $data) in /home/twfs/serverkurabe.com/public_html/blog/wp-content/plugins/front-end-editor/php/fields/other.php on line 0

Warning: Declaration of FEE_Field_Single_Title::wrap($title) should be compatible with FEE_Field_Term_Field::wrap($content, $term_id, $taxonomy) in /home/twfs/serverkurabe.com/public_html/blog/wp-content/plugins/front-end-editor/php/fields/other.php on line 0

Warning: Declaration of FEE_Field_Option::wrap($content, $key, $ui) should be compatible with FEE_Field_Base::wrap($content, $data) in /home/twfs/serverkurabe.com/public_html/blog/wp-content/plugins/front-end-editor/php/fields/other.php on line 0
CMS | Sabakura Blog - Part 7

徹底解説!query_postsを使ってWordPressで表示する記事数をカテゴリごとに変更する(プラグイン不使用)

WordPressでサイト・ブログを構築していると、1ページに表示する記事数をカテゴリごとに変えたい場合があります。(なお、全記事・全ページ共通で変えたいだけなら、ダッシュボードの「表示設定」で変更できます)

このような場合プラグインを利用して実現することもできるようですが、サイトが重くなることを避けたい場合、PHPとWordPressの関数を利用して簡単に実現できます

以下、query_posts関数の説明を兼ねつつ、手順を説明したいと思います。

query_postsの利用

WordPressでは、query_postsという非常に便利な関数があらかじめ定義されています。
このquery_postsは、引数部分(括弧内)にカテゴリや投稿数を指定することで、その直後に現れる投稿ループを操作する関数です。

・query posts – WordPress Codex

もっとも単純な使用例

query_postsは、WordPressのループが始まる直前に記載します。
もっとも単純な使用例は以下のようなパターンです。

<?php
	query_posts('&posts_per_page=20');
	if (have_posts()) : while (have_posts()) : the_post();
?>

たとえば上記のように「category.php」に記載した場合、ダッシュボードの表示設定で「1ページに表示する最大投稿数」を10件に指定していても、カテゴリページでは記事は常に20件表示されるようになります。

これはたとえば、トップページ(index.php)では最新記事は10件までしか表示したくないが、カテゴリページでは20件まで表示したい、といった場合に有効です。

なお、query_posts()の引数になっている「posts_per_page」は「1ページに表示する記事数」を指定するための引数です。
また、URLにクエリとして引き渡すため、先頭には必ず「&」をつけることを忘れないようにしてください。

特定のカテゴリにだけ使用する

ただし「posts_per_page」のみを指定した場合、カテゴリごとに記事数を変更することはできず、すべてのカテゴリの表示記事数が一様に変更されます。

そこでカテゴリごとに表示記事数を細かく指定するためには「category_name」という引数を使います。category_nameを使うと、カテゴリのスラッグ名を利用して、特定のカテゴリだけを指定できます。
※そのほか「cat」という引数でカテゴリーIDを指定するなどの方法もあります。

query_postsの間違った使用例

ですが、以下のように単純に「category.php」内のquery_postsに「category_name」を追加すると困ったことになります。

<?php
	//悪い例。すべてのカテゴリに日記の記事しか表示されなくなる。
	query_posts('&category_name=diary&posts_per_page=20');
	if (have_posts()) : while (have_posts()) : the_post();
?>

category.phpに上記のように設定してしまうと、どのカテゴリを開いても「diary」の記事しか表示されなくなってしまいます。
これは、category.phpを使用するすべてのカテゴリに対して「diaryカテゴリの記事を20件表示しろ」という命令になってしまうためです。

これを避けるためには、ページを開いた際のURLをその都度取得し、category_nameに入れるようにしないといけません。

正しい例

WordPressでは、現在開いているページのカテゴリ情報を取得するための「get_the_category」という関数があります。これを利用して、カテゴリ名を取得します。

・get the category – WordPress Codex

実際の使用例は以下の通りです。

<?php
	//カテゴリ情報を配列として取得
	$catinfo = get_the_category();
	//配列の一つ目の要素にあるオブジェクトからカテゴリ名を取り出す
	$catname = $catinfo[0]->category_nicename;
	//カテゴリ名(スラッグ名)がdiaryならば、表示する記事数を5件に制限
	if($catname == diary)
	{
		query_posts('&posts_per_page=5');
	}
	if (have_posts()) : while (have_posts()) : the_post();
?>

ページング(ページ送り)を利用できるようにする

カテゴリごとの表示記事数そのものは、ここまでで変更できます。
しかし記事数が多い場合には当然、次のページへ・前のページへといったページ送りが必要になります。

ですが、query_postsはそのままだと、ページ送りの動作に必須の「現在のページ数」をURLから取得できません。そのため、いくらページ送りを実行しても、常に最新の記事ばかりが表示されてしまいます。

WordPressにはこうした事態を防ぐための変数もじつは用意されています。
それが「$query_string」です。
$query_stringはグローバル変数ですので、category.phpのなかからでも「global」宣言さえすれば簡単に取り出すことできます。

よって、コードは以下のようになります。

<?php
	//グローバル変数$query_stringを取得
	global $query_string;
	$catinfo = get_the_category();
	$catname = $catinfo[0]->category_nicename;
	if($catname == diary)
	{
		//$query_stringとクエリ部分は.で繋ぐ
		query_posts($query_string . '&posts_per_page=5');
	}
	if (have_posts()) : while (have_posts()) : the_post();
?>

これで特定のカテゴリ(この例ではdiary)のみ表示記事数を変更することができました。

おまけ:コードをスマートにする

前述まででコードとしてはきちんと動きますが、カテゴリごとに記事数を細かく変更したいといった場合には、if文の行数が増えて可読性が悪いです。

そこで三項演算子を使って書くとスマートになります。
ちなみに三項演算子とは、「 A ? B : C 」の形で使うもので、Aの部分がTRUEであればBを実行、FALSEならばCを実行します。
これを使うと、以下のように書けます。

<?php
	global $query_string;
	$catinfo = get_the_category();
	$catname = $catinfo[0]->category_nicename;
	//カテゴリ名(スラッグ名)がdiaryなら5件まで、それ以外は10件
	$catname == 'diary' ? query_posts($query_string . '&posts_per_page=5')
	 : query_posts($query_string . '&posts_per_page=10');
	if (have_posts()) : while (have_posts()) : the_post();
?>

三項演算子は、PHP5.1や5.2ではFALSE時の挙動を省くことができないため、上記例では他カテゴリを10件にするという指定をしています。

5.3以降であればFALSEの挙動を省くこともできるため、特定のカテゴリの表示記事数を指定するだけで、他のカテゴリの表示記事数は変えない(ダッシュボードからの設定のままでいい)のであれば、さらに短く書けます。

<?php
	//PHP5.3以降
	global $query_string;
	$catinfo = get_the_category();
	$catname = $catinfo[0]->category_nicename;
	$catname == 'diary' ? query_posts($query_string . '&posts_per_page=5');
	if (have_posts()) : while (have_posts()) : the_post();
?>

このようなコードにしておけば、表示記事数を変えたいカテゴリが複数あっても、とても簡単に設定を行うことができます。ぜひ活用してみてください。

WordPressでコメントを別記事に移動する方法

別サイトの話なのですが、WordPressで構築しているサイトで、コメントを別記事に移動したいという要望を受けました。

コメント移動の経緯

どういうことか少し詳しく説明しますと、そのサイトではBBS(掲示板)のようなページを一つ作って、そこのコメント欄でユーザー(お客様)とのやり取りをしていたわけです。WordPressではコメントがスレッドとして管理されることもあり、これまでは上手くいっていました。

しかし、BBSへのコメント数が増えるにつれてコメント欄が縦に長大になるのと、それから商品の感想や問い合わせなど種類の異なる質問が入り混じるようになり、かなり混乱してきたわけです。

で、古い問い合わせは「これまでの問い合わせ」として別記事に分けたり、あるいは最近のコメントも「商品の感想」「商品についての質問」など別記事に分けて、それぞれのコメント欄で返信していきたい、というわけです。

で、ちょっと調べつつやってみましたので、備忘録として残しておきます。

コメントの返信元記事を変更する方法

残念ながら、WordPressのダッシュボードからはコメントの返信元記事を移動することができません。そこで直接MySQLのデータベースを変更します。
※なお作業は自己責任で行ってください。

コメントの返信元記事を変更する手順

  1. コメントを新しい別記事に移動したい場合は、先にWordPressのダッシュボードから新しい記事(または固定ページ)を作っておきます。
  2. phpMyAdminでMySQLにアクセスします。
    ※もちろん環境があれば、phpMyAdmin等を使わずに、SSH等で直接MySQLを操作してもらってもOKです。
  3. WordPressのテーブル群を格納しているデータベースにアクセスします。
  4. 「wp_posts」のテーブルを表示し、コメント移動先の記事の「ID」を確認しておきます。
  5. 次に「wp_comments」のテーブルを表示し、移動したいコメントの編集ボタン(鉛筆マーク)をクリックします。
  6. 「comment_post_ID」のフィールドの値を、先ほど確認しておいた記事の「ID」に変更します。
  7. 「実行する」をクリックします。

上記作業を、移動したいすべてのコメントについて実行します。SQL文が分かる方であれば、まとめて変更していただいても大丈夫だと思います。

また親コメントを移動しただけでは、子孫コメントは移動されませんので、必ず子孫コメントも移動するようにしてください。親子コメント両方を同一の記事に移動する場合であれば、スレッド内の親子関係は失われることはありません。

以上が、コメントの移動方法になります。
ユーザーとのやり取りが多いサイトなど、コメントが多いサイトでは役に立つと思います。

WordPressのSEO対策プラグイン「All in One SEO Pack」の導入と詳細設定

WordPressを利用してサイトを構築している場合、metaタグの設定など、HTMLレベルでのSEO対策を行うには、「All in One SEO Pack」プラグインを導入するのがおすすめです。

All in One SEO Packは、WordPressでtitleタグ、metaタグなどの追加・変更を簡単にするためのプラグインです。
非常に簡単に導入できるため、WordPressを利用してサイトを構築している方は、ぜひ利用することをおすすめします。

All in One SEO Packのインストール

  1. All in One SEO Packのページから、デスクトップなど適当な場所にダウンロードします。
  2. ダウンロードしたzipファイルを解凍します。
  3. FTPで「/[wordpressのフォルダ]/wp-content/plugins」フォルダ内にアップロードします。
  4. WordPressのダッシュボード(管理画面)にログイン→「プラグイン」
  5. All in One SEO Packの「有効化」をクリックします。
  6. ダッシュボードの「設定」に表示される「All in One SEO」をクリックします。
  7. 「Plugin Status:」の「Enabled」にチェックを入れます。
  8. 「UpdateOptions」をクリックします。

以上で、プラグインのインストール自体は完了です。
なお、上記は英語版のバージョン 1.6.13.2を元にした導入方法です。

このほかAll in One SEO Pack日本語版もあります。

ただ、あくまで説明等が日本語化されているだけで、日本のGoogle向けに特別な設定がなされているというわけではありません。
個人的にはSEOは非常に情報の動きが早いため、より対応の早い英語版を使っています。英語といっても、そんなに難解な項目はないので大丈夫だと思います。

All in One SEO Packの基本設定

導入が終わったら、次にキーワードなどの基本設定を行います。

  1. ダッシュボードの「設定」→「All in One SEO」をクリックします。
  2. 「Home Title」に自分のサイト名を入力します
  3. 「Home Description:」に「meta description」用の文章を入力します。
    ※なお、meta descriptionは全記事・ページごとに個別のものを設定することが推奨されています。個別のmeta descriptionは実際の投稿時に設定できますが、設定しなかった記事・ページにはこの「Home Description:」が使われます。
  4. 「Home Keywords」にmeta keywordsに使いたい記事をカンマで区切って入力します。
  5. 「Canonical URLs」にチェックを入れます。
    これは重複記事を防ぐオプションで、有効にしておくことをおすすめします。
  6. 「Rewrite Titles:」にチェックを入れます。
  7. 「Post Title Format:」を設定します。
    これは個別の記事のtitleタグの書き方を設定するものです。「%post_title%」が記事ごとのタイトル、「%blog_title%」が「Home Title」で設定してブログタイトルになります。
    実際にはほとんどの場合は変更しないか、%post_title%と%blog_title%の順番を変更、区切りを「|」ではなく「-」に変更、をお好みで行うぐらいです。
  8. 「Page Title Format:」を設定します。
    前述の「Post Title Format:」が記事ごとのtitleタグ設定だったのに対し、こちらは個別ページごとのtitleタグを設定します。

  9. 同様に、Category(カテゴリ)、Archive(過去記事一覧)、Tag(タグ)などについてもtitleタグを変更したいものがあれば変更します。※通常は変更の必要はありません。
  10. 記事のカテゴリをそのままキーワードとしてmeta keywordsに追加したい場合は、「Use Categories for META keywords:」にチェックを入れます。
  11. 同様に、記事につけた投稿タグをそのままキーワードとしてmeta keywordsに追加したい場合は、「Use Tags for META keywords:」にチェックを入れます。
  12. 「Use noindex for Categories:」にチェックを入れます。
    これにより、カテゴリページに<meta name=”robots” content=”noindex,follow” />が追加され、検索エンジンがリンクを辿ってはくれるが、インデックスはしない状態になります。
    ここでnoindexを設定するは、カテゴリページはコンテンツが薄い、ないしは重複コンテンツとして検索エンジンに認識される恐れがあるためです。
  13. 「Use noindex for Archives:」にチェックを入れます。
    これも「Use noindex for Categories:」同様で、過去記事一覧ページにnoindexを付与します。
  14. 「Use noindex for Tag Archives:」チェックをいれます。
    これも「Use noindex for Categories:」同様で、過去記事一覧ページにnoindexを付与します。
  15. 「Update Options」をクリックして設定を更新します。

記事・ページ新規追加時のmeta description設定

meta descriptionは、サイト内の記事・ページごとに個別のものを指定することが推奨されています。
そのため「Home Description:」を設定しておいても、実際には記事・ページを追加するごとにmeta descriptionを書く必要があります。

以下、記事追加の場合を例にとって個別のmeta descriptionの書き方を解説します。

  1. ダッシュボードから「投稿」の「新規追加」をクリックします。
  2. 投稿画面下部に「All in One SEO Pack」の「Descriptions:」に文章を書くことでmeta descriptionに設定されます。
  3. またKeywordsに「,」区切りでキーワードを書くことで、個別のmeta keywordsを設定することも可能です。

以上がAll in One SEO Packの導入、設定および使い方になります。