_blankを使わないで別ウィンドウを開く

2007/05/28 月曜日 19:10 投稿者 zon

個人的に別ウィンドウを開かせるようなリンクの張り方はほとんどしないのですが、たまにどうしても別ウィンドウで開いて貰いたい場合があります(PDFデータのダウンロードページとか、そのページからリンクが張れなくて、行き止まりになってしまう場合とか)。

でも、_blankは XHTML 1.1 では廃止されたとか、HTML4.01とXHTML1.0で非推奨だとか、そういった感じのイメージだけはなんとなくあって、今は基本的にほとんどが XHTML1.0 で書いているので良くはなくてもダメではないという感じなので、使ってもいいかとも思うのですが、将来的に XHTML 1.1 とかにしていくときに修正するのが大変なので、軽く調べて以下を参考にすることにしました。

_blankを使わないで別ウィンドウを開くにはrel=”external”を使うのが美しいと思う。

_blank 使わない別ウィンドウを開く方法

コメント欄を見るといろいろと議論されていて、この記事の内容から修正されている点もありますが、特にガチガチに XHTML に準拠した形にしたいわけでもないので、とりあえずは、a タグに class="extarnal" を指定して、JavaScriptで anchor.target = "_blank"; にすることにしました。

rel="extarnal" にしなかった理由は、WordPress のコア部分の auther 関連が既に class="extarnal" を指定していたからです。コア部分に手をつけるのはあまりしたくないし。

それなら external じゃなくて、別の名前にすればよかったのですがもう一つ理由があって、上記の記事のコメント欄を読んでいると、rel="external" は非準拠だどうだといった議論があったりして、詳しく調べるのも面倒なので、無難に class にしておくことにしました。ついでに rel属性の準拠、非準拠の話の中で、(X)HTML仕様に定められていないリンクタイプを記述するときは、プロファイルをhead要素で指定しないといけないといったことが書かれていました。

headタグの profile要素の指定について

プロファイルとか言われても、あまり意味が分からないので、とにかく参考にされている以下のリンク先などをざっと読んで rel="nofollow" を使う場合もプロファイルを指定しておく必要があるとありました。

rel="nofollow" ほかメタデータのプロファイル

WordPress のプロファイルは既に、XFNを使っていますが、このプロファイルが、どうも複数指定は出来ないようで、XFN をとるか XHTML metainformation profile 二者択一になってしまうので、XHTML metainformation profile を採用することにしました。幸い XFN は、指定するのが面倒で、全く使っていなかったし。

ソースコードは、<head profile="http://gmpg.org/xfn/11"> を <head profile="http://purl.org/net/ns/metaprof"> に変更すればOKのはず。

WP 未来投稿(予約投稿)のテスト・続

2007/05/15 火曜日 10:30 投稿者 zon

この件はWP 未来投稿(予約投稿)の注意点で、問題なかったのでいったんクローズしたんですが、このブログの環境では問題なかったものの、実際に問題が発生したブログの方では、やはり未来投稿(予約投稿)が出来ない症状が続いています。ここのところ忙しかったので見てみぬフリをしていたのですが、やはり不便なのでもう一度調査します。

症状が発生している方との違いを調査するのにこのブログのデータを取るための記事なので、内容のある記事ではありません。原因が特定できた場合は追記を書くと思います。

調査結果追記(2007/05/15)

未来投稿が反映されない原因はソケット接続オープン時のタイムアウトでした。
/wp-includes/cron.php の 87行目(Ver 2.1.3)の fsockopen タイムアウトが 0.01 に設定されていて、$errstr に Connection timed out を返していました。タイムアウト時間を長めにとれば大丈夫かと思います。

未来投稿が反映されなくて困っているけど、難しいことが分からないという人は、下記の部分の 0.01 の部分を 0.1 にしてみると問題が解決する場合があるかもしれません。

$argyle = @ fsockopen( $parts['host'], $_SERVER['SERVER_PORT'], $errno, $errstr, 0.01 );

一応、他にも短すぎるタイムアウトが設定されていないか fsockopen で水平展開してみましたが問題になりそうなところはありませんでした。

