PowerCMSで条件に応じて記事をファイル出力しない方法を調べた(2019年9月編)

公開

調べてみると、昔僕が会社のブログに「Movable Typeで記事をファイル出力しない方法を調べてみた」という記事を書いているのですが、それの応用編です。

案件には特殊な事情が絡むもので、テンプレートの出力パスを調整することによりブログAの記事をサイトAとサイトBに出力しているのですが、記事によってはサイトBには出力したくないという要件が出てきました。さてどうしたものか。

build_file_filterについて調べる

build_file_filterでどうにか出来るか否かだと思うので、MT::WeblogPublisherについて調べます。コールバックの項を見ていくとBuildFileFilterコールバックの説明があり、$argsからMT::TemplateMapオブジェクトが取れることが分かりました。これは使えそう。

ダンプしてみると以下のようなデータが取れました。template_idがあるのでサイトB用のテンプレートは出力しないという分岐が作れそうです。

bless( {
  '__cached' => {
    'MT::ObjectDriver::Driver::Cache::RAM' => 1
  },
  '__core_final_post_load_mark' => 1,
  '__is_stored' => 1,
  '__saved_output_file' => '2020/02/index.html',
  '__triggers' => {},
  '_class_trigger_results' => [],
  'column_values' => {
    'archive_type' => 'Monthly',
    'blog_id' => 2,
    'build_interval' => undef,
    'build_type' => 1,
    'file_template' => '%y/%m/%i',
    'id' => 38,
    'is_preferred' => 1,
    'noindex' => undef,
    'template_id' => 394
  }
}, 'MT::TemplateMap' )

また、会社ブログの記事にも書いていますがMT::Entryオブジェクトも取れるので、そこからMT::Categoryオブジェクトも取れます。これにより、サイトBであることの判別ができます。

bless( {
  '__children' => [],
  '__core_final_post_load_mark' => 1,
  '__is_stored' => 1,
  '__meta' => bless( {
    '__pkeys' => {
      'category_id' => 6
    },
    'pkg' => 'MT::Category'
  }, 'MT::Meta::Proxy' ),
  '__triggers' => {},
  '_class_trigger_results' => [
    [],
    [],
    [
      ''
    ]
  ],
  'column_values' => {
    'allow_pings' => 0,
    'author_id' => 1,
    'basename' => 'powercms',
    'blog_id' => 2,
    'class' => 'category',
    'created_by' => 1,
    'created_on' => '20181205154847',
    'description' => undef,
    'id' => 6,
    'ieo_original_id' => undef,
    'label' => 'PowerCMS',
    'modified_by' => undef,
    'modified_on' => '20181205154847',
    'parent' => 5,
    'ping_urls' => undef
  }
}, 'MT::Category' )

僕の課題は何とか解決ができそうです。