テンプレートカスタマイズするときに使えそうなソースをつらつら書き散らすよ!(その1・その2)
自作関数ネタが多いです。
- METAタグのgeneratorを消す
- keyで指定したカスタムフィールドの値を取得する
- 指定したカテゴリーの子カテゴリかどうか判定する
- ショートコードで出力されるGalleryをLightboxに対応させる
- Lightweight Google Mapsの地図を任意の場所に挿入する
- おまけ:ダッシュボードとアップデート告知の変更
METAタグのgeneratorを消す
デフォルトだとheadにwordpressが自動でgeneratorを追加しますが
<meta name="generator" content="WordPress 2.7" />
meta name=”generator”はセキュリティ的に入れない方がいいと言われてます。
これ入ってるとバージョンアップサボってるのもモロバレ。(ex:このブログ)
アクティブテーマのfunctions.phpに以下1行追加
remove_action('wp_head', 'wp_generator');
remove_action()関数は必要のない動作を一発で消す事が出来るので覚えとくと便利。
keyで指定したカスタムフィールドの値を取得する
プラグイン使わなくても一応出来るよ。ってことで。
functions.php
function getCustom($key,$id) { $custom = get_post_custom_values($key, $id); if(count($custom)!=1) return implode("<br />",$custom); else return $custom[0]; }
値が複数ある場合は改行でくっつけてから帰します。
テンプレートファイルのループ内
print getCustom("key",get_the_ID());
the_ID()使うならループ内、変数とかに入れておけばループ外でもいける。
直接テンプレートファイル内に関数の部分入れて処理しても良い。
指定したカテゴリーの子カテゴリかどうか判定する
子カテゴリーで、かつ親カテゴリが特定のIDならtrueを帰す。
テンプレートファイル
$currentcat = get_the_category(); if(is_catChild($currentcat,3)) print "Child true"; else print "Child false";
functions.php
function is_catChild($ct,$id){ $f = null; for($i=0;$i < count($ct); $i++){ if($ct[$i]->parent==$id) $f = 1; else $f = 0; } if($f == 1) return true; else return false; }
ショートコードで出力されるGalleryをLightboxに対応させる
ショートコードのギャラリー機能を使うと、attachment_id=20の様なURLになるのでLightboxが機能しない。
これを画像のURLに変更するには次のように修正します。
直接変更
media.php 446行目あたり
foreach ( $attachments as $id => $attachment ) { $link = wp_get_attachment_link($id, $size, true);
wp_get_attachment_link()の第3引数をfalseにすると画像のURLになります。
ver2.7についての補足
ギャラリー挿入時の設定でリンク先を「画像ファイル」またはショートコードにしてもOK。
直接変えるなら663行目付近にある三項演算のwp_get_attachment_link()の第三引数をfalseにする
$link = isset($attr['link']) && 'file' == $attr['link'] ? wp_get_attachment_link($id, $size, false, false) : wp_get_attachment_link($id, $size, false, false);
これで動作しない場合は、lightboxプラグイン内にあるadd_filter()の順位が設定されていないか上過ぎるので
add_filter('the_content', 'wplb_replace',100);
みたいに適当に引数を追加すれば動くと思います。
関数複製
以下はver2.7未検証
wp-includes/media.phpとwp-includes/post-template.php内にある
wp_get_attachment_link()、gallery_shortcode()をfunctions.phpに複製、自作のショートコードに複製した関数を割り当てても同じことが可能です。
functions.phpに上記2つの関数をコピペしたら、名前を変更する。
修正箇所は次の通りです。
gallery_shortcode()は直接変更するのと同じ場所
foreach ( $attachments as $id => $attachment ) { $link = my_wp_get_attachment_link($id, $size, false);
wp_get_attachment_link()はreturnのタグにrel追加
return "<a href='$url' title='$post_title' rel='lytebox[$id]'>$link_text</a>";
add_shortcode()を書いたら終了
add_shortcode( 'mygallery', 'my_gallery_shortcode' );
使うときは[mygallery columns=3]
のようになります。
この方法だとギャラリーのスタイルシートも直接編集・削除が出来る。
Lightweight Google Mapsの地図を任意の場所に挿入する
GoogleMaps表示プラグインLightweight Google Maps…すごい便利なんだけど
そのまま使うとコンテンツの一番最後に自動的に地図が追加されて場所変更できないので、
これを関数で呼び出せるようにカスタマイズしてみる。
lw_googlemaps.phpの330行目付近にあるelseifの下のadd_filter()をコメントアウトする。
} elseif ($this->get_option('lw_each_map_type') != 'LWGM_LINK_TO_MAP' && is_single()||is_page()) { //add_filter('the_content', array($this, 'each_map'),6);
409行目付近にあるメソッドeach_map()と687行目付近のeach_map_script()をクラスの外にコピペして名前を適当に変更する。
複製したeach_map()の引数$contentは削除。
each_map()内に$lwgm=new LWGM_PC();
を追加してget_option()の変数$thisを$lwgmに変更する。
$map_type = $lwgm->get_option('lw_each_map_type'); $page_id = $lwgm->get_option('lw_fixed_map_page_id');
each_map()の中央以下のif文内に2つあるforeach文を変更する。global $post;
も消す。
if ($page_link && $map_type == 'LWGM_LINK_TO_MAP') { foreach ($latlongs as $l) { $content["html"]= '<p class="map_link"><a href="' . "{$page_link}lat={$l['lat']}&lon={$l['lon']}" . '">' . __('View this location on my large map »', 'lw_googlemaps') . "</a></p>\n"; } } elseif ($map_type != 'LWGM_LINK_TO_MAP') { foreach ($latlongs as $i => $l) { $each_maps[$i + 1] = array($l['lat'], $l['lon'], ($page_link ? "{$page_link}lat={$l['lat']}&lon={$l['lon']}" : '')); $seq = $i + 1; $html[]= '<div class="each_map" id="map_' .$seq. '"></div>' . "\n"; } $content["html"] = $html; $content["each_maps"]=$each_maps; }
複製して名前を変えたeach_map_script()は受け渡し用の引数を書いておきます
function my_each_map_script($each_maps) {
冒頭のif文の条件を引数に変更
if (! isset($each_maps) || count($each_maps) < 1) { return; } [/php] each_map_script()に<code>$lwgm=new LWGM_PC();</code>を追加して変数<var>$this</var>を<var>$lwgm</var>に変更する。 [php] $page_id = $lwgm->get_option('lw_fixed_map_page_id'); $map_type = $lwgm->get_option('lw_each_map_type'); $zoom = $lwgm->get_zoom_level('lw_each_map_zoom', LWGM_ZOOM_OF_EACH_MAP);
Javascriptを出力する部分が大分変わります。
foreachが入れ子になってますが、中に入ってる方を削除。
下記$countの行を削除。同時に変数$countも全て消す。
$count = count($points) >= 2 ? "_$c" : '';
setCenter()の変数を変更
map$id$count.setCenter(new GLatLng($points[0], $points[1]), $zoom, $map_type);
その下のif文の変数も変更
if ($points[2]) { echo <<<E__O__T GEvent.addListener(marker$id, 'click', function() {location.href = '$points[2]'; }); E__O__T; } [/php] 出力用の関数を作成 [php] function getLWGM(){ $args=my_each_map(); if(!empty($args["html"])&&is_array($args["html"])){ foreach($args["html"] as $tag){ print $tag; } }else{ print $args["html"]; } if(!empty($args["each_maps"])){ my_each_map_script($args["each_maps"]); } } [/php] テンプレートファイルの挿入したい部分に追加。 [php] <?php if(function_exists(getLWGM)) getLWGM();?>
任意の場所に表示されるはず。
これそのままやるとカテゴリーとかで表示されなくなります。
自動挿入させるなら330行目付近のif文にis_category()とかの条件追加すればいいんじゃないかな。
このやり方をアーカイブページでやる場合はwp_headに入れるjavascriptを追加すればいいです。多分。
ダッシュボードとアップデート告知の変更
ダッシュボードのRSSウィジェットを非表示に。
wp-admin/includes/dashboard.phpの78~84行目、97~103行目をコメントアウトする。
ver2.7は同名のwp_register_sidebar_widget()のみでOK。
wp_register_sidebar_widget( 'dashboard_primary' wp_register_widget_control( 'dashboard_primary' wp_register_sidebar_widget( 'dashboard_secondary' wp_register_widget_control( 'dashboard_secondary'
if ( current_user_can( 'manage_options' ) )
で表示権限追加しても良い。
アップデート告知の非表示または表示条件変更
wp-admin/includes/update.phpの36行目付近のif文。ver2.7は133行目付近
if ( current_user_can('manage_options') ) $msg = sprintf( __('WordPress %2$s is available! <a href="%1$s">Please update now</a>.'), $cur->url, $cur->current ); else $msg = sprintf( __('WordPress %2$s is available! Please notify the site administrator.'), $cur->url, $cur->current );
デフォルトではオプション変更が出来るユーザーには「アップデートしてください」にダウンロードのリンクがつき、
それ以外のユーザーには管理者へ連絡してくださいというメッセージになります。
if文の条件(Capabilities)を変更すると表示対象となるユーザ変更出来ます。
以下はオプション変更権限を持たないユーザーにアップグレード告知を表示させなくする例。
if ( current_user_can('manage_options') ){ $msg = sprintf( __('WordPress %2$s is available! <a href="%1$s">Please update now</a>.'), $cur->url, $cur->current ); echo "<div id='update-nag'>$msg</div>"; }else{ //$msg = sprintf( __('WordPress %2$s is available! Please notify the site administrator.'), $cur->url, $cur->current ); return null; }
参考になりました!
ありがとうございました!