タケユー・ウェブ日報

Ruby on Rails や Flutter といったWeb・モバイルアプリ技術を武器にお客様のビジネス立ち上げを支援する、タケユー・ウェブ株式会社の技術ブログです。

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

でいけそう。