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. |