2011.07.14.

特定カテゴリーの記事表示とページナビ

WordPressで特定のカテゴリーや日付の記事だけ表示したい時、例えばトップページに「お知らせ」カテゴリーの記事のみ載せる場合などは、記事ループの前でテンプレートタグ「query posts」を使います。

カテゴリーの名前を「お知らせ」、そのカテゴリースラッグを「news」としていた場合。

<?php query_posts('category_name=news'); ?>

これで「お知らせ」カテゴリーのみを集めて表示していたんだけど、そうしたらちょっと困った事態になっていました。
WordPlessでページナビゲーションを表示する」で書いたようにページナビを入れていたら、2ページ以降が表示されない。どのページをクリックしても1ページ目が出てきます。
いつものようにググッてみると、「query_posts」はそのままではページ送りが出来ない仕様らしい。でも、もちろん解決策はあります。

ひとつ目は引数の頭に「$query_string .」を加え、引数を「&」で始める。

<?php query_posts($query_string . '&category_name=news'); ?>

もうひとつは引数の後ろに「&paged=」を付け足して「’」で閉じた後にさらに「.$paged」を加える。

<?php query_posts('category_name=news&paged=' .$paged); ?>

どちらの方法でもページナビは正常に動作しました。

この「query_posts」は複数のカテゴリーを指定したり、特定のタグを表示したり、記事の表示件数を指定したりといろいろ便利に使えます。

2010.03.11.

Twitterのつぶやきを簡単にブログへ貼り付ける

最近作り直した(まだ途中ですが)個人的日記ブログの中でTwitterを貼りつけてみました。ブログパーツはたくさん出ているのでいろいろ試してみましたが、なかなか気に入ったのが見つからなくて自分で改良を加えてみることに。
おおもとはTwitter公式サイトのJavaScript Badgeです。Flashは使いたくないので。

ツイートは最新の1件分だけでOK。アイコン表示必須で日付は日本語がいい。この条件であっちこっち調べながら作ったものをメモしておきます。

とりあえずの出来上がりはこんな感じ。

まずはJavaScriptの部分。

<script type="text/javascript">
function relative_time(time_value) {
time_values = time_value.split(" ");
time_value = time_values[1]+" "+time_values[2]+", "+time_values[5]+" "+time_values[3];
var parsed_date = Date.parse(time_value);
var relative_to = (arguments.length > 1) ? arguments[1] : new Date();
var delta = parseInt((relative_to.getTime() - parsed_date) / 1000);
delta = delta + (relative_to.getTimezoneOffset()*60);
if(delta < 60) {
	return '(1分以内)';
}
else if(delta < 120) {
	return '(1分前)';
}
else if(delta < (45*60)) {
	return '(' + (parseInt(delta / 60)).toString() + '分前)';
}
else if(delta < (90*60)) {
	return '(約1時間前)';
}
else if(delta < (24*60*60)) {
return '(約' + (parseInt(delta / 3600)).toString() + '時間前)';
}
else if(delta < (48*60*60)) {
	return '(昨日)';
}
else {
	return '(' + (parseInt(delta / 86400)).toString() + '日前)';
}
}

function twitterCallback(obj) {
var id = obj[0].user.id;
document.getElementById('my_twitter_image').innerHTML = '<a href="http://twitter.com/' + obj[0].user.screen_name + '"><img src = "' + obj[0].user.profile_image_url + '" alt = "avatar" /></a>';
document.getElementById('my_twitter_status').innerHTML = obj[0].text;
document.getElementById('my_twitter_screen_name').innerHTML = '<a href="http://twitter.com/' + obj[0].user.screen_name + '">' + obj[0].user.screen_name + '</a>';
document.getElementById('my_twitter_user_name').innerHTML = obj[0].user.name;
document.getElementById('my_twitter_status_time').innerHTML = relative_time(obj[0].created_at);
}
</script>

<script type="text/javascript" src="http://www.twitter.com/statuses/user_timeline/■ツイッターのユーザー名■.json?callback=twitterCallback&count=1"></script>

42行目の「■ツイッターのユーザー名■」の部分は、実際に使ってるユーザー名に書き替えてください。私の場合だと「ezorisu」。パソコンのTwitter画面で、右上の設定を開くと自分で設定した「名前」とか「ユーザー名」とかがわかります。
script上はちょっと混乱してしまいますが、「obj[0].user.screen_name」が設定画面上の「ユーザー名」、「obj[0].user.name」が「名前」になっています。

IE対応と時差調整はCreazy!の「第4回:twitter の JavaScript Badge をIEで表示するとおかしい件に対応してみる」から、日付の日本語化には葛西総合研究所Blog-ENSIS Note3.5の「Twitterブログパーツを改造」記事から、codeを使わせていただきました。ありがとうございます。
他にもユーザーアイコンURLの取得方法やJavaScriptの基本的なことなど、いろいろなサイトを参考にさせていただいています。

