追記:いつの間にか修正されたようで、現在では下記のフォーム部品は出現しません。一応記事はこのまま残しておきます。
新管理画面を使用している場合、クッキーを無効にしてブログを閲覧していると、フォーム(検索フォームとかコメントフォームとか)に謎のinput要素が現れます。type="hidden"になっているので気づきにくいですが、ソースは以下の通りです。
<input type="hidden" name="vcr" value="xxx..." />
value値は32桁くらいの英数で、リロードするたびに変化します。前回の記事のクエリと共通のようです。これ一体何なんでしょう。フォーラムにトピックがありますが、特に回答はなし。不具合ではなくこういう仕様ってことなんだと思いますが、どんな意味があるのか気になります。
あと困ったことに、件のinput要素はform直下に問答無用で挿入されます。DTDによっては、このような記述は誤りです(fieldsetとかpとかで囲む必要があります)。些細なことですが、これも気になる人は気になるはずです。
追記:いつの間にか修正されていた模様です。一応記事はこのまま残しておきます。
ちょっと気になるFC2ブログの不具合(仕様?)ぽい現象。クッキー無効状態で閲覧していると、相対パスで指定したURLによくわからないクエリ文字列がつきます(追記:新管理画面に移行している場合のみ発生するようです)。結構前から続いている現象ですが、どうやらフォーラムには特に報告されていないようです(見落としてるだけかも)。
参考として、以下に絶対パスと相対パスそれぞれで指定したこのブログのトップページへのリンクを載せておきます。
クッキーが有効になっていれば、上記2つはどちらもトップページにリンクされているはずです。しかしクッキーが無効になっていると、下の相対パス指定のURLに「?vcr=xxx...」という感じのクエリがつきます。このため、クリックしてもindex_areaに飛ぶことはできません(ページエリアに移動します)。
簡単な解決方法は、相対パス指定をやめて、絶対パスにすること。まあ私のようにクッキーを頻繁に切る人はたぶん少ないので、あまり問題になることもないと思います。
今作っているテンプレートは、基本1カラムで、上部メニュー(グローバルナビゲーション)からアーカイブ等のページに移動する、というタイプのものです。ギョさんのtabboxや、みりばーるさんのchameleonに近い感じです(かなり見劣りはしますが……)。
で、メニューにタグエリアへのリンクを追加しようと思ったんですが、ちょっとした壁にぶち当たりました。カテゴリー別ならば最初にblog-category-0(必ず存在する)に飛べばいいし、月別ならばとりあえずblog-date-<%now_year><%now_month>に飛べばいいんですが(ちなみに今は月別とカテゴリー別をまとめて"Archives"として、最初にtitlelist_areaへ移動して全記事一覧を表示するようにしています。chameleonとほぼ同じです。)、タグエリアは最初に移動すべきページが指定できないのです(自分のブログだけで使うなら、任意のタグのURLを直接書き込めば済むのですが)。一応、<%url>?tagとだけ指定する(こうすると、該当記事無しの状態のタグエリアに移動する)という手もありますが、最初のページの記事領域が空白というのは、なんとなく抵抗があります(個人的に)。あるいは、いっそのことタグも"Archives"にまとめてしまうこともできますが、タグはアーカイブというよりは検索の性質を持っていると思うので(これも個人的に)、一緒にすべきではないような気がします。
そこで前回の記事の出番です。タグエリアへのリンクを以下のようにします。
<!--ctag-->
<a href="<%ctag_url>">Tags</a>
<!--not_edit_area--><!--/ctag--><!--ctag--><!--/not_edit_area-->
<!--/ctag-->
ここではctagを使用したので、設定回数の一番多いタグのページにリンクされます。rtagを使えば一番最近追加されたタグ、stagを使えばランダムで決定されたタグのページへリンクされます。
ちなみに、前々回の記事の手法を使って、
<!--ctag--><!--not_edit_area--><!--/ctag-->
<!--ctag-->
<a href="<%ctag_url>">Tags</a>
<!--not_edit_area--><!--/ctag--><!--ctag--><!--/not_edit_area-->
<!--/ctag-->
<!--ctag--><!--/not_edit_area--><!--/ctag-->
という具合にすれば、タグを全く使用していない場合に、タグエリアへのリンクをメニューから消すことができます。
まあしかし、やっぱり得体の知れない技なので、共有登録するテンプレートに使うのはちょっと躊躇われます……。
今回も、FC2ブログの独自変数を利用した小技についてです。前回の記事を踏まえたうえで読んでください。そうでないとわけがわからんかもしれません。
いわゆるリスト型変数(前回勝手に名付けた)は、その内容を繰り返して表示するものです。何回繰り返すかは、該当する値の数によります。たとえば<!--archive-->〜<!--/archive-->は、記事が投稿された月の数だけその内容を繰り返します。
しかし今回紹介する方法を使えば、リスト型変数の1つ目の項目だけを表示することが可能となります。リスト型変数に分類される変数であれば、どの変数にも応用できます。つまり、たとえば<!--topentry-->〜<!--/topentry-->にも使えるので、最新の記事だけを表示する(もちろん環境設定の記事の表示件数をいじらずに!)ということも可能になります。……これはもしかしたら小技じゃなく大技かもわからんね。
では、topentryを使用した場合を例にとって解説します。通常下記のようになっている部分に
<!--topentry-->
内容(<%topentry_body>等)
<!--/topentry-->
次のように強調部分を書き加えるだけです。(追記:FCafeのDanielさんにコメント欄で指摘を頂き、タグの挿入位置を修正しました。)
<!--topentry-->
内容(<%topentry_body>等)
<!--not_edit_area--><!--/topentry--><!--topentry--><!--/not_edit_area-->
<!--/topentry-->
以上で完了。どういう仕組みなのかは謎ですが、これでtopentryの内容が最初の1つだけ出力されます。2つ目以降は出力されないので、もちろんソースにも全く現れません。
ここではnot_edit_areaを用いましたが、いわゆるフラグ型変数であれば他のものでも問題ないです。詳しくは前回の記事を参照してください。
他にどういう便利な使い方があるかなぁと考えてみました。そこで思い出したのが、FCafeさんの空リンク非表示 2という記事。もう3年近く前の記事ですが、今回紹介した手法を使えば、環境設定の「最新記事一覧」の表示件数を1件にすることなく同じことが実現できます。
やることはさっきの例と全く同じですが、一応書いておきます。リンク先の【方法】の項の一番下、head領域の部分の既述を以下のように書き換えるだけです。(追記:こちらもDanielさんのコメントの通り修正しました。)
<style type="text/css">
<!--recent-->
.nxt<%recent_year><%recent_month> {display: none;}
<!--not_edit_area--><!--/recent--><!--recent--><!--/not_edit_area-->
<!--/recent-->
</style>
強調部分が追加されました。空リンクを非表示にしたいけど、最新記事一覧を犠牲にしたくない、という人にはおすすめです。(追記:別の方法があるので、Danielさんのコメントを参照してください。)
今回紹介した小技、まだまだ使い道があると思います。Danielさんならもっとナイスな使い方を思いつきそうです。あとこの技のカラクリも解き明かしてくれそうな気が……というわけで時空を超えたトラバを送ってみました。
FC2ブログで使用できる、ほんの少し便利かもしれないテクニックを発見しました。ただ、このテクニックには謎が多いので、まだまだ検証が必要かと思われます。一応、現時点でわかっていることを(主に自分のために)メモしておきます。
説明しやすくするため、FC2ブログ用の独自変数を以下のように(勝手に)分類することにします。
まず、テンプレートの中に以下のようなソースがあるとします。
<dl id="sidebar">
<dt>カテゴリー</dt>
<dd>
<ul>
<!--category--><li><a href="<%category_link>" ><%category_name> (<%category_count>)</a></li><!--/category-->
</ul>
</dd>
<dt>最近のコメント</dt>
<dd>
<ul>
<!--rcomment--><li><a href="<%rcomment_link>" ><%rcomment_name> → <%rcomment_title></a></li><!--/rcomment-->
</ul>
</dd>
<dt>最近のトラックバック</dt>
<dd>
<ul>
<!--rtrackback--><li><a href="<%rtrackback_url>" ><%rtrackback_title>(<%rtrackback_blog_name>)</a> → <a href="<%rtrackback_link>" ><%rtrackback_etitle></a></li><!--/rtrackback-->
</ul>
</dd>
</dl>
まあよくあるサイドバーのようなものです。全体を<dl>で囲み、<dt>に項目名、<dd>内にその内容を<ul><li>で並べています。
こういう場合、カテゴリーは必ず1つは存在しているので問題ありませんが、コメントやトラックバックがまだ1件もないときは、空の<ul></ul>ができてしまうという問題が起こります。空のリストなんて気にする人はほとんどいないと思いますが、そのほかに、コメントやトラックバックがないのに「最近のコメント」「最近のトラックバック」といった項目名が表示されるのも、少し気になったりすると思います。
そこで、以下のようにすると、コメントやトラックバックがない場合に「最近のコメント」「最近のトラックバック」の項目をまるごと消し去ることができます。単に非表示にするだけではなく、ソースから完全に消せます。
<dl id="sidebar">
<dt>カテゴリー</dt>
<dd>
<ul>
<!--category--><li><a href="<%category_link>" ><%category_name> (<%category_count>)</a></li><!--/category-->
</ul>
</dd>
<!--rcomment--><!--not_edit_area--><!--/rcomment-->
<dt>最近のコメント</dt>
<dd>
<ul>
<!--rcomment--><li><a href="<%rcomment_link>" ><%rcomment_name> → <%rcomment_title></a></li><!--/rcomment-->
</ul>
</dd>
<!--rcomment--><!--/not_edit_area--><!--/rcomment-->
<!--rtrackback--><!--not_edit_area--><!--/rtrackback-->
<dt>最近のトラックバック</dt>
<dd>
<ul>
<!--rtrackback--><li><a href="<%rtrackback_url>" ><%rtrackback_title>(<%rtrackback_blog_name>)</a> → <a href="<%rtrackback_link>" ><%rtrackback_etitle></a></li><!--/rtrackback-->
</ul>
</dd>
<!--rtrackback--><!--/not_edit_area--><!--/rtrackback-->
</dl>
強調部分が追加されました。これだけで完了です。コメントやトラックバックが1件もないときは、強調部分に挟まれた内容がきれいさっぱり消え失せます。コメントやトラックバックがあれば、何の問題もなく通常通り表示されます。
これを一般化すると、以下のようになります。
<!--リスト型変数--><!--フラグ型変数--><!--/リスト型変数-->
(リスト型変数が空のときに消える内容)
<!--リスト型変数--><!--/フラグ型変数--><!--/リスト型変数-->
このとき、リスト型変数はすべて共通のものにする必要があります。しかしフラグ型変数に関しては、共通のものにする必要はありません。たとえば<!--category_area-->〜<!--/not_search_area-->のように、前後のタグが対応関係になくても問題ありません。とにかくいずれかのフラグ型変数で開始し、いずれかのフラグ型変数で閉じれば、正常に機能するようです(<!--not_edit_area-->〜<!--not_edit_area-->のように閉じなかった場合、エラーでページ自体が表示されません)。また、これはどのページでも関係なく、たとえばトップページ(index_area)において<!--not_index_area-->〜<!--/not_index_area-->という組み合わせを使用しても、同様の結果が得られます。
これが、このテクニックの謎の部分です。そもそも、一体どういう仕組みでこのようなテクニックが可能となっているのか……?
たとえば<!--rcomment-->〜<!--/rcomment-->は、最近のコメントの数だけその中身を繰り返して表示します。環境設定で最近のコメントの表示件数を5件に設定して、ブログにコメントが5件以上寄せられている状態では、<!--rcomment-->あ<!--/rcomment-->は「あああああ」と表示されます。同様に、3件ならば「あああ」、1件ならば「あ」とだけ表示されます。そして、コメントが1件も寄せられていない状態では、「あ」を0回繰り返して表示、つまり何も表示されません。
同様に考えれば、<!--rcomment--><!--not_edit_area--><!--/rcomment-->や<!--rcomment--><!--/not_edit_area--><!--/rcomment-->も、コメントが0件のときには何の意味も持たなくなるはずです。ところが、なぜか上記のようなことが起こるのです。しかも、単純に<!--rcomment-->〜<!--/rcomment-->の中身が出力されるわけではないようです(もしそうであれば、前述のようにindex_areaにおいて<!--not_index_area-->〜<!--/not_index_area-->を使用したり、対応関係にないタグを組み合わせたりはできないはずです)。
さらに、なぜコメントやトラックバックがある場合に問題が生じないのか、という点も謎です。すなわち、最近のコメントが5件あれば、<!--rcomment--><!--not_edit_area--><!--/rcomment-->は一見<!--not_edit_area-->を5回繰り返しそうに思えます。そうであれば、たとえば<!--rcomment--><!--category_area--><!--/rcomment-->〜<!--rcomment--><!--/not_search_area--><!--/rcomment-->は
<!--category_area--><!--category_area--><!--category_area--><!--category_area--><!--category_area-->
内容
<!--/not_search_area--><!--/not_search_area--><!--/not_search_area--><!--/not_search_area--><!--/not_search_area-->
という具合になり、閉じられるべきものが正しく閉じられていないため、当然ながらエラーでページが表示できなくなるはずです。ところが実際は、このような問題は生じず、通常どおり項目が表示されます。とはいえ、ここで<!--/not_search_area-->を省略するとエラーになるため、このことから、<!--rcomment-->〜<!--/rcomment-->内が完全に無視されているわけではないということが推測できます。
……書いていてわけがわからなくなってきたので、謎解きはひとまずこの辺まで。
どういう仕組みかはさておき、これは地味に使えるテクニックではないかと思います。コメントとトラックバックを例にとりましたが、もちろんほかの変数でも同様で、たとえば、
<!--topentry--><!--not_edit_area--><!--/topentry-->
(エントリーが存在しないときに消える内容)
<!--topentry--><!--/not_edit_area--><!--/topentry-->
のようにすれば、エントリーが1つもない場合(ブログ内検索で1件もヒットしなかった場合等)に、エントリーを内包しているブロック自体を消したりできます。工夫次第では、何かもっと面白いことができるかもしれません。