WordPress 3.0のTwenty Tenのループ出力, loop.phpとget_template_part

Twenty Tenのループ出力は loop.php に集約されて書かれていて、loop.php を呼び出す部分は 3.0 から登場した関数 get_template_part が使われています。

関数リファレンス/get template part
Function Reference/get template part

使い方

<?php get_template_part( $slug, $name ) ?>

[編集] パラメータ
$slug
(文字列) (必須) 一般テンプレートのスラッグ名
初期値: なし
$name
(文字列) (オプション) 特定テンプレートの名前
初期値: なし

用例

[編集] 子テーマで loop.php を使用する
テーマフォルダが wp-content/themes で、親テーマが twentyten で、子テーマが twentytenchild の場合、この例はファイルを順に PHP require() します。

  1. wp-content/themes/twentytenchild/loop-index.php
  2. wp-content/themes/twentytenchild/loop.php
  3. wp-content/themes/twentyten/loop-index.php
  4. wp-content/themes/twentyten/loop.php
<?php get_template_part( 'loop', 'index' ); ?>

用例を見ると、関数 get_template_part は今まで include, require としていた部分を置き換えてくれるようです。

index.php には以下のように書かれています。

<?php
/* Run the loop to output the posts.
 * If you want to overload this in a child theme then include a file
 * called loop-index.php and that will be used instead.
 */
 get_template_part( 'loop', 'index' );
?>

子テーマでカスタマイズしたいときは、loop-index.php を子テーマに作れば良いってことになります。
これってかなり便利そうな気がする。

これからはテーマで include, require が書いてあるとイケテないってことになりますね。

get_template_part は関数 locate_template を使い最後は関数 load_template でロードすべきファイルを require_once します。

general-template.php

// @since 3.0.0
function get_template_part( $slug, $name = null ) {
	do_action( "get_template_part_{$slug}", $slug, $name );
 
	$templates = array();
	if ( isset($name) )
		$templates[] = "{$slug}-{$name}.php";
 
	$templates[] = "{$slug}.php";
 
	locate_template($templates, true, false);
}

theme.php

// @since 2.7.0
function locate_template($template_names, $load = false, $require_once = true ) {
	if ( !is_array($template_names) )
		return '';
 
	$located = '';
	foreach ( $template_names as $template_name ) {
		if ( !$template_name )
			continue;
		if ( file_exists(STYLESHEETPATH . '/' . $template_name)) {
			$located = STYLESHEETPATH . '/' . $template_name;
			break;
		} else if ( file_exists(TEMPLATEPATH . '/' . $template_name) ) {
			$located = TEMPLATEPATH . '/' . $template_name;
			break;
		}
	}
 
	if ( $load && '' != $located )
		load_template( $located, $require_once );
 
	return $located;
}
 
// @since 1.5.0
function load_template( $_template_file, $require_once = true ) {
	global $posts, $post, $wp_did_header, $wp_did_template_redirect, $wp_query, $wp_rewrite, $wpdb, $wp_version, $wp, $id, $comment, $user_ID;
 
	if ( is_array( $wp_query->query_vars ) )
		extract( $wp_query->query_vars, EXTR_SKIP );
 
	if ( $require_once )
		require_once( $_template_file );
	else
		require( $_template_file );
}

よくわかんないのは get_template_partdo_action のとこ。
do_action( "get_template_part_{$slug}", $slug, $name ); だと引数3つだけど・・・

plugin.php

function do_action($tag, $arg = '')

だから3つ目は無視されるよね。
どういうことなんでしょう?
あと、なんのための do_action なのかなぁ。

WordPress 3.0, Twenty Ten Theme 1.1 登場で何が変わった??

WordPressを3.0にすると、テーマも自動アップデートできて便利。
数日前に標準添付の Twenty Ten が 1.1 だよ、「自動アップデート」する??なメッセージが出てたので[ポチ]っとしました。
でも、プラグインと違って Change Log が見つからなたったので、何が変わったのか分からず少々不安な気持ちにもなりました。

仕組み自体が始まったばかりなので色んなことがこれから良くなっていくとは思います。

同じことを思った人はいるみたいでした。
WordPress 3.0 Twenty Ten Theme Updated
ここに詳しく書かれていました。

Andrew Nacin さんが Forum で答えてるよ、ということらしいです。
Changes Twentyten 1.0 >> 1.1

trac に diff があるから見てみたら、とも書いてあります。
http://core.trac.wordpress.org/log/branches/3.0/wp-content/themes/twentyten/
view changes

style.css (73 diffs)
functions.php (1 diff)
loop.php (1 diff)
page.php (2 diffs)
languages/twentyten.pot (12 diffs)
editor-style.css (4 diffs)
header.php (1 diff)
attachment.php (1 diff)

syle.css は記述方法を揃えるために「改行」や「スペース」の変更とプロパティ設定順の変更がされているようです。
あと、いくつかのバグがFixされていました。
nav-menus.php メニューに関するもの。
attachment.php, style.css メディア表示に関するもの。
位かなぁー。
ほとんどがタイポや表記の統一をしようとしているようでした。
こうやってテーマも進化していくのはいいことだと思う。

