WordPress : $more の制御内容を調べてみた
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- が含まれる場合の動作は以下のように動作するようです。
- $moreに0をセットして前半($content[0])のみ出力モードに切り替え
- the_contentを呼び出して前半のみ出力
- 挟み込みたい要素を出力
- $moreに1をセットして前後を出力($content[0]. 表示用moreタグ .$content[1])モードに切り替え
- the_content関数の第2引数をtrueにして呼び出すことで後半のみ出力
$more の制御内容調査は以上です。
ディスカッション
コメント一覧
まだ、コメントがありません