確か、以前もVer 2.0系でタイムアウトが原因の問題で悩んだことがありました。(詳しく覚えてないけどトラックバック関連だったような気がします。)メモしておいたんですが、サーバトラブルでバックアップデータを復旧せずそのままに状態で放置してたのですっかり忘れてました。これからはちゃんとメモをしておこう。

WP 未来投稿(予約投稿)の注意点

2007/04/29 日曜日 19:00 投稿者 zon

WrodPressで未来投稿(予約投稿)の投稿を行う場合に引っかかりそうなことを書いておきます。

未来投稿(予約投稿)のやり方

管理画面の投稿画面でタイムスタンプを未来の投稿したい時間に設定します。

未来投稿(予約投稿)の注意点

  • 管理画面の投稿画面の『投稿ステータス』の公開にチェックを入れておきます。

通常の投稿を行う際には記事を書き上げた後に、『公開』のボタンを押せば、投稿画面の右側のメニューの投稿ステータスに関係なく公開されますが、未来投稿を行う際には『投稿ステータス』を公開に設定しておかないと自動で投稿されないようです。

注意
この記事はタイムスタンプを 2007/04/29 19:00、投稿ステータスを草稿に設定した状態で2007/04/29 13:20 に公開ボタンを押して投稿しました。
つまりこの記事が 2007年2007/04/29 19:00 で表示されていれば、『未来投稿(予約投稿)の注意点』に書かれてある内容はウソ情報と言うことになります。

詳しい考察は下記の記事を参照してください。
WP 未来投稿(予約投稿)のテスト

追記

問題なく未来投稿(予約投稿)されていました。前回はなぜ未来投稿(予約投稿)が出来なかったのか気になりますが、原因を調べるにももう再現さすことが出来ないし、問題なく表示されればそれでいいので、この件は終了。

さらに追記

問題が解消されていなかったので再度検証しました。
検証結果はWP 未来投稿(予約投稿)のテスト・続を参照してください。

WP 未来投稿(予約投稿)のテスト

2007/04/28 土曜日 19:00 投稿者 zon

とあるブログで週間単位くらいで連載ものの記事を書いているのですが、投稿の曜日を定期的にしておけば読者の方にも優しいと思って、cron か何かで投稿できるようにしようと考えていたのですが、WordPress には、予約投稿(未来投稿)なる機能があると書いてあったので、これは使わない手はないなと思って試してみました。

使い方は簡単で、記事の投稿画面のタイムスタンプを未来に設定すればよいと書かれていたので、早速タイムスタンプを未来に設定して、記事を投稿。

ざっと調べた感じの予想(注:あくまで予想です)では公開はされているけど、表示の処理が走る時にフィルタをかけて未来のものを表示されないようにしてるっぽい。そうなると、ping は記事投稿時に飛んでしまうのでは?とか、RSSはどうなるの?とかの疑問があったけど、その辺はあまり気にしなくてもいいやってことでそのまま投稿。

しかし、設定されたタイムスタンプの時刻は過ぎているのに一向に表示されない。おかしい。。

よくよく、詳しく調べてみると、 WordPress 2.1 は、予約投稿の処理の方法が違うらしく、wp-cron と言うのがキーワードとして出てきて、このwp-cron で cron の処理を走らせてるみたいなことが書かれてたので、そのソースをざっと追ってみると、以下のような感じでした。(注:あくまでざっとなので動作確認はしてません)

未来に行うイベントを DB にキャッシュさせておいて、外部からアクセスがあったときに wp-cron が現在時刻と DB のイベント発生時刻とを照らし合わせて、設定時刻が過ぎていたら設定されたイベントを実行。で、気になっていた ping の件も、これならイベントが走るまで飛ばないっぽいです。

で、疑問点である予約投稿が表示されなかった件とは関係くないようで未解決なのですが、DB を確認したところでは、どうも、イベントがキャッシュがされていなかったために処理が走らなかった様子です。

