月別アーカイブで、mt:Entries内のカスタムフィールドの値を利用する

Movable Type5の月別アーカイブのmt:Entries内でカスタムフィールドとれないっていうのにはまった。

サイトの全ページに特定ブログの最新記事リストを出力 - MTQ | Movable Type 5 ユーザーコミュニティ

にちょっとヒントがあったのだけど、
ブログのコンテキストっていうのが影響するらしい。

というわけで、

<mt:Entries blog_ids="自ブログのID">

とmt:Entriesに自ブログのIDわたして、コンテキストをきちっと指定することでカスタムフィールドの値取得できた。

特定のカテゴリを親カテゴリにもつカテゴリーアーカイブ/エントリーの判定

ちょっと状況説明が難しいのだけど、
特定のカテゴリーを親カテゴリーにもつ「カテゴリーアーカイブ」と「エントリー」のみ表示を変えたいときの判定。

カテゴリーアーカイブの場合

<?php
//現ページのカテゴリーIDを取得 - get_query_var('cat')で現在表示しているカテゴリーアーカイブのIDが返ってくる。
$category_currentID = get_query_var('cat');

//カテゴリーIDからカテゴリー情報を取得 - get_categoryにカテゴリーIDを渡して該当カテゴリの情報を取得
$category_current = get_category($category_currentID);

//親カテゴリのIDを取得 - ->category_parentで親カテゴリの存在確認(親がなければ0が帰る)
$category_parentID = $category_current->category_parent; 

//もし親カテゴリがあれば
if ($category_parentID !== '0' ) {
	//get_categoryに親カテゴリのIDを渡して、親カテゴリの情報を取得
	$category_parent = get_category($category_parentID);
	if ($category_parent->slug === '親カテゴリー「〜」のスラッグ名') {
		echo '親カテゴリーが「〜」の場合の表示処理';
	} else {
		echo '通常処理';
	}
} else {
	echo '通常処理';
}
?>

エントリーの場合 (エントリーでの重複カテゴリーは考慮してないよ)

<?php

//現ページのカテゴリー情報を取得
$category_current = get_the_category();

//親カテゴリのIDを取得、エントリーの場合はget_the_categoryが多次元配列になっているので[0]つける
$category_parentID = $category_current[0]->category_parent;

//もし親カテゴリがあれば
if ($category_parentID !== '0' ) {
	//get_categoryに親カテゴリのIDを渡して、親カテゴリの情報を取得
	$category_parent = get_category($category_parentID);
	if ($category_parent->slug === '親カテゴリー「〜」のスラッグ名') {
		echo '親カテゴリーが「〜」の場合の表示処理';
	} else {
		echo '通常処理';
	}
} else {
	echo '通常処理';
}
?>

動画をiframeで埋め込んだ時のz-indexきかない問題(chrome)

iframeのコードでYouTube動画埋め込んだときに、z-indexきかないよ(動画の上になんか要素のるときなど)問題。
safariではcssの通りの挙動になるのだけど、chromeだとiframe(youtube)の内容が最前面にくる。

というのはiframeのsrcに「wmode=transparent」を加えてあげるとよい。

<iframe width="560" height="345" src="http://www.youtube.com/embed/t_htoSaQFf4?rel=0" frameborder="0" allowfullscreen></iframe>

<iframe width="560" height="345" src="http://www.youtube.com/embed/t_htoSaQFf4?rel=0&wmode=transparent" frameborder="0" allowfullscreen></iframe>

にする感じ。


一括で書き換えるなら、jQueryつかって

$(this).find('iframe').each(function() {
	var src = $(this).attr('src');
	$(this).attr('src',src + '&amp;wmode=transparent');
});

とかするとよさそう。

パーマリンクのパスをルートからの/パスにする

mt:EntryPermalinkや、mt:AssetURLで出力されるのは、http://から始まる絶対パスだけど、
それちょっとヤダなって時に。

<!-- $WebsiteURLに、自ブログの親サイトのURLを格納 -->
<mt:BlogParentWebsite><mt:SetVarBlock name="WebsiteURL"><$mt:WebsiteURL$></mt:SetVarBlock>

<!-- replaceでEntryPermalink内から親サイトのURL部分を「/」に置換する -->
<mt:Entries>
<$mt:EntryPermalink replace="$WebsiteURL","/"$>
</mt:Entries>

「../」などいわゆる相対パスに指定したい場合は、出力されるURLにあわせてreplaceの「"/"」部分を書き換えればよいと思う。

各ブログのIDを調べる/取得する

別ブログの内容を読み込むときに、「mt:MultiBlog blog_ids=""」とかでID指定するとおもうんだけど、
本番とテストや復元つかってブログ追加したりとかで、IDがかわる場合があって、ちょっと不便。

