函数文档

wp_ajax_parse_media_shortcode()

💡 云策文档标注

概述

wp_ajax_parse_media_shortcode() 是一个 WordPress AJAX 处理函数,用于解析媒体相关的短代码并生成预览内容。它通过检查短代码类型、验证用户权限,并输出处理后的 HTML 和脚本。

关键要点

  • 函数处理 AJAX 请求,接收 POST 参数 shortcode 进行解析
  • 仅支持媒体相关短代码(如 audio、embed、playlist、video、gallery),其他短代码会触发错误
  • 对于 embed 短代码,需要验证 post 存在性和用户编辑权限
  • 使用 do_shortcode() 解析短代码,若结果为空则返回错误
  • 根据短代码类型(如 playlist)动态加载相应的 JavaScript 脚本
  • 最终以 JSON 格式返回成功或失败响应,包含 head 和 body 数据

代码示例

if ( empty( $_POST['shortcode'] ) ) {
    wp_send_json_error();
}
$shortcode = wp_unslash( $_POST['shortcode'] );
$media_shortcodes = array(
    'audio',
    'embed',
    'playlist',
    'video',
    'gallery',
);
if ( ! empty( $other_shortcodes ) ) {
    wp_send_json_error();
}
$parsed = do_shortcode( $shortcode );
if ( empty( $parsed ) ) {
    wp_send_json_error( array(
        'type'    => 'no-items',
        'message' => __( 'No items found.' ),
    ) );
}
wp_send_json_success( array(
    'head' => $head,
    'body' => ob_get_clean(),
) );

注意事项

  • 函数依赖于全局变量 $post 和 $wp_scripts,需确保在调用前正确设置
  • 仅处理媒体短代码,非媒体短代码会导致 wp_send_json_error() 调用
  • 对于 embed 短代码,必须提供有效的 post_ID 且用户有 edit_post 权限
  • 输出时使用 ob_start() 和 ob_get_clean() 捕获生成的 HTML

📄 原文内容

Source

function wp_ajax_parse_media_shortcode() {
	global $post, $wp_scripts;

	if ( empty( $_POST['shortcode'] ) ) {
		wp_send_json_error();
	}

	$shortcode = wp_unslash( $_POST['shortcode'] );

	// Only process previews for media related shortcodes:
	$found_shortcodes = get_shortcode_tags_in_content( $shortcode );
	$media_shortcodes = array(
		'audio',
		'embed',
		'playlist',
		'video',
		'gallery',
	);

	$other_shortcodes = array_diff( $found_shortcodes, $media_shortcodes );

	if ( ! empty( $other_shortcodes ) ) {
		wp_send_json_error();
	}

	if ( ! empty( $_POST['post_ID'] ) ) {
		$post = get_post( (int) $_POST['post_ID'] );
	}

	// The embed shortcode requires a post.
	if ( ! $post || ! current_user_can( 'edit_post', $post->ID ) ) {
		if ( in_array( 'embed', $found_shortcodes, true ) ) {
			wp_send_json_error();
		}
	} else {
		setup_postdata( $post );
	}

	$parsed = do_shortcode( $shortcode );

	if ( empty( $parsed ) ) {
		wp_send_json_error(
			array(
				'type'    => 'no-items',
				'message' => __( 'No items found.' ),
			)
		);
	}

	$head   = '';
	$styles = wpview_media_sandbox_styles();

	foreach ( $styles as $style ) {
		$head .= '<link type="text/css" rel="stylesheet" href="' . $style . '">';
	}

	if ( ! empty( $wp_scripts ) ) {
		$wp_scripts->done = array();
	}

	ob_start();

	echo $parsed;

	if ( 'playlist' === $_REQUEST['type'] ) {
		wp_underscore_playlist_templates();

		wp_print_scripts( 'wp-playlist' );
	} else {
		wp_print_scripts( array( 'mediaelement-vimeo', 'wp-mediaelement' ) );
	}

	wp_send_json_success(
		array(
			'head' => $head,
			'body' => ob_get_clean(),
		)
	);
}

Changelog

Version Description
4.0.0 Introduced.