WordPress」タグアーカイブ

WordPress コメント欄の URL 変換がおかしい気がする

WordPress ではコメント欄に URL が書き込まれると、自動的に <a> タグに変換してくれます。
これを実現しているのが、wp-includes\default-filters.php に記述してあるフィルターフック add_filter( 'comment_text', 'make_clickable', 9 ); と、wp-includes\formatting.php に記述してある make_clickable() 関数。
しかし、この make_clickable() 関数内で使用している正規表現が適切では無いため、全角文字も URL として処理されてしまいます。
これにより URL の後ろにスペースが入らず、そのままコメントが続いてしまうと、嫌な感じに整形されてしまいます。

URLに使える文字列を規定している RFC2396 によると、URLとして使える文字は reserved | unreserved | escaped の3種類です。
大雑把にまとめると

  • reserved = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" | "$" | ","
  • unreserved = alphanum (英数字) | mark ( "-" | "_" | "." | "!" | "~" | "*" | "'" | "(" | ")" )
  • escaped = "%" hex hex
    ※日本語などの unreserved 以外の文字は16進数のコードに変換後、頭に % をつけてエスケープする。

続きを読む

WordPress マルチサイト版の高速化アイデア

WordPress をマルチサイトで使用していると、画像のURLが以下のような感じになると思います。

http://hoge.example.com/files/2011/05/fuga.jpg

しかし、実際にはサーバ上には /files/2011/05/fuga.jpg ってファイルは存在してません。
WordPress が、どうやってこのファイルを処理しているかというと

  1. wp-includes/rewrite.php の WP_Rewrite クラスで wp-includes/ms-files.php?file=2011/05/fuga.jpg に書き換え
  2. wp-includes/ms-files.php で、/wp-content/blogs.dir/{blog ID}/files/2011/05/fuga.jpg を読み込んで出力

つまり、静的ファイルにアクセスするためにわざわざ WordPress のプロセスを起動してるわけですね。
これでは、画像をいっぱい張ってある場合、非常に重たくなります。

てなわけで、以下のように設定してやれば wp-includes/ms-files.php を経由しないで、直接 Web サーバに応答させることができるのでは無いの?ってな按配です。
続きを読む

wp_remote_get のススメ

WordPress プラグインで外部サービスのAPIを叩く場合、以前は Snoopy 等のライブラリを include して行っていました。
# Snoopy が WordPress コアソースに含まれていたため。

しかし、WordPress 2.7 以降では wp_remote_get() という関数が追加されたため、もっぱらこれを使っています。
例えば Topsy の API を使って、パーマリンクに対して言及されたツイートを取得するには以下のようなコードを書けば実現できます。

$response = wp_remote_get('http://otter.topsy.com/trackbacks.json?url='.rawurlencode(get_permalink()).'&tracktype=tweet&perpage=50');
if( !is_wp_error( $response ) && $response["response"]["code"] === 200 ) {
	$response_body = json_decode($response["body"]);
	var_dump($response_body->response->list[0]);
} else {
	// Handle error here.
}

簡単でしょ?

以下、簡単に wp_remote_get の使い方
続きを読む

WordPressで、特定のエントリーについたコメントをCSVで一括DLできる方法とかないかな

Comment Downloader

WordPressで、特定のエントリーについたコメントをCSVで一括DLできる方法とかないかな@tunakko_ さんが、「WordPressで、特定のエントリーについたコメントをCSVで一括DLできる方法とかないかな」とか言ってたので、任意のエントリに着いたコメントの情報をタブ区切りテキストで一括してダウンロードできるプラグイン Comment Downloader を作ってみました。
カンマ区切りではなくタブ区切りなのは、コメント内にカンマが含まれていた時の処理が面倒くさかったため。面倒臭がりですいません。
ソース見てもらえば分かるんですが作りは単純です。
ログインしてないとコメント一覧をダウンロードできないようにしてあるので、勝手にダウンロードされる恐れは無いかと思われます。
このプラグインのダウンロードは以下から。
http://dl.dropbox.com/u/110305/comment-dl.zip

ダッシュボードで投稿一覧画面を表示すると、右端に「この投稿のコメントをダウンロード」ってリンクが表示されるので、それをクリックすると zip 形式で圧縮されたテキストファイルをダウンロードできます。
後は、それを Excel に食わせるなりなんなり好きにしてやってください。

Head Cleaner 1.4.2.x リリース

Head Cleaner をアップデートしました。
WordPress > Head Cleaner « WordPress Plugins

今回の追加機能は以下の2つ。

  • Last-Modified タグ出力オプション
  • パラノイアモードの搭載

パラノイアモードが、どんな機能かというと head 部だけでなく html 全体をなるべく小さくするように不要な改行や連続した空白を取り除いちゃう機能です。
ただ、このパラノイアモードは実験的な機能なので、不具合が出る場合は適用しないでください。
# どんな感じになるかは、当サイトの HTML ソースを見てみてください。