で、やっぱりチェンジ・ログがあると便利だと思います。
次のアップデートの時にはあるといいな。

update 2010-07-25 16:28
@odessy さんがブログにまとめてくれてます。
Twenty Ten 1.1 の変更点とアップデートの注意点

moファイルをアップしなおさないとメニューが英語表記のままになっちゃってるんですね。
今から、アップロードしておこう。

update 2010-08-03
大きな変更が抜けてました。
title の出力部分が大幅に変わっています。
表示そのものは変わってませんが、1.0 の時は functions.php にオリジナル関数を書いて wp_titleadd_filter していたのが、1.1 では関数を廃止しコードをtitleタグ間へ直書きになっています。

header.php を子テーマへコピーしてカスタマイズしている場合は、1.1版をコピーし再度カスタマイズが必要になります。

これが、親・子テーマの限界なんだなぁ。
親テーマに大幅な変更が加えられると、改造した子テーマへ影響があるかどうか調べないといけない、しょうがないけど。。。

update 2010-08-11
WordPress 3.0.1 ja へアップグレードした方は Twenty Tenも言語ファイル(mo)付きなので改めてmoファイルをアップロードしなくていいです。

WordPress 3.0, 子テーマのURLとパス

子テーマを使うとTEMPLATEPATH, get_bloginfo("template_url") は 親テーマのパス, URL を返します。

子テーマのURL, パスを知る方法はないものかとガサゴソしたら使えそうなのが見つかりました。

URL

get_stylesheet_directory_uri();

PATH

STYLESHEETPATH

get_stylesheet_directory_uri(); は使用しているテーマまでのURLを返してくれます。

STYLESHEETPATH は使用しているテーマまでのフルパスが設定されている定数です。

これを使うと子テーマまでのURL, パスがわかります。

update 2010-08-04
general-template.phpget_bloginfo を見ると子テーマの URL は取得できるようです。

// get_stylesheet_directory_uri(); と同じ
get_bloginfo('stylesheet_directory');

update 2010-08-11
子テーマのパスを知りたかったのは include, require したいからだったけど、get_template_part を使えば必要ないことがわかった。
WordPress 3.0のTwenty Tenのループ出力, loop.phpとget_template_part

update 2011-01-31
あれ〜。
TEMPLATEPATH が子テーマのパスを返してる。。
変わったんかなぁ?
Ver. 3.0.4 のお話。

get_bloginfo('template_url')

コアが変更になったんだ。
不便だもんね。

WordPress 3.0 + Twenty Ten + 子テーマでリニューアル

WordPress 3.0 にアップグレードし標準テンプレートの Twenty Ten を使用しサイトをリニューアルしました。
少し style.css を書き換えたかったので「子テーマ」を使いオリジナルの CSS をオーバーライドしました。

Codex 子テーマ : http://wpdocs.sourceforge.jp/Child_Themes

子テーマを使うことによりオリジナルのテンプレートを書き換えること無く改造が可能になります。

テーマのアップグレード機能もある現在は、オリジナルファイルを残しておかないとテーマ・アップグレードのたびに書換作業が発生してしまいメンドイことになってしまいます。

Codex に詳しく書かれているので使用は難しくありません。

子テーマフォルダを themes 配下に任意の名前で作成します。
作成したフォルダに style.css を作成します。
style.css に以下のコメントを設定します。

via : Codex

/*
Theme Name:     Kid
Theme URI:      http: //example.com/
Description:    Child theme for the Twenty Ten theme for WordPress
Author:         Demetris
Author URI:     http: //example.com/about/
Template:       twentyten
Version:        0.1.0
*/

Theme Name (必須) 子テーマ名
Theme URI (任意) 子テーマのウェブページ
Description (任意) テーマの説明。例: わたしの最初の子テーマ。ワーイ!
Author URI (任意) 作者のウェブページ
Author (任意) 作者の名前
Template (必須) 親テーマのディレクトリ名, 大文字小文字を区別します
Version (任意) 子テーマのバージョン。例: 0.1, 1.0, etc

コメントに続けてオリジナルの style.css を import させます。

@import url('../twentyten/style.css');

これで、オリジナルの style.css を読込んで上書き設定が可能になります。

テンプレートタグを使う時に少し注意が必要かもしれません。
wp-syntax プラグインの wp-syntax.css はテーマフォルダに配置するとコチラを優先して読込む設定になっているのですが、親テーマの twentyten フォルダに置かないといけませんでした。

TEMPLATEPATH, get_bloginfo("template_url") は 親テーマ を返しているようでした。

他にも注意すべき点があるようです、Codexを良く読んで使いましょう。
既存のテーマファイルを改造して使いたい時は子テーマを使うのが便利です。

WordPress, シングルでもwp_list_categoriesにcurrent-cat

http://aext.net/2010/05/quick-tip-highlight-current-category-menu-item-for-wordpress-single-post/
Quick Tip: Highlight Current Category Menu Item for WordPress Single Post

wp_list_categories がシングル表示の時に current-cat をCSS classに追加しないときのFix方法。

プラグインもあるけど functions.phpadd_filter を書くだけでも簡単に実装できる。
ありがたいです。

