ActivePerlでMySQL

XAMPPでPerlが動くようになったものの、そう簡単にMTのインストールは進まなかった。MySQLがない模様だ。SQLiteで済ませようとしたのに、MT5からデータベースがMySQLのみになっていることにここで気づいた。

ActivePerlでMySQLをインストールしなければならない。ハードルをクリアするとまたすぐに次のハードルが現れる。ActivePerlに付いてくるPPMというツールを使うらしいのだが、実行しようとするとネットに接続中のまま「応答なし」となる。Firewallのせいということに気がつくのも時間がかかった。また今日も挫折しそうになる。
ググりまくって、PPMを実行するまえにコマンドプロンプトで
C:\>set HTTP_PROXY=http://[プロキシ名]:[ポート番号]
とするといいらしいと知った。
続けて、
C:\usr\bin> PPM install DBD-Mysql
とするとなにやらジャカジャカとインスールが始まった。コマンドプロンプトを活用するとは、ン十年ぶりのことだ。かくしてPerlでMySQLが使えるようになった。

ここからはMTのウィザードに従ってスムーズに進み、First Blogを作成するまでが完了した。

XAMPPでActivePerl

XAMPPのPealアドオンをインストールしてPerlが動くようになったと思ったのもつかの間、肝心のMTのインストールが進まなかった。
http://localhost/mtos/mt.cgi
にアクセスすると
DBI object version 1.607 does not match $DBI::VERSION 1.604
というエラーが表示された。MySQLを使用するためのDBIのバージョンが違うといっているらしい。ググっても対応方法が分からない。

http://localhost/mtos/mt-check.cgi
で実行環境をチェックしてみると、やはり途中でエラーが出ていることが分かった。

お手上げモードでググっているうちに、XAMPPのアドオンPerlを使うよりも、ActivePerlというものがよいらしいことを知り、とりあえずこちらを試すことにした。
XAMPPのapacheとMySQLを停止し、Perlアドオンをアンインストールする。
ActivePerl 5.10.1のmsiをダウンロードして実行する。インストール先は”c:\usr\”を指定するとよい。こうするとperlのパスが”/usr/bin/perl”となり、CGIファイルのパスを修正せずに済むのだ。

apacheとMySQLを再開してmt-check.cgiにアクセスすると、エラーが消え「システムのチェックを完了しました。」が表示された。まだ足りないモジュールはあるようだ。ここまで時間がかかったものの、自力でなんとかなったのは嬉しい!やっとMTのインストールができる(か?)。

コメントフォームに項目を追加する

アクションフックのcomment_formで、コメントフォームに項目を挿入することができる。
以下はチェックボックスを追加する例。

[sourcecode language=’php’]
add_filter(‘comment_form’, ‘addMyControl’);

function addMyControl() {
_e(‘
サンプル
‘);
}
[/sourcecode]

ただし、テンプレート(comments.php)に以下の記述が必要である。
[sourcecode language=’php’]
ID); ?>
[/sourcecode]
デフォルトテーマにはこの記述がある。
使用中のテーマにこの記述がない場合は、挿入したい箇所にこれを記述すればよい。

トップページに表示するカテゴリを限定する

トップページに表示するカテゴリを限定するには、
index.phpで記事一覧を表示するループの前でquery_postsを使用する

[sourcecode language=’php’]
query_posts($query_string . “&cat=(カテゴリID)”);
while (have_posts()) : the_post();
// 処理
endwhile;
wp_reset_query();
[/sourcecode]

category_name=(カテゴリスラッグ)というのも使える。

XAMPPでperlを動かす

MTOSを試したくなった。
まずはXAMPPでperlが動くようにしなければ!

1.公式サイトよりアドオンをダウンロード
 http://www.apachefriends.org/jp/xampp-windows.html#2675
 インストーラの実行でエラーが出るため、自己解凍型ZIPアーカイブを使用
 Perl 5.10.0-2.2.9-pl2のEXE (7-zip)

2.解凍してXAMPPのインストールフォルダ(c:\xampp以下に)に上書きコピーする

3.C:\xampp\setup_xampp.batを実行

4.Windowsの設定で、拡張子.cgiをperlに関連付けする
 拡張子cgiに、アクションとしてopenを追加し、アクションを実行するアプリケーションに
 C:\xampp\perl\bin\perl.exe “%1” を設定

5.Apacheのhttpd.confの「 ScriptInterpreterSource Registry」 の行頭の#を外す

6.Apacheを再起動

query_postsを使ったらwp_reset_query

query_postsを使って表示条件を操作した後は、wp_reset_queryで条件をリセットしたほうがよい
しておかないと、is_home()が無効になる。

[sourcecode language=’php’]
query_posts($query_string . &showposts=5&cat=3″);
if (have_posts()) :
while (have_posts()) : the_post();
// 処理
endwhile;
endif;

wp_reset_query();
[/sourcecode]
ただし、wp_reset_query()すると、その後プラグインの動作と整合性がとれなくなる場合もある。
状況によって様子をみる。

パーマリンクをカスタマイズするには

パーマリンクをデフォルト以外で使用するには、.htaccessの書き換え可能になっている必要がある。
.htaccessの書き換え可能にするには、httpd.confでmod_rewriteを有効にしておく。もし.htaccessを書き換えできない場合は、パーマリンクの設定を変更した際にエラーメッセージが表示される。

また、.htaccessを書き換えたとしてもパーマリンクにアクセスした際に404になることがある。その場合は、httpd.conf の セクションに AllowOverride All を明記すればよい。同じサーバなのにパーマリンクが使えないサイトがあるのはなぜかと悩んでいたら、これだった。

記事をページ分割

記事をページ分割して表示することができる。
記事の本文に<!–nextpage–>を記述すると改ページになるので、ひとつの記事が複数ページで表示されるようになる。

1ページ目の内容
<!–nextpage–>
2ページ目の内容
<!–nextpage–>
3ページ目の内容

使用中のテーマがページネーションに対応しているかどうか確認が必要。
自分でテーマを作成する際は、デフォルトテーマを参考にするとよい。

定期的に自動処理させる

WordPressに用意されている擬似CRONのようなものを使って、定期的な自動処理を実行することができる。
wp_schedule_event()で時間を指定して、独自のアクションフックを発生させる。
実行のタイミングは、毎時(hourly)か毎日(daily)。

毎日、午前5時に設定する場合
[sourcecode language=’php’]
$timenow = time();
$year = date(‘Y’, $timenow);
$month = date(‘n’, $timenow);
$day = date(‘j’, $timenow);
$hours = 5;
$minutes = 0;
$seconds = 0;
$schedule = mktime($hours, $minutes, $seconds, $month, $day, $year);
wp_schedule_event($schedule, ‘daily’, ‘everyday_myevent’);
[/sourcecode]

設定した時間になるとeveryday_myeventが発生するので、処理を関連づけておく。
[sourcecode language=’php’]
add_action(‘everyday_myevent’, ‘run_myschedule’);

function run_myschedule() {
// 処理
}
[/sourcecode]

解除する場合
[sourcecode language=’php’]
wp_clear_scheduled_hook(‘everyday_myevent’);
[/sourcecode]

状態を取得する場合
[sourcecode language=’php’]
if($next_scheduled = wp_next_scheduled(‘everyday_myevent’)){
$next = date(‘Y-m-d H:i:s’, $next_scheduled);
}
[/sourcecode]