根拠は、[options] テーブルの [cron] にイベントらしきものが入っていないのと、同じく [options] テーブルの [doing_cron] に設定された値が 0 のままなので、cron が実行されたことはいまだかつてないってことではないかと思うのです。たぶん、cron が実行されていたら [doing_cron] は、処理が走った time が入るんではないかと予想。

となると、ステータスが公開ではなかったから?でも、草稿のところには表示されないし、管理画面のステータスは公開になっていた気がするんですが。(その記事は既に手動で投稿してしまったので、確認するすべなし。)

気になるのは、記事投稿時にテキストボックスの下にある『公開』ボタンを押して投稿したのですが、右側にあるメニューの『投稿ステータス』の公開にチェックを入れておかないといけないような処理っぽかったので、この投稿で試してみます。

注:この記事はタイムスタンプを 2007/04/28/19:00 に設定し、2007/04/28/ 18:50 に投稿しました。

追記:テスト後

無事に未来投稿(予約投稿)されていました。
上に書かれていたことで、嘘情報がありました。[options] テーブルの [cron] が全て実行されたあとは、[doing_cron] に設定された値は 0 になるようです。[doing_cron] は、前回のイベントをチェックした際に一定期間内(たぶん30秒)は、イベントのチェックをしないようにするフラグみたいです。

ブログ等でよく このエントリーのはてなブックマーク被リンク数 で、はてなユーザのソーシャルブックマークでリンクされた数を表示しているのを見かけますが、これを表示する意味のひとつにSEO的な側面もあるみたいなので、表示できるようにしてみました。

SEO的な話は、今日のSEO:はてなブックマークの活用は有効なSEOだのブログ記事なんですが、そこにこのように書かれていました。

※3人以上のはてなユーザーからブックマークされると、注目エントリーに掲載される。

今日のSEO:はてなブックマークの活用は有効なSEOだ

で、この注目エントリーの Google PageRank が2なので、そこからバックリンクがもらえるとSEOの効果があるよ。ということらしいです。そういう一面もあったんですね。もちろんそれだけの理由で表示してるわけではないでしょうけど。

それほどブックマークされなくても、こちらからリンクをはれば、はてなからバックリンクをもらえるしくみになっているのならそこそこSEOの意味はあるだろうし、誰がブックマークしたかも簡単にチェックできるといった便利さもあるので、表示するようにカスタマイズしてみました。

wp-hatena プラグインをカスタマイズしてみる

このブログのテーマのひとつでもある『あるものは使う』の精神にのっとって、WordPress エントリをはてなブックマークに登録 – wp-hatena プラグイン正式版 – リリースで配布されている wp-hatena をカスタマイズしてみました。(正確にはWordPress Plugins/JSeries ≫ wp-hatenaで配布しているのでしょうか?)

上記リンク先からファイルをダウンロードして解凍するとwp-hatena.phpがあるので、そのなかの適当な場所に、以下のコード二つを追加してください。
(2007/04/24現在、wp-hatena-0.93j.zipです)

/**
 * WP interface.
 *
 * @param none
 * @return none (はてなブックマーク用の被リンク数を echo)
 */
function entryHatena()
{
    echo
        $this->entryBookmarkURL(
            'はてなブックマーク',
            'http://b.hatena.ne.jp/entry/',
            'http://b.hatena.ne.jp/entry/image/'
        );
}
/**
 * Bookmark URL entry.
 *
 * @param $sitename (サイト名称文字列)
 * @param $linkurl (リンク先URL)
 * @param $iconfile (画像ファイル URL)
 * @return $tag (画像リンクタグ)
 */
function entryBookmarkURL($sitename, $linkurl, $iconfile)
{
    $title = $this->utf8_encode(get_the_title());

    $tag  = '<a';
    $tag .= ' href="' . $linkurl . get_permalink() . '"';
    $tag .= '>';
    $tag .= '<img';
    $tag .= ' src="' . $iconfile . get_permalink() . '"';
    $tag .= ' alt="' . $title . 'の' . $sitename . '被リンク数"';
    $tag .= ' title="' . $title . 'の' . $sitename . '被リンク数"';
    $tag .= ' style="border: 0;margin: 0;padding: 0;vertical-align: baseline;" ';
    $tag .= '/>';
    $tag .= '</a>';

    return $tag;
}