で、ブログ名からIDを取得してblog_idなどを指定する形にしておく。
(これならテストと本番でblog_idの指定かえなくていいよね)

<!-- mt:Blogsでブログ一覧を取得、include_blogs="site"、include_with_website="1"で自分が所属するサイトのみを対象にする -->
<mt:Blogs include_blogs="site" include_with_website="1">
<mt:If tag="BlogName" eq="ブログ名A"><mt:SetVarBlock name="blogA_id"><$mt:BlogID$></mt:SetVarBlock></mt:If><!-- ブログ名AのIDを$blogA_idに格納 -->
<mt:If tag="BlogName" eq="ブログ名B"><mt:SetVarBlock name="blogB_id"><$mt:BlogID$></mt:SetVarBlock></mt:If>
<mt:If tag="BlogName" eq="ブログ名C"><mt:SetVarBlock name="blogC_id"><$mt:BlogID$></mt:SetVarBlock></mt:If>
</mt:Blogs>


あとは、

<mt:MultiBlog blog_ids="$blogA_id">
<mt:Entries></mt:Entries>
</mt:MultiBlog>

など、blog_idsに設定したMT変数指定すればよいと思う。
ちなみに、同一サイト内に、同名のブログがない事前提。

history.pushStateをつかってみる。

pushState、実際にサンプルつくってみた。


http://dl.dropbox.com/u/131731/sample/pushstate/index.html


リンク遷移時にページ内で必要な部分のみ表示が代わり、かつ、
ページのtitle、ページのURLも読み込んだ内容に適応したものにかわるよう。


HTMLは事前にこんな感じになっている事想定。

HTML

//トリガーとなるaタグ、classがpjaxのものを対象としてる
//<a href="リンク先" class="pjax" title="遷移先のページのタイトル"></a>
<a href="index.html" class="pjax current" title="index">index</a></li>

<div id="main">
//この内容がページごとに置き換わる
</div>

JavaScript

jquery使うこと前提にしてる。

<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js"></script>
<script type="text/javascript">
$(function() {

	//init
	var _target = "#main"; //おきかえるコンテンツのID
	var _href; //同一ページのpushState二重投稿防止

	//初期ページのタイトルとHTMLを定義
	var _default = { 
		title : document.title,
		content : $(_target).html()
	};
	
	//debug
	$('nav').after($("<ol/>").addClass("debug"));

	$('a.pjax').click(function() {
		var title = $(this).attr('title'), href = $(this).attr('href');
		//console.log('location : ' + location.pathname);
		if ( _href !== href ) { //同一URLの時はpushしない(環境に応じて要調整)
			$('a.pjax').removeClass('current');
			$(this).addClass('current');
			if ( window.history.pushState ) { //pushStateが使えるブラウザなら
				window.history.pushState(title, null, href); 
					//pushState(event.state, 'title', 'url'), 先では、第1引数にタイトル渡して、第2のtitleはnullにしてるけど、
					//1には数字わたして、2には素直にページタイトルわたしたほうが、戻る/進む時の現在の位置管理ができてよさそう。
					//replaceStateは "現在のエントリを入れ替える、つまり新規のエントリは追加したくない場合に使用するAPI" だそう。
				changeContent(title,href);
				_href = href;
				
				$('.debug').append('<li>' + title + '<span>' + href + '</span></li>');
			} else { //pushState対応してないなら、普通に開く
				window.location = href;
			}
		}
		return false;
	});
	
	window.onpopstate = function(event){ //戻る/進むでイベント発動
		//console.log(event);
		$('a.pjax').removeClass('current');
		$('a[title ="' + event.state + '"]').addClass('current');
		if (event.state) {
			changeContent(event.state, location.pathname);
		} else {
			changeContent(_default.title, location.pathname);
		}
	}
	
	function changeContent(t,u) { 
		$(_target).slideUp(500,function() {
			$(_target).after('<em>loading...</em>').load(u + ' ' + _target, function() {
				$(this).slideDown(500, function() {
					document.title = t;
				}).next().remove();
			});
		});

	}
});
</script>

Google Mapsで住所から緯度経度 / マーカーから緯度経度&住所を求める

タイトル通りの内容。

地図を登録させるフォームつくる機会があったんだけど、
住所検索だけだと同一番地内などで微妙に位置ずれする。

なので、マーカーで緯度/経度を修正して、
投稿時には
・入力した住所
・マーカーの緯度/経度
をもらってGoogle Mapsを表示させればいいんじゃないかなという話。

こんな感じ。

http://dl.dropbox.com/u/131731/sample/googlemaps-address_marker.html

2011/11/24:ちょっと改良して、ドラッグ時にパーマリンク表示するようにした。