WordPress Thematic フレームワークで hiromasa.another をつくる

最近、ウィジェットは入れるは JavaScript でひゅんひゅん動くはで、WordPress 近代化が図られている(!?)このサイトですが、何を隠そう IE8 でみるとおかしかったのです。 しょうがないので、IE7 エミュレーションしていたのですが、気にくわなかったのでついにテーマを書き直すことに!

テーマといえばおでこさんでおなじみ、Thematic テーマフレームワーク。 目標は、旧 hiromasa.another を style.css と functios.php だけで再現すること、、、、なのでご覧のサイトは既に Thematic 版になっていますが見た目はほとんど変わっていません :)。

Thematic とはなんじゃという方や、初めて使う方はおでさんのスライドが良いっす!

テーマフレームワークは、WordPress のお約束的な部分が既にできていて、それに対して追加設定をするような形でテーマを構築していくものです。 ループなど基本的なことはもちろん、コアやプラグインが要求するようなテーマの仕様がきちんと設定されています。

まっさらからフルスクラッチすると忘れがちな部分や大変な部分が既に構築済みなので、PHP コードに関して楽ができます。 また、ぼくのような CSS がよく分からないものにも、リセットや段組などのノウハウ的な部分が盛り込まれていますので便利に感じました。

新しいテーマの構築は、style.css への CSS の追加適応とたくさんの位置に配置できるウィジェットでほぼ望みのサイトはできると思いますが、「ウィジェットが配置できないところに何かを出したい」とか、「表示文言を変えたい」とかいったときに、さらに追加で2つの方法をとることができます。

ひとつは Thematic 本体から修正したいテンプレートファイルをコピーしてきて書き換えること。 もうひとつは、WordPress のフックの仕組みをつかって functions.php でプログラム的に書き換えることです。

どちらの方法をとっても良いと思いますが、ここでは後者を紹介してみます。

style.css と functions.php だけでサイトを構築するのは極端ですが、functions.php 作戦はファイルを修正するより楽にできる部分もありますので、いくつかのコードが参考になれば。

まず基本的なところですが、Thematic の本体にはあちこちで do_action もしくは apply_filter をしているところがります。 これを自分の functions.php に追加したプログラムでフックして動作を書き換えるイメージです。 どんなフックがあるかは、修正対象部分の Thematic 本体のプログラムを追っていけば大抵は見つけることができます。

以下、そんなコードの例です。(自分のテーマ内の functions.php にかきます)

パターン1。 どっかに何かを追加。

hiromasa.another のヘッダには kougabu さんのサムネイルが4つでていますが、このようなことをするには Thematic 本体で do_action をしているところをみつけて、そこに echo で HTML を差し込みます。(ここでは thematic_header というフックを使いました)

/*************************************************************
 * ブログヘッダー部分に kougabu のサムネイルいれる
 *************************************************************/
