WordPress 默认分享的视频都是独立的,而对于一些想通过 WordPress 做视频分享站的小伙伴来说,分集视频的分享便成了一个问题,似乎 WordPress 并不适合做视频站。因为自己网站有时候会分享一些视频,有一部分视频难免就是分集视频,而要一集一集的分享显然不太靠谱,于是最近抽了些时间研究了下分集视频分享的问题,最终以 meta 信息存储了各集的视频连接,然后前端通过 video.js 根据不同链接加载不同视频了,虽然不是太完美,但大致可以用了,这里简单分享下后台添加自定义 Meta 列表的方法,有需要的小伙伴可以参考一下。后台效果如下:

在了解本篇文章前,先温习下 Meta 信息的使用比较好,推荐下面两篇文章:

下面我们简单说下后台添加自定义 Meta 列表的方式。

生成函数

将以下代码添加到主题 functions.php 文件中:

// 文章新增视频列表 Meta
/**==================== 新增视频列表开始 ====================*/
function video_list_meta(){
	global $list_meta_box;
	$list_meta_box = array(
		'name' => 'video_list_info',
		"std"   => "",
		'title' => "",
		'type' => 'group',
		'submeta' => array(
			array(
				'title' => '序号',
				'name'   => 'sort',
				'std'  => '',
				'type' => 'text'
			),
			array(
				'title' => '标题',
				'name'   => 'title',
				'std'  => '',
				'type' => 'text'
			),
			array(
				'title' => '链接',
				'name'   => 'link',
				'std'  => '',
				'type' => 'text'
			),
			array(
				'title' => '海报',
				'name'   => 'poster',
				'std'  => '',
				'type' => 'text'
			),
		),
	);
	
	add_action('admin_menu', 'my_list_meta_box_create');
	add_action('save_post', 'my_list_meta_box_save');
	
	function my_list_meta_box_create() {
		if ( function_exists('add_meta_box') ) {
			add_meta_box( 'video_lists_id', '视频列表', 'my_list_meta_box_init', 'post', 'normal', 'high' );
		}
	}
	// 初始化 Meta 信息
	function my_list_meta_box_init( $post_id ) {
		global $list_meta_box,$html_format;
		global $post;
		$post_id = $post -> ID;
		$total_num = get_post_meta($post_id, 'video_total_num', true) ? get_post_meta($post_id, 'video_total_num', true) : 1 ;
		$update_num = get_post_meta($post_id, 'video_update_num', true) ? get_post_meta($post_id, 'video_update_num', true) : 1;
		echo '
		<div class="meta-list-field">
			<div class="meta-list-sum">
				<label class="field-label" for="video-total-num-id" >总集数</label><input type="text" name="video_total_num" id="video-total-num-id" value="'.$total_num.'" class="field-input" />
				<label class="field-label" for="video-update-num-id" >更新至</label><input type="text" name="video_update_num" id="video-update-num-id" value="'.$update_num.'" class="field-input" />
			</div>
			<div class="meta-lists">';
				// 获取已有更新视频列表
				for ($i=1; $i<=$update_num; $i++){
					if ($i == 1){
						$html_format_old .= '
						<div class="meta-list-item first-item">
							<div class="meta-list-item-group">';
					}else{
						$html_format_old .= '
						<div class="meta-list-item">
							<div class="meta-list-item-group">';
					}
					if(is_array($list_meta_box['submeta'])){
						foreach ( $list_meta_box['submeta'] as $sub_meta ){
							$meta_box_key = $list_meta_box['name'].'_'.$i.'_'.$sub_meta['name'];
							$item_value = get_post_meta($post_id, $meta_box_key, true);
							
							$format = '<div class="meta-item header %s"><label for="%s">%s</label><input type="text" name="%s" id="%s" value="%s"/></div>';
							$mixed_arg0 = $sub_meta['name'];
							$mixed_arg1 = $meta_box_key;
							$mixed_arg2 = $sub_meta['title'];
							$mixed_arg3 = $item_value ? $item_value : $sub_meta['std'];
							$html_format_old .= sprintf( $format, $mixed_arg0, $mixed_arg1, $mixed_arg2, $mixed_arg1, $mixed_arg1, $mixed_arg3 );
						}
					}else{
						echo 'Error:submeta 不是一个数组集合!!!';
					}
					if ($i < $update_num){
						$html_format_old .= '
								<a href="#" style="visibility: hidden;" class="delete-item button-secondary '.$i.'" id = "'.$post_id.'";>删除</a>
							</div>
						</div>';
					}else{
						$html_format_old .= '
								<a href="#" class="delete-item button-secondary '.$i.'" id = "'.$post_id.'";>删除</a>
							</div>
						</div>';
					}
				} 
				// 生成新增视频列表组
				$html_format = '
				<div class="meta-list-item">
					<div class="meta-list-item-group">';
					if(is_array($list_meta_box['submeta'])){
						foreach ( $list_meta_box['submeta'] as $sub_meta ){
							$format = '<div class="meta-item %s"><label for="%s">%s</label><input type="text" name="%s" id="%s" value="%s"/></div>';
							$mixed_arg0 = $sub_meta['name'];
							$mixed_arg1 = $list_meta_box['name'].'_{{i}}_'.$sub_meta['name'];
							$mixed_arg2 = $sub_meta['title'];
							$mixed_arg3 = $sub_meta['std'];
							$html_format .= sprintf( $format, $mixed_arg0, $mixed_arg1, $mixed_arg2, $mixed_arg1, $mixed_arg1, $mixed_arg3 );
						}
					}else{
						echo 'Error:submeta 不是一个数组集合!!!';
					}
				$html_format .= '
						<a href="#" class="delete-item button-secondary '.$i.'" id = "'.$post_id.'";>删除</a>
					</div>
				</div>';
					
				echo '
				<script type="text/html" id="framework-html-'.$list_meta_box['name'].'">'.$html_format.'</script>
				'.$html_format_old.'
				<a href="#" class="add-item button-secondary" data-name="framework-html-'.$list_meta_box['name'].'">添加</a>
			</div>
		</div>';
		echo '<input type="hidden" name="list_meta_box_input" id="list-meta-box-input-id" value="'.wp_create_nonce( plugin_basename(__FILE__) ).'" />';
	}
	// 遍历剧集信息生成 Meta
	function my_list_meta_box_save( $post_id ) {
		global $list_meta_box;
		global $post;
		$post_id = $post -> ID;
		
		if ( !wp_verify_nonce( isset($_POST['list_meta_box_input']) ? $_POST['list_meta_box_input'] : '', plugin_basename(__FILE__) ))
			return;
		if ( !current_user_can( 'edit_posts', $post_id ))
			return;	
		// 总集数
		creat_my_post_meta($post_id, 'video_total_num');
		// 更新至
		creat_my_post_meta($post_id, 'video_update_num');
		//分集
		$update_num_new = isset($_POST['video_update_num']) ? $_POST['video_update_num'] : '';
		for ($i=1; $i<=$update_num_new; $i++) {
			foreach( $list_meta_box['submeta'] as $sub_meta ) {
				$meta_box_key = $list_meta_box['name'].'_'.$i.'_'.$sub_meta['name'];
				creat_my_post_meta($post_id, $meta_box_key);
			}
		}
	}
	// 提交 Meta 到数据库
	function creat_my_post_meta($post_id, $meta_box_key){
		
		$new_data = isset($_POST[ $meta_box_key ]) ? $_POST[ $meta_box_key ] : '';
		
		if( get_post_meta( $post_id, $meta_box_key ) == "" ){
			add_post_meta( $post_id, $meta_box_key, $new_data, true );
		}elseif( $new_data != get_post_meta( $post_id, $meta_box_key, true ) ){
			update_post_meta( $post_id, $meta_box_key, $new_data );
		}elseif($new_data == ""){
			delete_post_meta( $post_id, $meta_box_key, get_post_meta( $post_id, $meta_box_key, true ) );
		}
	}

}
video_list_meta();
/**==================== 新增视频列表结束 ====================*/

