ブログ関係の最近のブログ記事

先月、キーワードによるスパム防止のプラグインを入れて、たしかにすごく効果は上がったのですが、それを上回るスパムがきて、もういい加減うんざりしたので、日本語を含まないコメントをはじくプラグインを入れてみることにしました。

日本語でないスパムをフィルタするプラグイン

さあ、どうなるかな~。

今日は町内会のどんど焼き。
10時スタートで、10時半には公園についたのにもう最初のもちがない;;缶ビールもない;;
熱燗はあったので、2杯いただきました。
子供はおもちつきを体験させてもらったり、消防車に乗ったりして、それなりに楽しかったかな?
最近風邪っぴきで外で遊んでないしね。

ものすごく久しぶりの更新になってしまった。
今月は一度も更新しなかったということは、当然一度も運動しなかったということですよ・・・。
体重も・・・久しく見ていなかった数値をたたき出してます!

さて、今月に入って、やけにスパムが多いので、MT5で使えるプラグインを探してみた。

Movable Typeで指定文字列を含むコメントを拒否する「CustomizedCommentfilterプラグイン」

指定文字列ではじけるのもうれしい。

何を指定しようか、スパムコメントの一覧を見てみたら、標準のプラグインではじかれてて気がつかなかったけど、中国語のスパムがわんさか来てるじゃん。
英語ならともかく、中国語じゃどれがNGワードかわからないよ。

とりあえず、これで無事に年越しできるかな?

ブログのサイドバーに、エクササイズの合計時間を載せていますが、2日くらい前から小数点以下の表示がえらく長くなってしまいました。

小数点1位までしか記載していないハズなのに、なぜに9999・・・?

変数の値を四捨五入するようなディファイアはないのかと探してみたら、こんなやり方があるようだ。

MTで税込み計算&3桁ごとにコンマで区切る&切り捨てなど

<mt:SetVar name="sale_r" value="$sale">
<mt:SetVar name="sale_r" value="0.5" op="+">
<mt:GetVar name="sale_r" regex_replace="/(\d*)\.(\d*)/","$1" setvar="sale_r">

なるほど~。
今日のエクササイズは0.8時間。

アマゾンへの商品リンクがあるエントリーをサイドバーに出すようにしてますが、これがいつのまにやら消えてしまい、どこが悪いのか不明のままです。
再構築したら直りました。

過去ログページにスパムが付いたので、久しぶりに古いページを確認したら、2010年12月のアーカイブで403エラー。12月のフォルダ自体はある。他の月のアーカイブで不具合はないみたい・・・と思ったら、ところどころで403エラー。全部エラーなら分かるけれど、なぜに部分エラー。
index.phpがフォルダにないのでアクセス拒否になるようだ。
バックアップを戻した時にすでにファイルがなかったのかも。
あとで、見直してみよう。

今日のエクササイズは1時間。

MT5.04とAutoTagging0.08の組み合わせで使っていますが、タグを自動で入れたくない場合でも登録された単語がタグに入ってしまう場合があります。
ダイエットがテーマのエントリーにダイエット関連のタグが入るのはいいのですが、技術的にまじめな話題の時にダイエット関連のワードに反応してしまうとちょっとなあ・・・。

タグに複数単語が入っている時は、いらない方の単語を消せばそのまま反映されますが、1つしかない場合は、何度消しても復活します。

一応、タグに何か単語を入れて更新。その単語を消してまた更新すると、タグが空欄になってくれました。覚書としてメモ。

毎日何時間運動したかとか、今日の売り上げは~、今日の勉強時間は~、みたいなカタチの値を毎日メモしておいて、あとで集計するにはどうしたらいいかを考えました。

エントリー毎、カスタムフィールドに何時間運動したかを入力。

MT4.1UPのカスタムフィールドで演算をする を参考にさせていただきました。

まず、カスタムフィールドをエントリーで使う設定にしたので、運動時間用のカスタムフィールドの値<$mt:dietmemo$>は<mt:Entries>の中で使います。

