Home > wordpress

wordpress Archive

[WPCH vol.01] ウィジェットをハック。タグクラウドのソート順を変更する

WordPress は様々な動作を、テーマやウィジェットなどに記述することで拡張することができます。ただ、ほんのちょっとのことだったり、こうだと便利なのに!と思う部分を、全部テーマやウィジェットで書き直すのはまず面倒ですし、最終的に全体のパフォーマンスに影響を与えます。

というわけで、新しいウィジェットを書いたり、テーマファイルに特別な記述をしたりするよりも、ほんのちょっとだけコアのプログラムに手を入れて、ほんのちょっとだけ楽したり、自己満足したりするカテゴリーを立ててみました。

第一弾として、多くの人がブログとして使う際に利用しているであろう、タグクラウドの並び順を変更してみます。
ファイルは、wp-dir/wp-includes/widgets.php です。


// 1340行目付近

function wp_widget_tag_cloud($args) {
	extract($args);
	$options = get_option('widget_tag_cloud');
	$title = empty($options['title']) ? __('Tags') : $options['title'];

	echo $before_widget;
	echo $before_title . $title . $after_title;
// wp_tag_cloud 並び順変更(デフォルトは名前の昇順。カウントの降順にする)
//	wp_tag_cloud(); // この行をコメントし、下のようにする
	wp_tag_cloud(array('orderby' => 'count', 'order' => 'DESC'));
	echo $after_widget;
}

上記のように、wp_tag_cloud();を、wp_tag_cloud(array('orderby' => 'count', 'order' => 'DESC'));にすることで、使用頻度(count)の高い順(DESC)に出力させることができます。

function wp_tag_cloud()は、wp-dir/wp-includes/category-template.phpにあって、以下のように書かれています。


// category-template.php function wp_tag_cloud() 内

	$defaults = array(
		'smallest' => 8, 'largest' => 22, 'unit' => 'pt', 'number' => 45,
		'format' => 'flat', 'orderby' => 'name', 'order' => 'ASC',
		'exclude' => '', 'include' => ''
	);

というわけなので、これは次のように設定できることがわかります。


