wp_list_pages関数のexclude_treeの複数指定が機能していないので、その対処方法

このサイトって、多くの人に見てもらうために作成したサイトではないので
GoogleAnalyticsも実験で入れたぐらいで、活用してませんでした^^;

で、フとしたきっかけでGoogleAnalytics見てみたんですが
結構「wp_list_pages exclude_tree」の検索ワードで
このサイトの「wp_list_pages関数exclude_treeの複数指定」に
来られているみたいです。

来て下さるのは本当に有り難いことなのですが、
もう二年近く前の記事ですし、書いた解決方法は
本体ファイルを改編する方法なので、
バージョンアップの度に改編が必要で非常に良くないです。

自分自身、WordpressのVer3.0の時に記事修正して以来
すっかり記事を書いたことすら忘れていましたが、
改めてVer3.3のWordpress本体のソースを見たところ、
未だ不具合のままのようです。

…って事で、今度はfunction.phpで
対処する方法を記載しておきます。

関数にて対応する方法です。
function.phpに以下を記述

// exclude_tree対応
function mee_wp_list_pages( $args ) {
	// wp_list_pagesと同じ引数を設定。
	$defaults = array(
		'depth'       => 0,
		'show_date'   => '',
		'date_format' => get_option('date_format'),
		'child_of'    => 0,
		'exclude'     => '',
		'title_li'    => __('Pages'),
		'echo'        => 1,
		'authors'     => '',
		'sort_column' => 'menu_order, post_title',
		'link_before' => '',
		'link_after'  => '',
		'exclude_tree'=> '' );
	$r = wp_parse_args($args, $defaults);

	// exclude_treeが設定されている場合
	if ( $r['exclude_tree'] != '' ) {
		// 文字列を区切る
		$excludes_tree_arrs = explode(",", $r['exclude_tree']);
		foreach( $excludes_tree_arrs as $excludes_tree_id ) {
			if ( $r['exclude'] != '' ) {
				$r['exclude'] .= ','. $excludes_tree_id;
			} else {
				// excludeが空の場合(最初しか入らないはず)
				$r['exclude'] = $excludes_tree_id;
			}
			// 子のページを取得
			$child_pages = get_pages('child_of=' . $excludes_tree_id);
			foreach($child_pages as $child_page) {
				$r['exclude'] .= ',' . $child_page->ID;
			}
		}
		// 最後にexclude_treeの中身は無くす
		$r['exclude_tree'] = '';
	}
	wp_list_pages( $r );
}

関数説明

動きとしてはexclude_treeの指定したIDから
子ページを全て取得し、全部exclude指定にしてから
wp_list_pagesを呼んでいるだけです。
※使用出来る引数はwp_list_pagesとまったく同じで、
exclude、exclude_treeともに指定していても大丈夫です。

使用方法

  1. 使用しているテーマのfunction.phpに上をコピー
  2. テーマ内で使用している「wp_list_pages」を「mee_wp_list_pages」に関数名変更

以上です。
これで、そのテーマ使用中はどんなにバージョンアップしても大丈夫で
exclude_treeを複数指定していても対応されます。

カテゴリー: wordpress | タグ: , | コメントをどうぞ
.

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>