最初の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');