私の改造部分は、アイコン画像を表示するためのURLを取得してimgタグでかこったうえでリンクタグを追加、表示名を取得してこれもリンクタグを追加したくらいです。
JavaScriptもあまりいじったことがなかったので、これが最善なのか分かりませんがとりあえずはツイートの中身は取り出せました。
書き込む場所は</body>の手前。これは最後に読み込む方が表示速度が遅いときにイライラしないから。

次はブログ内のTwitterを表示したい位置に以下のcodeを書きます。

<div id="my_twitter">
	<div id = "my_twitter_image"></div>
	<div id="my_twitter_status"></div>
	<div id="twitter_information">
		Twitter : <span id="my_twitter_screen_name"></span>
		<span id="my_twitter_user_name"></span>
		<span id="my_twitter_status_time"></span>
	</div>
</div>

後はcssで自分のサイトに合うように、サイズ、色、デザインを整えていきます。

#my_twitter {
	background-color: #c0deed; /*バックは好きな色で*/
	margin: 20px auto;
	padding: 10px 10px 5px 10px;
	width: 300px; /*全体の横幅*/
	font-size:12px;
	line-height:1.4em;
}

#my_twitter_image {
	width: 60px; /*アイコン左寄せ部分の幅*/
	float: left;
}

#my_twitter_status {
	min-height: 34px;
	width: 240px; /*右寄せ部分は(全体の横幅 - 左寄せ部分の幅)*/
	float: right;
}

#twitter_information {
	font-size: 11px;
	text-align: right;
	padding: 5px 0 0;
	clear: both; /*フロート解除*/
}

#my_twitter_user_name {
	margin-left: 0.4em;
	color: #999999;
}

#my_twitter a {
	text-decoration: none;
}

#my_twitter a:hover {
	text-decoration: underline;
}

#my_twitter img {
	border: none;
}

これで最初のサンプル画像のようなTwitter Badgeの完成です。
これをたたき台にしてさらにこのあと、自分のブログに合わせていろいろ手を加えてみました。

実際に設置したものはこちら→「Sense of Wonder
メインエリアの上部に表示したかったので、サイズを横長にしてツイートはフキダシの中に入れました。アイコンも柔らかいイメージで角を丸めてあります。ただしIE6と7は、フキダシの角が丸くなりません。
デザインはいろいろ考えられそうですね。

参考サイト

ついでに参考図書も

JavaScriptの絵本
JavaScriptの絵本
posted with amazlet at 10.03.10
アンク
翔泳社
売り上げランキング: 23131

ホントの大まかなところを押さえるにはわかりやすくていい入門書です。なにしろ初心者なので。細かいところはネットで検索。

2009.07.15.

ソーシャルブックマークのボタンをつくる

最近よく見かけるソーシャルブックマークのボタンを付けてみることにしました。
ブックマークするための複数のボタンをまとめて設置できるサービスは、ウェブ上にたくさんあります。コードを貼り付けるだけなので、設定も簡単・・・
簡単すぎておもしろくない。特にボタンの形状は、たいていブックマークサービスのアイコンを使用しているので、ボタンに見えるものもあるし、見えないものもある。並べてみても統一感がありません。

そんなわけで、当サイトに合わせてアイコンから作ってみました。

まずは、それぞれのアイコンを作成。サイトのイメージに合わせてあまり目立ちすぎない程度に色調を統一。サイズもそろえてボタンふうにアレンジ。通常のアイコンとマウスを重ねた時用の二種類用意します。それからマウスカーソルを重ねたときにボタン名を表示するようにフキダシふうタイトルも追加(ボタンのタイトルは、リンクタグにtitle属性を加えておけば一応表示するんだけど、ワンテンポ遅れるし、この手作り感がいいかなと思って)

次に、クリックしたときにブックマークサービスに飛んで、タイトルやurlを入れてくれるようにコードを設定します。
ここで使ったブックマークサービスは、上から順に
twitter、delicious、Yahoo!ブックマーク、Googleブックマーク、はてなブックマーク、livedoorクリップ。

<ul  class="social_bookmarks">
	<li class="twitter_icon"><a href="http://twitter.com/home?status=<?= urlencode(mb_convert_encoding(the_title("","",false),"UTF-8")) ?> <?php the_permalink() ?>"target="_blank"><img src = "保存したアイコンのURL" alt = "twitter" /><span>twitterでつぶやく</span></a>
	</li>

	<li class="delicious_icon"><a href="http://delicious/post?url=<?php the_permalink() ?>&amp;amp;amp;amp;amp;title=<?= urlencode(mb_convert_encoding(the_title("","",false),"UTF-8")) ?>" target="_blank"><img src = "保存したアイコンのURL" alt = "del.icio.us " /><span>delicious</span></a>
	</li>

	<li class="yahoo_icon"><?php echo '<a href="http://bookmarks.yahoo.co.jp/action/bookmark?t='.urlencode(the_title('','',false)).'&amp;amp;amp;amp;amp;u='.urlencode(get_permalink()).'" target="_blank"><img src = "保存したアイコンのURL" alt = "Yahoo!ブックマーク" /><span>Yahoo!ブックマーク</span></a>';?>
