WordPress : $more の制御内容を調べてみた

WordPress

WordPressの内部で使用されているグローバル変数 $more の制御内容を調べてみました。

調査の発端は [M] これはカンタン! 記事をmoreタグの前後で分割して出力する方法 | mbdb (モバデビ) と言う記事で紹介されている single.php のカスタム用コードでした。

<?php if(strpos(get_the_content(),'id="more-')) :
global $more; $more = 0;
the_content(''); ?>
<!-- ここに挟みこみたい要素を挿入 -->
<?php $more = 1;
the_content('', true );
else : the_content();
endif; ?>

single.php に含まれる the_content() を上記コードに置き換えると、moreタグの前後で記事が分割出力されるそうです。

このコードで global $more; が使われていますが、なんの変数なのか分かりません。コードの流れからmoreタグ前後の出力を制御してるんだなと言うことは推察できますが、折角なのでWordPress内部のコードを追って調べて見ることにしました。

$more=’1’がセットされる場所

$more変数がセットされるのはregister_globals関数内です。register_globals関数は wp-includes/class-wp.php にあります。

	function register_globals() {
		global $wp_query;
		// Extract updated query vars back into global namespace.
		foreach ( (array) $wp_query->query_vars as $key => $value) {
			$GLOBALS[$key] = $value;
		}

		$GLOBALS['query_string'] = $this->query_string;
		$GLOBALS['posts'] = & $wp_query->posts;
		$GLOBALS['post'] = (isset($wp_query->post)) ? $wp_query->post : null;
		$GLOBALS['request'] = $wp_query->request;

		if ( is_single() || is_page() ) {
			$GLOBALS['more'] = 1;
			$GLOBALS['single'] = 1;
		}
	}

上記コードを見ると、個別の記事を表示している場合( is_single or is_page)に $more に 1 がセットされるようです。

$moreが使用されている場所

$more変数が使用されている場所は複数ありますが、今回関連するのは get_the_content関数です。get_the_content関数 は wp-includes/post-template.php にあります。

get_the_content関数内の特に関連するコードのみ下記に示します。

function get_the_content($more_link_text = null, $stripteaser = false) {
	global $post, $more, $page, $pages, $multipage, $preview;
		:
		:(中略)
		:
	$teaser = $content[0];
		:(中略)
	$output .= $teaser;
	if ( count($content) > 1 ) {
		if ( $more ) {
			$output .= '<span id="more-' . $post->ID . '"></span>' . $content[1];
		} else {
				:(中略)
			$output = force_balance_tags($output);
		}
	}
		:(後略)
	return $output;
}

moreタグでコンテンツが前後に分割されている場合、$moreが1なら前後($content[0]. 表示用moreタグ .$content[1])が出力され、そうでない場合($moreが0)は前半($content[0])のみが出力されるようです。

改めて前後分割用のコードを理解する

冒頭で紹介したmoreタグの前後で記事を分割するコードを再掲します。

<?php if(strpos(get_the_content(),'id="more-')) :
global $more; $more = 0;
the_content(''); ?>
<!-- ここに挟みこみたい要素を挿入 -->
<?php $more = 1;
the_content('', true );
else : the_content();
endif; ?>

出力される文章に id="more- が含まれる場合の動作は以下のように動作するようです。

  1. $moreに0をセットして前半($content[0])のみ出力モードに切り替え
  2. the_contentを呼び出して前半のみ出力
  3. 挟み込みたい要素を出力
  4. $moreに1をセットして前後を出力($content[0]. 表示用moreタグ .$content[1])モードに切り替え
  5. the_content関数の第2引数をtrueにして呼び出すことで後半のみ出力

$more の制御内容調査は以上です。