FC2ブログでは現在、他のブログサービスにあるような記事の予約投稿的なことはできません。投稿時に記事の日時を未来のものにしても、公開した時点でそのまま公開されます(日時は設定したものになっている)。
これはこれで使いようがあるのですが、それでも予めいくつか記事を書きためておいてから適宜指定の日時に公開したい場合、どうしようもありません。
わたしはそのような予約投稿が実装されることを希望しているひとりでもあるのですが、現時点で実装される気配もないようなのであきらめていました。
先日、FC2ブログのユーザーフォーラムにてJavaScriptを使ってユーザー側で擬似予約投稿を実現できることを知り、それを参考にしつつ自分なりに使いやすいように改造してみましたので、ご紹介させていただきます。
基本的に
FCafeのdaniel様の作成したオリジナルのスクリプトの機能を継承しつつ、
日時まで指定して予約投稿(実際には時刻による表示の制御)ができるようにしてみました。
各記事は投稿時に指定した日時(年・月・日・時・分)に、指定したモードに従って表示されます。
オリジナル版同様に、以下の3つのモードを各記事ごとに指定できます。
・待機モード(指定日時になったら表示、いわゆる予約投稿的な動作)
・限定モード(指定日時になるまで表示、期間限定で表示するおしらせ的なものに)
・通常モード(公開状態なら常に表示、未来の日時だろうとそのまま表示)
−スクリプトの設置手順−
1. <head>〜</head>間にJavaScriptの2つの関数を定義する。
<head>
※ほかのタグはそのまま
<script type="text/javascript">
<!--
function TimeCntl(){
for (k=0;k<2;k++) {
if (k==0) {
var Tag=document.getElementsByTagName('DIV') }
if (k==1) {
var Tag=document.getElementsByTagName('LI') }
for (i=0;i<Tag.length;i++) {
if (Tag[i].className=="time") {
Suppress(Tag[i].id); } } }
}
function Suppress(TI) {
var CT=new Date();
var ID=TI.split('-');
var ET=new Date(ID[1],ID[2]-1,ID[3],ID[4],ID[5]);
if ((ET>CT && ID[6]=="00")||(ED<CT && ID[6]=="01")){
document.getElementById(ID).style.display="none"; }
}
//-->
</script>
</head>
2. topentryブロック(<!--topentry-->〜<!--/topentry-->)を下記のようにdivタグで囲む。
<!--topentry-->
<div class="time" id="ent-<%topentry_year>-<%topentry_month>-
<%topentry_day>-<%topentry_hour>-<%topentry_minute>-<%topentry_second>">
※ほかのタグはそのまま
</div>
<!--/topentry-->
3. 最新エントリーリスト(のプラグイン)があれば、そのliタグを下記のように変更する。
<li &align class="time" id="lst-<%recent_year>-<%recent_month>-
<%recent_day>-<%recent_hour>-<%recent_minute>-<%recent_second>">
※リスト項目部分はそのまま
</li>
4. プラグインの場合は、liタグのあとに下記のJavaScriptも記述する。
<script type="text/javascript">
<!--
TimeCntl();
//-->
</script>
5. </body>直前に下記のJavaScriptを記述する。
<script type="text/javascript">
<!--
TimeCntl();
//-->
</script>
−予約投稿の方法−
通常どおり記事を作成し、その時刻を"自分で指定"して、"秒"部分を使って表示モードを指定します。
・
待機モード:指定の時刻になったら記事を表示する・・・"秒"を
00 にする
・
限定モード:指定に時刻になるまで記事を表示する・・・"秒"を
01 にする
・
通常モード:投稿したらそのまま記事を表示する・・・"秒"を
00 または 01 以外 にする
もちろん、記事投稿(保存)時に状態を"公開"にしないと有効になりません。
−動作解説−
スクリプトは以下のような動作をします。
・divタグのうち、classが"time"のもののidをチェックする
・liタグのうち、classが"time"のもののidをチェックする(liタグにも設定した場合)
・それぞれのidには、記事の時刻(年月日時分)情報とモード情報(秒で指定)が定義されている
・idから抽出した時刻情報を現在時刻と比較し、モード情報に従って表示を制御する
具体的には、該当のdivタグおよびliタグのdisplay属性を書き換えて、ブラウザ側で表示させるかさせないかを制御しているだけなので、ブログ上には該当の記事は存在しています。従って、指定したモードにかかわらずカレンダーにはその日のリンクが出現します。しかしながらそのリンクから日別ページ(blog-date-yyyymmdd.html)を開いても、指定したモードによって記事が表示されていたりされていなかったりします。つまり、カレンダーを見ればその日に記事が存在することだけはわかってしまいます。
また、最新記事のリストにも同様のことが発生します。最新記事リストには投稿済み記事のタイトルが指定した本数ぶん表示されますが、今回紹介している方法だと表示させなくしている記事もその本数に数えられますので、リストには指定した本数よりも少ない記事数しか表示されません。例えば最新から5本ぶん表示としているときに、5本以上の記事を待機もしくは限定表示させた場合、最新記事リストにはまったく表示されなくなります。なお、プラグインモジュール内でもスクリプトを実行させていますが、プログラム的には必須ではありません。ですが、リストが表示されてから、表示させたくない記事タイトルが見えなくなるまでに若干のタイムラグが生じるので、プライグイン内でも実行するようにしました。
カレンダーと最新記事リスト(ほかには月別アーカイブの本数など)、該当記事が表示されていないと見た目はちょっと不自然になりますが、制限事項ということでご了承下さい。少なくともカレンダーについてはどうしようもなさそう(システム上いじれない)なので。
あとはRSS関連で記事の存在が知られてしまうのも防ぎようがないですかね。ただし、該当記事を開いても見られないようにはなっています。
−最後に−
最後になりましたが、オリジナルのスクリプトを考案し公開されたFCafeのdaniel様、アイデアの流用を許可していただきありがとうございました。
- 2006/08/02(水) 19:20|
- 工作
-
| トラックバック:0
-
| コメント:0