カテゴリー別アーカイブ: WordPressカスタマイズ

#WordPress カスタム投稿タイプとカスタム分類(タクソノミー)の使いかた、ざっとまとめ

WordPress3.0で企業サイト構築中なので色々わかったことをメモして行きます。

カスタム投稿タイプ、カスタム分類を使うにはプラグインが便利

カスタム投稿タイプカスタム分類(タクソノミー)をWordPressに追加するにはfunctions.phpにアクションフィルタを書いてもいいのだが(8割くらい書いちゃってから気づいたのだが)、すでに良いプラグインがいくつかあるのでプラグインを使うのが便利。

なかでもCMS Pressはデフォルトでパーマリンク構造を設定できるのでおすすめ。

追加した投稿タイプの新着を表示

WP_Queryを使う。Codexのカスタム投稿タイプページに実例がある。

追加した分類(タクソノミー)でソートした新着を表示

WP_Queryを使う。Codexのカスタム分類ページに実例がある。

IDやスラッグから追加した分類(タクソノミー)の情報を取得

get_term_by()関数を使えばOK。

その他、随時追加して行きます。

#WordPress マルチサイトネットワーク内の各ブログから最新の投稿1件を取得し時系列で並べる方法

2011.8.28:別サイトにて修正版をアップしました。

 

WordPress3.0以降で標準で使える様になった、複数のブログをひとつのWordPressで管理できるネットワーク機能。ネットワーク内のブログの新着記事は普通トップページに表示したいと思うので、表題の機能は需要がありそうだからテンプレートタグがあってもいいのになぁと思うのですが、見つからなかったので自作。いや、ほんとに探したらあるのかもしれないけど!

方針

functions.phpに、ネットワーク内の全ブログから最新1件の投稿を取得し、時系列で並び替える関数を用意する。表示はお好みで。

関数(functions.phpに入れるととりあえず使えます)

// $startを1以上にすると最新のn件を飛ばして取得できます
// $numで取得する件数を指定。
function get_recentposts_from_network( $start = 0, $num = 10 ) {
 $recent_posts = get_site_option("network_recentposts");

 // データが残っていない場合、60秒以上経過している場合はアップデートする
 if( is_array( $recent_posts ) ) {
 if( ( $recent_posts['time'] + 60 ) < time() ) { // cache for 60 seconds.
 $update = true;
 }
 } else {
 $update = true;
 }

 if( $update == true ) {
 unset( $recent_posts );
 // 全ブログのIDを取得
 $blogs = get_blog_list( 0,'all' );

 if( is_array( $blogs ) ) {
 reset( $blogs );
 // 各ブログの最新1件を取得する
 foreach( $blogs as $blog ) {
 switch_to_blog( $blog['blog_id'] );
 $posts = get_posts( 'numberposts=1' );
 if( $posts ) {
 foreach( $posts as $post ) {
 $recent_posts[$blog['blog_id']] = $post->post_date;
 $post_list[$blog['blog_id']] = $post;
 } // endforeach
 unset( $posts );
 } // endif ( $posts )
 restore_current_blog();
 } // endforeach
 // 投稿日時で並べ替える
 arsort( $recent_posts );
 reset( $recent_posts );
 foreach( (array) $recent_posts as $key => $details ) {
 $t[$key] = $post_list[$key];
 } // endforeach
 unset($recent_posts);
 $recent_posts = $t;
 update_site_option( "network_recentposts", $recent_posts );
 } //endif ( is_Array( $blogs ) )
 } // endif ( $update == true )

 if( $recent_posts )
 return array_slice( $recent_posts, $start, $num, true );

 return array();
}

続きを読む #WordPress マルチサイトネットワーク内の各ブログから最新の投稿1件を取得し時系列で並べる方法

[WordPress] 今見ている記事と同じカテゴリの最新記事を表示する

関連する記事を出力するプラグインは色々存在するが、シンプルに今見ている記事と同じカテゴリの最新記事を表示させる方法を考えてみた。

  • 記事に複数のカテゴリが存在する場合、それぞれのカテゴリの最新記事を出力。
  • 最新記事のリストは、今見ている記事を除いて出力。

で、こんな感じで表示できました!

