Home

WolaWola

公開キューをHogeHogeする地味なプラグインを書いた

  • Posted by: oscar
  • 2013年8月 7日 22:30
  • MovableType

ちょっとプラグインまとめに入る前に、個人的に書いてたプラグインの話を。
世間じゃDATA APIネタで持ちきりですか、今更のリスティングフレームワーク+公開キュープラグインです。

naoaki011/mt-plugin-publishque-manager

MT5以下だと「Publish Queue Manager | majordojo」が利用できます。もちろんMT5.1以降でも利用できるのですが、リスティングフレームワークで書き直したいと、常々思っていたので、MT6のベータに併せて思い切って書いてみました。

プラグインについて

公開キューを表示・管理するためのMovable Type プラグインです。
未確認ですが、リスティングフレームワークが追加された、Movable Type 5.1以降なら利用可能なはずです。(テストはMT6b1で行なっています)
GitHubで仮公開中ですが、いくつか問題点が見つかっています。

機能説明

  • リスティングフレームワークで、公開キューを表示します。
  • 選択した公開キューを削除出来ます。
  • 選択した公開キューを再構築出来ます。
  • 選択した公開キューの優先度を変更出来ます。

優先度変更

優先度変更はプラグインアクションになっています。選択されたキューの優先度をポップアップ入力欄に入れた数字に変更します。

追加予定の機能

  • リスティングフレームワークでの項目フィルターを作成する
  • ts_jobはMT::Worker::Publish以外も存在するので対応処理を追加する
  • ブログで表示した時は、ブログ以下の公開キューに限定して表示する

現在は公開キューというメニューで表示していますが、処理としては「MT::Worker::Publish」以外もロードしているので、メニューに対してフィルターされた状態で表示できるようにするつもりです。

バグとして認識している点

  • ラベルとカラムがずれて表示される
  • priority指定した項目が幅ゼロになる

Publish Queue Manager

ts_jobをリスティングフレームワークとして表示したところ、何故かラベル部分とデータ部分が一列分カラムがずれました。シックス・アパート高山さんに相談してみたところ、「ts_jobは特殊だからなぁ」とのお言葉でした。ずれているだけで、ソートなど機能は正常に動作しています。
またフィルターの候補として空の項目名が表示されているので、どうもココら辺が関係していそうな感じです。

空白の項目名

MT6beta1プラグインの動作(1)

  • Posted by: oscar
  • 2013年7月13日 20:52
  • MovableType

きちんとしたまとめは後でやるとして、入れた段階で問題があったもの。

他は入れただけでのエラーとかは発生していないが、詳細確認は後で行います。

お約束のMT6beta1にしてみた

  • Posted by: oscar
  • 2013年7月12日 10:01
  • MovableType

出たもんは試すので。

まんまココをアップデートして、早速プラグイン2つインストールした。

メールフォームが心配だったけど、問題なくメール送信できているようです。

他にも、ウェブサイトで記事が扱えるようになったので、ブログだったものを裏でゴリゴリとウェブサイトに変更しました。
特に問題無さそうです。

EntryNumber By Dayプラグイン更新

  • Posted by: oscar
  • 2013年4月25日 14:21
  • MovableType

えーと、一年近く更新サボってました。
いろいろと報告する内容があるのですが、それはGWに余裕があったらということで。

EntryNumber By Dayプラグインに機能を追加しました。

naoaki011/mt-plugin-entrynumber-by-day · GitHub

とある案件で、その日の連番をカテゴリー縛りでやりたいという話があり、あぁあったら使いそうだなと記憶していたのですが、先日のMTCafe Tokyo 2013 Springの帰りに藤本さんに、カテゴリーに属さないエントリーをリスティングするにはMT5.1移行以降で使えるleft joinってのを使えばいいんだと教えてもらい、早速書いてみました。

新たに「MTEntryNumberByDayOnCategory」というファンクションタグを追加しました。

ブログ記事のプライマリーカテゴリー内で、同日何番目の記事かを出力します。記事にカテゴリーが指定されていない場合は、同日のカテゴリー指定されていない記事として何番目かを出力します。(このためにleft joinが必要だった)
「MTEntryNumberByDay」と同じく「prefix」「zeropad」「always」のモディファイアが指定できます。

「MTEntryNumberByDay」についてはダイナミック・パブリッシングに対応済みですが、「MTEntryNumberByDayOnCategory」は、まだダイナミック・パブリッシングに対応していません。

