概要 ▶ WordPressの「Public Post Preview」というプラグインっぽいことをMovable Typeのテンプレートだけでやってしまおうということで「Movable TypeでWordPressの「Public Post Preview」っぽいものを作る(類推しづらいファイル名編)」というエントリーを書きました。表だって公開したくないときにはカスタムフィールドのチェックをつけるだけで、
WordPressの「Public Post Preview」というプラグインっぽいことをMovable Typeのテンプレートだけでやってしまおうということで「Movable TypeでWordPressの「Public Post Preview」っぽいものを作る(類推しづらいファイル名編)」というエントリーを書きました。
表だって公開したくないときにはカスタムフィールドのチェックをつけるだけで、類推しづらいファイル名になるので、このアドレスを特定の人にだけ教えれば本公開の前に特定の人だけチェックできるというわけです。
ここで気をつけなければならないのは、エントリーを「公開」にしたことで他のテンプレートの出力結果にも影響してしまうという点です。
デフォルトのテンプレートにもあるわかりやすい例では「最新記事のフィード」(いわゆるRSS・Atom)です。
RSSには最新の公開エントリーが15件分書き込まれています。(デフォルトのテンプレート)
なので、たとえファイル名を類推しづらい複雑なものにしても、そのままではアドレスがしっかり入ってしまっていることになります。
「最新記事のフィード」から除外される様にしておかないと、場合によってはすぐにGoogleさんに情報を収集されてしまってインデックスされ、検索エンジンの結果に掲載されてしまうことも考えられます。
これでは元も子もありません。
このエントリーではそれを防ぐためのテンプレートモジュールの書き方を考えてみます。
「最新のフィード」に含まれないようにするためには
「最新のフィード」に含まれないようにするためには、前回作った「一般公開しないためのカスタムフィールド《cf_Public_Post_Preview》」にチェックが入っているかどうかを判定して、チェックが入っていれば除外すれば良い、ということになります。そんなに難しくはないですね。
「最新のフィード」のテンプレートに書かれている
<mt:Entries lastn="15">
ですが、これは最新のエントリーから15件を出力するという命令です。
(正しく言えばエントリーの出力命令でモディファイアが最新の15件だけを出力しなさいと指示している)
ここにモディファイアをつけることで特定のカスタムフィールドの値があるかないかを簡単に除外することができます。
今回利用するモディファイアは「field:customfieldbasename="foo"」です。
field:customfieldbasename="foo"※なお、上記サンプルは「カスタムフィールドのベースネームがproduct_rankという前提で書かれている。書いていないけど…。
カスタムフィールドの値 foo を利用して出力する記事をフィルタリングできます。モディファイアの customfieldbasename には、カスタムフィールド機能で作成したフィールドの [ベースネーム] を設定します。
例えば表示するブログ記事を、値が 2 だけのものにしたいときは次サンプルのようにします。
<MTEntries field:product_rank="2"> ... </MTEntries>MTEntries | テンプレートタグリファレンス
上記のサンプルを見るとわかる様に、
<mt:Entries lastn="15" field:《カスタムフィールドのベースネーム》="foo">
とすれば、《カスタムフィールド名》が「foo」のものだけを出力することができます。
つまり今回の場合はカスタムフィールド「cf_Public_Post_Preview」にチェックが付いていない(=なにも値がない)もので最新の15件を出力すれば良いので以下の通りになります。
<mt:Entries field:cf_Public_Post_Preview="" lastn="15">
ここでちょっと注意点があります。
業界の人達には常識過ぎて、あまりMovable Typeの参考書やマニュアルには強調して書かれていないのですが、モディファイアは左側から順に実行されます。
このため、
<mt:Entries field:cf_Public_Post_Preview="" lastn="15">と
<mt:Entries lastn="15" field:cf_Public_Post_Preview="">は似ているけど違います。
前者は最初にカスタムフィールド「cf_Public_Post_Preview」に値が無いものを残して、残ったものから最新の15件のエントリーを出力します。
後者は最初に最新の15件のエントリーを抜き出して、カスタムフィールド「cf_Public_Post_Preview」に値が無いものを出力します。
なので、後者は場合によって15件分のエントリーが出力されないことがあります。(例えば最新のエントリーのうち7件にカスタムフィールド「cf_Public_Post_Preview」のチェックが入っているなど)
注意しましょう。
最終的な「最新のフィード」
元々のテンプレートは以下の様になっています。(前略) <mt:Entries lastn="15"> <entry> (略) </entry> </mt:Entries> (後略)
これの「<mt:Entries lastn="15">」を「<mt:Entries field:cf_Public_Post_Preview="" lastn="15">」に変更するだけです。
簡単でしたね。
最終的にできた「最新のフィード」を掲載しておきます。
<$mt:HTTPContentType type="application/atom+xml"$><?xml version="1.0" encoding="<$mt:PublishCharset$>"?> <feed xmlns="http://www.w3.org/2005/Atom"> <title><$mt:BlogName remove_html="1" encode_xml="1"$></title>
<link rel="alternate" type="text/html" href="<$mt:BlogURL encode_xml="1"$>" />
<link rel="self" type="application/atom+xml" href="<$mt:Link template="feed_recent"$>" />
<id>tag:<$mt:BlogHost exclude_port="1" encode_xml="1"$>,<$mt:TemplateCreatedOn format="%Y-%m-%d"$>:<$mt:BlogRelativeURL encode_xml="1"$>/<$mt:BlogID$></id>
<updated><mt:Entries lastn="1"><$mt:EntryModifiedDate utc="1" format="%Y-%m-%dT%H:%M:%SZ"$></mt:Entries></updated>
<mt:If tag="BlogDescription"><subtitle><$mt:BlogDescription remove_html="1" encode_xml="1"$></subtitle></mt:If>
<generator uri="http://www.sixapart.com/movabletype/"><$mt:ProductName version="1"$></generator> <mt:Entries lastn="15" field:cf_Public_Post_Preview=""> <entry>
<title><$mt:EntryTitle remove_html="1" encode_xml="1"$></title>
<link rel="alternate" type="text/html" href="<$mt:EntryPermalink encode_xml="1"$>" />
<id><$mt:EntryAtomID$></id>
<published><$mt:EntryDate utc="1" format="%Y-%m-%dT%H:%M:%SZ"$></published>
<updated><$mt:EntryModifiedDate utc="1" format="%Y-%m-%dT%H:%M:%SZ"$></updated>
<summary><$mt:EntryExcerpt remove_html="1" encode_xml="1"$></summary>
<author>
<name><$mt:EntryAuthorDisplayName encode_xml="1"$></name>
<mt:If tag="EntryAuthorURL"><uri><$mt:EntryAuthorURL encode_xml="1"$></uri></mt:If>
</author>
<mt:EntryCategories>
<category term="<$mt:CategoryLabel encode_xml="1"$>" scheme="http://www.sixapart.com/ns/types#category" />
</mt:EntryCategories>
<mt:EntryIfTagged><mt:EntryTags><category term="<$mt:TagName normalize="1" encode_xml="1"$>" label="<$mt:TagName encode_xml="1"$>" scheme="http://www.sixapart.com/ns/types#tag" />
</mt:EntryTags></mt:EntryIfTagged>
<content type="html" xml:lang="<$mt:BlogLanguage ietf="1"$>" xml:base="<$mt:BlogURL encode_xml="1"$>">
<$mt:EntryBody encode_xml="1"$>
<$mt:EntryMore encode_xml="1"$>
</content>
</entry>
</mt:Entries>
</feed>
これで検索エンジンやRSSリーダーでブログを読んでいる人にバレないで、一部の人に確認作業をしてもらうことができます。
WordPress使いの方、いかがでしょうか。
こんな感じがWordPressの「Public Post Preview」でしょうかね?
違ったら教えて下さい(笑)。
指定日で非公開にする機能について
なお、指定日時で公開にする機能はMovable Typeに標準でありますが、指定日時で非公開にする機能は標準では存在しないので、以下のいずれかのプラグインを併用する使う必要があります。-
MT > Period - ToI
《修正BSDライセンス:無料》 - エディション別機能比較 | 特徴と機能 | MTCMS - ウェブサイトを「かんたん」にするCMS
《MTCMS smart:102,900円》他の色々な機能も付いている。 - FutureUnpublish 3rd Focus
《52,500円》
大規模過ぎる感じになるかもしれないけど以下のものもあります(315,000円から)。
それではまた(^-^)/