<mt:Entries>
<mt:SetVar name="<mt:archiveDate format="%Y%m">_var_month" value="0">
<mt:SetVarBlock name="month_total" value="$<mt:archiveDate format=
"%Y%m">_var_month" op="+"><$mt:dietmemo$></mt:SetVarBlock>
</mt:Entries>

<mt:If name="month_total">
<div class="diet-month">
<mt:SetVarBlock name="this_diet_month"><mt:archiveDate format="%Y年%m"></mt:SetVarBlock><$mt:GetVar name="this_diet_month"$>月にエクササイズした合計時間:<$mt:GetVar name="month_total"$>時間
</div>
</mt:If>

クラス名diet-monthのうしろは、閉じタグのところまで改行しないで1行で続けます(後でPHPから呼び出す時に関係するので)。

<mt:If name="month_total">の部分のモディファイアをいろいろ考えていたけれど、リファレンスをよく見たら、何も指定しなければ、「MTSetVar ファンクションタグに value モディファイアが設定されていて、その値が 0 ではない場合にのみ実行します。」とあった。よかった、よかった。

さて、重要なのは、ただ単にカスタムフィールドの値の累計を取るなら、モジュールやウィジェットを使ってサイトの好きなところに結果表示できるんですが、月別の集計を取るのなら、月別アーカイブのテンプレートに直にコードを書く必要があります。
最初、インデックスにあるアーカイブ(archives.php)に結果を出力しようとしてあれこれ試して、どうにもうまくいかず・・・挫折しました(何かうまい方法があれば教えてください)。

ついでに、年間集計を取るなら、当然年間アーカイブのテンプレートを新規で作って・・・ということになります(年間アーカイブを作らないと<mt:archiveList archive_type="Yearly">自体が使えない)。

ただ、これだけだと月間の合計数字を同じページに一覧表示できない。
他の仕事で、プログラマーさんがMTの変数をPHPに反映させているのを見たことがあるので、同じ方法でできないか調べてみました。

月別アーカイブのページから、集計結果の部分だけを文字列として抜き出せばいいのだから・・・

PHPについての質問です。外部ファイルの一部を読み込んで表示するにはどうすればいいのでしょうか? に、同じような質問をしている人を発見。

提案されているコードをコピペして試してみるけれど、質問者と同じように真っ白のページにしかならない。あるいは、うまくいっても、中身を少し変えるとまた真っ白。
PHPはエラーメッセージが出ないので、何が悪いかわからない。

とりあえず、簡単なサンプルページを作り、file_get_contentsができてないのか、preg_matchがダメなのか1文字変えては確認、1行変えては確認・・・・と延々作業しながら、何とか完成したのがコチラ。

<mt:Ignore>カウンターを作る</mt:Ignore>
<$mt:SetVar name="counter" value="0"$>

<mt:Ignore>月別アーカイブが現在何個あるかカウンターで数える</mt:Ignore>
<mt:archiveList archive_type="Monthly">
<$mt:SetVar name="counter" op="++"$>
<mt:Ignore>月別アーカイブが増えたら「年月」名を配列に入れる</mt:Ignore>
<mt:SetVarBlock name="push(set_monthly)"><mt:archiveDate format="%Y/%m/"></mt:SetVarBlock>
</mt:archiveList>

<?php
//MTで宣言した変数をPHPの変数に入れる
$x = <$mt:GetVar name="counter"$>;

for($i = 0; $x > $i; $i++){
//「年月」名の配列を作る
$set_monthly = array();
//上で作った配列にMTでできる配列の中身を追加する
print "<mt:Loop name="set_monthly">";
array_push ($set_monthly, '<$mt:Var name="__value__"$>'). "\n";
print "</mt:Loop>";
}

//PHPの関数foreachは、要素の数だけループさせるもの
foreach( $set_monthly as $element ){
$url = ("http://www.kumacha-bin.com/archives/{$element}index.php");

//エクササイズした時間を上記URLから抜き出して表示
$str = file_get_contents($url);
if (preg_match('!<div class="diet-month">\n((.*)\n)!', $str, $res)){
print $res[1];
print "<br />";
}else{
print "failed";
}
}
?>