// 先の wp_tag_cloud()の呼び出し箇所

	wp_tag_cloud(array(
		'smallest' => 8,	// styleで定義されるフォントサイズ(小さい)
		'largest' => 22,	// 同上(最も大きい)
		'unit' => 'pt',		// フォントサイズのユニット(ex:pt,em,px)
		'number' => 45,		// リミッター(SQL の LIMIT 句に使われるので、多くのタグを使う場合増やすこと。)
		'format' => 'flat',	// 出力形式。list(デフォルト) と flat(内部的なデフォルト)が使える。array は未調査。
		'orderby' => 'name',	// ソートキー。name と count(内部的なデフォルト) が使える
		'order' => 'ASC',	// ソート順。DESC(降順) と RAND(ランダム) が使える。ASC(昇順)はデフォルト。
		'exclude' => '',	// 含まないタグID(未検証)
		'include' => ''		// 含みたいタグID(未検証)
	);

や、ぶっちゃけ、FC2ブログが同じようにできるらしくて、WPでもできない?って聞かれただけなんですけどね。

注:この情報は、WordPress 2.5 をベースに書かれています。また、WP自体をバージョンアップする場合に、ヘタに上書きしたり、逆に反映し忘れたりしないように、サブバージョン等でのファイル管理をお勧めします。

[WPTH vol.02] 携帯3キャリアに対応した header.php のメモ

日本国内の携帯電話3キャリア(ただし3Gのみ)に対応した WordPress Theme 記述の手抜き版。既存の携帯プラグインは多機能なため、自分でテーマを管理できる場合や、要求精度が低い場合には冗長すぎるので、プラグインなしでPC用と同一テンプレートで処理するには?ということで書いてみた。

アウトプットはPC版の文字コードに依存する。ME では検証していない(たぶん問題なく動く)。UTF-8 以外の文字コードで動作確認をしていないが、変更する場合は記述も変えないといけないことに注意。動作確認は、テストサイト漢字読めるかな?(QRから携帯で確認可能)にて行っている。各々の環境で確認してみて、不具合などあれば教えていただけると非常にありがたい。


<?php
	$agent = $_SERVER['HTTP_USER_AGENT'];
	$isPC  = 1;
	if(ereg("^DoCoMo", $agent)){
		header("Content-Type:application/xhtml+xml");
		$isPC  = 0;
		$xml=<<<EOF
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//i-mode group (ja)//DTD XHTML i-XHTML(Locale/Ver.=ja/1.0) 1.0//EN" "i-xhtml_4ja_10.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
EOF;
	}else if(ereg("^J-PHONE|^Vodafone|^SoftBank", $agent)){
		$isPC  = 0;
		$xml=<<<EOF
<?xml version="1.0"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html lang="ja" xml:lang="ja" xmlns="http://www.w3.org/1999/xhtml">
EOF;
	}else if(ereg("^UP.Browser|^KDDI", $agent)){
		$isPC  = 0;
		$xml=<<<EOF
<?xml version="1.0"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html lang="ja" xml:lang="ja" xmlns="http://www.w3.org/1999/xhtml">
EOF;
	}else{
		$xml=<<<EOF
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html lang="ja" xml:lang="ja" xmlns="http://www.w3.org/1999/xhtml">
EOF;
	}
	echo $xml;
?>
<head>

中略

<?php if ( $isPC != 1 ){ ?>
<style type=text/css">
<!--
// 携帯用にCSSを記述。利用可能範囲に注意。
//-->
</style>
<?php } ?>

漢字読めるかな?の環境まわりは次のとおり。

  • WordPress 日本語版 2.5
  • DB は MySQL 5
  • 文字コードはUTF-8
  • docomo は 705,905 など多数の機種で確認(自前ではないので正確な表示確認はしていない)
  • au は W43SA INFOBAR2 などの機種で確認
  • SoftBank は、911SH 920T などの機種で確認

[WPTH vol.01] header.php でよく使う書き方メモ

WordPress の Theme ファイルのうち、header.php でよく使う書き方を備忘的にメモ。まだ検証途中であり、後々まとめを作成する予定。将来的に汎用的に使いまわせるようにできるといいと思う。

title


<title><?php
    wp_title(' | ',true,'right');
    bloginfo(’name’);
    if(is_home()){
        echo ' | ';
        bloginfo('description');
    }
?></title>

description


<?php if ( $description = get_bloginfo('description') ) { ?><meta name="description" content="<?php bloginfo('description'); ?>" /><?php } ?>

CSS


<link rel="stylesheet" href="<?php bloginfo('stylesheet_url'); ?>" type="text/css" media="screen" />
<link rel="stylesheet" href="<?php bloginfo('template_url'); ?>/print.css" type="text/css" media="print" />

link (ナビゲーション) home へのリンク用


<?php if (!is_home()) { ?><link rel="start" href="<?php bloginfo('home'); ?>" title="<?php bloginfo('name'); ?> Home" /><?php } ?>

link (ナビゲーション) アーカイブへのリンク用


<?php wp_get_archives('type=monthly&format=link'); ?>

wp-contact-form-7 に簡単に定数(っぽいもの)をつける方法のメモ

WordPress 2.5 でも使えるコンタクトフォームプラグインは数多くありますが、当サイトでは、Contact Form 7 Plugin を使わせていただくことにしました。

比較的わかりやすい設定ですし、デフォルトでもそこそこ使えるので重宝しているわけですが、どうしてもメール本文中に、送信日時や、送信者のUA情報などを含めたいと考えました。しかし、上記ページ中のコメント欄にあるとおり、デフォルトの機能の中にはそういった機能はついていません。

というわけで、ちょっとだけいじってみたところ、とりあえずうまくいったので公開してみます。あくまでこのプラグインを使いつつ、どうしても利用者情報が欲しいという場合の応急処置であること、利用に関しては自己責任、ということでお願いします。また、この情報は2008年4月20日現在の最新版である、7.1.7.7 を対象にしています。

    function mail_callback($matches) {
        if (isset($_POST[$matches[1]])) {
            $submitted = $_POST[$matches[1]];
            if (is_array($submitted))
                $submitted = join(', ', $submitted);
            return stripslashes($submitted);
        } else {
            return $matches[0];
        }
    }

wp-contact-form-7.php の160行目付近の上記 function を、下記のように修正します。

    function mail_callback($matches) {
        if (isset($_POST[$matches[1]])) {
            $submitted = $_POST[$matches[1]];
            if (is_array($submitted))
                $submitted = join(', ', $submitted);
            return stripslashes($submitted);
        } else {
// メール送信時に定数(っぽいもの)を追加
            if ( $matches[1] === 'WPCF7_SEND_DATE'){return date("Y/m/d G:i:s T");}
            if ( $matches[1] === 'WPCF7_SEND_UA')  {return $_SERVER['HTTP_USER_AGENT'];}
            if ( $matches[1] === 'WPCF7_SEND_HOST'){return $_SERVER["REMOTE_HOST"] ? $_SERVER["REMOTE_HOST"] : $_SERVER["REMOTE_ADDR"];}
            return $matches[0];
        }
    }

これにより、管理画面でメールのメッセージ本文のテキストエリアに、[WPCF7_SEND_DATE]、[WPCF7_SEND_UA]、[WPCF7_SEND_HOST]を加えることで、メールの本文中にそれぞれ、送信日時、ユーザーエージェント(ブラウザ)、送信元ホスト情報(サーバ名かIPアドレス)を出力することが可能になります。実際にはUSER_AGENTの出力には少し気を使ったほうがいいはずですが、お問い合わせという性質上、とりあえずこれで問題ないと思います(基本的に受け取るのは自分だけでしょ?)。もしセキュリティ的にこうしたほうが安全だ、というのがあれば教えていただけたら幸いです。

作者の方には特にコンタクトしないままいじってしまったのですが、とりあえず勝手処理、ということで。くれぐれもこの修正で生じた問題などで作者の方にご迷惑をおかけしないようにお願いします。

注意(よく読んでください)

  • 本当に、作者の方に迷惑かけるのだけは止めてください。
  • 自分の作業メモなので、これについてのサポートは勘弁してください。
  • メッセージ本文でしかテストしていませんw タイトル欄やメールアドレスのところにこれらを設定することはないと思いますが、もし設定して何かよくないことが発生しても自己責任でお願いします(たぶんメールが送れないとかそういう目にあいます)。
  • 定数名の WPCF7 部分を、適宜書き換えて使ってください。単にメール送信直前の処理で、値を置き換えているに過ぎません。もしハッキング目的でコレを悪用しようと思えば、例えば POST データに対して、この定数名でデータを送り込まれた場合、そのデータが優先されてしまいます(一応処理速度と自己設定優先で後ろに置いているので)。この意味がわからない場合は、この修正を行わないほうが無難です。

ついでだから利用者情報を取得したい主な理由とか書いておこうかな(コメント6093へのレスじゃないけどw)

  • 入力されたメッセージ以外にも、情報を整形してコピーを送信者に返す場合に、送信日時は必要
  • 受信したメールを元にやり取りを始める場合、受け取るメーラの種類によっては返信時に元の投稿日時を引き継がないものがある(なので日時が入ってると便利)
  • UA情報を追加することで、単なる閲覧利用者ではなく、問い合わせをしてくれる利用者のUAの傾向を把握しやすくなる。それによりサイトのデザインやそのチェックの方向性を定めやすくなる
  • 送信元ホスト情報は(たとえ気休めでも)セキュリティ向上に一役買う。また、いざという時に、IP-BANしやすくなる。
  • まぁ、ぶっちゃけ友人に問い合わせのメールにそういうデータ入れたいんだけど、って言われちゃっただけなんだけどねw

function.php で widget の出力内容を変更するメモ

WordPress 2.5 のデフォルトテーマなどに含まれている function.php はサイドバーの名称が数字で表される上に、なぜか全体を <li> で囲むという仕様になっています。(これはもちろん、sidebar.php が widget 全体を <ul> で囲っているからだが。)別にそれがダメだと言い切るつもりはないけど、イマイチ気持ち悪い感は否めないんです。

if ( function_exists('register_sidebar') )
    register_sidebar(array(
        'before_widget' => '<li id="%1$s" class="widget %2$s">',
        'after_widget' => '</li>',
        'before_title' => '<h2 class="widgettitle">',
        'after_title' => '</h2>',
    ));
}

