wp_filter_oembed_result

函数
wp_filter_oembed_result ( $result, $data, $url )
参数
  • (string) $result The oEmbed HTML result.
    Required:
  • (object) $data A data object result from an oEmbed provider.
    Required:
  • (string) $url The URL of the content to be embedded.
    Required:
返回值
  • (string) The filtered and sanitized oEmbed result.
定义位置
相关方法
wp_filter_pre_oembed_resultwp_filter_commentwp_filter_nohtml_kseswp_oembed_getwp_filter_post_kses
引入
4.4.0
弃用
-

wp_filter_oembed_result:这个过滤器是用来修改特定URL的oEmbed结果的。它把oEmbed结果作为一个参数,并返回修改后的结果。

过滤给定的oEmbed HTML。

如果`$url`不在可信任的提供者名单上,我们需要对HTML进行严格的过滤以保证安全。

只过滤’rich’和’video’响应类型。

function wp_filter_oembed_result( $result, $data, $url ) {
	if ( false === $result || ! in_array( $data->type, array( 'rich', 'video' ), true ) ) {
		return $result;
	}

	$wp_oembed = _wp_oembed_get_object();

	// Don't modify the HTML for trusted providers.
	if ( false !== $wp_oembed->get_provider( $url, array( 'discover' => false ) ) ) {
		return $result;
	}

	$allowed_html = array(
		'a'          => array(
			'href' => true,
		),
		'blockquote' => array(),
		'iframe'     => array(
			'src'          => true,
			'width'        => true,
			'height'       => true,
			'frameborder'  => true,
			'marginwidth'  => true,
			'marginheight' => true,
			'scrolling'    => true,
			'title'        => true,
		),
	);

	$html = wp_kses( $result, $allowed_html );

	preg_match( '|(<blockquote>.*?</blockquote>)?.*(<iframe.*?></iframe>)|ms', $html, $content );
	// We require at least the iframe to exist.
	if ( empty( $content[2] ) ) {
		return false;
	}
	$html = $content[1] . $content[2];

	preg_match( '/ src=(['"])(.*?)1/', $html, $results );

	if ( ! empty( $results ) ) {
		$secret = wp_generate_password( 10, false );

		$url = esc_url( "{$results[2]}#?secret=$secret" );
		$q   = $results[1];

		$html = str_replace( $results[0], ' src=' . $q . $url . $q . ' data-secret=' . $q . $secret . $q, $html );
		$html = str_replace( '<blockquote', "<blockquote data-secret="$secret"", $html );
	}

	$allowed_html['blockquote']['data-secret'] = true;
	$allowed_html['iframe']['data-secret']     = true;

	$html = wp_kses( $html, $allowed_html );

	if ( ! empty( $content[1] ) ) {
		// We have a blockquote to fall back on. Hide the iframe by default.
		$html = str_replace( '<iframe', '<iframe style="position: absolute; clip: rect(1px, 1px, 1px, 1px);"', $html );
		$html = str_replace( '<blockquote', '<blockquote class="wp-embedded-content"', $html );
	}

	$html = str_ireplace( '<iframe', '<iframe class="wp-embedded-content" sandbox="allow-scripts" security="restricted"', $html );

	return $html;
}

常见问题

FAQs
查看更多 >