あとは、テーマの表示したいところに以下のコードを追加すれば表示されます。

<?php if(isset($wph)) $wph->entryHatena(); ?>

ちなみに、このブログのバージョンは、2.1.3で動いていますが、2.0.X でも動くと思います。採用するかどうかは自己責任でお願いします。

で、このブログをブックマークしてくれている人がいないので現状表示されていません。(2007/04/24現在)
テストのために自分でブックマークして確認はしたのですが消しました。
誰か、ブックマークしてください。(反映されるのにちょっと時間がかかります。)

おまけで、del.icio.us と livedoorクリップ・ソーシャルブックマークも作ったのですが、どれくらい需要はあるんでしょう?

ファイルをそのままダウンロードできるようにしたいところですが、こういうのを公開したことがないので、ライセンスとかその辺のルールがいまいち分からないし、作者のhiromasa.zone :o) さん の許可もないので回りくどくて申し訳ないです。正直、ブログにソースコード書くのは面倒です。何か楽な方法はないでしょうか。

その後

で、カスタマイズした後にブックマークの登録件数を取得して、1件以上なら表示できるようにしようと思って、APIとかないか調べていたら、[WP:Plugin] 被ブックマーク数表示+ランキング生成プラグインという素敵なプラグインがありました。ショック。。

でも、自分がカスタマイズしたものに愛着が沸いたというか、懲りずに被ブックマーク数表示+ランキング生成プラグインを参考に、wp-hatenaを自分好みにカスタマイズしたんですけど、それはまた次の機会に。

style.cssの変更に対応する

2007/04/22 日曜日 18:40 投稿者 zon

ブログを立ち上げて間もない状態なので、ブログのレイアウトやデザインの微調整のためにスタイルシートを頻繁にいじっている状態になっています。

で、このスタイルシートがブラウザにキャッシュされていて、内容を変更しても閲覧している側がページの再読み込みをしてくれなければ、古いキャッシュファイルのスタイルシートのまま閲覧されておかしなレイアウトになっていることってあると思います。

正確には、自分が使っているFirefox2.0はスタイルシートが変更されたら、自動的にスタイルシートを再読み込みしてくれているのかこの現象は出ないのですが、IE6.0だと、スタイルシートを変更しても古いスタイルシートを使ってレイアウトがおかしくなります。

これを回避する為にちょっとした小技メモ。

ファイル名が同じでもHTMLで読み込む際のファイル名の後に、?v=xxx をつければ、別ファイルとしてキャッシュされるようです。これが、HTMLの文法的にありかなしなのかは調べていないから分かりませんが、割と使われている方法みたいだし、この際その辺の細かいことは気にせずコレを利用します。

?v=xxxを使った例

<style type="text/css" media="screen">
@import url(style.css?v=1.0.0);
</style>

この ?v=xxx の xxx 部分を更新時間が表示されるようにして、スタイルシートを修正すると自動で xxx が変更されるようにします。

WordPress の場合は、スタイルシートを読み込んでいる処理をしているところは、以下のファイルがほとんどだと思うのでここを修正すればOKです。

/wp-content/themes/テーマ名/header.php

スタイルシートのパスを出力する関数は、

<?php bloginfo('stylesheet_url'); ?>

でこの後に、ファイルの更新時間を取得する関数 filemtime('ファイルのパス') を使って

?v=<?php filemtime('ファイルのパス') ?>

を追加します。

WordPressでのカスタマイズ例

難しいことは分からないという人のために WordPress で使えるサンプルコードを以下に書いておきますが、この小技は、WordPressだけじゃなく、スタイルシートのパスさえ変更すれば、いろいろなところで使えます。

<style type="text/css" media="screen">
@import url(<?php bloginfo("stylesheet_url"); ?>?v=<?php echo filemtime(get_stylesheet_directory() . '/style.css'); ?>);
</style>
Page 6 of 6
1 4 5 6

zontheworld HTML convert time: 0.089 sec. ( Login )