WordPressのbody_classに固定ページのルートのスラッグを追加する

body_classで出力されるclassに最上位のルートのページのスラッグを含むclass名が追加されるようになります。子ページ全部で同じcssを利用できるので、特定のツリーだけ配色を変更したいときなど便利にですよね。さらに、汎用化しているので固定ページだけじゃなくて、階層サポートしたのカスタム投稿タイプでも利用できます。

class名は、{投稿タイプスラッグ}-category-{ページのスラッグ}という命名規則にしてますが、このあたりはお好みで。

 $post_type . '-category-' . $post->post_name

の部分を変えてくださいな。

function add_page_root_body_class( $classes ) {
	if ( is_singular() ) {
		$post_type = get_query_var( 'post_type' );
		if ( is_page() ) {
			$post_type = 'page';
		}
		if ( $post_type && is_post_type_hierarchical( $post_type ) ) {
			global $post;
			if ( $post->ancestors ) {
				$root = $post->ancestors[count($post->ancestors) - 1];
				$root_post = get_post( $root );
				$classes[] = esc_attr( $post_type . '-category-' . $root_post->post_name );
			} else {
				$classes[] = esc_attr( $post_type . '-category-' . $post->post_name );
			}
		}
	}
	return $classes;
}
add_filter( 'body_class', 'add_page_root_body_class' );

CSS Nite in Seoul, Vol.3にて登壇してきます

ご存じの方も多いかとは思いますが、2012年3月24日に行われるCSS Nite in Seoul, Vol.3にて、WordPressについてのスピーチをしてきます。

韓国でのWordPressの状況について詳しいところまでは分かりませんが、WordPress Koreanフォーラムの状況のサイトなどを見る限り、日本ほどの普及には至っていないように思われます。このあたりは、ローカライズの状況にも左右されるので、改めて日本語化チームのみなさんに感謝しなければいけませんね。ただ、韓国でも2010年に最初のWordCampが行われ、今年の5月を目標に第2回を計画しているようなので、是非がんばってほしいところです。

今回、韓国で話してくる内容ですが、上記のような普及状況が予想されること、CSS NiteというWeb制作者の集う場所でもあることから、WordPress の概要から、カスタム投稿タイプの利用シーンまで幅広く紹介してくることにしました。

韓国でのWordPressの普及に少しでも貢献できればいいと思います。

ちなみに韓国は、初めてでよく分からないのですが、とりあえずおいしいものが食べてこられれば満足です。

WordPressでユーザーを投稿の新しい順に並べ、○件ずつ投稿を表示する

functions.php

function sorted_author_posts( $authors, $posts_num ) {
	$all_posts = array();
	$sort_date = array();
	$posts_num = (int)$posts_num;
	foreach ( (array)$authors as $author ) {
		$author = (int)$author;
		$author_data = get_userdata( $author );
		$author_posts = get_posts( "posts_per_page=$posts_num&author=$author" );
		if ( $author_posts ) {
			$all_posts[$author_data->display_name] = $author_posts;
			$sort_date[$author_data->display_name] = $author_posts[0]->post_date;
		}
	}

	array_multisort( $sort_date, $all_posts );
	$all_posts = array_reverse( $all_posts );
	return $all_posts;
}

テンプレートの記述例

<?php $users = array( 1, 2 );
$users_posts = sorted_author_posts( $users, 2 );
foreach ( $users_posts as $user_name => $user_posts ) : ?>
	<h2><?php echo $user_name ?></h2>
	<ul>
<?php foreach ( $user_posts as $post ) : setup_postdata( $post ); ?>
		<li><?php the_title(); ?></li>
<?php endforeach; ?>
	</ul>
<?php endforeach; wp_reset_postdata(); ?>

WordPressでユーザーの最新投稿日を取得する

functions.php

function get_author_latest_update( $author_id, $date_format = null ) {
	$latest_post = get_posts( 'posts_per_page=1&author=' . (int)$author_id );
	$update_date = '';
	if ( $latest_post ) {
		$format = is_null( $date_format ) ? get_option( 'date_format' ) : $date_format;
		$update_date = mysql2date( $format, $latest_post[0]->post_date );
	}
	return $update_date;
}

テンプレートファイル

<?php echo get_author_latest_update( 1 ); ?>

表示はこうなる

2012年2月28日

WordPressの日付別アーカイブのtitleタグに年やら日やらを追加する

WordPressの日付別アーカイブのtitleタグが「2012 3月 15」みたいに中途半端な表示になっているのが気になったので調整してみることにしました。

こんな感じのやつね。
修正前

<title>  2012  2月  28</title>

こんな感じで、うまく行くはず。。。

function jp_date_archive_wp_title( $title ) {
	$title = trim( $title );
	if ( is_date() ) {
		$replaces = array(
			'/([1-9]{1}[0-9]{3})/' => '$1年',
			'/ ([0-9]{1,2}) /'     => ' $1日 ',
			'/ ([0-9]{1,2})$/'     => ' $1日',
			'/[\s]+/'              => ' '
		);
		$title = preg_replace( array_keys( $replaces ), $replaces, $title );
	}
	return $title;
}
add_filter( 'wp_title', 'jp_date_archive_wp_title', 10 );

修正後

<title>2012年 2月 28日</title>

wp_titleのパラメーターでうまくいかない場合があったら、教えてください。