</li>

	<li class="google_icon"><a href="http://www.google.com/bookmarks/mark?op=edit&amp;amp;amp;amp;amp;bkmk=<?php the_permalink() ?>&amp;amp;amp;amp;amp;title=<?= urlencode(mb_convert_encoding(the_title("","",false),"UTF-8")) ?>" target="_blank"><img src = "保存したアイコンのURL" alt = "Googleブックマーク" /><span>Googleブックマーク</span></a>
	 </li>

	<li class="hatena_icon"><a href="http://b.hatena.ne.jp/append?<?php the_permalink() ?>" target="_blank"><img src = "保存したアイコンのURL" alt = "はてなブックマーク" /><span>はてなブックマーク</span></a>
	</li>

	<li class="livedoor_icon"><a href="http://clip.livedoor.com/redirect?link=<?php the_permalink() ?>&amp;amp;amp;amp;amp;title=<?php bloginfo("name"); ?>%20:%20<?= urlencode(mb_convert_encoding(the_title("","",false),"UTF-8")) ?>" target="_blank"><img src = "保存したアイコンのURL" alt = "livedoorクリップ" /><span>livedoorクリップ</span></a>
	</li>
</ul>

JavaScriptは使わないのと、WordPlessを前提にしてあります。
twitterはブックマークじゃないし、Googleはブックマークだけどソーシャルじゃないというのは、ちょっと置いておいて・・・

CSSはこんな感じ

ul.social_bookmarks a img {
	border: none;
}

ul.social_bookmarks {
	list-style: none;
	width: 145px; /*ボタンの数に合わせてサイズ調整*/
	margin: 1em 0 1em auto;/*右寄せ*/
	padding: 0px;
}

ul.social_bookmarks li { /*横並びに*/
	float: left;
	width: 16px;
	height: 16px;
	margin-left: 7px;
}

ul.social_bookmarks:after { /*floatの解除*/
	content: ".";
	display: block;
	height: 0;
	clear: both;
	visibility: hidden;
}

.social_bookmarks ul li.twitter_icon {
	background-image: url("マウスを重ねたときの画像URL") ;
	background-repeat: no-repeat;
}

.social_bookmarks ul li.delicious_icon {
	background-image: url("マウスを重ねたときの画像URL") ;
	background-repeat: no-repeat;
}

.social_bookmarks ul li.yahoo_icon {
	background-image: url("マウスを重ねたときの画像URL") ;
	background-repeat: no-repeat;
}

.social_bookmarks ul li.google_icon {
	background-image: url("マウスを重ねたときの画像URL") ;
	background-repeat: no-repeat;
}

.social_bookmarks ul li.hatena_icon {
	background-image: url("マウスを重ねたときの画像URL") ;
	background-repeat: no-repeat;
}

.social_bookmarks ul li.livedoor_icon {
	background-image: url("マウスを重ねたときの画像URL") ;
	background-repeat: no-repeat;
}

ul.social_bookmarks span {
	margin: 0;
	padding: 0;
	background-image: url("タイトル用フキダシ画像のURL");
	background-repeat: no-repeat;
	width: 116px;
	height: 34px;
	position:relative;
	top: -50px;
	left: -50px;
	text-align: center;
	font-size: 11px;
	line-height: 20px;
	color:black;
	display: none; /*ボタンタイトルを非表示に*/
}

ul.social_bookmarks a:hover span { /*マウスを重ねたときにボタンタイトル表示*/
	display: block;
}

ul.social_bookmarks a:hover { /*ボタンタイトルの下線消去*/
	text-decoration: none;
}

ul.social_bookmarks a:hover img { /*マウスを重ねたときボタン画像を非表示にしてバックグラウンド画像を表示*/
	visibility: hidden;
}

リストにしたソーシャルブックマークボタンを横並びに変えます。
ボタンのバックグランド画像(ボタン-02)を設定し、その上にボタンイメージ(ボタン-01)を重ねます。
ボタンにマウスカーソルを重ねたとき、ボタン-01を非表示にして、その下のボタン-02が現れるようにします。
同時に非表示にしてあったボタンタイトルを表示。

せっかく作ったので、フリーアイコンとして公開しておきます。気に入ったら使ってみてください。もしリクエストがあれば他のボタンも作ります(気長に待ってもらえればですが・・・)

social_bookmarks.zip(12kb)

わざわざこんな手間をかけるより簡単にソーシャルブックマークボタンを並べたい人は、ネット上を探してみて下さい。ブログに貼り付けるだけで設置できるのがいろいろ見つかります。

123