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; }
以上。
评论 (2)
请教前端模板怎么调用列表,谢谢
看我分享的主题里面应该调用了。