You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

134 lines
3.9 KiB

<?php
defined( 'ABSPATH' ) || die;
/**
* Video field which uses WordPress media popup to upload and select video.
*/
class RWMB_Video_Field extends RWMB_Media_Field {
public static function admin_enqueue_scripts() {
parent::admin_enqueue_scripts();
wp_enqueue_style( 'rwmb-video', RWMB_CSS_URL . 'video.css', [ 'rwmb-media' ], RWMB_VER );
wp_style_add_data( 'rwmb-video', 'path', RWMB_CSS_DIR . 'video.css' );
wp_enqueue_script( 'rwmb-video', RWMB_JS_URL . 'video.js', [ 'rwmb-media' ], RWMB_VER, true );
RWMB_Helpers_Field::localize_script_once( 'rwmb-video', 'i18nRwmbVideo', [
'extensions' => wp_get_video_extensions(),
] );
}
/**
* Normalize parameters for field.
*
* @param array $field Field parameters.
*
* @return array
*/
public static function normalize( $field ) {
$field['mime_type'] = 'video';
$field = parent::normalize( $field );
return $field;
}
/**
* Get uploaded file information.
*
* @param int $file_id Attachment image ID (post ID). Required.
* @param array $args Array of arguments (for size).
* @param array $field Field settings.
*
* @return array|bool False if file not found. Array of image info on success.
*/
public static function file_info( $file_id, $args = [], $field = [] ) {
if ( ! get_attached_file( $file_id ) ) {
return false;
}
$attachment = get_post( $file_id );
$url = wp_get_attachment_url( $attachment->ID );
$file_type = wp_check_filetype( $url, wp_get_mime_types() );
$data = [
'ID' => $file_id,
'src' => $url,
'type' => $file_type['type'],
'title' => $attachment->post_title,
'caption' => $attachment->post_excerpt,
'description' => $attachment->post_content,
];
$data['meta'] = [];
$meta = wp_get_attachment_metadata( $attachment->ID );
if ( ! empty( $meta ) ) {
foreach ( wp_get_attachment_id3_keys( $attachment ) as $key => $label ) {
if ( ! empty( $meta[ $key ] ) ) {
$data['meta'][ $key ] = $meta[ $key ];
}
}
if ( ! empty( $meta['width'] ) && ! empty( $meta['height'] ) ) {
$data['dimensions'] = [
'width' => $meta['width'],
'height' => $meta['height'],
];
} else {
$data['dimensions'] = [
'width' => 640,
'height' => 360,
];
}
}
$thumb_id = get_post_thumbnail_id( $attachment->ID );
if ( ! empty( $thumb_id ) ) {
list( $src, $width, $height ) = wp_get_attachment_image_src( $thumb_id, 'full' );
$data['image'] = compact( 'src', 'width', 'height' );
list( $src, $width, $height ) = wp_get_attachment_image_src( $thumb_id, 'thumbnail' );
$data['thumb'] = compact( 'src', 'width', 'height' );
} else {
$src = wp_mime_type_icon( $attachment->ID );
$width = 48;
$height = 64;
$data['image'] = compact( 'src', 'width', 'height' );
$data['thumb'] = compact( 'src', 'width', 'height' );
}
return $data;
}
/**
* Format value for a clone.
*
* @param array $field Field parameters.
* @param string|array $value The field meta value.
* @param array $args Additional arguments. Rarely used. See specific fields for details.
* @param int|null $post_id Post ID. null for current post. Optional.
*
* @return string
*/
public static function format_clone_value( $field, $value, $args, $post_id ) {
$ids = implode( ',', wp_list_pluck( $value, 'ID' ) );
// Display single video.
if ( 1 === count( $value ) ) {
$video = reset( $value );
return wp_video_shortcode( [
'src' => $video['src'],
'width' => $video['dimensions']['width'],
'height' => $video['dimensions']['height'],
] );
}
// Display multiple videos in a playlist.
return wp_playlist_shortcode( [
'ids' => $ids,
'type' => 'video',
] );
}
/**
* Template for media item.
*/
public static function print_templates() {
parent::print_templates();
require RWMB_INC_DIR . 'templates/video.php';
}
}