そこでこの <li> を外して <div> に変更してみました。ついでにCSSで処理しやすいように内側に <div> を追加し(ソコdiv厨とか言わないw)さらにきれいに改行して見栄えもよくしてみました(注:2008年4月16日現在の当サイトでは使っていません。別のサイトで採用しています)。

if ( function_exists('register_sidebar') ){
    register_sidebar(array(
        'name' => 'sidebar1',
        'before_widget' => "\\n<div id=\"%1\$s\" class=\"widget %2\$s\">\\n<div class=\"widget-inner\">\\n",
        'after_widget' => "\\n</div>\\n</div>\\n",
    ));
}

参考になるのは次の点

before(after)_title の記述は削除
デフォルトと同じ記述だったら不要なので。もちろん class 名を変更したい場合にはつければOK。
name で名前をつけた
管理画面で表示されます。複数のサイドバーをセットする際に管理しやすいです。
before(after)_widget への代入を”(ダブルクォーテーション)にする
\n(改行のしるし)を活かせるので、出力結果をきれいにフォーマットできます。ただし、中に含まれる”をエスケープする必要があります。
閉じ忘れない
内部的に div を増やしたので閉じ忘れないこと。MT でのCSS作成に慣れた人には、inner class は使い勝手がよいと思います。これの最大のメリットは、最近流行りのビッグフッターをウィジェットで作成するときのコントロールのしやすさだと思うので(横に並べてマージンをとったり、背景画像で装飾したりしやすくなる)。

