WordPress, 子カテゴリのカテゴリIDを取得したい

WordPress のテンプレートタグ、カテゴリ。

ある親カテゴリの子カテゴリのIDを取得したい時があったけど、どうも該当するテンプレートタグが無さそうだった。
$wpdb インスタンスを使ってSQLクエリを使ってみることにした。

$wpdb->get_results("SELECT t.term_id FROM $wpdb->term_taxonomy AS term LEFT JOIN $wpdb->terms AS t ON term.term_id = t.term_id WHERE parent = 'Parent ID' ORDER BY t.slug");

WordPress 2.5系からコンテンツやカテゴリ管理に taxonomy「分類」が使われています。

terms
カテゴリ、タグに関する情報テーブル

term_id bigint(20) PRIMARY auto_increment
name varchar(200) INDEX カテゴリ名 / タグ名
slug varchar(200) UNIQUE
term_group bigint(20)

term_taxonomy
カテゴリ、タグに関する情報テーブル

term_taxonomy_id bigint(20) PRIMARY auto_increment
term_id bigint(20) UNIQUE
taxonomy varchar(32) category / link_category / post_tag
description longtext
parent bigint(20) 親ID
count bigint(20) 投稿数

SQLの結果から子カテゴリIDを取出す。

$children_cats = array();
foreach($wpdb->last_result as $cat){
	$children_cats[] = $cat->term_id;
}

関数化して functions.php にでも置いておくと便利かな。

あと、バージョンアップに伴ってテーブル構造が変わったら使えなくなる。
2.5系へのアップグレードでカテゴリ関連のテーブル構造が変わって、SQLを使ってカスタマイズしていたテンプレートの修正で死にそうになったことがある。

WordPress, 複数ページのタイトルやdescriptionにページナンバー

index とかアーカイブとかコンテンツが増えてくると複数ページにまたがることがある。
title, description が重複していると Google サイトマップさんに怒られるので、せめてページナンバーを付けて許してもらうことにした。

ページナンバーを付ける。
wp_title(); に続けて

echo (isset($paged) && $paged) ? " Page - {$paged}" : "";

とした。

変数 $paged に現在のページナンバーが入っているのでセットされている時に出力するようにしただけ。

all-in-one-seo-pack プラグインを使えばプラグインが勝手にやってくれるけど、好きじゃないんだよねこのプラグイン。

WordPress the_contentをHookしてwp-hatenaを追加する

wp-hatena は「はてなブックマーク」などに追加するリンクタグを挿入できる。

ただ、テンプレートにタグを打ち込まないといけないのがめんどうだったので functions.php に Hook を作ってみた。

// bookmark icon
function hatena_bookmark_icons(){
	global $wph;
	if(isset($wph)) {
		echo '
 
';
		$wph->addHatena();
		$wph->adddelicious();
		$wph->addLivedoor();
		$wph->addYahoo();
		$wph->addFC2();
		$wph->addNifty();
		$wph->addPOOKMARK();
		$wph->addBuzzurl();
		$wph->addChoix();
		$wph->addnewsing();
		echo '
 
';
	}
}
add_action('the_content', 'hatena_bookmark');
function hatena_bookmark ($content){
	if ( !is_feed() && function_exists( "hatena_bookmark_icons" ) ) hatena_bookmark_icons();
	return $content;
}

テンプレート the_content(); しているところで投稿データの前に表示される。
Hook って便利だ。

Function Reference/add action

update
Feed にもブックマークアイコンが表示されていたので修正した。

WordPress JavaScriptライブラリをテンプレートで使う作法

WordPress テンプレートで prototype.js, jQuery…etc などの JavaScriptライブラリを使いたい時にテンプレートにハードコードしてはいけない。
プラグインを作成し JavaScriptライブラリを使いたい時も同じ。

コンフリクトを起こすかもしれないし、同じライブラリを何度も呼び出してしまうかもしれない。

