親ページに属する子ページのリストを表示する方法(WordPress)
TOPページのデザインなどで商品やサービスの概要を表示する等の要望はすごくあるのでは無いだろうか?親ページに属する子ページのオブジェクトを取得し子ページの概要を表示する方法です。
やり方はいっぱいあるのですが、自分の使用している方法をば。。。感じ的には予約管理システムの特徴ページを見てください。
ソースコード
コードが長いので関数ごとに分割して説明します。
function.phpに記述し、各テンプレート関数で使用してください。
メインになる関数
テンプレートに以下の関数を埋め込んで使用します。
/**
* 子ページのリストを表示する関数(メイン?関数)
* @param int $post_id 子ページのリストを表示したい親ページのID
* @param string $tags 出力タグ
* @param string $printtype 本文の出力形式(more:moreまで出力、all:全文出力、default:本文無し)
* @return array ページオブジェクトの配列
*/
function print_page_list($post_id, $tags = null, $printtype = 'more')
{
//出力タグのデフォルト
$defaults = array(
'start' => '', 'end' => '',
'abs_start' => '', 'abs_end' => '',
'title_start' => '<h3>', 'title_end' => '</h3>',
'content_start' => '', 'content_end' => '',
);
$tags = wp_parse_args( $tags, $defaults );
//$post_idのチェック
if (preg_match('/^\d+$/',$post_id)) {
if ($post_id <= 0) {
return;
}
} else {
return;
}
//get_pages()に渡すパラメータ値作成
//変数に出力(echo=1)、並び順はメニュー順(sort_column=menu_order)
//ページを取得する深さは1階層(depth=1)、$post_idの子ツリーを取得(child_of=)
$args = 'echo=1&sort_column=menu_order&depth=1&child_of='.$post_id;
// 自分以下のページを取得
$chiled_pages = get_pages($args);
//得られた子ページを出力
if ($chiled_pages){
echo $tags['start']."\n";
foreach($chiled_pages as $page) {
if ($page->post_parent == $post_id) {
echo $tags['abs_start']."\n";
/* setup_postdata()関数を使うと通常のテンプレート関数が使用できます。 */
//setup_postdata($page);
print_title($page, $tags);
print_content($page, $tags, $printtype);
echo $tags['abs_end']."\n";
}
}
echo $tags['end']."\n";
}
}
ページIDを渡すとメニュー順に子ページの概要を出力します。
タイトルを取得しパーマリンクを張る関数
案件によって出力の仕方が違うと思うので自分で改良してください。
$tags配列にtitle_startとtitle_endでパラメータを渡すことによってある程度の汎用性を持たせています。
title_startとtitle_endで設定したタグでタイトルが括られます。
/**
* タイトルを取得しパーマリンクを張る関数(print_page_list関数で使用)
* @param object $page $postオブジェクト
* @param string $tags 出力タグオプション
* @return void
*/
function print_title(&$page, $tags = null)
{
$title = $page->post_title;
if (!$title) return;
//フィルタ適用
$title = apply_filters( 'the_title', $title );
//パーマリンクを取得しaタグ生成
$a = '<a href="'.get_permalink($page->ID).'" title="'.$title.'">';
echo "\t" . $tags['title_start'] . $a . $title . '</a>' . $tags['title_end'] . "\n";
}
本文を取得する関数
案件によってかなり出力の仕方が違うと思うので自分で改良してください。
$tags配列にcontent_startとcontent_endでパラメータを渡すことによってある程度の汎用性を持たせています。
content_startとcontent_endで設定したタグで本文が括られます。
また本文の出力形式を三種類選択できるようにしています。
/**
* 本文を取得する関数(print_page_list関数で使用)
* @param object $page $postオブジェクト
* @param string $tags 出力タグオプション
* @param string $printtype 本文の出力形式(more:moreまで出力、all:全文出力、default:本文無し)
* @return void
*/
function print_content(&$page, $tags = null, $printtype = 'more')
{
//本文を取得
switch ($printtype) {
case 'more': //moreまでを取得
$content = $page->post_content;
if ( preg_match('/<!--more(.*?)?-->/', $content, $matches) ) {
$content = explode($matches[0], $content, 2);
$content = $content[0];
} else {
$content = '';
}
break;
case 'all': //本文全てを取得
$content = $page->post_content;
$flg_more = false;
break;
default:
$content = null;
break;
}
if (!$content) return;
//フィルタ適用
$content = apply_filters( 'the_content', $content );
$content = str_replace(']]>', ']]>', $content);
//出力
echo "\t" . $tags['content_start'] . $content . $tags['content_end'] . "\n";
}
使い方
print_page_list()関数の第一引数には親ページのIDを指定します。
print_page_list()関数の第二引数には出力タグを指定します。
start,endにHTMLを指定するとリスト表示の前後に指定したHTMLが出力されます。
abs_start,abs_endにHTMLを指定するとページ概要表示の前後に指定したHTMLが出力されます。
title_start,title_endにHTMLを指定するとタイトル表示の前後に指定したHTMLが出力されます。
content_start,content_endにHTMLを指定すると概要(本文?)表示の前後に指定したHTMLが出力されます。
print_page_list()関数の第三引数には本文の出力形式を指定します。
使い方例
page.phpテンプレートなどにthe_post()実行後に以下のようにして埋め込みます。
以下の例では、タイトルをh4タグで括って出力します。
<?php print_page_list($post->ID, 'title_start=<h4>&title_end=</h4>'); ?>
以下の例では、子ページをリスト形式(ulタグ)で出力し、タイトルはh4タグで括って出力します。
<?php print_page_list($post->ID,'start=<ul>&end=</ul>&abs_start=<li>&abs_end=</li>&title_start=<h4>&title_end=</h4>'); ?>
以下の例では、子ページをリスト形式(ulタグ)で出力し本文無しで出力しています。
<?php print_page_list($post->ID,'start=<ul>&end=</ul>&abs_start=<li>&abs_end=</li>&title_start=&title_end=',''); ?>
最後に
簡単な説明で終わらせるつもりだったのに。。。逆に分かりにくくなっている気がする。。。
あわせて読む
コメント投稿
4件のコメント
有用な情報ありがとうございます。
とても参考になりました。
それで、1点質問なのですが一覧で呼び出してきた子ページが多い場合、複数ページに分割して表示することはできるのでしょうか?
PageBarプラグインなどを参考に作ることは出来るかと。作れれば何でも出来るのはWordPressの良いところです。
ただ、PageBarプラグインなどを参考にして作り方が分からなければ自力では出来ないと考えたほうが良いです。
ご回答ありがとうございます。
PageBarプラグインが参考になるんですね。
ヒントをありがとうございました。
すばらしい機能、ありがとうございます。困っていたので、本当に助かります。心から感謝いたします。