WP に限らずテンプレートシステムからのアウトプットは汚くなりがち。ソース上の見栄えがちょっとでもきれいになって、それをうれしい、と思う人の参考になれば幸いです。

WPのバージョンアップとテーマ変更

最近他のサイトのことばっかりで、本体をいじる暇がなかったんだけど、ちょっと時間ができたので、このサイトのWordpressを、RC1から正式版にアップグレードし、ついでにテーマのテストで、Wordpress Magazine にしてみました。

インストールガイドもついてて丁寧なんだけど、ちゃんとやってないのでいろんなところが壊れているwぼちぼち直していかなきゃ。。。

WordPress 2.5 正式版のリリース

本家版のWordPress 2.5 が3月30日、ついにリリースされたようですね。RC1でのテストは概ね済んでいるので、順次正式版に切り替えていこうと思います。

WordPress2.5RC1リリース

皆さんお待ちかねのWordPress2.5がリリースされたようです。RC1ですけれどもw

でもさっそくテスト中のサイトに組み込んでみちゃうわけですよ。早くいじりたーいw

もちろんご利用は自己責任ですよ。RC1のバグ報告は歓迎って書いてあるけど、それでぎゃーぎゃー文句言っちゃダメですよ。

WordPress の管理画面テーマやプラグイン

WordPress の管理画面用のテーマやプラグインのまとめエントリーがありました。The Best Wordpress Admin Themes You Could Possibly Find(英語なので注意w)

雰囲気としては WP Tiger Administration がよさげな雰囲気です。もっと他にもあるぜ、というのがあったら教えてください!

Prologue Theme をテスト

ティーザーサイトっぽくあけようかとも思ったんだけど、WPを無駄にするくらいなら、何かに使おう、というわけで、シンプルに、Twitter 風テーマの Prologue Theme を使用することにしました。当面の間コレでいきます。

注:2008年4月15日にWPのバージョンアップをしたことに伴い、テーマを変更しました。

ホーム > wordpress

Search
Feeds
Meta


Return to page top