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コールバックでいけそう。
まとめ
でいけそう。