function head_kougabu() {

    echo '<div id="header-kougabu">' . "\n";
    echo '<ul style="display: inline;">' . "\n";
    kougabu_get_images('before=<li style="display: inline;">
        &post_id=662&count=4&max_width=70&max_height=70');
    echo '</ul>' . "\n";
    echo '</div>' . "\n";

}

add_action('thematic_header', 'head_kougabu', 6);

パターン2。 不要な文字列を削除。

たとえば、記事の下に出ている記事情報メタ文字列を消すコードです。 ここではついでに消したトラックバック URL を別な場所(コメントフォームの下に動かしています)

/*************************************************************
 * トラックバックの URL をコメントフォームの下に移動
 *************************************************************/
function trackback_add_url() {
    echo '<div id="trackbacks">' . "\n";
    echo '<h3>Trackback</h3>' . "\n";
    echo '<p>' . trackback_url() . '</p>' . "\n";
    echo '</div>' . "\n";
}

function trackback_delete_default($content) {
    return '';
}

add_action('thematic_belowcomments', 'trackback_add_url');
add_filter('thematic_postfooter', 'trackback_delete_default');

パターン3。 不要なフックの削除。

ある状態の時に、Thematic にデフォルトで登録してあるフックを呼ばなく(delete)する場合です。 たとえば、シングルページの時はナビゲーションを出さない、など。 ポイントはいきなり remove_action するのではなく、template_redirect くらいまで実行を遅延させることです。

自分の functions.php は Thematic の functions.php より先に呼ばれます。 なので、いきなり remove は無理、なのです。 で、 init くらいでもいいかなって感じなのですが、ここだとまだ is_single が確定できてないので、適当に  template_redirect でやってみました。

/*************************************************************
 * 不要なナビゲーション削除
 *************************************************************/
function navigation_delete_post() {
    remove_action('thematic_navigation_above', 'thematic_nav_above', 2);
    if(!is_single()) return;
    remove_action('thematic_navigation_below', 'thematic_nav_below', 2);
}

add_action('template_redirect', 'navigation_delete_post');

パターン4。 ある特定ページだけサイドバーを消す。

ここのサイトの Gallery ページでやっている部分です。 Thematic のコードを追っていくと制御できるコードがありました。 thematic_sidebar に false を返すとサイドバーが非表示になるようです。

/*************************************************************
 * ギャラリーページだったらサイドバーをなし
 *************************************************************/
function kougabu_delete_sidebar() {
    $show = true;
    // kougabu page : 182
    if(is_page('182')) {
        $show = false;
    }
    return $show;
}

add_filter('thematic_sidebar', 'kougabu_delete_sidebar');

パターン5。 パターン2といっしょですが、ある文字列を修正加工。

フッター文字列にクエリー数をだしています。

/*************************************************************
 * フッターにクエリー数
 *************************************************************/
function fotter_add_query($content) {
    global $wpdb;
    $timer = "({$wpdb->num_queries} queries.";
    $timer .= timer_stop(false) . "seconds.)";
    return $content . ' ' . $timer;
}
add_filter('thematic_footertext', 'fotter_add_query');

などなど。

ここのサイトでは他にも、記事タイトルにカレンダーだしてり、いろいろしていますがパターンはほぼ全ていっしょです。 🙂

ひとつだけ違うのが、コメント、トラックバック・ピンバックの表示で、Thematic 標準ではそれぞれ分けた形で表示となるのですが、hiromasa.another はずらっと並べる形にしていたので、それは comment.php をコピーして修正しています。

functions.php でも無理矢理やればできたのですが、おそらくは Thematic 作者さんの意図外でしたのでやめました。 こういうときは素直にいったほうが良さそうです。 🙂

てなわけで、

[tegaki]できた~[/tegaki]

何を隠そう、ぼくは CSS がなんちゃってしか分からないのでそちらに時間がかかりました。。 まだおかしいところありますが、とりあえず。。

thematic01

制作は Linux 上の Firefox で確認。 一応、IE6 もそれなりにでるようにしています。 ぼくは VMWare 上の XP をわざと IE6 のままにしていてそれを、Unity で Linux のデスクトップにだして確認する方法をとっています。

テーマフレームワークは CSS さくさくできる方なら、WordPress がそれほど分からなくてもテーマつくれちゃいますね。 あとは、PHP をつかって細かい差し込みをしていくイメージでしょうか。

ためしてがってん。 🙂

がってん、がってん、がってん。

使っている WordPress プラグイン 2010年版

たまに古い企画を持ち出してくる .another です。 みなさまいかがお過ごしでしょうか(?)。 ということで、過去 2006 年に一度やったらしい「使っている WordPress プラグイン」 再び。 🙂

hiromasa.zone :o) » WordPress プラグイン

hiromasa.zone で使っている WordPress のプラグイン。 画面に見えるものを紹介します。

とりあえずぱっとブラウザから見えるものからいきます!

ちっちゃくてすいません。。 しかも画像あれた、、しょんぼり。。

plugins02

まずはサイドバー。

全てウィジェットです。 吹き出しがないのは WordPress 標準のものを使っています。 テキストウィジェットはなんでもはれるので便利ですね。 🙂

WordPress Plugins/JSeries » wp-kotodama (投稿コメント表示ウイジェット)

サイドバーなどに、最近投稿されたコメント者名とその親記事へのリンクを出力するウィジェットです。 MySQL 5 系で動作します。

WordPress Plugins/JSeries » wp-kyodeki (本日人気の記事表示ウィジェット)

サイドバーなどに、本日人気の記事表示の一覧とそのアクセス回数を表示するウィジェットです。

WordPress Plugins/JSeries » Kougaburari (ランダムポスト・スライドショー)

画像付きアーカイブ表示プラグイン「wp-kougabu」のランダムポスト機能を使用して、スライドショーを表示するプラグインです。

