PowerCMS™
2025年1月1日購入分よりライセンスの価格を改定いたします。
[ブログ] PowerCMS 6 でのアップデートまとめ を追加しました。
[よくあるご質問] システムログに「タスクを実行するために必要なロックを獲得できませんでした」というログが残っている を追加しました。
[よくあるご質問] 特定のシステムログに絞って確認できますか? を追加しました。

PowerCMS ブログ

ホーム > PowerCMS ブログ > 技術情報 > インポート機能をプラグインで拡張する(2)

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のソースを様々な方法でパースして抽出することで、カスタムフィールドへの値の登録やより複雑な抽出、インポートなど様々な拡張が可能になります。


カテゴリー
プラグイン
技術情報

Recent Entries