这里我主要是生成的视频列表,如果你想生成其他列表,代码中有注释,改下即可。

JS 新增项目

因为需要点击新增/删除按钮添加或移除统一行数据,所以需要通过  引入自定义 JS 代码,引入方式:

// 后台加载 JS 文件
function my_backstage_js() {
	wp_register_script( 'backstage_js', get_template_directory_uri() . '/js/backstage.js' );  
	wp_enqueue_script( 'backstage_js' ); 
}

JS 代码如下:

// 视频列表后台增加分集
jQuery(document).ready(function($){
	
	$('.meta-list-field').on('click','a.add-item',function(){
		
		$(".meta-list-item .delete-item").css("visibility","hidden")
		
		if(event){ event.preventDefault(); }
		meta_lists = $(this).closest('.meta-lists');  // 向上查找第一个类名为 meta-lists 的祖先元素
		data_name = $(this).attr('data-name');
		html_format = $('#' + data_name).html();
		count = 0;
		count = meta_lists.find('.meta-list-item').length + 1;
		$('#video-update-num-id').val(count);
		html_temp = html_format.replace(/({{i}})/g,count);
		$(this).before(html_temp);
		
	});
		
	$('.meta-list-field').on('click','a.delete-item',function(){
		
		item_num = $(".meta-list-item").length
		
		event.preventDefault();
		meta_lists = $(this).closest('.meta-lists');
		count = 0;
		count = meta_lists.find('.meta-list-item').length - 1;
		$('#video-update-num-id').val(count);
		$(this).closest('.meta-list-item').remove();
		if($(".meta-list-item").length >1){
			$(".meta-list-item .delete-item:last").css("visibility","visible");
		}
	});	
	
});