標準対応でも良さそうなものですけど。

WordPress, 投稿にClass設定できますョなテンプレートタグ

紆余曲折*1はありましたが、投稿を特定できるCSSクラスを埋め込めるpost_classテンプレートタグが今さらながら便利です。

*1 WordPress Jpan Forum「post_class() が不正な CSS クラス名を生成

<div id="post-<?php the_ID(); ?>" <?php post_class(array("my-post", "another-class")); ?>>

な感じで使うとCSSでデザイン設定するとき便利です。
body_classと合わせて使うと最強ですかね。

XAMPP for OS X

Max OS X 10.5.8 へサーバー環境構築メモ。

サーバー環境は XAMPP をインストール。

1.7.2aをインストール。
Document root の htdocs のパーミッションが適切でなくファイルやフォルダが作れない。
everybody に read / write を許すとフォルダやファイルは作成できるようになる。

php.ini の Error Reporting を E_ALL に変えると XAMPP の初期画面が表示できなかった。
MAX Upload file サイズを 128M から 2M に変えると phpMyAdmin が動かない。

手始めに WordPress 2.8.6 をインストール。
パーミッションのせいだと思うけど wp-config.php が作成できない。
手動で設定した後インストール完了。

これもパーミッションのせいだと思うけどテーマやプラグインの自動インストールができない。

XAMPP のファイルが入っているフォルダ (xamppfiles) の権限やオーナーを変えると phpMyAdmin が動作できなくなる。

アンインストールして 1.0.1 に変更。
htdocs のパーミッションに変な設定はされていないので、普通にファイルやフォルダは作れる。

WordPress 2.8.6 をインストール。
wp-config.php が作成できない。
Wordpress インストールディレクトリのパーミッションを 777 へ。
別に 777 でなくてもと思ったけど・・・

インストールはできたけどテーマやプラグインの自動インストールはやっぱりできない。
ServerRoot の xamppfiles が原因ぽいなぁー。

MAMP に比べて XAMPP は使い勝手がイケテナイ気がする。
こちらの知識が足りないせいだけなのですが・・・

どうしてもパーミッションの問題が解決できなくて、使わないことにした。
残念ながら XAMPP for OS X をセットアップできなかった。
悲しい記録。。

wp-syntax, preタグ内の文字をFirefoxでも折返して表示したい

WordPress のプラグイン wp-syntax を使ってコード表記を行っています。
対応言語も多く助かっているのですが、1つだけ気になっていたことがあります。

Firefox だとコードが折返し表示されずに横スクロールバーが出てしまうことです。
Safariだと折り返して表示されています。

コードは pre タグ内に書くのでFirefoxの挙動は正常だとも思うのですが・・・

wp-syntax 付属の wp-syntax.css をカスタマイズすることにします。

プラグインフォルダのファイルを編集してしまうとアップデートの時に面倒くさいのでどうしようかとソースを見てると、テンプレートフォルダに同名の wp-syntax.css があればコチラが優先になるようになっていました。
それで、ダウンロードしたプラグインファイルから wp-syntax.css をテンプレートフォルダへアップロードしカスタマイズを開始しました。

変更した箇所は .wp_syntax pre へ以下の設定を末尾に2行追加しました。

white-space: -moz-pre-wrap;
white-space: pre-wrap;

これで良さそうだ。

WordPress, bodyタグにClass設定できますョなテンプレートタグ

WordPress 2.8から使えるテンプレートタグ、body_class
body タグ内で使用し Class 設定が可能になります。
テンプレートでCSSデザインの自由度を高めることができます。

使い方

<body <?php body_class( $class ); ?>>

$class へは String, Array のどちらかで設定します。
設定しない(null)でも構いません。

$class = "this-class";
$class = array("class-one", "class-two");

テンプレートタグのデフォルト出力Classの後に $class が書出されます。
デフォルト出力Classはhomeなのかarchiveなど、どのデータを出力しているかによって変わってきます。

Codex:テンプレートタグ/body class で確認できます。

【WordPress Plugin】cformsII が返ってきた

cformsIIがプラグインディレクトリに戻ってきています。
http://wordpress.org/extend/plugins/cforms/

フォームデータをDBへ保存する機能を持ったフォーム生成プラグイン。
以前は日本語環境では難ありで、そのまま使うとSubjectや送信者名が文字化けする確率が高く、使用するにはプラグインファイルをいくつか書き換える必要がありました。

cforms Ⅱ が日本語に対応

現在ではカスタマイズなしに使えます。

プラグインディレクトリから消えていたのはライセンスの問題らしいとネットのウワサで聞きましたが、復帰してくれて喜ばしい限りです。

ただ、良くわからないのがプラグインディレクトリにホストされているバージョンは10.1なのですが、Plugin Homepage のバージョンは11.1と異なっていることです。

cformsが多機能ということはよーーく分かっているのですが、ちょっと気になることが・・・
cformsはWordPressが用意している関数群をあまり使わず、オリジナル関数を使う傾向が強いこと。
wp_mail使っていれば文字化けの問題も起きなかったのでは、と思わずにいられません。