ちゃんと関数が用意されている。

// wp_head の前で使う!
wp_enqueue_script( 'handle', 'src', 'deps', 'ver');
// wp_head を次に - wp_head でライブラリの<script>コードが書出される
wp_head();

Function Reference/wp enqueue script

handle(string)
ライブラリ名(小文字)

src(string)
ライブラリまでのパス – 通常は指定しなくてよい。
添付されているライブラリが最新版というわけではないので、どうしても最新版でないといけないような時に使うのだろう。

deps(array)
– 通常は指定しなくてよい。

ver (string)
– 通常は指定しなくてよい。

handle を指定すればことたりるはず。

// prototype.js and scriptaculous.js
wp_enqueue_script('prototype');
wp_enqueue_script('scriptaculous-effects');
wp_head();

下記のライブラリは WordPress に添付されている。

Script Name Handle
Scriptaculous Root scriptaculous-root
Scriptaculous Builder scriptaculous-builder
Scriptaculous Drag & Drop scriptaculous-dragdrop
Scriptaculous Effects scriptaculous-effects
Scriptaculous Slider scriptaculous-slider
Scriptaculous Sound scriptaculous-sound
Scriptaculous Controls scriptaculous-controls
Scriptaculous scriptaculous
Image Cropper cropper
SWFUpload swfupload
SWFUpload Degarade swfupload-degrade
SWFUpload Queue swfupload-queue
SWFUpload Handlers swfupload-handlers
jQuery jquery
jQuery Form jquery-form
jQuery Color jquery-color
jQuery UI Core jquery-ui-core
jQuery UI Tabs jquery-ui-tabs
jQuery UI Sortable jquery-ui-sortable
jQuery Interface interface
jQuery Schedule schedule
jQuery Suggest suggest
ThickBox thickbox
Simple AJAX Code-Kit sack
QuickTags quicktags
ColorPicker colorpicker
Tiny MCE tiny_mce
Prototype Framework prototype
Autosave autosave
WordPress AJAX Response wp-ajax-response
List Manipulation wp-lists
WP Common common
WP Editor editor
WP Editor Functions editor-functions
AJAX Cat ajaxcat
Admin Categories admin-categories
Admin Tags admin-tags
Admin custom fields admin-custom-fields
PAssword Strength Meter password-strength-meter
Admin Comments admin-comments
Admin Users admin-users
Admin Forms admin-forms
XFN xfn
Upload upload
PostBox postbox
Slug slug
Post post
Page page
Link link
Comment comment
Admin Gallery admin-gallery
Media Upload media-upload
Admin widgets admin-widgets
Word Count word-count
WP Gears wp-gears
Theme Preview theme-preview

ちなみに wp_head はなるべく </head> の前に書いておく。
プラグインなどの中にも wp_head を使用してコードを吐き出している場合がある。

テンプレートでは wp_footer(); の記述を忘れないように挿入場所は </body> の前に書くのが吉。

WordPress クエリをカスタマイズする

WordPress である特定のカテゴリやタグだけ表示を他と変えたい時がある。
わざわざテンプレートファイルを作るほどでもない時は、オリジナルループの条件を足したり変更したりすることで対応できる。

条件を文字列で指定する時は $query_string を利用する。

// 表示件数を20件に変える
query_posts($query_string."&showposts=20");

条件が category__in, category__not_in... など配列指定が必要な条件の時は
$wp_query->query_vars を使用する。

// カテゴリID 5, 8, 7 を除く
$wp_query->query_vars['category__not_in'] = array(5,8,7);
query_posts($wp_query->query_vars);

WordPress は本家も日本語版もドキュメントが他のCMSなどに比べて充実していると思う。
ただテンプレートタグの説明はだいたいあるけど、変数になるとどこに説明があるのかが分かりにくい、と思ったりする。

Codex を上手に使うと WordPress はもっと楽しくなる。
Codex 日本語版
Codex