記事のタイトルに入れている系。

WordPress Plugins/JSeries » wp-hatena

WordPress の各エントリを「はてなブックマーク」するクイックリンクを自動的に挿入するプラグインです。 また、del.icio.us のクイックリンクも追加できます。

WordPress Plugins/JSeries » wp-otenki

WordPress のエントリにLWWSから取得したお天気情報を付加します。

Chameleon Cyber » MoonPhase

デフォルトでは月相イメージと月齢が投稿日時の後に表示されます。

Date Stamp « stevelam.org

This is a plugin for WordPress that displays the date/time in a stamp fashion. It has been tested with and configured for K2. It might work with other themes with few modifications.

記事の中。

WordPress Plugins/JSeries » wp-tegaki

投稿エントリ内のタグで指定した文字列を指定の TrueType フォントで出力する WordPress 用プラグインです。

記事の外。

WordPress Plugins/JSeries » wp-kougabu (画像付きアーカイブ)

WordPress の投稿やページにアップロードされた画像ファイルを抽出し、サムネイルでページに一覧表示するショートコードを提供します。過去に投稿した画像をサイトに一覧表示しそこから本文にリンクされる、画像付きアーカイブのようなプラグインです。

WordPress Plugins/JSeries » WordPress Related Post for Japanese (関連投稿表示プラグイン)

Yahoo! Japan が提供する日本語形態素解析APIを利用して、WordPress の投稿をアナライズし、自動的に投稿の下部に「関連する記事」へのリンクを付与するプラグインです。

コメント。

WordPress Plugins/JSeries » wp-ohayo

コメントや投稿の"時間"をお日様などのイメージに置き換えます。

最近では、にいさんの Kougaburari でランダムポストが出せるようになったので、ご機嫌です。 🙂

サイト上あちこちで kougabu くんが活躍していますが、現行バージョンだと、キーが画像 + サイズで実装されているのでフレームが一種類しかもてません。 次はこの変を直してみようかな・・・。

結構変えないといけないので、ひろまさプラグイン初の 2.0 系が出現するかもしれません。 お気づきの方も多いと思うのですが、tegaki と kougabu は基本の動きが同じなので恐らくそのときには統合されます。 😀

WordPress も安定してきて、最近こういったブログいじり的なネタが少なくなってきたよねと思いだし書いてみました。 昔は

[tegaki]バグるだけでおいしいネタ[/tegaki]

だったもんですね(笑)

サーバサイド Groovy と Groovlets

ちょっと前ですが、スクリプト言語 Groovy の新しいバージョンにあわせて eclipse-groovy プラグインのバージョンがあがったということで、ちょっと触ってみました。 Groovy 自体、ワンショットスクリプトを数回かいただけでほどんどさわったことがないのですが、まぁお遊びということで。

このスクリプト言語、いざとなったら普通の Java の書き方できるので手が止まらなくて便利なのです。 クラスライブラリもいつもの使えますし(笑)

【コラム】イマドキのIDE事情 (74) 高機能なGroovy開発環境「Groovy-Eclipse 2.0」リリース! | エンタープライズ | マイコミジャーナル

1月15日、Groovy開発用のEclipseプラグイン「Groovy-Eclipse 2.0」がリリースされた。GroovyはJava VM上で動作するスクリプト言語でJavaに似た構文を持つためJavaプログラマにとって扱いやすいという特徴がある。Groovy-EclipseはこのGroovyでの開発を強力に支援してくれるEclipseプラグインだ。バージョン1.0から大幅に機能が強化されており、Eclipse標準の Java開発環境であるJDTと比較しても遜色ない開発支援機能を備えている。

ぱらぱらみていると、Groovy をサーバサイドでつかう Groovlets という仕組みがあるようだったので、こちらとあわせてサーブレット環境で使ってみることに。

以下、せっかくやったのでメモです。

とりあえず、Eclipse WTP で新規「動的 Web プロジェクト」をつくります。

groovlets02

普通ですね。 🙂

で、このままだと Groovy-Eclipse が構成されていないので(.groovy がコンパイルされない)、つくったプロジェクトを右クリックして Groovy を構成します。

groovlets01

Convert to Groovy Project。 これで nature に groovy が入ります。 でもって、これやると groovy の jar も追加してくれるのですが、JavaEE の場所 (WEB-INF/lib)に入らないので消して、手動で lib の下にいれてあげます。

