WordPressで運営しているサイトでYoutubeを使う際に知っておくと得するっぽいTips

Ads

Warning: Undefined array key "HTTP_USER_AGENT" in /home/youhei0828/kachibito.net/public_html/wp-content/themes/kachibito7_with_cocoon_child/functions-module/other/tiny-fixed.php on line 75

なんとなく情報が少ない気がするので試しに
書いてみます。WordPressで運営している
サイトでYoutubeをよく貼るようなことが多い
ならちょっとお得、というか管理が楽になる
かも知れないTipsをいくつかご紹介。自分
でも動画を使うサイトには取り入れたいカス
タマイズです。

Youtubeをよくはってるサイトやブログを良く見かけますので少しでも効率が良くなればなぁと思ってTipsをいくつか書いてみました。コードばかりで何があるか分かりくいですが内容は以下になります。

  1. ショートコードで動画を貼る
  2. カスタムフィールドで管理する
  3. z-indexが自動で効くようにしてあげる
  4. レスポンシブWebデザインに対応させる
  5. Youtubeのサムネイルを取得する
  6. 管理画面で固定の動画を管理する
  7. ショートコードで動画一覧をドバッと出せるプラグイン・TubePress

ショートコードで動画を貼る

ショートコードでYoutubeを手軽に貼れる様にします。functions.phpに以下を追加

function youtube($atts) {
	extract(shortcode_atts(array(
		"value" => '',
		"width" => '649',
		"height" => '395',
	), $atts));
	return '<iframe width="'.$width.'" height="'.$height.'" src="http://www.youtube.com/embed/'.$value.'" frameborder="0" allowfullscreen></iframe>';
}
add_shortcode("youtube", "youtube");

ショートコードは以下のように指定します。

[youtube value="rTUwqxHpXMY"]

ID入れるだけ。幅も指定したいときは

[youtube width="200" value="rTUwqxHpXMY"]

のようにすれば指定されますが未入力ならデフォルト値が使われます。

カスタムフィールドで管理する

動画ばっかりのサイトならカスタムフィールドで管理しちゃったほうが楽です。

<?php if(get_post_meta($post->ID, 'YTid', true)): ?> 
 
<iframe width="649" height="395" src="http://www.youtube.com/embed/<?php echo get_post_meta($post->ID, 'YTid', true); ?>?rel=0" frameborder="0" allowfullscreen></iframe>
 <?php endif; ?>

上記コードをsingle.phpなどに埋め込んで記事投稿時にカスタムフィールドの名前の部分にYTid、IDにYoutubeのIDを入れれば動画を簡単に実装できます。条件分岐を使っているのでカスタムフィールドを使わなければ表示されません。

この場合、テンプレートファイルに貼ることになるので場所は固定されます。サイズなどはレイアウトに応じて変更してください。

z-indexが自動で効くようにしてあげる


少し前にYoutubeにz-indexが効かないのを効くようにする方法を書きました。重複しますが・・

Youtube(というか、embedを使った動画全般)には通常z-indexが効きません。Lightboxとかposition: fixed;とかでご経験されてる方も多いかと思いますが、この場合は?wmode=transparentというパラメーターを付ければz-indexを適応できます。

しかし、WordPressのようなブログサイトで毎回手動で入れるのは面倒なのでjQueryで自動挿入します。

$('iframe').each(function(){
      $(this).attr('src',$(this).attr('src')+'?wmode=transparent');
})

コードはiframe全般にしているのでサイトに応じて工夫してみてください。以下デモです。再生ボタンで確認できます。

灰色の部分にz-indexが指定されています。

レスポンシブWebデザインに対応させる


Media Queriesを使って様々なデバイスに対応させるレスポンシブWebデザインに動画を対応させるには以下のようにしてあげます。

動画をdivで囲みます。

<div class='medias'>
<iframe src="http://player.vimeo.com/video/25945509?title=0&amp;byline=0&amp;portrait=0&amp;color=ffffff" width="649" height="395" frameborder="0"></iframe>
</div>