<mt:Ignore>で囲まれたところはMT内で使うコメント欄です。HTMLには出力されません。
PHPの場合は//ではじめるとコメントになります。

私と同じくらい初心者で、これを使ってうまくいかない場合は、行最後の「;」を忘れてるとか、「;」の後に半角スペースが入ってるとか、変数前後に余計な半角スペースがあるとか、まあつまりモロモロが原因です。1文字づつなめるように見直してみてください。
あと、エントリー欄にコードを貼ると他の文字に置き換わっちゃう場合もあるので、気をつけて見直してますが、直し忘れもあるかも・・・。

これをテンプレートモジュールに入れれば、好きな場所に呼び出せる・・・と思います、たぶん。

MTの配列の使い方はカテゴリ名の全取得、配列へセットするを参考にさせていただきました。
PHPの配列はあちこちで解説があるんですが、たとえばここみたいに

$a = array('abc', 'def', 'ghi');
こういう形で紹介されているものばかりで、配列の中身が最初は決まってなくて、後から追加するにはどうしたらいいんだろうと、かなり悩みました。

foreachは超便利だった!
配列([ ]のカタチの)に変数入れてループで回して~とかグルグル考えていたのが、これだけで済んじゃったよ。

ただ、最後の結果出力の部分にあるprint $res[1];は、なんでprint $res;じゃダメなのかがわからない。$urlの部分はprint $url;で確認できるんだけどなあ。
preg_match - 正規表現によるマッチングを行う の最初に解説があるので、$resが配列になってるのはわかるけど、それなら$urlも同じじゃないかなあと思ったり・・・。
ここは、もうちょっと勉強しないと。

結果的に上記の形にまとまりましたが、もっとスマートなやり方もありそうだ・・・。

エントリーにある画像をポップアップで開いた時の、新規ウィンドウのページタイトルがURLのみになっているのが気になったので、これを変更するカスタマイズ。

デザイン>テンプレート>システムテンプレートの「ポップアップ画像」を開いて

<title><$mt:ImageURL$></title> を

<title><$MTAssetLabel$></title> に変更。

こうすれば、画像をアップするときに聞かれるファイルオプションの「名前」の欄が<$MTAssetLabel$>に表示されます。

このままだと文字化けするので、<title><$MTAssetLabel$></title>の上に
<meta http-equiv="Content-Type" content="text/html; charset=<$mt:PublishCharset$>" /> を追加しておく。

今日のエクササイズは1時間。

アマゾンの商品画像とアフィリエイトリンクが、ブログの好きなところに表示できるといいなと思ったので、カスタムフィールドを使ったカスタマイズを考えてみました。

やりたいのは、紹介用のエントリー記事を書いたら、その記事に含まれる商品画像付のアフィリエイトリンクとオススメ星マーク(自作の)だけを抜き出して、任意の位置に表示。

まず、商品画像用とオススメ星マーク用のカスタムフィールドを作り

商品画像用カスタムフィールドの設定

商品画像用のカスタムフィールドの説明

オススメ星マーク用カスタムフィールドの設定
ドロップダウンのオプションの最初に「,」だけ書いて空欄を作らないと、既定値に値が入ってしまうので注意。

オススメ星マーク用のカスタムフィールドの説明

エントリー表示用に「カスタムフィールドの表示」というテンプレートモジュールを作る。

<div class="custom-tags">
<mt:IfNonEmpty tag="ImageDataAmazon"><p><$MTImageDataAmazon$></p></mt:IfNonEmpty>
<mt:IfNonEmpty tag="DataAmazon">オススメ度:<mt:SetVarBlock name="starsimage"><$MTDataAmazon$></mt:SetVarBlock>
<mt:If name="starsimage" like="星1">
<img src="/img/stars01.gif" alt="星1つ" width="73" height="14" />
<mt:else name="starsimage" like="星2">
<img src="/img/stars02.gif" alt="星2つ" width="73" height="14" />
<mt:else name="starsimage" like="星3">
<img src="/img/stars03.gif" alt="星3つ" width="73" height="14" />
<mt:else name="starsimage" like="星4">
<img src="/img/stars04.gif" alt="星4つ" width="73" height="14" />
<mt:else name="starsimage" like="星5">
<img src="/img/stars05.gif" alt="星5つ" width="73" height="14" />
</mt:if>
</mt:IfNonEmpty>
</div>