<?php $categories = get_the_category();
foreach($categories as $category):
$related_posts = get_posts('category='.$category->cat_ID.'&exclude='.$post->ID);
if($related_posts): ?>
<h2><?php echo $category->cat_name; ?>カテゴリの最新記事</h2>
<ul>
<?php foreach($related_posts as $related_post): ?>
<li><a href="<?php echo get_permalink($related_post->ID); ?>"><?php echo $related_post->post_title; ?></a></li>
<?php endforeach; ?>
</ul>
<?php endif; endforeach; ?>

各カテゴリの記事はget_posts()の初期値の5件まで表示されます。

[WordPress] 他サイトのRSSを読み込んで表示

WordPressはPHPでできているので、他サイトのRSSを読み込ませてサイドバーなどに新着記事を表示するのも簡単だ…と思っていたら意外と手こずったのでメモ。

いくつかプラグインも配布されているようなのだが、受託案件でデザイン的な制約があったので自作することとする。WordPressではfetch_rss()wp_rss()get_rss()という関数が用意されていて、楽に実装できるようだ。それぞれ、fetch_rss()が配列で取得、wp_rss()が<ul>付きでリスト表示、get_rss()が<ul>なしでリスト表示というのが主な違い。

使い方は以下ページで分かりやすく解説されています。

WebTecNote – [WP]wordpressでRSSを取得して表示

詰まったのは日時を表示させようと思ったため。wp_rss()とget_rss()のどちらも記事の投稿日時は表示されない。そのためfetch_rss()でRSSデータを配列で取得して表示してみるが、こんな風に表示される。

2009-05-13T08:26:08+09:00

これではちょっと困る。調べてみたところこの日時の表示形式はW3CDTFというそうで、この形式を解釈するparse_w3cdtf()という関数もあるみたい。なーんだ。

というわけで、関数にしてみました。functions.phpに書いておけばテンプレート中で使えます。

function custom_get_rss($feed,$maxitems){
$rss = fetch_rss($feed);
$items = array_slice($rss->items, 0, $maxitems);
if (empty($items)) {
echo '<li>No Items</li>';
} else {
foreach ( $items as $item ){
echo '<li><a href="' . $item['link'] . '" title="' . $item['title'] . '>';
echo $item['title'];
echo '</a>';
if($item['dc']['date']){
echo '<span class="date">' . date('Y年m月d日',parse_w3cdtf($item['dc']['date'])) . '</span>';
}
echo '</li>';
}
}
}

タネさえ分かってしまえば実に便利。
(上記サンプルはRSSの種類を考慮していないので読み込むRSSによっては動かない場合もあります。ご了承ください。)

プラグインにオリジナル機能を追加する

WordPressで欲しい機能のためにプラグインを導入したものの、微妙に要件を満たしてないという問題が発生。

受託開発のサイトの場合、様々な要望に対応するため、wp_tag_cloud()のようにHTMLタグも吐き出されるテンプレートタグでは不便なことがある。そういう場合はPHP関数形式のタグがあれば便利なのだが、特にプラグインではPHP関数形式のテンプレートタグがない。

3時間悩んだ末の解決策が、プラグインファイルのクラスを継承して新しいクラスを作り、PHP関数形式で値を返すメソッドを作成するという苦肉の策。

class 苦肉の策クラス extends プラグインで実装されているクラス {
	function 勝手に追加したメソッド() {
		処理
	}
}

$変数に入れます = new 苦肉の策クラス();

function メソッド呼び出し用関数() {
	global $変数に入れます;
	return $変数に入れます->勝手に追加したメソッド();
	// ↑今回はIDを配列で返すようにしてみました。
}

これでとりあえず必要な関数はできたので、めでたくテンプレートの中で使えるようになったわけだが…
上記のクラスもテンプレートに書いてあるという不格好さ。

まぁとりあえずこうしておけば、プラグインがアップデートしたときでも、もとになるクラスが消えてなければ大丈夫だと思うのだが。もっとスマートなやり方がないもんかな。

【追記】

index.phpでうまくいったと思ったら、他のテンプレートではFatal error
もう少し考える必要がありそうだ。

【追記2】

結局プラグインファイルに上記のクラスを追記。何がいけないのか???