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
Sabakura Blog - Part 18

jQueryを利用して、WordPressの特定のカテゴリだけ日付を消去する

WordPressを使っていて、特定のカテゴリの投稿記事だけ、日付などの情報を消去したい場合があります。このような場合、jQueryを使うと簡単に実現できます。
(カテゴリ別の指定ではなく、タグ別の指定も行えます)

どういった場合に便利?

たとえばこのサイトでは、レンタルサーバーのレビューを固定ページではなく投稿として追加しています。しかしこの場合、日付情報はあまり重要ではありません(随時更新しているため)。

WordPressのプラグインのなかには投稿から固定ページへの変換を行ってくれるものもありますが、投稿ではタグ付けが行えるのに、ページではタグ付けが行えないなど、そのまま変換するのはためらわれる場合も多いです。

そこで、かわりにjQueryを用いて不要な情報だけを消去にすると便利です。

例:jQueryを用いて日付情報を非表示にする

jQueryでは、CSSのクラス・IDを用いてコンテンツを操作するため、まずカテゴリや日付情報の部分にクラスを指定しておきます。

カテゴリにクラスを指定

まずsingle.phpを開き、記事のカテゴリが表示されている部分にCSSのクラスを割り当ててください。具体的な例を以下に示します。

<p class="category"><?php the_category() ?></p>

日付情報にクラスを指定

同様にsingle.php内で、日付情報が表示されている部分にCSSのクラスを割り当ててください。

<li class="date">更新日:<?php  the_time('Y年m月d日') ?></li>

ヘッダーにjQueryを追加

次にheader.phpを開き、以下のようにjQueryのスクリプトを追加します。

<script type="text/javascript">
jQuery(function() {
	//.category内のaタグのhref要素がcookingまたはrecipeであれば
	if (jQuery(".category a").is("[href*='cooking'],[href*='recipe']")) {
		//.dateタグ内の要素を削除
		jQuery(".date").remove();
	}
});
</script>

なおWordPress内でjQueryを使う場合、上記のように「$」記号は「jQuery」に置換して記述します。これがスマートでない場合は、以下のように書き換えてもらってもOKです。
(参考:WordPressでjQueryを動かす方法

<script type="text/javascript">
jQuery(function($) {
	if ($(".main_nav a").is("[href*='review'],[href*='select']")) {
		$(".date").remove();
	}	
});
</script>

検索エンジンスパムに該当しないか?

このような画面上の情報消去は、検索エンジンに対しての情報を操作する検索エンジンスパムだと誤解される場合があります。

実際、CSSの「display:none;」を利用して特定の文字列を人間には見えないようにするのは、この検索エンジンスパムに該当してしまいます。
これは「display:none;」は人間にはその文字列が見えないにもかかわらず、検索エンジンには見えているためです。

しかし、jQueryのremove()を使う場合、HTMLそのものから文字列を削除するため、その文字列は人間にも検索エンジンにもまったく認識されません。(逆に言うとインデックスさえされません)。

そのため検索エンジンの評価を操作しようとする要素はまったくないため、スパム行為に該当することはまったくないので安心してください。

Vimでのウィンドウ分割方向の設定(netrw含む)

Vimでウィンドウ分割方向を設定

Vimの初期設定ではウィンドウの分割は、水平分割は上側、垂直分割は左側に新規ウィンドウが表示されます。このウィンドウ分割を逆方向(下側と右側)にしたい場合の設定方法です。

通常ウィンドウ分割方向

_vimrc(_gvimrc)に以下のように記述します。

" 新しいウィンドウを下に開く
set splitbelow
" 新しいウィンドウを右に開く
set splitright

netrwのウィンドウ分割方向

さて通常ウィンドウの分割は比較的すぐに情報が見つかるのですが、先日紹介したnetrwでのウィンドウ分割は、上記の設定では反映されません。この設定を調べるのにちょっと苦労したのでメモしておきます。

" netrwで新しいウィンドウを下に分割する
let g:netrw_alto = 1
" netrwで新しいウィンドウを右に分割する
let g:netrw_altv = 1

以上で、通常ウィンドウもnetrwからでも常にウィンドウが下側・右側に分割されるようになります。

徹底解説!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();
?>

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