ドロップダウンで選んだオススメ度を、テキストから星マーク画像に置き換えて表示させる。
この「カスタムフィールドの表示」モジュールを、「ブログ記事の概要」と「ブログ記事」のエントリー本文下に入れる。

<mt:If tag="EntryBody">
<div class="asset-body">
<$mt:EntryBody$>
</div>
</mt:If>
<$MTInclude module="カスタムフィールドの表示"$>

次に、ウィジェットに「最近のオススメ作品」というテンプレートを作り、

<mt:Entries tag="アフィリエイトリンク付" lastn="5">
<mt:EntriesHeader>
<div class="widget-recent-amazon widget">
<h3 class="widget-header">最近のオススメ作品</h3>
<div class="widget-content">
</mt:EntriesHeader>
<mt:IfNonEmpty tag="ImageDataAmazon"><p><$MTImageDataAmazon$></p></mt:IfNonEmpty>
<mt:IfNonEmpty tag="DataAmazon"><mt:SetVarBlock name="starsimage"><$MTDataAmazon$></mt:SetVarBlock>
<p><mt:If name="starsimage" like="星1">
<img src="/img/stars01.gif" alt="星1つ" width="73" height="14" />
<mt:else name="starsimage" like="星2">
<img src="/img/stars02.gif" alt="星2つ" width="73" height="14" />
<mt:else name="starsimage" like="星3">
<img src="/img/stars03.gif" alt="星3つ" width="73" height="14" />
<mt:else name="starsimage" like="星4">
<img src="/img/stars04.gif" alt="星4つ" width="73" height="14" />
<mt:else name="starsimage" like="星5">
<img src="/img/stars05.gif" alt="星5つ" width="73" height="14" />
</mt:if></p></mt:IfNonEmpty>
<mt:EntriesFooter>
</div>
</div>
</mt:EntriesFooter>
</mt:Entries>

3カラムのサイドバー(サブ)の検索の下にドラッグして追加。終わったら再構築もしておく。

エントリーを書く際に、タグに「アフィリエイトリンク付」と入れておくと、サイドバーにも商品画像とオススメマークが表示される、というわけです。タグで条件分岐するのがイヤならエントリー本文にアフィリエイトIDが含まれていれば・・・という条件でもいいと思います。

ブログ記事内で表示させるカスタムフィールドなので、<mt:Entries>内にこれを書かないといけないのですが、複数記事があった場合に<h3>最近のオススメ作品</h3>も複数できてしまいました。<mt:Entries>の外におくと、エントリーがなくても表示されてしまうし、どうしようかと「最近のエントリー」や「最近のコメント」を見ていたら、そうした場合にタグを囲むヘッダーとフッターのタグがあったのね。今さら気がつきました。

アマゾンのアフィリエイトリンクを作るとインラインフレームの中に表示されるので、これがイヤだなあと思って検索してみたら、リンクの作成支援ツールを使うとかなり自由にコードがカスタマイズできるので、さっそく試してみました。
amazletを使ってみたんですが、リンクの細かいパラメータがだいぶ違います。
でも、amazonのテキストリンクとamazletで出来るリンクを直打ちすると同じページが開くので、何が違うのかわかりません。

とりあえず、amazletでできたコードを参考にして、カスタムフィールドの商品画像用のフィールドに、商品画像だけのアマゾンへのリンクのHTMLを貼り付けます。
オススメ星マークをドロップダウンで選んで「公開」すれば完成。

オマケ:今回作ったオススメ星マークの画像が欲しい人はこちらからどうぞ。

今日のエクササイズは0.5時間。

エントリー数が多くなると、何かあった場合の再構築の時間が長いので、テキトウなところでデータベースを分けたくなります。データベースを入れ替えると困るのが過去ログへのつなぎ方と、検索機能。

今回のアップグレードで、上記2点をこんなカンジで解決しました。

