Movable Type 5
いたはし
2009年12月17日
Can't call method "server_offset" on unblessed reference
検索を行おうとすると、上記のようなエラーが出る場合があります。
検索のフォームにIncludeBlogsの指定を入れる事で回避できます。
検索対象が自ブログの場合
<input type="hidden" name="IncludeBlogs" value="<$MTBlogID$>" />
検索対象が全ブログの場合
<input type="hidden" name="IncludeBlogs" value="<MTBlogs include_blogs="all"><$MTBlogID$><MTUnless name="__last__">,</MTUnless>" />
小林
2009年12月17日
本件、MT5のバグでした。詳しくはこちらをご覧ください。
skyarc.co.jpのウェブサイト全般はMT4で管理されていましたが、MT5にバージョンアップしてみました。
結果としてうまくは行きましたが、相当苦戦しました。しかもデータベースがいじれない人には直せない現象も発生しました。
バージョンアップの準備
まずバージョンアップの準備を行います。
-
データベースのバックアップ mysqldump -uroot -p データベース名 > 任意の名前.sql
-
mt-staticのバックアップ support/assets_c 、pluginsのインストールしたプラグイン
-
プラグインのバックアップ plugins以下のインストールしたプラグイン
-
mt5をサーバーにアップロード、設置(くわしくはインストールマニュアルをご覧ください)
-
mt-config.cgiをmt4と同一の内容に書き換える
-
mt-config.cgiにDefaultLanguage jaを追記
データベースは絶対にバックアップを取ったほうがよいです。また、不測の事態のために、いつでも復旧できるようにmt4は残したままが良いでしょう。
バージョンアップ
-
mt5のcgiもろもろを755に変更
-
mt.cgiに接続
-
アップロードの確認画面が表示、アップロード開始

-
アップロードが完了すると、ユーザーダッシュボードに移動します

動作確認
ここからが鬼門でした。
まず、バージョンアップする前とした後を下記の表で比較しました。
|
blog_id |
ブログ名 |
SiteURL |
変更後SiteURL |
|
1 |
Movable Type・CMSのスカイアークシステム |
http://www.skyarc.co.jp/ |
/::/ |
|
2 |
スカイアークについて |
http://www.skyarc.co.jp/company/ |
/::/company/ |
|
3 |
スカイアークシステム : 採用サイト |
|
|
|
4 |
MTエンジニアブログ |
http://www.skyarc.co.jp/ |
/::/engineerblog/ |
|
8 |
SKYARC Partner WEB |
|
|
|
15 |
SAEニュース |
|
|
|
16 |
SKYARC System Co., Ltd, |
|
|
|
17 |
キャンペーン |
|
|
|
18 |
社内ブログ:SKYARC Enterprise IntraBlog |
http://enterprise.skyarc.co.jp/ |
enterprise./::/ |
|
19 |
コミュニティ |
|
|
|
21 |
デモサイト |
|
|
|
23 |
広報ブログ |
http://www.skyarc.co.jp/pressroom/ |
/::/pressroom/ |
|
24 |
スカイアークシステム5周年記念サイト |
http://www.skyarc.co.jp/5th/ |
/::/5th/ |
|
25 |
マニュアルデモ |
|
|
|
26 |
New WebSite http://co.jp/ |
新規作成 |
http://co.jp/ |
|
27 |
New WebSite http://careerblog.jp/ |
新規作成 |
http://careerblog.jp/ |
MT5からウェブサイトという概念ができたため、MT4からバージョンを上げると、ウェブサイトが存在しないために新規で作成します。それがblog_id=26,27です。そして、ブログのサイトURLはウェブサイトのドメインを引き継ぐためにドメイン部分が::/と置き換わります。
まずcareerblog.jpのほうは「New WebSite http://careerblog.jp/」となっているにたいして、www.skyarc.co.jpのウェブサイト名が「New WebSite http://co.jp/」になっており、正しくドメインがウェブサイト名に反映されていませんでした。
そして、blog_id=1に遷移してみると・・・

え?blog_id=1はそもそもhttp://www.skyarc.co.jpが割あたっていたブログです。なぜこうなるのだろうとデータベースを見てみたら、このブログだけが親とのひもづけがされておらず(blog_parent_idがNULLになっていました)、管理画面からはアクセスできなかったのです。
これは管理画面上からは修正できるものではないので、しかたがないので直接データベースを書き換えた(blog_parent_idを26に書き換えた)ところ、正常に表示されました。
ここで一安心かと思ったら、次の鬼門が待っていました・・・
blog_id=1を再構築してみると、パーマリンクがすべてhttp://co.jp/http://www.skyarc.co.jp/になってしまい、ページのリンクが切れてしまうのです。ブログの公開設定を見ると

