プラグイン用のテーブルを作成するには

WordPressをインストールする際にMySQLに作成されるテーブルのほかに、自作プラグインでもテーブルを作成することができる。アクションフックのregister_activation_hookを定義しておくとプラグインが有効になった際に関数が呼ばれるので、ここでテーブルを作成する。テーブル名にはWordPressの接頭辞を使用すること。
以下は、wp_sampleというテーブルを作成する例。

[sourcecode language=’php’]
function myActivation() {

global $wpdb;

$table_name = $wpdb->prefix . “sample”;
if($wpdb->get_var(“show tables like ‘$table_name'”) != $table_name) {

$sql = “create table ” .$table_name .” (
ID bigint not null auto_increment,
name varchar(64) NOT NULL,
furigana varchar(64) default NULL,
url varchar(64) default NULL,
primary key(ID)
)”;

$results = $wpdb->query($sql);
}
}

register_activation_hook(__FILE__, ‘myActivation’);
[/sourcecode]

プラグインが無効化された際の処理は以下を使用する。
[sourcecode language=’php’]
register_deactivation_hook(__FILE__, ‘myDeactivation_’);
[/sourcecode]

ショートコードの作りかた

ショートコードとは、記事中に記述することで実行させるプラグインのことだ。有名なショートコードのプラグインに、ソースコードを表示するためにここでも使っている「SyntaxHighlighter Plus」がある。

ショートコードは以下のように記事中に記述する。
[hello color=”red”]ほにゃらら[/hello]

プラグインでは、add_shortcodeで定義した関数を用意する。下の例では、赤い文字で”ほにゃらら”と表示する。この場合の出力はechoではなく、returnとすることに注意したい。
$attsの引数で、属性値を受け取ることもできる。

[sourcecode language=’php’]
function showhello($atts, $content) {
extract( shortcode_atts( array(‘color’ => ”), $atts ));
return ‘

‘ .$content .’

‘;
}

add_shortcode(‘hello’, ‘showhello’);
[/sourcecode]

ショートコードは記事中だけでなく、テーマで使用することもできる。テーマで使用する場合は、 do_shortcode()を使う。
[sourcecode language=’php’]

[/sourcecode]

画像がアップロードできない

WordPress2.8.4にアップデートした後にひっかかったのは、画像ファイルのアップロードだ。
投稿画面で「画像の追加」アイコンをクリックしてもウンともスンともいわなくなってしまった。よく見るとFireFoxでJavaScriptのエラーが大量に出ている。とりあえずプラグインをひとつづつ無効にしていきながら、Simple Tagsでひっかかっていることまでつきとめた。
Simple Tagsを最新バージョンにアップデートしてみるも直らない。このような有名なプラグインが最新バージョンに対応していないはずはないと思った。そこでふと思いついてFireFoxをIEに変えると、問題ないことが分かった。FireFoxがだめなのか?と2、3日はブログの更新をIEで行っていた。またふと思いついて、FireFoxを最新バージョンにしたら正常に戻った。

何事も最新バージョンに保たないと思いどおりにいかないものだ。

自動アップデート

新しいバージョンがリリースされると、ダッシュボードに「WordPress *.* が利用可能です ! アップデートしてください。」というメッセージが表示される。
v2.8がリリースされた際には、自動アップデートに不具合があるとの情報があらかじめ出回っていたため、ファイルを手動でFTPでアップせざるを得なかった。今回2.8.4にアップデートする際に初めて、自動アップデートを行った。
「WordPress 2.8.4 が利用可能です ! アップデートしてください。」のリンクをクリックすると、ウィザード形式で作業が始まり、FTP情報をきかれたところで、アカウントとパスワードを入力する。あとは自動的にファイルが更新され、アップデートが完了する。次回、ログインのタイミングでデータベースのアップデートが行われる。
なんと手軽!

今回はマイナーバージョンアップのため、見た目には違いがわからない。

検索結果をソートしたい

検索結果をソートするには、通常query_posts()で”orderby”を指定する。
ただし指定できる項目は、投稿テーブル(wp-posts)のフィールドに限られる。
他の項目(カスタムフィールドや、カテゴリ順など)でソートした場合には、
フィルターフックでSQLに手を加えるとよい。

たとえばカテゴリのid順にソートした場合は、
[sourcecode language=’php’]
add_filter(‘posts_join’, ‘my_join’);
add_filter(‘posts_orderby’, ‘my_orderby’);

function my_join($query){

global $wpdb;

if(is_search()){
$query .= ” JOIN $wpdb->term_relationships AS tr ON tr.object_id=$wpdb->posts.ID JOIN $wpdb->term_taxonomy AS tt ON tt.term_taxonomy_id=tr.term_taxonomy_id JOIN $wpdb->terms AS t ON t.term_id=tt.term_id”;
}

return $query;
}

function my_orderby($query) {

global $wpdb;

if(is_search()){
$query = ” t.term_id DESC, $wpdb->posts.post_date DESC”;
}

return $query;
}
[/sourcecode]

独自に作成したテーブルを追加することも可能だ。ただしやりすぎと負荷がかかるので、様子を見ながら対応すること。

ダッシュボードの投稿画面に入力セクションを追加したい

ダッシュボードの投稿画面に項目を追加するには、カスタムフィールドを利用するのが一般的だ。
独自の項目がある程度まとまっている場合には、add_meta_box()で入力セクションを追加したほうが、使い勝手がぐっとよくなるだろう。手順としては、ダッシュボードがロードされたタイミングでadmin_menu()をフックし、add_meta_box()を実行することで実装できる。

[sourcecode language=’php’]
add_action(‘plugins_loaded’, ‘my_init’);

function my_init() {

if(is_admin()) {
add_action( ‘admin_menu’, ‘my_dashboard’, 1);
}
}

function my_dashboard() {
add_meta_box(‘my_metabox’, __(‘今日のお天気情報’, ‘my_metabox’), ‘my_section’, ‘post’);

}

function my_section() {

$my_weather = ‘(初期値を設定またはDBから取得)’;
$my_high = ‘(初期値を設定またはDBから取得)’;
$my_low = ‘(初期値を設定またはDBから取得)’;

?>
天気:‘ />
最低気温: sysbirdテーマ コメントはまだありません

JavaSciptライブラリを読み込む

テーマやプラグインでJavaScriptを読み込む場合は、アクションフックのwp_print_scriptsを使用する。

[sourcecode language=’php’]
function add_myscript() {
wp_enqueue_script(‘myscript’, ’JavaScriptのフルパス’);
}

add_action(‘wp_print_scripts’, ‘add_myscript’);
[/sourcecode]

jQueryに依存したJavaScriptを読む込む場合は以下のようになる。wp_enqueue_script(‘jquery’);を行うことで、jQueryが2重に読み込まれることがなくなる。

[sourcecode language=’php’]
function add_myscript() {
wp_enqueue_script(‘jquery’);
wp_enqueue_script(‘myscript’, ’JavaScriptのフルパス’, array(‘jquery’));
}

add_action(‘wp_print_scripts’, ‘add_myscript’);
[/sourcecode]