サイト内の検索にGoogle.comを使う方法
Googleに登録されていないページはどうにもなりませんが、たぶんこれで事足りるハズ。

過去ログへのつなぎ方ですが、カテゴリーアーカイブに古いカテゴリーアーカイブへのリンクがあれば分かりやすいんじゃない?ってことで、カテゴリ別ブログ記事リストのテンプレートの下に以下を追加しました。

<mt:setvarblock name="cat_name"><$mt:ArchiveTitle$></mt:setvarblock>
<mt:if name="cat_name" like="アニマス">
<a href="http://www.kumacha-bin.com/archives/203animas.php">2010年12月までの「アニマス」アーカイブへ</a>
<mt:else name="cat_name" like="ウェブデザイン雑記">
<a href="http://www.kumacha-bin.com/archives/204web.php">2010年12月までの「ウェブデザイン雑記」アーカイブへ</a>
<mt:else name="cat_name" like="ブログ関係">
<a href="http://www.kumacha-bin.com/archives/201blog.php">2010年12月までの「ブログ関係」アーカイブへ</a>
<mt:else name="cat_name" like="日記">
<a href="http://www.kumacha-bin.com/archives/002diary.php">2010年12月までの「日記」アーカイブへ</a>
<mt:else name="cat_name" like="ダイエット">
<a href="http://www.kumacha-bin.com/archives/cat46.php">2010年12月までの「ダイエット」アーカイブへ</a>
<mt:else>
<a href="http://www.kumacha-bin.com/2005_2010data.php">2005年8月後半から2010年12月までのアーカイブへ</a>
</mt:if>

以前、カテゴリーを並べ替えるためにファイル名の先頭に数字を入れたりしてたので、これもやめたいなーと思っていたので、ちょうどよかった。ファイル名も普通にわかりやすいものに変更。
カテゴリーに並べ替えはプラグインでできるので、問題なし。

今日のエクササイズは1時間。

AutoTaggingを入れてみましたが、自動でタグを入れてくれるのは確かに便利。
登録したいタグは一度タグ欄に自分で記入してから、設定(プラグインの設定ではなく、ブログ全般の設定のところ)>AutoTagging 初期化を実行する必要があります(最初これがわからなかった)。

今までタグは利用していませんでしたが、pixivでタグ検索がけっこう便利だったので、ウチでもやってみる気になりました。でも、どうしたら有効活用できるか、イマイチ思い浮かばない。

TinyMCE
MT5.04でも動いてます。
マニュアルにはダウンロードしたファイルをインストールするだけとありますが、TinyMCEがインストールしても動かない場合、mt-config.cgiのStaticWebPathを設定する必要があるのでメモ。
StaticWebPath    http://xxx.com/mt/mt-static

標準設定だと、記事を書くエントリー画面の文字が小さすぎて使いづらいのでフォントサイズを変更。
システムの方のプラグイン設定画面から、編集領域に関する設定で「デフォルト」>「CSSを編集する」に変更。bodyのfont-size:10pxになってますので、これを12pxくらいに変更。

body, td, pre {color:#000; font-family:Verdana, Arial, Helvetica, sans-serif; font-size:12px; margin:8px;}

たまにエントリー画面でカーソルが見えなくなって、どこに文章が入るかわからなくなる。
HTML編集画面で見ればわかるけど、これはどうしたら直るんでしょうね?

MTRemoveBlank
MT5.04でも動いてます。
テンプレートでは見やすいようにタブや改行を入れますが、条件分岐が増えると無意味な改行がずらずら続くので、公開時にそれを消したい場合はこれを入れます。

SortCatFld
MT5.04でも動いてます。
カテゴリの並び順を変える。MT4用からMT5用に変更。
テストの時は入れてなかったので、各カテゴリーのエントリーがないと確認できないなあ。エントリーのないカテゴリーも表示するようにしておこうかしら。
うまく並び替えができなかったら、MTタグの置換え忘れがないか確認。

PageBute
1ページが長い場合に指定した記事数で分割する。
以前導入したときのメモがあるので、エントリーが増えてきたら導入します。

2012年2月

      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29