2009年03月10日
インポート機能をプラグインで拡張する(2)
先日の記事 インポート機能をプラグインで拡張する でインポート機能を拡張するプラグインの作り方について例をあげてご説明しました。今日はもうひとつ拡張の例をご紹介します。
エントリー(ブログ記事)が 2009/3/9/basename.html のように日付ベースのパスで保存されている場合限定ですが、インポート対象のパスから日付を取得してブログ記事の公開日にセットするプラグインの例です。
sub _cms_post_import {
my ( $cb, $app, $entry, $path, $data ) = @_;
my $site_path = $app->blog->site_path;
$site_path = quotemeta( $site_path );
$path =~ s/^$site_path//;
$path =~ s/^¥///;
my @dates = split( /¥//, $path );
my $y = $dates[0];
my $m = $dates[1];
my $d = $dates[2];
my $ts = sprintf( "%04d%02d%02d000000", $y, $m, $d );
$entry->authored_on( $ts );
$entry->save or die $entry->errstr;
}
インポート直後に処理を行うためには cms_post_import.entry(page) コールバックに呼応して動作するプラグインを書きます。変数 $path にはインポート元ファイルのフルパスが格納されていますので、パス情報から日付を組み立ててエントリーの公開日 (authored_on) にセットしてやれば良いことになります。
もう一例、今度はHTMLのソースから日付を抽出してエントリーの公開日をセットする例です。
例えばHTMLの中で日付が「<p id="date">2009年3月9日</p>」のようにマークアップされているとします。この場合も同じく cms_post_import.entry(page) コールバックに呼応して動作するプラグインを書きます。
sub _cms_post_import {
my ( $cb, $app, $entry, $path, $data ) = @_;
if ( $data =~ m!<p¥sid="date">(.*?)</p>! ) {
my $date = $1;
if ( $date ) {
if ( $date
=~ /([0-9]{4})年([0-9]{1,2})月([0-9]{1,2})日/ ) {
my $y = $1;
my $m = $2;
my $d = $3;
my $ts = sprintf( "%04d%02d%02d000000",
$y, $m, $d );
$entry->authored_on( $ts );
$entry->save or die $entry->errstr;
}
}
}
}
変数 $data にはインポート元のHTMLソースが丸ごとそのまま入っています。HTMLのソースを様々な方法でパースして抽出することで、カスタムフィールドへの値の登録やより複雑な抽出、インポートなど様々な拡張が可能になります。
コメントを投稿する