当サイトは広告およびアフィリエイトプログラムによる収益を得ています。

【Web】WordPressで「moreタグ」の位置にウィジェットを表示させるには?

最初のH2タグ前にウィジェットを表示するのはテーマなどの機能でよく見るが、もう少し上にウィジェットのエリアが欲しかったので「moreタグの位置にウィジェットエリアを追加する」を実装した。

moreタグとは?

投稿の本文に挿入することで抜粋文の位置を指定するためのタグが以下のmoreタグで、記事一覧などで概要を表示する際に「ここまで表示する」と言う指定をするために挿入するタグ。

<!--more-->

このタグは表示する際に以下に置き換わる([99]は投稿ID)。

<span id="more-99"></span>

この位置にウィジェットエリアを追加すれば、広告など自由に表示することができるようになる。

ウィジェットエリアを追加する

子テーマのfunction.phpに以下のコードを追記。ウィジェットの内容は[TAG_MORE]で指定した正規表現の後に追加される。

/*
 * moreタグの定義
 */
define('TAG_MORE', '/<span id="more-.*?"><\/span><\/p>/i');
/*
 * ウィジェットエリアの追加
 */
register_sidebars(1,
	array(
		'name'=>'moreタグ',
		'id' => 'widget-tag-more',
		'description' => 'moreタグの位置に表示されるウイジェット',
		'before_widget' => '<div id="%1$s" class="widget-tag-more %2$s">',
		'after_widget' => '</div>',
		'before_title' => '<div class="widget-tag-more-title">',
		'after_title' => '</div>'
	)
);
/*
 * ウィジェットの処理
 * 投稿ページのみに表示されます。
 * 投稿ページと固定ページの両方に表示するにはis_single()をis_singular()に置き換えてください。
 */
function add_widget_tag_more($the_content) {
	if ( is_single() && is_active_sidebar( 'widget-tag-more' ) ) {
		ob_start();
		dynamic_sidebar( 'widget-tag-more' );
		$ad_template = ob_get_clean();

		$result = null;
		if ( preg_match( TAG_MORE, $the_content, $results )) {
			$result = $results[0];
		}
		if ( $result ) {
			$the_content = preg_replace(TAG_MORE, $result."\n".$ad_template, $the_content, 1);
		}
	}
	return $the_content;
}
add_filter('the_content','add_widget_tag_more');