WordPressのギャラリー機能で追加した画像一覧からアイキャッチを除外して、画像に任意のリンク先を指定する
2012.06.12
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の記事投稿で、アップロード
した画像をショートコードで簡単に画像
ギャラリーを作成する機能がデフォルト
で備わっていますが、基本的にあまり
使いやすいものではありません。なので
少し便利にしてみます。
デフォルトのギャラリー機能でちょっと微妙な点は「アイキャッチ画像も含まれる」と「リンク先を自由に指定できない」の2つです。これを、実装できるようにしてみます。
アイキャッチ画像を除外する
まずはアイキャッチを除外します。
ギャラリーは[gallery]というショートコードで、その記事内でアップロードした画像のギャラリーを実装出来ます。これは、結構クライアントさんにも手軽で良いと評判です。ギャラリー系のプラグインは便利なんですけど、プラグインそのものの利用方法に戸惑う方もいますので、個人的には極力デフォルトのギャラリーを使って貰うようにしています。
手動で除外
さて、アイキャッチを除外する方法ですが、[gallery exclude='画像ID']とすれば、任意の画像をギャラリーから除外できますので、ここにアイキャッチ画像のIDを含めればOK。
投稿している場合は画像のclassにwp-image-***と付きます。これがIDになりますが、アイキャッチを投稿内に含めない場合はIDを調べるのも、excludeってわざわざ入力するのも面倒臭い。
自分でも面倒臭いと思うような事をクライアントさんにやってもらう訳には行かないですね。
自動で除外
自動で除外する。ここは素直にテーマファイルにショートコードを埋め込んだ方が良さそうです。
<?php $id = get_post_thumbnail_id(get_the_ID()); ?>
<?php echo do_shortcode('[[gallery exclude='.$id.' size="thumbnail" columns="3"]]'); ?>
get_post_thumbnail_idで取得したIDをexcludeオプションに含めてあげます。
これだと毎回ギャラリーが追加されてしまいますのでカスタムフィールドで条件分岐し、ギャラリーの有無を選択できるようにします。
カスタムフィールドでギャラリー表示をスイッチできるようにする
ギャラリーを追加したいときはカスタムフィールドを登録すればいいだけ。
<?php $img_gallery = get_post_meta($post->ID, 'img_gallery', true); if ($img_gallery) { ?>
<?php $id = get_post_thumbnail_id(get_the_ID()); ?>
<?php echo do_shortcode('[[gallery exclude='.$id.' size="thumbnail" columns='.$img_gallery.']]'); ?>
<?php } else { ?>
<?php } ?>
上記のコードをテーマファイルに含めます。あとは、記事でimg_galleryという名前で、値にギャラリーの列数を指定すればアイキャッチ画像の含まれないギャラリーを手軽に実装出来ます。
続いて、ギャラリーの画像のリンク先を任意に指定出来るようにします。
プラグインを使う
通常、画像にはリンク先を指定できますが、ギャラリーにはリンク先を指定出来ません。これはgallery-custom-link というプラグインが実現してくれます。
有効化すると、アップロードした画像の編集画面にCustom Linkという項目が追加されます。ここに、任意のリンク先を指定し、保存します。
あとは、
[gallery link="custom_url"]
とするだけで、設定したURLが画像リンクになってくれます。これを先ほどのコードに含めれば完成ですね。
ゴール
<?php $img_gallery = get_post_meta($post->ID, 'img_gallery', true); if ($img_gallery) { ?>
<?php $id = get_post_thumbnail_id(get_the_ID()); ?>
<?php echo do_shortcode('[[gallery exclude='.$id.' link="custom_url" size="thumbnail" columns='.$img_gallery.']]'); ?>
<?php } else { ?>
<?php } ?>
link=”custom_url”を追加しました。これで
ギャラリー機能で追加した画像一覧からアイキャッチを除外して、画像に任意のリンク先を指定
を簡単に実装出来る様にするという要望に応えることができます。でも、出来れば標準でリンク先を指定出来るようになって欲しいです。
※紹介したプラグインは標準装備のギャラリーテンプレートをオーバーライドします。利用にはご注意下さい。詳しくはデベロッパーの記事 をご参照下さい。
おまけ
自動で除外する一つの方法としてget_post_thumbnail_id()でアイキャッチ画像のIDを取得して一旦ギャラリーを無効化し、配列からアイキャッチ画像を除外して再度ギャラリーのショートコードを有効化させる方法があります。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php
function exclude_thumbnail_from_gallery($null, $attr)
{
if (!$thumbnail_ID = get_post_thumbnail_id())
return $null;
remove_filter('post_gallery', 'exclude_thumbnail_from_gallery');
if (!isset($attr['exclude']) || empty($attr['exclude']))
$attr['exclude'] = array($thumbnail_ID);
elseif (is_array($attr['exclude']))
$attr['exclude'][] = $thumbnail_ID;
$gallery = gallery_shortcode($attr);
add_filter('post_gallery', 'exclude_thumbnail_from_gallery', 10, 2);
return $gallery;
}
add_filter('post_gallery', 'exclude_thumbnail_from_gallery', 10, 2);
?>
<?php
function exclude_thumbnail_from_gallery($null, $attr)
{
if (!$thumbnail_ID = get_post_thumbnail_id())
return $null;
remove_filter('post_gallery', 'exclude_thumbnail_from_gallery');
if (!isset($attr['exclude']) || empty($attr['exclude']))
$attr['exclude'] = array($thumbnail_ID);
elseif (is_array($attr['exclude']))
$attr['exclude'][] = $thumbnail_ID;
$gallery = gallery_shortcode($attr);
add_filter('post_gallery', 'exclude_thumbnail_from_gallery', 10, 2);
return $gallery;
}
add_filter('post_gallery', 'exclude_thumbnail_from_gallery', 10, 2);
?>
via:Exclude the_post_thumbnail from gallery shortcode
これはこれで楽なのですが、一旦関数を除去したせいか、先ほどのプラグインが動作しませんでした。
という分けでこのコードは不採用としています。
version 3.0.83 (Wed, 16 Apr 2014 03:56:09 GMT)
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