と、URLがhttp://co.jp/というわけのわからないURLが当たってました。ウェブサイトの公開設定を見ると、http://co.jp/が指定されていたので、それを

http://www.skyarc.co.jp/と指定しなおしました。するとブログの公開設定もそれに合わせてhttp://www.skyarc.co.jp/に治ってくれて、再構築もうまくいきました。しかし、ここからも問題が多発・・・。
こんどは広報ブログなどが、

なんだそのURL(笑
しかたがないので

こうやって修正。これを全部のブログに対して設定しなおして、やっとこ終了。
実はこれ以外にも細かい修正やらをやっていたので、相当時間がかかり、なんと3回チャレンジして検証も含め合計6~7時間かかりました。
もしかしてwww.付きのURLの移行はうまくいかない?
いま気づいたのですが、MT4でサイトURLをhttp://www.~.co.jpと指定した場合、バージョンアップ時にco.jpだけになってしまうのかな?キャリアブログhttp://careerblog.jp/の移行は問題なくいっていたので、www.とってバージョンアップしたほうが無難なのですかね。こちらは試していないので確信はありません。
ひとつだけ解消していない問題が
実は、blog_id=18がenterprise.skyarc.co.jpとサブドメインを使っているのですが、URLがどうしてもenterprise.www.skyarc.co.jpになってしまいます。これはウェブサイトのドメインにwwwが付いているせいだと思いますが、はずすとなると全体の調整が必要になってくるので(パーマリンクからwww.がなくなるので、全部のブログのサブドメイン欄にwwwを入れなければならなくなる)、面倒なので放置しています。
ただ、www指定しているウェブサイトって多いと思うんですが、それを取らないとブログでサブドメインがまともに使えないのはちょっといただけない気がします。
万が一、不測の事態が発生した場合
もし、バージョンアップが失敗した場合、一度アップグレードを走らせてしまうとサイトURLが/::/の形式に書き変わってしまうので、MT4では読み込むことができません。ですので、失敗したらすぐにデータベースを復元して、MTを切り替えましょう。
総括
結果的にバージョンアップはうまくいったのでよかったのですが、まさかここまで苦戦するとは思ってませんでした。私もMTを2.6からさわって幾多となくバージョンアップをしてきましたが、ここまで苦戦したのは初めてでした。この苦戦が弊社のウェブサイトの特有の問題ならよいのですが、他のサイトをバージョンアップした時にも発生する可能性があるかと思うと、復旧するスキルがないのであれば、いまの段階では気安くバージョンアップはされないほうがいいような気がします。
方川
2009年11月19日
こんにちは。方川です。
さっそくですが、タイトルの通り、MTのメール通知などが文字化けしてしまって「なんで!?」と思った方、結構いるんじゃないでしょうか?
MT4の頃は意識する必要はなかったと思いますが、MT5rc2のコードでは、config情報にMailEncodingの初期パラメータが設定されてないようで、そのため代用としてPublishCharsetの文字コードを利用してしまうようです。結局のところ、ヘッダ情報で送ってる文字コードと合致しない場合、問題がおきるみたいですね。
対処方法としてはmt-config.cgiに直接「MailEncoding ISO-2022-JP」等を記述することで回避できるようです。
小林
2009年10月28日
MT5.0では、ウェブサイトとブログの結びつきという新しい概念になりましたが、ウェブサイトのタイトルやID、テンプレートをブログに引き継ぐことができません。厳密に言うと可能なのですが、ちょっとタグが複雑になります。
たとえば<$MTWebsiteName$>とブログに書いても、ウェブサイト名は出力できません。ブログでウェブサイト名を出力するには<MTBlogParentWebsite><$MTWebsiteName$></MTBlogParentWebsite>という長いタグを書かなければなりません。これではテンプレートの視認性が悪くなってしまいますね…
そこで、ウェブサイトの情報をブログに簡単に引き継げるようにするために、こんなアイデアはいかがでしょうか?ウェブサイトとブログの連携性を保てば、メンテナンス性が向上するんじゃないかと思います。
※MT5.0ではこのやり方が楽だとおもいますが、もっと簡単なやり方があれば教えてください!
ウェブサイトにテンプレートを作る
ウェブサイトに「共通設定」などの名前でテンプレートモジュールを作成します。
モジュール内で変数に値をセットする
テンプレートモジュールの中に、以下の宣言を書きます。お好みでいろいろ追加したい場合は、MTSetVarsタグの使い方をご覧ください。
<MTSetVars>
website_id=<$MTWebsiteID$>
website_url=<$MTWebsiteURL$>
website_title=<$MTWebsiteName encode_html="1"$>
website_description=<$MTWebsiteDescription encode_html="1" strip_linefeeds="1"$>
common_filepath =<$MTWebsiteURL$>common/
</MTSetVars>
ブログのテンプレートから共通設定テンプレートを呼び出す
先日公開したParentalIncludeプラグインでウェブサイトの共通設定テンプレートを呼び出します。呼び出すときにcache="1"を指定すると、このテンプレートはキャッシュされるので、たくさんのテンプレートからインクルードしたとしてもキャッシュのおかげで再構築が遅くなることはありません。
そして共通設定テンプレートをインクルードした後はMTGetVarで各値を呼び出します。いかに例を示します。
共通設定テンプレートをインクルードする
<$MTParentarInclude module="共通設定" cache="1" ttl="60"$>
タイトルタグにブログ名とウェブサイト名を出す
<title><$MTBlogName$> | <$MTGetVar name="website_title"$></title>
ウェブサイトと同じ概要を使う
<meta name="description" content="<$MTGetVar name="website_description"$>" />
ウェブサイトと同じスタイルシートを読み込ませる
<link rel="stylesheet" href="<$MTGetVar name="common_filepath"$>styles.css" type="text/css" media="screen" />
ウェブサイトのID
<$MTGetVar name="website_id"$>
ウェブサイトのURLへリンクする
<a href="<$MTGetVar name="website_url"$>"><$MTGetVar name="website_title"$></a>
みたいな使い方です。
たとえばウェブサイトのカスタムフィールドで「キーワード」とか作って、全サイトのmeta keywordsを共通化したり、共通化したい値があるのであれば用途はいろいろ使えるのではないでしょうか?
ちょっとやり方として強引感は否めませんが、いまのところこれがベストなやりかたかなぁと思っています。
小林
2009年10月26日
皆様、MT5βさわってますか? 弊社ではバリバリ検証しているのですが、ウェブサイトとブログの連携性に問題を感じています。ウェブサイト配下にブログを作成した時に、ブログのデザインをウェブサイトと共通化したい場合、MT5だと長いコードを書かなければウェブサイトのテンプレートをインクルードできません。
ブログからたとえば以下のようなコードを書いたとします。
<$MTInclude module="ヘッダー"$>
すると、MT5の動きとしては、
-
ブログのテンプレートモジュールを呼び出す
-
ブログに該当するモジュールがない場合はグローバルテンプレートモジュールを呼び出す
という動きになってしまい、ウェブサイトのモジュールを読みに行ってくれません。こちらとしては、ブログはウェブサイトの配下なのだから、グローバルテンプレートモジュールを呼び出す前にウェブサイトのモジュールを呼び出してもらえれば...と思うのですが、MT5b4ではまだその連携は実装されていないようです。
では、ウェブサイトからのモジュールインクルードをMT5標準機能で実現すると、以下のようなコードになります。
<$MTWebsiteID setvar="website_id"$> ←ウェブサイトのIDを取得する
<$MTInclude module="ヘッダー" blog_id="$website_id"$> ←指定したウェブサイトIDのモジュールを呼び出す
たいした手間ではないかもしれませんが、ちょっと面倒ですよね。
そこで、MTタグ一発で下記の動きを取るようなプラグインを試験的に作りました。
-
ブログのテンプレートモジュールを呼び出す
-
ブログにモジュールがない場合はウェブサイトのテンプレートを呼び出す
-
ウェブサイトにモジュールがない場合はグローバルテンプレートモジュールを呼び出す
これでウェブサイトとブログでのテンプレート連携が便利になると思います。
プラグインのダウンロード
ParentalInclude0.14.zip
プラグインのインストール
pluginsディレクトリにParentalIncludeディレクトリをアップロードしてください。
プラグインの使い方
テンプレートモジュールをインクルードするために、以下のMTタグを書いてください。MTIncludeタグと同じモディファイアが利用できますが、globalモディファイヤの指定はタグ内部で上書きされるため使用できません。
<$MTParentalinclude module="モジュール名"$>
テンプレートキャッシュを利用する
cache="1"
SSIを利用する
ssi="1"
キャッシュの生存時間を指定する
ttl="任意の秒数"
注意事項
-
ダイナミックパブリッシング、SSI、テンプレートキャッシュに対応しました
-
このプラグインはブログウェアです。どなたでも無償でご利用頂けますが、感想、要望などをあなたのブログで記事として紹介頂けると幸いです。
-
本プラグインをご利用される方は必ず「プラグインご利用の際の注意事項」をお読みください