で、css

	.medias {
		position: relative ; 
		padding-bottom: 51% ; 
		height: 0 ; 
		overflow: hidden ; 
		width: 100% ; 
		height: 100% ;
		}
		.medias iframe,
		.medias object,  
		.medias embed { 
			position: absolute ; 
			top: 0 ; 
			left: 0 ; 
			width: 100% ; 
			height: 100% ;
			}

responsivetwentytenのようにiframeにwidth: 100%;、height: auto ;としても、縦が自動調整されないので、アスペクト比を保つためにはdiv等で囲ってあげる必要があります。

あとは普通にMedia Queriesで親要素の幅かなんかをゴニョゴニョすればいいんですが、これもいちいちiframeを手動でdivで囲うのは面倒なので自動的に囲ってあげます。

    $("iframe").wrap("<div class='medias'></div>");

管理が楽なのでこうしてますけどもっとスマートな方法あると思います。

デモ (動作確認はresponsivepxをご利用下さい)

Youtubeのサムネイルを取得する


動画のサムネイルが欲しいときはありませんか?いちいちキャプチャ撮るのは面倒です。以下のコードで手軽に取得出来ますよ。

functions.phpに以下を追加

add_action("admin_init", "youtube_init");
    add_action('save_post', 'save_youtube_link');
    function youtube_init(){
        add_meta_box("youtube", "Youtube thumbnail code", "youtube_link", "post", "normal", "high");
    }
    function youtube_link(){
        global $post;
        $custom  = get_post_custom($post->ID);
        $link    = $custom["link"][0];
?>

<div class="link_header">
    <input name="link" class="form-input-tip" value="<?php echo $link; ?>" /><br />
</div>

<div class="yt-thumb"><img src="http://img.youtube.com/vi/<? echo $custom['link'][0]; ?>/0.jpg" width="30" height="30" /></div>

<p>ボックスの中にYoutubeのIDを入力して下さい。あかい文字の場所がIDです。 <br /> http://www.youtube.com/watch?v=<span class="yt-id">oHg5SJYRHA0</span>&feature=player_embedded</p><div class="yt-clear"></div>

<?php
    }