さて、当サイトのトップページがどれくらい小さくなるかというと

HeadCleaner off

45.0 KB
HeadCleaner on without paranoia mode

39.6 KB
HeadCleaner on with paranoia mode

36.4 kB

パラノイアモードオフの場合は12%、パラノイアモードをオンにすると19%サイズダウンしました!

当サイトでは gzip 圧縮が有効になっているため、実際に転送されるファイルのサイズは gzip 圧縮後のサイズになります。
あと Head Cleaner は自サイトの JS, CSS も最小化してくれるため、それらもまとめて見てみた方が良いでしょう。

HeadCleaner off

83.3 KB
HeadCleaner on without paranoia mode

72.3 KB
HeadCleaner on with paranoia mode

72.1 kB

パラノイアモードオフの場合は13.2%、パラノイアモードをオンにすると13.2%サイズダウンしました!
パラノイアモードあまり意味ない orz
続きを読む

WordPress でカテゴリのリンクを変更する

WordPress でカテゴリのリンクを標準以外に変更する方法です。
まぁ、それ専用のプラグインとかも探せば有ると思うんですが

http://example.com/?cid=xx 形式に変更する

例えば、カテゴリのリンクを http://example.com/?cid=xx とかって形式でも表示できるようにするには、以下のようにして parse_query フィルタを使うと良いです。
# functions.php とかに追加してやってください。

class add_category_link_to_different_link {
	function __construct(){
		add_filter('query_vars', array(&$this, 'add_query_vars'));
		add_action('parse_query', array(&$this, 'parse_query'));
	}
	public function add_query_vars($qvars) {
		$qvars[] = 'cid';
		return $qvars;
	}
	public function parse_query($query) {
		$cat_id  = (int) $query->query_vars['cid'];
		if ( !(empty($cat_id) || $cat_id === 0) ) {
			$url = get_category_link($cat_id);
			if ( !empty($url) && $url !== FALSE ) {
				$query->query_vars["cat"] = $cat_id;
				$query->is_404 = false;
			} else {
				$query->set_404();
			}
		}
		return $query;
	}
}
new add_category_link_to_different_link;

続きを読む

WordPress でスニペットを簡単に管理する方法

昨今の WordPress 人気にあやかって、「WordPress スニペット」とか「WordPress functions.php カスタマイズ」とかで検索すると、functions.php を使ってできる簡単なカスタマイズ方法が出てきます。
これらを functions.php で管理してるとテーマを変更した時とか、コピペしなおさなきゃ行けなくなって面倒くさいことこの上ありません。
このカスタマイズやっぱ要らないなーとか思っても、すでにどこに書いていたか分からなくなっちゃうなんてこともしばしば。
そんなわけで、私はこれらのスニペットについては簡単なプラグインを作って管理してます。
# 昔は my-hacks.php ってファイルを使って管理できたんですが、WordPress 2.8 以降から非推奨になっちゃいました。
続きを読む

WordPress で URL をすべて相対 URL にする方法

WordPress で SSL 対応した時に、プラグインが書き出すリンクやコンテンツ内のリンクが https:// にならずに哀しくなることはありませんか?
そんなときは、こんな感じのコードを functions.php に書いておけば、一発で全てのリンクを相対URLに変更してくれますよ。

class relative_URI {
	function relative_URI() {
		add_action('get_header', array(&$this, 'get_header'), 1);
		add_action('wp_footer', array(&$this, 'wp_footer'), 99999);
	}
	function replace_relative_URI($content) {
		$home_url = trailingslashit(get_home_url('/'));
		return str_replace($home_url, '/', $content);
	}
	function get_header(){
		ob_start(array(&$this, 'replace_relative_URI'));
	}
	function wp_footer(){
		ob_end_flush();
	}
}
new relative_URI();

ob_start() 関数を使っているので、ob_start() を使っているプラグインとは相性が悪いかもしれません。
# 例えば、私の作った Head Cleaner とか。

WordPress 開発に便利なプラグイン Debug Bar

screenshot_0WordPress 3.1 から導入された管理バー。
僕は好きなんだけど、結構嫌いな人は多いみたいですね。
そんな人達に管理バーがあると便利だよって伝えたいエントリ。

まずは、以下の2つのプラグインをインストールしてみてください。

そうすると、管理バーの右端に「Debug」ってメニューが追加されるはずです。
これが相当便利。
続きを読む

WordPress 3.1 がリリースされました

WordPress › WordPress 3.1, lots of fun
WordPress 3.1 が正式リリースされたので、早速バージョンアップしました。
# つっても、ずいぶん前から 3.1 RC で運用してたんですが
今回は RC5 まで行ってしまうくらいの長い RC 期間を経てのリリースです。

個人的には、ログイン時にサイト上部に表示される Admin Tool Bar がお気に入り。
WordPress 3.1 の新機能については、おでこんの所とか、WordPants とか、WordPress Codex とかで勉強すれば良いと思うよ。