WordPress, wp-jrelated 1.50 で Warning

wp-jrelatedを関連記事を表示するのに利用している。
http://wppluginsj.sourceforge.jp/wp-jrelated/

Yahoo! Japan が提供する「日本語形態素解析Webサービス」を使って投稿の内容を分析し関連する投稿などを表示します。

バージョンを1.50にするとWarningが出るようになってしまった。
注意書きに、関数の引数を変えたとあったのが原因かと思うのだけど・・・

“WordPress, wp-jrelated 1.50 で Warning” の続きを読む

WordPress, ショートコード使い過ぎに注意!?

WordPress 2.5 から機能追加されたショートコード。

[ショートコード名]のようにブラケットで囲った部分をタグに置換えてくれる。
XMLのように
[ショートコード名]HTMLタグや文字[/ショートコード名]
[ショートコード名 fruits=”みかん” price=”200″ /]
みたいに属性も指定できて便利。

今回、[sample /]という風にショートコード名に「sample」と名前をつけたコードを追加したが、imgタグのパスに/sample...とsampleという文字が入っていて、ココも置換えてしまった。
てことは、ショートタグ名は投稿中に絶対現れないユニークな名前にしとかないとひどい目にあうってことになる。
またプラグインで使っているかもしれない名前を使うのもダメってことらしい。
どうもショートコード名は慎重に設定しないといけないようだ。
クラス名のようにユニークになるようにドメインでもくっ付けるのがよさそう。

“WordPress, ショートコード使い過ぎに注意!?” の続きを読む

WordPress, 親ページと子ページを全部出力

親ページの「タイトル」と「本文」、子ページの「タイトル」と「本文」をまとめて出力したい。
どうも該当するテンプレートタグが無い様子。
無い知恵しぼって考えた。

“WordPress, 親ページと子ページを全部出力” の続きを読む

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 プラグイン Event Calendar 3 の言語ファイルを作る

イベントを管理しカレンダーに表示してくれるプラグイン Event Calendar 3 の言語ファイルを作った。

Event Calendar 3 は投稿にイベント日時を追加して管理するプラグイン。
投稿が無ければイベント日時を登録できない。
ウイジェットも付属する。

イベントだけのカレンダーを表示したり iCal ようのファイルがダウンロードできたり・・・
運用を工夫すると休業日の表示ができたりすると思う。

あるサイトの開発に使用した。
クライアントオーダーでプラグインの改造を余儀なくされたが、基本的な機能には多いに助けられた。

日本語化のために言語ファイルを作成した。
作成時点のバージョンは3.1.2、現在の3.1.4でも問題ないようだ。
せっかくなのでダウンロードできるようにしてみた。

作成には Poedit を使用。
圧縮には MacZip4Win を使用。

リンク先からダウンロードし解凍後、フォルダ内のファイルを Event Calendar 3 プラグインフォルダ内 gettext フォルダへアップロード。
ファイル名を ec3-ja.* へ変更。

ダウンロード

WordPress cforms プラグインってイケテルの?

カスタムフォームを作れる cforms が人気のプラグインらしい。

確かにDBへデータを保存したりなかなか高機能。
日本語言語ファイルもあるのでかなり便利。

ただ日本語環境だといくつか問題がある。

メールSubjectはかなりの確率で文字化けを起こす。
コードが日本語Subjectを考慮していないのが原因。

送信者名は “ブログタイトル” になるようにプログラムされているが「ブログタイトル」に日本語を使うと文字化けを起こす。

メール本文は WordPress の charset になるので UTF-8 になる。
今はUTF-8でメールを送信してもほとんどのメーラーは問題なく受信できるので、まっイイカとあきらめる。

メールSubjectの文字化けはコードを修正しなければならない。

// lib_aux.php
function encode_header ($str) {
	$x = preg_match_all('/[\000-\010\013\014\016-\037\177-\377]/', $str, $matches);
 
	if ($x == 0)
		return ($str);
	return mb_encode_mimeheader($str,'ISO-2022-JP');
}

関数 encode_header を修正した。
マルチバイトに対応していない部分を全て削除した。
セキュリティ面にどんな影響が出るのか読めない。

送信者の文字化けは

$frommail = '"'.get_option('blogname').'" <wordpress@' . preg_replace('#^www\.#', '', strtolower($_SERVER['SERVER_NAME'])) . '>';

を下記のように修正した。

$frommail = '"'.mb_encode_mimeheader(get_option('blogname'),'ISO-2022-JP').'" <wordpress@' . preg_replace('#^www\.#', '', strtolower($_SERVER['SERVER_NAME'])) . '>';

ただ、このコードあっちこっちにハードコードされているのでいちいち修正するのが面倒くさい。
せめて関数化してくれていると良かったのに、と思ったりする。

メール本文の文字コード指定もあっちこっちにハードコードされてたりして、イタダケナイと思う。

アップデートも頻繁に行われ、Wordpress のバージョンアップにもいち早く対応しているなど、高機能のプラグインをメンテナンスし続けてくれて感謝!
2バイトな(UTFなのでマルチバイトって言った方がよいのかな?)日本語なんて知らない人が作っているからしょうがないよネな、良くある話。

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

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

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

// bookmark icon
function hatena_bookmark_icons(){
	global $wph;
	if(isset($wph)) {
		echo '
 
';
		$wph-&gt;addHatena();
		$wph-&gt;adddelicious();
		$wph-&gt;addLivedoor();
		$wph-&gt;addYahoo();
		$wph-&gt;addFC2();
		$wph-&gt;addNifty();
		$wph-&gt;addPOOKMARK();
		$wph-&gt;addBuzzurl();
		$wph-&gt;addChoix();
		$wph-&gt;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> の前に書くのが吉。