In my experience, the default “Pages” is easy enough for people to understand..it is where you edit each page.
You can make a “Videos” page template for a Videos page that can show the page content at top “your text areas” and then calls a listing of all the custom post type Videos you created. I just worked on a site with CPT for videos so here is some code you can play with..it creates a taxonomy for Videos, and then the video types, and then adds some extra features to the back-end for adding videos. It is kind of long but just copy and past into your functions.php file and then edit out the bits you don’t want.
*Additional Thoughts**
For the 10+ pages that have the more complex layouts, a new custom-post-type would be appropriate, especially if you can think of a group of generic metafields and boxes you can use that can be put to work on each of the pages. For example:
A custom post type called “Special Pages”
The edit page for “Special Pages” will a set of meta-fields with some generic labeling:
Images- “Image 1” “Image 2″…
Text: “Text 1” “text 2”
You can add the simple-video-editor to this post type to get the Video Fields
Here is a blog-post a guy made about creating just such a special Page:
http://sicdigital.com/2010/07/create-custom-post-type-for-image-upload-wordpress3/
<?php
/*******************************************************************Create a Custom Taxonomy ******************************/
add_action( 'init', 'build_taxonomies', 0 );
function build_taxonomies() {
register_taxonomy(
'video_types',
'videos',
array( 'hierarchical' => true,
'label' => 'Video Types',
'query_var' => true,
'rewrite' => true ) );
}
// Add to admin_init function
add_filter("manage_edit-video_types_columns", 'theme_columns');
function theme_columns($theme_columns) {
$new_columns = array(
'cb' => '<input type="checkbox" />',
'name' => __('Name'),
// 'description' => __('Description'),
// 'slug' => __('Slug'),
'posts' => __('Posts')
);
return $new_columns;
}
/*******************************************************************Create a Custom Post Type******************************/
add_action( 'init', 'create_post_type' );
function create_post_type() {
//start the post type
register_post_type( 'videos',
array(
'labels' => array(
'name' => __( 'Videos' ),
'singular_name' => __( 'Video' ),
'slug' => __( 'videos' ),
'with_front'=> __( false ),
'new_item' => __( 'New Video' ),
'add_new_item'=> __( 'Add New Video' ),
'edit_item'=> __( 'Edit Video' )
),
'public' => true,
'has_archive' => true,
'menu_position' => 6,
'supports' => array('title','thumbnail', 'videoembed')
)
);
//end this post type
}/*---end create post type---*/
// Customise edit columns for video post type
add_filter("manage_edit-videos_columns", "prod_edit_columns");
add_action("manage_posts_custom_column", "prod_custom_columns");
function prod_edit_columns($columns){
$columns = array(
"cb" => "<input type=\"checkbox\" />",
"title" => "Video Title",
"video_type" => "Video Type",
);
return $columns;
}
function prod_custom_columns($column){
global $post;
switch ($column)
{
case "video_type":
echo get_the_term_list($post->ID, 'video_types', '', ', ','');
break;
}
}
// Make these columns sortable
function sortable_columns() {
return array(
"video_type" => "video_types",
"title" => "title"
);
}
add_filter( "manage_edit-videos_sortable_columns", "sortable_columns" );
// Filter the request to just give posts for the given taxonomy, if applicable.
function taxonomy_filter_restrict_manage_posts() {
global $typenow;
// If you only want this to work for your specific post type,
// check for that $type here and then return.
// This function, if unmodified, will add the dropdown for each
// post type / taxonomy combination.
$post_types = get_post_types( array( '_builtin' => false ) );
if ( in_array( $typenow, $post_types ) ) {
$filters = get_object_taxonomies( $typenow );
foreach ( $filters as $tax_slug ) {
$tax_obj = get_taxonomy( $tax_slug );
wp_dropdown_categories( array(
'show_option_all' => __('Show All '.$tax_obj->label ),
'taxonomy' => $tax_slug,
'name' => $tax_obj->name,
'orderby' => 'name',
'selected' => $_GET[$tax_slug],
'hierarchical' => $tax_obj->hierarchical,
'show_count' => false,
'hide_empty' => true
) );
}
}
}
add_action( 'restrict_manage_posts', 'taxonomy_filter_restrict_manage_posts' );
function taxonomy_filter_post_type_request( $query ) {
global $pagenow, $typenow;
if ( 'edit.php' == $pagenow ) {
$filters = get_object_taxonomies( $typenow );
foreach ( $filters as $tax_slug ) {
$var = &$query->query_vars[$tax_slug];
if ( isset( $var ) ) {
$term = get_term_by( 'id', $var, $tax_slug );
$var = $term->slug;
}
}
}
}
add_filter( 'parse_query', 'taxonomy_filter_post_type_request' );
/*---end edit columns---*/
/************************************************************ Simple Video Editor and Video Thumbnails plugins *******/
//HOTFIX FOR VIMEO VIDEOS NOT SHOWING UP USING LINK
function fix_vimeo_oembed_providers( $providers ) {
$providers['#http://(www\.)?vimeo\.com/.*#i'] = array( 'http://vimeo.com/api/oembed.{format}', true );
return $providers;
}
add_filter('oembed_providers', 'fix_vimeo_oembed_providers');
/**
* Gets the embed code for a video.
*
* @param $postID The post ID of the video
* @return The embed code
*/
function p75GetVideo($postID, $width=""){
global $wp_embed;
// legacy support...
if ( $videoURL = get_post_meta($postID, 'videoembed', true) ) return $videoURL;
if ( $videoEmbed = get_post_meta($postID, '_videoembed_manual', true ) ) return $videoEmbed;
$videoURL = get_post_meta($postID, '_videoembed', true);
if ( !($videoWidth = get_post_meta($postID, '_videowidth', true)) )
$videoWidth = get_option('p75_default_player_width');
if ( !($videoHeight = get_post_meta($postID, '_videoheight', true)) )
$videoHeight = get_option('p75_default_player_height');
$height = intval ( $width * ( $videoHeight / $videoWidth ) );
if (empty($width)){$width = $videoWidth;}
if (empty($height)){$height = $videoHeight;}
return $wp_embed->shortcode( array('width' => $width, 'height' => $height), $videoURL );
}
/**
* Returns true if post has a video.
*
* @param $postID The post ID
* @return True if post has a video, false otherwise
*/
function p75HasVideo($postID)
{
return (bool)
(
get_post_meta($postID, '_videoembed', true) ||
get_post_meta($postID, '_videoembed_manual', true) ||
get_post_meta($postID, 'videoembed', true)
);
}
// Register the custom JW Media Player embed handler.
function p75_jw_player_handler( $matches, $attr, $url, $rawattr )
{
static $counter = 1;
if ( !empty($rawattr['width']) && !empty($rawattr['height']) ) {
$width = (int) $rawattr['width'];
$height = (int) $rawattr['height'];
} else {
list( $width, $height ) = wp_expand_dimensions(
get_option('p75_default_player_width'),
get_option('p75_default_player_height'),
$attr['width'], $attr['height'] );
}
$flashvars = get_option('p75_jw_flashvars');
if ( !empty($flashvars) && substr($flashvars, 0, 1)!='&' )
parse_str( $flashvars, $vars );
$file_loc = get_option('p75_jw_files');
if ( substr($file_loc, -1)!="https://wordpress.stackexchange.com/" )
$file_loc = $file_loc . "https://wordpress.stackexchange.com/";
$res = "
<script type="text/javascript" src="https://wordpress.stackexchange.com/questions/31195/{$file_loc}swfobject.js"></script>
<div id='videoContainer-" . $counter . "'>This text will be replaced</div>
<script type="text/javascript">
var so = new SWFObject('{$file_loc}player.swf','ply','" . esc_attr($width) . "','" . esc_attr($height) . "','9','#000000');
so.addParam('allowfullscreen','true');
so.addParam('allowscriptaccess','always');
so.addParam('wmode','opaque');
so.addVariable('file','" . esc_attr($url) . "');\n";
if ( $vars )
{
foreach ( $vars as $key => $val )
$res .= "so.addVariable('$key','" . rawurlencode($val) . "');\n";
}
$res .= "so.write('videoContainer-" . $counter++ . "');
</script>\n";
return $res;
}
wp_embed_register_handler(
'p75_jw_player',
'#http://.*\.(flv|mp4)#i',
'p75_jw_player_handler' );
// RSS feed filter to include videos
function p75_feed_video_filter($content, $feed) {
global $post;
if ( p75HasVideo($post->ID) )
return p75GetVideo($post->ID) . $content;
return $content;
}
add_filter('the_content_feed', 'p75_feed_video_filter', 10, 2);
/**
* Plugin activation. Set default player width
* and height if not present.
*/
register_activation_hook(__FILE__, 'p75_sveActivate');
function p75_sveActivate()
{
global $wpdb;
// Set default player width and height if not present.
add_option('p75_default_player_width', '670');
add_option('p75_default_player_height', '400');
update_option('p75_sve_version', '2.0');
}
/**
* Post admin hooks
*/
add_action('do_meta_boxes', "p75_videoAdminInit");
add_action('admin_menu', "p75_videoAdminOptionsInit");
add_action('save_post', 'p75_saveVideo');
/**
* Add video posting widget and options page.
*/
function p75_videoAdminInit($page)
{
if( function_exists("add_meta_box") )
{
$post_types = explode(',',get_option('p75_post_types'));
if ( in_array( $page, $post_types ) ){ add_meta_box("p75-video-posting", "Post Video Options", "p75_videoPosting", $page, "advanced"); }
}
}
function p75_videoAdminOptionsInit()
{
add_options_page('Simple Video Embedder Options', 'Video Options', 8, 'videooptions', 'p75_videoOptionsAdmin');
}
/**
* Code for the meta box.
*/
function p75_videoPosting()
{
global $post_ID, $wp_embed;
$videoURL = get_post_meta($post_ID, '_videoembed', true);
$videoHeight = get_post_meta($post_ID, '_videoheight', true);
$videoWidth = get_post_meta($post_ID, '_videowidth', true);
$videoEmbed = get_post_meta($post_ID, '_videoembed_manual', true);
?>
<div style="float:left; margin-right: 5px;">
<label for="p75-video-url"><?php _e("Video URL"); ?>:</label><br />
<input style="width: 300px; margin-top:5px;" type="text" id="p75-video-url" name="p75-video-url" value="<?php echo $videoURL; ?>" tabindex='100' />
</div>
<div style="float:left; margin-right: 5px;">
<label for="p75-video-width3"><?php _e("Width"); ?>:</label><br />
<input style="margin-top:5px;" type="text" id="p75-video-width3" name="p75-video-width" size="4" value="<?php echo $videoWidth; ?>" tabindex='101' />
</div>
<div style="float:left;">
<label for="p75-video-height4"><?php _e("Height"); ?>:</label><br />
<input style="margin-top:5px;" type="text" id="p75-video-height4" name="p75-video-height" size="4" value="<?php echo $videoHeight; ?>" tabindex='102' />
</div>
<div class="clear"></div>
<div style="margin-top:10px;">
<label for="p75-video-embed"><?php _e("Embed Code"); ?>: (<?php _e("Overrides Above Settings"); ?>)</label><br />
<textarea style="width: 100%; margin:5px 2px 0 0;" id="p75-video-embed" name="p75-video-embed" rows="4" tabindex="103"><?php echo htmlspecialchars(stripslashes($videoEmbed)); ?></textarea>
</div>
<p>
<input id="p75-remove-video" type="checkbox" name="p75-remove-video" /> <label for="p75-remove-video"><?php _e("Remove video"); ?></label>
</p>
<?php
// Video preview.
if ( $videoURL )
{
echo '<div style="margin-top:10px;">' . __("Video Preview") . ': (' . __("Actual Size") . ')<br /><div id="video_preview" style="padding: 3px; border: 1px solid #CCC;float: left; margin-top: 5px;">';
echo p75GetVideo($post_ID);
echo '</div></div><div class="clear"></div>';
}
else if ( $videoEmbed )
{
echo '<div style="margin-top:10px;">' . __("Video Preview") . ': (' . __("Actual Size") . ')<br /><div id="video_preview" style="padding: 3px; border: 1px solid #CCC;float: left; margin-top: 5px;">';
echo stripslashes($videoEmbed);
echo '</div></div><div class="clear"></div>';
}
?>
<p style="margin:10px 0 0 0;"><input id="publish" class="button-primary" type="submit" value="<?php _e("Update Post"); ?>" accesskey="p" tabindex="5" name="save"/></p>
<?php
}
/**
* Saves the thumbnail image as a meta field associated
* with the current post. Runs when a post is saved.
*/
function p75_saveVideo( $postID ) {
global $wpdb;
// Get the correct post ID if revision.
if ( $wpdb->get_var("SELECT post_type FROM $wpdb->posts WHERE ID=$postID")=='revision')
$postID = $wpdb->get_var("SELECT post_parent FROM $wpdb->posts WHERE ID=$postID");
// Trim white space just in case.
$_POST['p75-video-embed'] = trim($_POST['p75-video-embed']);
$_POST['p75-video-url'] = trim($_POST['p75-video-url']);
$_POST['p75-video-width'] = trim($_POST['p75-video-width']);
$_POST['p75-video-height'] = trim($_POST['p75-video-height']);
if ( $_POST['p75-remove-video'] )
{
// Remove video
delete_post_meta($postID, '_videoembed');
delete_post_meta($postID, '_videowidth');
delete_post_meta($postID, '_videoheight');
delete_post_meta($postID, '_videoembed_manual');
}
elseif ( $_POST['p75-video-embed'] )
{
// Save video embed code.
if( !update_post_meta($postID, '_videoembed_manual', $_POST['p75-video-embed'] ) )
add_post_meta($postID, '_videoembed_manual', $_POST['p75-video-embed'] );
delete_post_meta($postID, '_videoembed');
delete_post_meta($postID, '_videowidth');
delete_post_meta($postID, '_videoheight');
}
elseif ( $_POST['p75-video-url'] )
{
// Save video URL.
if( !update_post_meta($postID, '_videoembed', $_POST['p75-video-url'] ) )
add_post_meta($postID, '_videoembed', $_POST['p75-video-url'] );
delete_post_meta($postID, '_videoembed_manual');
// Save width and height.
if ( is_numeric($_POST['p75-video-width']) )
{
if( !update_post_meta($postID, '_videowidth', $_POST['p75-video-width']) )
add_post_meta($postID, '_videowidth', $_POST['p75-video-width']);
}
else if ( empty($_POST['p75-video-width']) )
delete_post_meta($postID, '_videowidth');
if ( is_numeric($_POST['p75-video-height']) )
{
if( !update_post_meta($postID, '_videoheight', $_POST['p75-video-height']) )
add_post_meta($postID, '_videoheight', $_POST['p75-video-height']);
}
else if ( empty($_POST['p75-video-height']) )
delete_post_meta($postID, '_videoheight');
}
}
/**
* The shortcode for embedding videos in your posts wherever.
*
* The shortcode accepts four parameters:
* id: some post ID, defaults the current post
* url: a URL to a video, defaults to null
* width: the player width, only works when specifying the URL
* height: the player height, only works when specifying the URL
*
* If you specify the post ID, it will use the video, width, and height
* associated with the post.
*
* If you specify the video URL, it will use that URL to create the embedded player.
* If width and height are specified as well, they will be used, otherwise the
* defaults will be used as set in the options page.
*/
function p75_video_short_code($atts, $content=null) {
global $post, $wp_embed;
extract(shortcode_atts(array(
'id' => $post->ID,
'url' => null,
'width' => -1,
'height' => -1
), $atts));
// If a URL is passed in, use that.
if ( null != $url ) {
$width = (-1 != $width) ? $width : get_option('p75_default_player_width');
$height = (-1 != $height) ? $height : get_option('p75_default_player_height');
return $wp_embed->shortcode( array('width' => $width, 'height' => $height), $url );
}
// No URL was passed in.
return p75GetVideo($id);
}
add_shortcode('simple_video', 'p75_video_short_code');
function p75_videoOptionsAdmin()
{
?>
<div class="wrap">
<h2>Simple Video Embedder Options</h2>
<form method="post" action="options.php">
<?php
wp_nonce_field('update-options');
if( get_option('p75_post_types') == "" ){
$post_type_value="post";
}else{
$post_type_value = get_option('p75_post_types');
}
?>
<table class="form-table">
<tr valign="top">
<th style="white-space:nowrap;" scope="row"><label for="p75_post_types"><?php _e("Enabled for post types"); ?>:</label></th>
<td><input id="p75_post_types" type="text" name="p75_post_types" value="<?php echo $post_type_value; ?>" /></td>
<td style="width:100%;">The post types (post,page,custom_post_type) that this plugin is enabled for. Use commas to separate with no spaces.</td>
</tr>
<tr valign="top">
<th style="white-space:nowrap;" scope="row"><label for="p75_default_player_width"><?php _e("Default player width"); ?>:</label></th>
<td><input id="p75_default_player_width" type="text" name="p75_default_player_width" value="<?php echo get_option('p75_default_player_width'); ?>" /></td>
<td style="width:100%;">The default width of the video player if not set.</td>
</tr>
<tr valign="top">
<th style="white-space:nowrap;" scope="row"><label for="p75_default_player_height"><?php _e("Default player height"); ?>:</label></th>
<td><input id="p75_default_player_height" type="text" name="p75_default_player_height" value="<?php echo get_option('p75_default_player_height'); ?>" /></td>
<td>The default height of the video player if not set.</td>
</tr>
<tr valign="top">
<th style="white-space:nowrap;" scope="row"><label for="p75_jw_files"><?php _e("JW Player files location"); ?></label>:</th>
<td><input id="p75_jw_files" type="text" name="p75_jw_files" value="<?php echo get_option('p75_jw_files'); ?>" /></td>
<td>The location of the JW player files relative to your WordPress installation.</td>
</tr>
<tr valign="top">
<th style="white-space:nowrap;" scope="row"><a href="http://developer.longtailvideo.com/trac/wiki/FlashVars" title="<?php _e("What are flashvars?"); ?>" target="_blank"><?php _e("JW Player flashvars"); ?></a>:</th>
<td><input type="text" name="p75_jw_flashvars" value="<?php echo get_option('p75_jw_flashvars'); ?>" /></td>
<td>Extra parameters for JW player. For experienced users.</td>
</tr>
</table>
<input type="hidden" name="action" value="update" />
<input type="hidden" name="page_options" value="p75_post_types,p75_default_player_width,p75_default_player_height,p75_jw_files,p75_jw_flashvars" />
<p class="submit">
<input type="submit" class="button-primary" value="<?php _e('Save Changes') ?>" />
</p>
</form>
</div>
<?php
}
function ident_simple_video_plugin($blogopts) {
$blogopts['simple_video_embedder'] = array(
'desc' => __( 'Press75 Simple Video Plugin 1.2' ),
'readonly' => true,
'option' => 'simple_video_embedder'
);
return $blogopts;
}
add_filter('xmlrpc_blog_options', 'ident_simple_video_plugin');
/*-----------------------------------------------------------------------------END VIDEO PLUGINS------------*/
?>