日曜研究室 〜技術的な日常〜

技術的な観点から日常を綴ります

   7月 03

XREAのレンタル共用サーバーに設置したWordPressでメディアの一括削除ができない

WordPressのバージョンは2.7.1です。 いつも書いてる通りXREAのサーバーはあまり触りたくないのですが、依頼なので仕方ありません。 XREAでWordPressを動かす場合、モジュール版PHPではパーミッションの関連上ファイル操作に難があり、普通に設置しただけではWordPressから画像などをアップロードすることが出来ません。(PHPのセーフモードがらみの問題で、仕様ですね) そこで、管理画面は(もしくはアップロード用スクリプトのみを)CGI版PHPで動かす設定を.htaccessで施すことによってその問題を回避する方法があります。 まぁココまでは”XREA WordPress”などで検索すれば幾らでも出てくる情報なんですが、その設定をやった上で、今回新たに「メディアライブラリの一覧で、個々のファイルの左にあるチェックボックスを複数チェックして、一括して削除しようとしたときに、サーバーからの応答が無くなる」という問題が発生しました。 応答がなくても、実際によく調べてみると、ファイルの削除もデータベースの操作も完了してるっぽかったので正確には「削除できてる」んですが、削除ボタン(実際には適用ボタンですか)を押してから、ブラウザが延々といわゆる「読み込み中」のまま、という状態です。 HTTPヘッダも何も返ってこない状態。 該当部分のソースを読んでみたり色々テストしていくと、削除処理をした後のリダイレクト処理部分で”wp_redirect”という関数が呼ばれており、どうもその関数が上手く動いてない様子でした。 ちなみにモジュール版なら”wp_redirect”関数自体は普通に動作します。 一括削除処理だけモジュール版で動作するようにしようかと一瞬思いましたが、そのwp_redirect関数を含むファイルって、upload.phpなんですよね。 つまりupload.phpに表示・追加・削除の機能が一つにまとめられてるので、htaccessのfilesディレクティブで切り替える方法が使えません。 とりあえず今回はwp_redirectを呼んでる行をコメントアウトして、 <html> <header> <title>wordpress redirect</title> <meta http-equiv=”Refresh” content=”0; URL=$location”> </header> <body> しばらくお待ち下さい。 </body> </html> という内容を返すようにしました。 文字化けるかもしれないのでもっとちゃんとしたソースを返すようにした方がいいです。 他にもwp_redirect関数を呼び出してる部分があったのですが、それらはちゃんと動いてるようでした(ホントかな)のでそのままです。 一応調査の中で、 header(‘Location: http://example.com/’); などと一行だけ書いたスクリプトをCGI版で動かしてみたりしましたが普通に動きました。 まぁ、これが動かなかったら大問題になりますけど。 原因は複合的なんでしょうね。

Read the rest of this entry »

   1月 06

wp_get_attachment_imageでalt属性を出力できるようにした

WordPressには、wp_get_attachment_imageとwp_get_attachment_image_srcという関数(テンプレートタグ)があります。 これらの関数は、引数にブログに登録された画像ファイルのIDと表示サイズを渡し、その情報を取得することができます。 wp_get_attachment_image_srcは、戻り値として画像のURLと縦横のサイズを配列にしたものを返します。 wp_get_attachment_imageは、その関数内部でwp_get_attachment_image_srcを利用し、戻り値として画像を表示するためのHTMLタグを文字列として返します。 これらの関数は記事の枠組みにとらわれず、画像を表示し管理したい場合に役に立つのですが、SEO的に必須とも言えるようなimgタグのalt属性に対応していません。 Wordpressの管理画面では画像ファイルに”キャプション”と”説明”というalt属性として使えそうな項目を関連付けられるのにも関わらず、それらがあまり生かされていないのは勿体無いと言う外ありません。 そこで、今回は管理画面で言うところの画像の”キャプション”を”alt属性”として出力できるようなプラグインを作成してみました。 名前は、wp_get_attachment_image_complete。センスのかけらもないネーミングですね。 プラグインファイルはここからダウンロードできます。 使い方 ダウンロードして解凍し、Wordpressのプラグインフォルダに入れて、管理画面から有効にします。 そうするとテンプレートでwp_get_attachment_image_completeとwp_get_attachment_image_src_completeの2つのテンプレートタグが利用可能になります。 元々のテンプレートタグと互換性を持たせてあるので、そのまま置き換えるだけ(同じ使い方)で問題ないハズです。 wp_get_attachment_image_completeは特に何もしなくてもalt属性を出力します。 wp_get_attachment_image_src_completeは、戻り値の配列の4番目と5番目、つまり$imgに格納したとして$img[3]と$img[4]がそれぞれ”キャプション”と”説明”に対応します。 あとがき、言い訳 本当は、wp_get_attachment_imageから呼び出されるwp_get_attachment_metadataにフックをかけるのがスマートだと思うのですが、そうした場合に何故かpost idがプラグインの関数側で取得できないという問題が起き、それを解決するためにwp-includes内の関数に手を加える以外の方法を思いつかなかったので、違う関数名で定義することにしました。 バージョンアップが頻繁なWordpressですから、wp-includes内の関数に手を加えたのを忘れて新しいバージョンを上書きすると面倒なことになりますからね。 もしかしたら、同じ機能を持つもっと良いプラグインが他に実在するかもしれません。 ただ、ちょっと調べた感じでは無さそうだったので作ってみました。 というかそもそも、元のwp_get_attachment_image自体があまり利用されてない気がする・・・ このブログでも使ってないしw あと、元のソースをベースになるべく時間をかけずに改造したので汚くなってます。 1から自分で書けば、まるで清廉なポエムを読んでるような気分になるくらい美しいソースになるんですが。ウソです。ドキドキです。 ライセンスはWordpressのソースを流用してるので一応GNU GPLってことにしておきます。コピーレフトコピーレフト。 post idがプラグインの関数側で取得できない問題について 今回公開したプラグインはこの問題を避けているので関係ないのですが、気になったので記録しておきます。 といっても、きちんと調べて説明するのが面倒なので箇条書き風です。 func_get_args関数には魔物が潜んでるのかもしれない。 wp_get_attachment_metadata関数内部 return apply_filters( ‘wp_get_attachment_metadata’, $data, $post->ID ); ここでは$dataに画像の基本的な情報(src,width,height)とEXIFデータが格納されてて、$post->IDには画像のID(WordPressは記事も画像データも同じテーブルに入ってるため、$image->IDとかじゃなくて$post->IDになる)が入ってる。画像のキャプションと説明はpostテーブルに入ってるためそれらを取得するには$post->ID超重要。 apply_filters関数内部 $args = func_get_args(); 何故かprint_r($args)で$post->IDで渡されたものが出てこない。 しかし$args[2]と直接指定すると見える。 最終的にcall_user_func_arrayでプラグインの関数が呼び出される訳ですが、 プラグインの関数内ではもう完全に$post->IDで渡されたはずのデータが見れなくなってる。

Read the rest of this entry »

   8月 06

沖縄で何が起きているのか

大した内容ではございません。 近くのMT信者にちょっとイラッとしたので、Google TrendsでMTの没落っぷりを見て独りほくそ笑んでおりました。いやな性格です。ついでにWordpressの隆盛っぷりも見て悦に入っていました。 MTは日本以外の国での検索数が非常に少なく、たまたま見たカナダのデータでは検索数が少なすぎてグラフが表示されないような状態でした。 一方Wordpressの検索数では日本はトップ10にさえ入っていませんが、その11位以下の日本でさえWordpressの検索数の方がMTの検索数を軽く超えています。つまり、MTに最大限有利に計算しても10倍以上は検索数の差があるということです。もちろんカナダのグラフも普通に表示されました。 MTにとっては最後の頼みの綱である日本でさえ検索数でWordpressに圧倒的に負けている状況は、没落しているとしか言いようがありません。 ちなみにMT没落の原因としてMT3発表時のライセンス問題がよく挙げられますが、僕はそれだけではないと思います。MT4になってから仕事上いくつかの案件で使ったことがあるのですが、あんな重くてバグが多く運用に気を使うソフトウェアは、代替が豊富にある今となっては、タダであっても使う気がしません。要はソフトウェアそのものの出来によって没落した部分もあると思います。 とまぁ、そんな没落ソフトのことはどうでもいいのですが、気になるのは、日本国内では、Movable TypeとWordpressの検索数でどちらも沖縄が東京を抜いて1位だという点です。沖縄で何が起きているのでしょうか。その真相について非常に興味があるところです。

Read the rest of this entry »