样式美化

默认的样式比较丑,建议通过 wp_enqueue_style() 引入后台样式文件,引入方式:

// 后台加载 CSS 文件
function my_backstage_css() {
    wp_enqueue_style( "backstage_css", get_template_directory_uri() . "/css/backstage.css" );
}
add_action('admin_init', 'my_backstage_css');

样式内容如下,当然你也可以自己再改改。

/* 列表样式 */
.meta-list-field{
	display: block;
	width: 100%;
	height: auto;
	margin: 0 auto;
	padding: 0;
	border: 0;
}
.meta-list-field .meta-list-sum{
	display: block;
	width: 100%;
	height: 30px;
	margin: 10px 0;
	padding: 0;
	border: 0;
	line-height: 30px;
	font-size: 14px;
	font-weight: bold;
}
.meta-list-field .meta-list-sum .field-label{
	display: inline-block;
	width: auto;
	height: 100%;
	margin: 0 15px 0 0;
	border: 0;
	padding: 0;
	vertical-align: baseline;
}
.meta-list-field .meta-list-sum .field-input{
	display: inline-block;
	width: 60px;
	height: 100%;
	margin: 0 30px 0 0;
	padding: 0 10px 0 0;
	text-align: right;
}
.meta-list-field .meta-lists{
	display: block;
	width: 100%;
	height: auto;
	margin: 0 auto;
	border: 0;
	padding: 0;
	overflow: hidden;
}
.meta-list-field .meta-list-item{
	display: block;
	width: 100%;
	height: auto;
	margin: 5px 0;
	padding: 0;
	border: 0;
}
.meta-list-field .meta-list-item .meta-list-item-group{
	display: flex;
	flex-direction: row;
	width: 100%;
	height: auto;
	margin: 0 auto;
	border: 0;
	padding: 0;
}
.meta-list-field .meta-list-item .meta-item{
	display: inline-block;
	width: auto;
	height: auto;
	margin: 0 10px 0 0;
	border: 0;
	padding: 0;
	overflow: hidden;
}
.meta-list-field .meta-list-item a{
	display: block;
	flex-basis: 60px;
	margin: 0 auto;
	padding: 0;
	text-align: center;
}
.meta-list-field .meta-list-item.first-item a{
	visibility: hidden;
}
.meta-list-field .meta-list-item .sort{
	flex-grow: 1;
	width: 5%;
}
.meta-list-field .meta-list-item .title{
	flex-grow: 1;
	width: 15%;
}
.meta-list-field .meta-list-item .link{
	flex-grow: 1;
	width: 40%;
}
.meta-list-field .meta-list-item .poster{
	flex-grow: 1;
	width: 40%;
}
.meta-list-field .meta-list-item .meta-item label{
	display: none;
	float: left;
	width: 100%;
	margin: 0 auto 5px;
	padding: 0;
	text-overflow: ellipsis;
	text-align: center;
	white-space: nowrap;
	word-wrap: break-word;
	word-break: break-word;
	overflow: hidden;
}
.meta-list-field .first-item .meta-item label{
	display: block;
}
.meta-list-field .meta-list-item .meta-item input{
	display: block;
	width: 100%;
	height: 30px;
	margin: 0 auto;
	padding: 3px 5px;
	line-height: 30px;
}
.meta-list-field .meta-list-item .sort input{
	text-align: center;
	font-weight: bold;
}

以上。