function save_youtube_link(){
global $post;
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {return $post->ID;}
    update_post_meta($post->ID, "link", $_POST["link"]);
}
function youtube_thumb($w,$h,$t){
     $custom = get_post_custom($post->ID);
     return '<img src="http://img.youtube.com/vi/'.$custom['link'][0].'/'.$t.'.jpg" width="'.$w.'" height="'.$h.'" />';
}
add_action('admin_head', 'youtube_css');
function youtube_css() {
    echo'
    <style type="text/css">
        .link_header{margin:0px 5px 0px 0px;}
        .link_header input{
            font-size:13px;

            color:#666;
            border:solid 1px #ccc;
            -moz-border-radius:3px;
            padding:2px;
            margin:0px 10px 0px 0px;
            width:100%;
            }
        .yt-clear{clear:both;}
        .yt-id{color:#ff0000;font-weight:bold;}
        .yt-thumb{
            float:left;
            margin:6px 6px 0px 0px;
            border:solid 1px #ccc;
            }
    </style>
    ';
}

で、サムネイルを表示させたい場所(ループ内)に以下のコードを含めます。

<? echo youtube_thumb('480','360','0'); ?>

サイズは調整してください。
via:Add youtube thumbnail posts with custom metabox

管理画面で固定の動画を管理する

WP-Tubularで使った方法を使います。まず、以下のコードでsettings.phpというファイルを作り、テーマファイルの中に含めてあげてください。

<?php

$settings = array(
	'youtube' => '_VKW_M_uVjw'
);

# Settings

$themename = "Youtube ";
$shortname = "YT";
$options = array (
	array(	"name" => "Main Settings",
			"type" => "header"
	),
	array(  "name" => "Youtube Video ID",
            "id" => $shortname."_youtube",
            "std" => $settings['youtube'],
            "type" => "text",
			"note" => "<strong>Example: </strong> http://www.youtube.com/watch?v=<strong style='color: #ff0000;'>_VKW_M_uVjw</strong>")
);
function mytheme_add_admin() {
    global $themename, $shortname, $options;
    if ( $_GET['page'] == basename(__FILE__) ) {
        if ( 'save' == $_REQUEST['action'] ) {
                foreach ($options as $value) {
					if ($value['type']!='header') {
						update_option( $value['id'], $_REQUEST[ $value['id'] ] );
					}
				}
                foreach ($options as $value) {
                    if( isset( $_REQUEST[ $value['id'] ] ) ) { update_option( $value['id'], $_REQUEST[ $value['id'] ]  ); } else { delete_option( $value['id'] ); } }
                header("Location: themes.php?page=settings.php&saved=true");
                die;
        } else if( 'reset' == $_REQUEST['action'] ) {
            foreach ($options as $value) {
                delete_option( $value['id'] ); }
            header("Location: themes.php?page=settings.php&reset=true");
            die;
        }
    }
    add_theme_page($themename." Settings", "Youtube Settings", 'edit_themes', basename(__FILE__), 'mytheme_admin');
}
function mytheme_admin() {
    global $themename, $shortname, $options;
    if ( $_REQUEST['saved'] ) echo '<div id="message" class="updated fade"><p><strong>'.$themename.' settings saved.</strong></p></div>';
    if ( $_REQUEST['reset'] ) echo '<div id="message" class="updated fade"><p><strong>'.$themename.' settings reset.</strong></p></div>';
?>
<style type="text/css">
th {text-align: left;}
td {padding: 5px 10px !important;}
tr.header {background-color: #1a1a1a !important;color: #ffffff;}
.header td {padding: 2px 10px !important;font-size: 14px !important;font-weight: bold !important;}
</style>
<div class="wrap">
<h2><?php echo $themename; ?> Settings</h2>
<form method="post">
<table class="form-table">
<?php foreach ($options as $value) { 
if ($value['type'] == "text") { ?>
<tr> 
    <th scope="row" style="width: 25%"><?php echo $value['name']; ?>:</th>
    <td>
        <input onfocus="this.select();" name="<?php echo $value['id']; ?>" id="<?php echo $value['id']; ?>" type="<?php echo $value['type']; ?>" value="<?php if ( get_settings( $value['id'] ) != "") { echo get_settings( $value['id'] ); } else { echo $value['std']; } ?>" />
		&nbsp; &nbsp; <?php echo $value['note']; ?>
    </td>
</tr>
<?php } elseif ($value['type'] == "select") { ?>
    <tr> 
        <th scope="row"><?php echo $value['name']; ?>:</th>
        <td>
            <select name="<?php echo $value['id']; ?>" id="<?php echo $value['id']; ?>">
                <?php foreach ($value['options'] as $option) { ?>
                <option value="<?php echo $option; ?>" <?php if ( get_settings( $value['id'] ) == $option) { echo ' selected="selected"'; } elseif ($option == $value['std']) { echo ' selected="selected"'; } ?>><?php echo $option; ?></option>
                <?php } ?>
            </select>
			&nbsp; &nbsp; <?php echo $value['note']; ?>
        </td>
    </tr>
<?php 
} elseif ($value['type'] == "header") {?>
	<tr class="header"><td colspan="2"><?php  echo $value['name'] ?> &nbsp; &nbsp; <span style="font-size: 11px; font-weight: normal;"><?php echo $value['note']; ?></span></td></tr>
<?php 
} }
?>
</table>
<p class="submit">
<input name="save" type="submit" value="Save changes" />    
<input type="hidden" name="action" value="save" />
</p>
</form>
<form method="post">
<p class="submit" style="border: 0;">
<input name="reset" type="submit" value="Reset" />
<input type="hidden" name="action" value="reset" />
</p>
</form>
<?php
}
add_action('admin_menu', 'mytheme_add_admin');
foreach ($options as $value) {
if (get_settings( $value['id'] ) === FALSE) { $$value['id'] = $value['std']; } else { $$value['id'] = get_settings( $value['id'] ); } }

# Set Values
foreach ($settings as $k=>$v) {
	$var = $shortname.'_'.$k;
	if (!empty($$var)) $settings[$k] = $$var;
}
?>

さらに、functions.phpに以下のコードを追記してsetting.phpをincludeします。

include("settings.php");
function dp_settings($key) {
	global $settings;
	return $settings[$key];
}

これでテーマに以下のようなオプション機能が加わりました。

あとは、サイドバーやTOPページのスライドとかで見かけるような場所に動画を貼れば管理画面で動画を変更できるようになります。

<iframe width="300" height="100" src="http://www.youtube.com/embed/<?php echo dp_settings("youtube") ?>" frameborder="0" allowfullscreen></iframe>

dp_settings(“youtube”)に、管理画面でセットしたYoutubeのIDが入る、という仕組みです。

実際にこの方法でYoutubeを管理するのは実はあまり意味が無いのですが、この方法を覚えておくと他にもいろいろと応用できるので挙げてみました。

TubePress


以前ご紹介したプラグインです。これが凄いんです。ショートコード貼るだけで、Youtubeの検索結果をドバッとページングつきで出してくれるプラグイン。ぜひ一度お試しいただきたいです。

TubePress

以上、Youtubeを使うなら知っておくと得っぽいTipsでした。書いておいてアレですけどあんまり需要無さそうですねw他にもいろいろあるんですが、多くの場合はプラグインでどうにかなる気がします。

version 3.0.83 (Wed, 16 Apr 2014 03:56:09 GMT)
http://alexgorbatchev.com/SyntaxHighlighter
JavaScript code syntax highlighter.
Copyright 2004-2013 Alex Gorbatchev.
If you like this script, please donate to
keep development active!

'}},vars:{discoveredBrushes:null,highlighters:{}},brushes:{},regexLib:{multiLineCComments:XRegExp("/\\*.*?\\*/","gs"),singleLineCComments:/\/\/.*$/gm,singleLinePerlComments:/#.*$/gm,doubleQuotedString:/"([^\\"\n]|\\.)*"/g,singleQuotedString:/'([^\\'\n]|\\.)*'/g,multiLineDoubleQuotedString:XRegExp('"([^\\\\"]|\\\\.)*"',"gs"),multiLineSingleQuotedString:XRegExp("'([^\\\\']|\\\\.)*'","gs"),xmlComments:XRegExp("(<|<)!--.*?--(>|>)","gs"),url:/https?:\/\/[\w-.\/?%&=:@;#]*/g,phpScriptTags:{left:/(<|<)\?(?:=|php)?/g,right:/\?(>|>)/g,eof:!0},aspScriptTags:{left:/(<|<)%=?/g,right:/%(>|>)/g},scriptScriptTags:{left:/(<|<)\s*script.*?(>|>)/gi,right:/(<|<)\/\s*script\s*(>|>)/gi}},toolbar:{getHtml:function(e){function t(e,t){return B.toolbar.getButtonHtml(e,t,B.config.strings[t])}for(var n='

',r=B.toolbar.items,i=r.list,a=0,l=i.length;l>a;a++)n+=(r[i[a]].getHtml||t)(e,i[a]);return n+="

"},getButtonHtml:function(t,n,r){return n=e(n),''+e(r)+""},handler:function(e){function t(e){var t=RegExp(e+"_(\\w+)"),n=t.exec(r);return n?n[1]:null}var n=e.target,r=n.className||"",i=s(g(n,".syntaxhighlighter").id),a=t("command");i&&a&&B.toolbar.items[a].execute(i),e.preventDefault()},items:{list:["expandSource","help"],expandSource:{getHtml:function(e){if(1!=e.getParam("collapse"))return"";var t=e.getParam("title");return B.toolbar.getButtonHtml(e,"expandSource",t?t:B.config.strings.expandSource)},execute:function(e){var t=o(e.id);r(t,"collapsed")}},help:{execute:function(){var e=x("","_blank",500,250,"scrollbars=0"),t=e.document;t.write(B.config.strings.aboutDialog),t.close(),e.focus()}}}},findElements:function(e,t){var n=t?[t]:i(document.getElementsByTagName(B.config.tagName)),r=B.config,a=[];if(r.useScriptTags&&(n=n.concat(A())),0===n.length)return a;for(var l=0,s=n.length;s>l;l++){var o={target:n[l],params:p(e,E(n[l].className))};null!=o.params.brush&&a.push(o)}return a},highlight:function(e,t){var n=this.findElements(e,t),r="innerHTML",i=null,a=B.config;if(0!==n.length)for(var l=0,s=n.length;s>l;l++){var o,t=n[l],u=t.target,c=t.params,g=c.brush;if(null!=g){if("true"==c["html-script"]||1==B.defaults["html-script"])i=new B.HtmlScript(g),g="htmlscript";else{var h=b(g);if(!h)continue;i=new h}o=u[r],a.useScriptTags&&(o=M(o)),""!=(u.title||"")&&(c.title=u.title),c.brush=g,i.init(c),t=i.getDiv(o),""!=(u.id||"")&&(t.id=u.id),u.parentNode.replaceChild(t,u)}}},all:function(e){m(window,"load",function(){B.highlight(e)})}};return B.Match=function(e,t,n){this.value=e,this.index=t,this.length=e.length,this.css=n,this.brushName=null},B.Match.prototype.toString=function(){return this.value},B.HtmlScript=function(e){function t(e,t){for(var n=0,r=e.length;r>n;n++)e[n].index+=t}function n(e){for(var n,a=e.code,l=[],s=r.regexList,o=e.index+e.left.length,u=r.htmlScript,c=0,g=s.length;g>c;c++)n=L(a,s[c]),t(n,o),l=l.concat(n);null!=u.left&&null!=e.left&&(n=L(e.left,u.left),t(n,e.index),l=l.concat(n)),null!=u.right&&null!=e.right&&(n=L(e.right,u.right),t(n,e.index+e[0].lastIndexOf(e.right)),l=l.concat(n));for(var h=0,g=l.length;g>h;h++)l[h].brushName=i.brushName;return l}var r,i=b(e),a=new B.brushes.Xml,l=this,s="getDiv getHtml init".split(" ");if(null!=i){r=new i;for(var o=0,u=s.length;u>o;o++)(function(){var e=s[o];l[e]=function(){return a[e].apply(a,arguments)}})();return null==r.htmlScript?(v(B.config.strings.brushNotHtmlScript+e),void 0):(a.regexList.push({regex:r.htmlScript.code,func:n}),void 0)}},B.Highlighter=function(){},B.Highlighter.prototype={getParam:function(e,t){var n=this.params[e];return d(null==n?t:n)},create:function(e){return document.createElement(e)},findMatches:function(e,t){var n=[];if(null!=e)for(var r=0,i=e.length;i>r;r++)"object"==typeof e[r]&&(n=n.concat(L(t,e[r])));return this.removeNestedMatches(n.sort(k))},removeNestedMatches:function(e){for(var t=0,n=e.length;n>t;t++)if(null!==e[t])for(var r=e[t],i=r.index+r.length,a=t+1,n=e.length;n>a&&null!==e[t];a++){var l=e[a];if(null!==l){if(l.index>i)break;l.index==r.index&&l.length>r.length?e[t]=null:l.index>=r.index&&i>l.index&&(e[a]=null)}}return e},figureOutLineNumbers:function(e){var t=[],n=parseInt(this.getParam("first-line"));return y(e,function(e,r){t.push(r+n)}),t},isLineHighlighted:function(e){var t=this.getParam("highlight",[]);return"object"!=typeof t&&null==t.push&&(t=[t]),-1!=h(t,""+e)},getLineHtml:function(e,t,n){var r=["line","number"+t,"index"+e,"alt"+(""+(0==t%2?1:2))];return this.isLineHighlighted(t)&&r.push("highlighted"),0==t&&r.push("break"),'

'+n+"

"},getLineNumbersHtml:function(e,t){var n="",r=a(e).length,i=parseInt(this.getParam("first-line")),l=this.getParam("pad-line-numbers");1==l?l=(""+(i+r-1)).length:1==isNaN(l)&&(l=0);for(var s=0;r>s;s++){var o=t?t[s]:i+s,e=0==o?B.config.space:S(o,l);n+=this.getLineHtml(s,o,e)}return n},getCodeLinesHtml:function(e,t){e=C(e);for(var n=a(e),r=(this.getParam("pad-line-numbers"),parseInt(this.getParam("first-line"))),e="",i=this.getParam("brush"),l=0,s=n.length;s>l;l++){var o=n[l],u=/^( |\s)+/.exec(o),c=null,g=t?t[l]:r+l;null!=u&&(c=""+u[0],o=o.substr(c.length),c=c.replace(" ",B.config.space)),o=C(o),0==o.length&&(o=B.config.space),e+=this.getLineHtml(l,g,(null!=c?''+c+"":"")+o)}return e},getTitleHtml:function(t){return t?"

"+e(t)+"

":""},getMatchesHtml:function(e,t){function n(e){var t=e?e.brushName||a:a;return t?t+" ":""}for(var r=0,i="",a=this.getParam("brush",""),l=0,s=t.length;s>l;l++){var o,u=t[l];null!==u&&0!==u.length&&(o=n(u),i+=N(e.substr(r,u.index-r),o+"plain")+N(u.value,o+u.css),r=u.index+u.length+(u.offset||0))}return i+=N(e.substr(r),n()+"plain")},getHtml:function(t){var n,r,i,a="",s=["syntaxhighlighter"];return 1==this.getParam("light")&&(this.params.toolbar=this.params.gutter=!1),className="syntaxhighlighter",1==this.getParam("collapse")&&s.push("collapsed"),0==(gutter=this.getParam("gutter"))&&s.push("nogutter"),s.push(this.getParam("class-name")),s.push(this.getParam("brush")),t=w(t).replace(/\r/g," "),n=this.getParam("tab-size"),t=1==this.getParam("smart-tabs")?R(t,n):H(t,n),this.getParam("unindent")&&(t=P(t)),gutter&&(i=this.figureOutLineNumbers(t)),r=this.findMatches(this.regexList,t),a=this.getMatchesHtml(t,r),a=this.getCodeLinesHtml(a,i),this.getParam("auto-links")&&(a=I(a)),"undefined"!=typeof navigator&&navigator.userAgent&&navigator.userAgent.match(/MSIE/)&&s.push("ie"),a='

'+(this.getParam("toolbar")?B.toolbar.getHtml(this):"")+''+this.getTitleHtml(this.getParam("title"))+""+""+(gutter?'":"")+'"+""+""+"
'+this.getLineNumbersHtml(t)+"'+'
'+a+"
"+"
"+"

"},getDiv:function(e){null===e&&(e=""),this.code=e;var t=this.create("div");return t.innerHTML=this.getHtml(e),this.getParam("toolbar")&&m(c(t,".toolbar"),"click",B.toolbar.handler),this.getParam("quick-code")&&m(c(t,".code"),"dblclick",X),t},init:function(e){this.id=f(),u(this),this.params=p(B.defaults,e||{}),1==this.getParam("light")&&(this.params.toolbar=this.params.gutter=!1)},getKeywords:function(e){return e=e.replace(/^\s+|\s+$/g,"").replace(/\s+/g,"|"),"\\b(?:"+e+")\\b"},forHtmlScript:function(e){var t={end:e.right.source};e.eof&&(t.end="(?:(?:"+t.end+")|$)"),this.htmlScript={left:{regex:e.left,css:"script"},right:{regex:e.right,css:"script"},code:XRegExp("(?"+e.left.source+")"+"(?.*?)"+"(?"+t.end+")","sgi")}}},B}();"undefined"!=typeof exports?exports.SyntaxHighlighter=SyntaxHighlighter:null