Groovlets を使うには –all を使うといいようです。 配布元にある groovy-binary-1.7.0.zip の embeddable フォルダに入っています。

あとは、 src の下で .groovy ファイルを作成すればコンパイル・再デプロイを groovy-eclipse と WTP がやってくれます。 ここまでで、 .groovy のグルーヴィな記述でサーバサイドプログラムを行うことができます。

さて、こっからが Groovlets。

サーバに「ファイルとして配置された」 .groovy をそのまま動かすのが Groovlets です。 ランタイムで勝手にコンパイルしてくれます。 あと、GSP という JSP みたいなテンプレートライブラリがあります。

要はサーバに配置された .groovy ファイルを書き換えると Groovlets がホットデプロイ(とはいわないか。JIT?) してくれる仕組み。 ぼくはまた、このホットデプロイを利用しながら、Groovy のシンタックスシュガーを使いまくって小規模な Web アプリを高速にかくものと想像していたのですが、どうもそうとは違う模様。

間違っていたらご指摘いただきたいのですが、 Groovy でモジュールを分割する仕組みは import のみ。 でもって、Groovlets は import 先のモジュールはダイナミックにコンパイルしてくれないのです。 なので、プログラムは url-pattern にあたったひとつの .groovy ファイルだけで構成する必要があります。

もちろん、デプロイ時に .class になっているものは import 可能なので Eclipse で .groovy かいてコンパイルしてデプロイすりゃいいんですが、そしたら Groovlets 使わなくてもいいような(笑)

結論的には、GSP とか JSP とかと同じように html テンプレートで使うのかな~。 もしくは上にフレームワークをかくための土台、、あとモジュール1本で済むような、「なんとか度」判定みたいなアプリとか。 😀

groovy のオリジナルソースを読んだところ、ダイナミックコンパイルは直アクセスだけでなく RequestDispatcher の指定も対応しているようだったので、きっとそういうことなのでしょう。

てなわけで、試しに以下のように構成してみました。

groovlets03

web.xml (抜粋)

<display-name>Groovlets</display-name>
<!-- Groovlets -->
<servlet>
    <servlet-name>Groovy</servlet-name>
    <servlet-class>groovy.servlet.GroovyServlet
    </servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>Groovy</servlet-name>
    <url-pattern>*.groovy</url-pattern>
</servlet-mapping>
<!--  GSimpleServlet -->
<servlet>
    <servlet-name>GSimpleServlet</servlet-name>
    <servlet-class>net.maple4ever.groovlets.GSimpleServlet
    </servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>GSimpleServlet</servlet-name>
    <url-pattern>/index.do</url-pattern>
</servlet-mapping>

Groovlets と自前のサーブレットを2つ登録します。

テンプレート(ダイナミックコンパイル側)の .groovy ファイルは WEB-INF/groovy もしくは WEB-INF/ に配置します。(/ 優先で、そこになければ groovy/ を見に行くようになっていました) ここではわかりやすいように WEB-INF/groovy/index.groovy を配置。

index.groovy

html.html {
    head {
        title 'index.groovy'
    }
    body {
        h1 'Hello, Groovy World.'
    }
}

このへんが groovy の面白いところで、クロージャをつかった html の builder とかがあります。 これを使っておけば変な HTML ができることはないでしょう。(たぶん)

で、サーブレット側。 一応こちらも groovy っぽく書いてみる。。

GSimpleServlet.groovy

package net.maple4ever.groovlets;
 
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
class GSimpleServlet extends HttpServlet {
    
    void doGet(
        HttpServletRequest request
        , HttpServletResponse response) throws IOException {
        def rd = request.getRequestDispatcher("index.groovy")
        rd.include(request,response);
    }
    
}

最初、 void doGet(reauest, response) とかかいてみて、動かなくてはたと2分。 型を指定してなかったので、 HttpServlet の doGet をオーバーライドできなかったというオチでした。 オーバーロードになっちゃったのね。 てっか、そこ省略は怖いか。 🙂

で、この中で index.groovy をこんな感じで include してあげると、読まれた時点で index.groovy が動的コンパイルされます。

ということで、、、う~ん view に groovy 使えるよ、という理解でいいのだろうか。いまいっぽ腹に落ちないひろまさくんでした。