以前の記事「EntryNumberByDayプラグインを改造してみた - WolaWola

念のため補足ですが、基本的な使い方としてはブログ記事のアーカイブマッピングで、ファイル名部分にタグを書きます。オリジナルは野田さんが書いたものです。

ダイナミックパブリッシングで、複数ブログ利用でのパスが同じ時

  • Posted by: oscar
  • 2012年6月 9日 22:13
  • MovableType

チョット5月はいろんなことがありまして、まぁその件はいずれやるとして、久しぶりに記事書きます。

商用サイトを作るときなどに、複数ブログを扱うことがあると思いますが、諸々の事情で(例えば、日英のコンテンツを別なパスに公開する必要があるとか)ブログの公開パスが同じ物が存在するということは、良くあると思います。

  • ウェブサイト(http://www.hoge.com/)
    • ウェブサイトの日本語ウェブページ(http://www.hoge.com/・・・)
    • ウェブサイトの英語ウェブページ(http://www.hoge.com/en/・・・)
    • ブログ1(http://www.hoge.com/)
      • ブログ1の日本語アーカイブ(http://www.hoge.com/blog1/・・・)
      • ブログ1の英語アーカイブ(http://www.hoge.com/en/blog1/・・・)
    • ブログ2(http://www.hoge.com/)
      • ブログ2の日本語アーカイブ(http://www.hoge.com/blog2/・・・)
      • ブログ2の英語アーカイブ(http://www.hoge.com/en/blog2/・・・)

この様な場合に、それぞれのブログでダイナミックパブリッシングを利用しようとすると、うまく行かなくなるケースがあります。 その原因と、対応方法について説明します。

ダイナミックパブリッシングの簡略化した仕組み

動作には2つのファイルが関連してます。「.htaccess」と「mtview.php」です。

## %%%%%%% Movable Type generated this part; don't remove this line! %%%%%%%
# Disable fancy indexes, so mtview.php gets a chance...
Options -Indexes +SymLinksIfOwnerMatch
  <IfModule mod_rewrite.c>
  # The mod_rewrite solution is the preferred way to invoke
  # dynamic pages, because of its flexibility.

  # Add mtview.php to the list of DirectoryIndex options, listing it last,
  # so it is invoked only if the common choices aren't present...
  <IfModule mod_dir.c>
    DirectoryIndex index.php index.html index.htm default.htm default.html default.asp /test/mtview.php
  </IfModule>

  RewriteEngine on

  # don't serve mtview.php if the request is for a real directory
  # (allows the DirectoryIndex lookup to function)
  RewriteCond %{REQUEST_FILENAME} !-d

  # don't serve mtview.php if the request is for a real file
  # (allows the actual file to be served)
  RewriteCond %{REQUEST_FILENAME} !-f
  # anything else is handed to mtview.php for resolution
  # passthrough query parameters
  RewriteRule ^(.*)(\?.*)?$ /test/mtview.php$2 [L,QSA]
</IfModule>

<IfModule !mod_rewrite.c>
  # if mod_rewrite is unavailable, we forward any missing page
  # or unresolved directory index requests to mtview
  # if mtview.php can resolve the request, it returns a 200
  # result code which prevents any 4xx error code from going
  # to the server's access logs. However, an error will be
  # reported in the error log file. If this is your only choice,
  # and you want to suppress these messages, adding a "LogLevel crit"
  # directive within your VirtualHost or root configuration for
  # Apache will turn them off.
  ErrorDocument 404 /test/mtview.php
  ErrorDocument 403 /test/mtview.php
</IfModule>
## ******* Movable Type generated this part; don't remove this line! *******

ダイナミックパブリッシングを利用するようにした場合、ブログルート(この例ではブログの公開パスは/test/です。)のこんな感じの内容の「.htaccess」が書き出されてると思います。いっぱい書いてあるように見えますが、大半がコメントとフェイルセーフのための内容です。 Apacheでmod_rewriteとmod_dirが有効の場合、意味を持つのは、次の6行だけです。

Options -Indexes +SymLinksIfOwnerMatch
DirectoryIndex index.php index.html index.htm default.htm default.html default.asp /test/mtview.php
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)(\?.*)?$ /test/mtview.php$2 [L,QSA]

3行目でリライト処理を有効にし、4・5行目でファイルが存在しない場合のみ処理を限定し、6行目でクエリを引き継ぎながら処理をmtview.phpに渡しています。

<?php
    include('/usr/local/httpd/cgi-bin/MT/php/mt.php');
    $mt = MT::get_instance(90, '/usr/local/httpd/cgi-bin/MT/mt-config.cgi');
    $mt->view();
?>

「mtview.php」も同じくブログルートにこの様な内容で書き出されていると思いますが、この中で注意するのは、MT::get_instanceの最初の因数の「90」の部分です。これはこのブログのブログIDになります。 ここからは、このブログIDを頼りに、MTが管理している(バーチャルな)ファイルかを判断(実ファイルを持たないアーカイブパスも「mt_fileinfo」のテーブルに保存されてます)して、コンテクストに応じた処理を返すようになっています。

パスが同じブログが複数ある場合の問題と対応

ここまで読めば、気づいたと思いますが、このブログIDを元に判断するというのがキモで、その為、複数ブログが同じ公開パスを持っていた場合、それぞれのブログから「mtview.php」が書き出され、ファイルが存在するか判断する為のブログIDが、正しく与えられずにダイナミックパブリッシングの処理としてエラーになります。

この問題を解決するには、適切なブログIDをそれぞれ対象ごとに渡すようにする事が必要です。

異なる階層にそれぞれを設置する場合

最初に上げた例のような構造の場合は、公開パスは一緒でも、実際にファイルを書き出すパスは、それぞれ違っているので、各階層に「.htaccess」と「mtview.php」を置いてやれば解決します。mtview.phpの中で、それぞれ対応するブログIDを指定すれば解決です。

同一階層で処理を分ける場合

あまりないとは思いますが、複数ブログで権限を持つユーザーが異なり、それぞれが管理するウェブページがルートに書き出される場合、「.htaccess」をそれぞれで設置は出来なくなります。その要な場合は「mtview.php」はリネームしても動作するので、「mtview1.php」と「mtview2.php」を用意してそれぞれに対応するブログIDを書き、以下の様な「.htaccess」で振り分け処理をすれば大丈夫です。「file1.html」は「mtview1.php」で、「file2.html」は「mtview2.php」でそれぞれ処理されます。どちらにも合致しないファイルリクエストは、「mtview.php」で処理されます。

Options -Indexes +SymLinksIfOwnerMatch
DirectoryIndex index.php index.html index.htm default.htm default.html default.asp /test/mtview.php
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(file1\.html)(\?.*)?$ /mtview1.php$2 [L,QSA]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(file2\.html)(\?.*)?$ /mtview2.php$2 [L,QSA]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)(\?.*)?$ /mtview.php$2 [L,QSA]

おまけ

リクエストのエラーページをApacheで設定している場合でも、ダイナミックパブリッシングが有効なパス以下では、ダイナミックパブリッシングのエラーページが表示されます(システムテンプレートの「ダイナミックパブリッシングエラー」の内容)。存在しない全てのファイルのリクエストをダイナミック・パブリッシングが処理するからです。

対象とするパスが明確な場合は、特定のリクエストのみダイナミック・パブリッシングが有効になるように「.htaccess」を書いたほうがリクエストに対する反応時間や、ダイナミックパブリッシングの起動時間(ファイルがないことを返すまでに時間)を節約できます。例えばブログ記事(標準のアーカイブマップ)のみをダイナミック・パブリッシングの対象にする場合は、以下のようにすれば、でたらめなリクエストを投げられた時のエラー表示までの時間が短縮されます。

Options -Indexes +SymLinksIfOwnerMatch
DirectoryIndex index.php index.html index.htm default.htm default.html default.asp /test/mtview.php
RewriteEngine on
RewriteRule ^\d{4}/\d{2}/(.*)(\?.*)?$ /mtview.php$2 [L,QSA]

DynamicMTMLの場合も基本的な考え方は一緒ですが、「.htaccess」と「.mtview.php(DynamicMTMLの場合はmtview.phpではない)」の内容が、もう少し複雑になるので書き換えに注意が必要です。

Index of all entries

Home

Blogs
  • mt.Vicuna:mt.VIcunaの公開場所です。
  • PlugInf:Movable Typeプラグインに関する、動作情報など、各種情報を発信します。
  • SideB
Nakanohito

CC Licence

Creative Commons License

このブログはクリエイティブ・コモンズでライセンスされています。

Feeds

Return to page top