読者です 読者をやめる 読者になる 読者になる

元フリーエンジニアライフ

Ruby on Rails とか MovableType とかAWSやってるフリーランスウェブエンジニアの記録でした。現在は法人成りしてIT社長。

MovableTypeで記事公開時に処理したいとき

MailMugで、記事公開時にメルマガ配信ジョブ登録したかった。

公開時処理?

  • 記事保存時
    • 新規作成で公開
    • ステータスを公開に変更
  • 一括編集
    • ステータスを公開に変更
  • 指定日時公開

それぞれのコールバックについて。

記事保存時

lib/MT/CMS/Entry.pm

MT::CMS::Entry::save

$app->run_callbacks( 'cms_post_save.' . $type, $app, $obj, $orig_obj );  # $type は ブログ記事 entry かウェブページ page

cms_post_save.entryが使えそう。

コールバック補足

公式ドキュメント

コールバックとフックポイント

https://github.com/movabletype/Documentation/wiki/Japanese-plugin-dev-3-2

config.yaml でコールバックを登録

Perlで実装

コールバックの引数をいちいち覚えてらんない!

run_callbacksの引数を見れば一目瞭然

$app->run_callbacks( 'cms_post_save.' . $type, $app, $obj, $orig_obj ); 

なので

sub _hdlr_cms_post_save_entry {
  my ( $cb, $app, $obj, $orig_obj ) = @_;
}

とかけることがわかる。

一括編集

一括編集を実際に行ってみる

_mode=save_entries type=entry

MT::CMS::core_methods を見れば__modeと実装コードの対応がわかる

'save_entries' => {
    code      => "${pkg}Entry::save_entries",
    no_direct => 1,
},

MT::CMS::Entry::save_entries

$app->run_callbacks(
    'cms_post_bulk_save.' . ( $type eq 'entry' ? 'entries' : 'pages' ),
    $app, \@objects );

コールバック引数の\@objectsはその前

push( @objects, { current => $entry, original => $orig_obj } );

にある通りで、これでも「公開に変更された」ことはわかりそう。

なので、このコールバック「cms_post_bulk_save.entries」が使えそう。

指定日時公開

MTは「タスク」で公開処理を行う。

追ってみる。

MT::Core::load_core_tasks

        'FuturePost' => {
            label     => 'Publish Scheduled Entries',
            frequency => $cfg->FuturePostFrequency * 60,    # once per minute
            code      => sub {
                MT->instance->publisher->publish_future_posts;
                }
        },

MT::publisher

   sub publisher {
        my $mt = shift;
        $mt = $mt->instance unless ref $mt;
        require MT::WeblogPublisher;
        $mt->request('WeblogPublisher')
            || $mt->request( 'WeblogPublisher', new MT::WeblogPublisher() );
    }

MT::WeblogPublisher::publish_future_posts

    MT->run_callbacks( 'scheduled_post_published', $mt, $entry );

scheduled_post_publishedコールバックでいけそう。

まとめ

  • 記事保存時 cms_post_save.entry
  • 一括編集 cms_post_bulk_save.entry
  • 指定日時公開 scheduled_post_published

でいけそう。