WordPress使用dynamic_sidebar函数获取小工具保存到变量

在某些需求场景下,我们想要获取小工具保存到变量,而不是直接输出结果。dynamic_sidebar()函数用于输出小工具,但不能只返回结果,并且无法通过hook来解决。

目前我采取的解决办法是将dynamic_sidebar()函数的输出放到缓冲区,代码如下:

if(!function_exists('get_dynamic_sidebar')) {
	function get_dynamic_sidebar($id) {
		flush();
		ob_start();
		dynamic_sidebar('content-center');
		$html = ob_get_contents();
		ob_end_clean();
		return $html;
	}
}

有了这个获取小工具的自定义函数,我们就可以通过hook在文章的第N个段落后插入小工具。

首先注册一个名为content-center的小工具:

function bzg_register_widget() {
	register_sidebar(array(
		'name' => '文章内容中',
		'id' => 'content-center',
		'description' => '',
		'class' => '',
		'before_widget' => '<div class="ad content-center">',
		'after_widget' => '</div>',
		'before_title' => '<h3>',
		'after_title' => '</h3>',
	));
}
add_action('widgets_init', 'bzg_register_widget');

过滤the_content,在第二个段落后插入小工具:

function bzg_the_content_ad($content) {
	if(!is_singular() || !is_main_query()) return $content;
	$content_center = get_dynamic_sidebar('content-center');
	if(!$content_center) return $content;
	
	$paragraphs = explode('</p>', $content, 3);
	if(count($paragraphs) == 3) {
		$content = $paragraphs[0] . '</p>' . $paragraphs[1] . '</p>' . $content_center . $paragraphs[2];
	}
	return $content;
}
add_filter('the_content', 'bzg_the_content_ad', 10, 1);
阿里云