WordPress Tips: functions.phpに記載すると幸せになれそうなコード

近年、非常に人気が高いCMS「WordPress」。中規模のサイトでCMSを導入したいというクライアントにはWordPressを提案し構築するパターンが非常に多くなっています。

独自デザインのサイトを作成する場合には、必ずと言ってもいいほど独自にテーマを開発、またはカスタマイズを行う必要があるかと思いますが、その過程でWordPressが書き出すコードを補正し、意図通りに表示するよう、functions.phpにソースコードを書き足すシーンが多々あります。

今回はWordPressで用意されている関数を組み合わせた、比較的汎用性が高く、コピペで簡単に利用できるようなソースコードをご紹介。大部分は地味ですが、記載しておくとちょっぴり幸せになれるかも?

WordPress Tips: functions.phpに記載すると幸せになれそうなコード

フィード・リンクタグの削除

投稿記事のフィード配信を行いたくない場合に、以下の関数をfunctions.phpに記述すると、<head>内のRSSフィード・リンクタグを消去することができます。(厳密にはテーマファイルの規定箇所に記載すれば動作しますが、functions.phpに記載するのが一般的です。以降はfunctions.phpに書き足すことを前提として話を進めます。)

remove_action('wp_head', 'feed_links_extra', 3);

ブログとして運用する場合には、RSSフィードは必須かと思いますが、ほぼ固定ページだけで構築されたサイト、更新系のコンテンツがない、または必要が無いサイトでは上記コードを記載してRSSフィードを一掃してしまうのも手かと思います。

ジェネレータ・タグの削除

WordPressはデフォルトで<head>内に以下のタグを書き出します。

<meta name="generator" content="WordPress 3.5" />

「このサイトはWordPress 3.5で構築しています!」と宣言するメタタグで、クライアントからみてはあまり気持ちの良いタグではなく、商用サイトでは極力このような内部事情がわかってしまうようなタグは排除するべきかと思います。(「CMSの名称、バージョンを記載しても、リスクさえ潰してしまえば問題ない」という発想の開発者も多いですが・・・)

個人的には必要が無いコードは極力記載するべきでないという考えですので、以下のコードで非表示にしています。

remove_action('wp_head', 'wp_generator');

ブログ投稿ツール用リンクタグの削除

ジェネレータ・タグと同様に不要と考えるのが、ブログ投稿ツール向けのリンクタグです。

remove_action('wp_head', 'wlwmanifest_link');
remove_action('wp_head', 'rsd_link');

「Windows Live Writer」や「MarsEdit」などのアプリケーションや、外部サイト経由のブログ更新ツールなどの利用を想定していない場合、上記コードを記載すれば<head>内に余計なリンク・タグを書き出さないようにすることができます。

bodyのclassを拡張

標準テーマの「Twenty Eleven」などでは、ページの属性に応じてbodyのclassを自動で書き出す機能があります。これはこれで便利なのですが、活用していけばするほど少し物足りなく感じるかもしれません。

普段は以下のように関数を記述し、投稿記事が属するカテゴリーと、固定ページを階層化した場合に、「このページが、どのページを先祖にもつのか」「階層最上位のページなのか」のclassを追加しています。

function advance_body_classes( $classes, $class ) {
	if(is_single()){
		$categories = get_the_terms( $post->ID, 'category' );
	    foreach ($categories as $category) {
	        if (!(empty($category->slug))) {
	             $classes[] = "category-" . $category->slug;
	        }
	    }
	}

	$post_type = get_query_var( 'post_type' );
	if ( is_page() ) {
		$post_type = 'page';
	}

	if ( $post_type && is_post_type_hierarchical( $post_type ) ) {
		global $post;
		if ( $post->ancestors ) {
			$root = $post->ancestors[count($post->ancestors) - 1];
			$root_post = get_post( $root );
			$classes[] = esc_attr( $post_type . '-son-' . $root_post->post_name );
		} else {
			$classes[] = esc_attr( $post_type . '-root-' . $post->post_name );
		}
	}

	return $classes;
}
add_filter( 'body_class', 'advance_body_classes' );

ある投稿記事が「新着情報(スラッグ: news)」カテゴリーに属している場合「category-news」と表示されます。(複数のカテゴリーが指定されていた場合にも対応)

固定ページに関しては少しわかりにくいので、例えば以下のような固定ページの階層が設置されているとしましょう。

  • Aページ(スラッグ: me)
    • A子供ページ
      • A孫ページ

Aページのbody classには「post-root-me」、A子供ページは「post-son-me」、A孫ページは「post-son-me」が追加されます。

このようにclass付けした場合、Aページより下層のページのデザインを統一させたいシーンなどで、cssによるマークアップが容易になるメリットがあります。独自にpageテンプレートを作成し工夫しても同様のことが可能ですが、こちらのスマートではないでしょうか。

検索結果から特定のページを除外する

保守性を考えながらテーマをガツガツ編集していると、パーツを固定ページとして作成し、それをテーマファイルからインクルードさせるなどの、荒技を用いる場合があるかと思います。

それらが検索結果に表示されてしまうと、非常に恥ずかしいことになってしまうので、除外設定を行いましょう。

function custom_search_filter($query) {
	if ( !$query -> is_admin && $query -> is_search) {
		$query -> set('post__not_in', array(1, 10) );
	}
	return $query;
}
add_filter( 'pre_get_posts', 'custom_search_filter' );

3行目の「array(1, 10)」の数字は除外するページのIDを複数の場合はカンマ区切りで入力します。上記の場合はページID: 1と10が除外されます。

category_descriptionのPタグを除去する

テンプレート・タグの「category_description()」を用いて概要文章を掲載する場合に、Pタグ自動挿入されてしまうのを防ぎます。

remove_filter('term_description','wpautop');

自分はよく title属性にカテゴリーの説明文として「categorydescription()」を用いているため、お約束といっていいほど記述しています。

ユーザーエージェントを簡単に呼び出せるように

これはあまり利用シーンがないかもしれませんが、ユーザーエージェントで分岐させる必要がある場合に、変数に格納しておき簡単に呼び出せるよう事前準備をしておきます。

$ua = getenv( "HTTP_USER_AGENT" );

単体では意味をなさないので、他のコードとの合わせ技で真価を発揮。

ただしキャッシュ・プラグインでうまく動作しないなどの副作用があるので利用にはご注意を!

表示しているページのURLを簡単に呼び出せるように

こちらも合わせ技のためのコード。現在表示しているページのURLを変数に格納しておきます。特定のページだけごにょごにょしたい場合に有用です。

$page_url = 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'];

読み込んだスクリプトのバージョン表記を無効に

wp_enqueue_script()などで読み込んだスクリプトのバージョン表記を取り払います。あえてバージョン表記する必要が無い場合は、消しておくのが無難でしょう。

function remove_ver( $src ) {
	if( strpos( $src, '?ver=' ) )
		$src = remove_query_arg( 'ver', $src );
	return $src;
}
add_filter( 'script_loader_src', 'remove_ver', 10, 2 );

一点留意してほしいところは、引数付きのスクリプトを読み込む場合にうまく動作しなくなる場合がある点。CDNのスクリプトなどでよく目にします。少し改良の余地があるかもしれません。


以上、定番から少しだけひねりが入ったソースコードを紹介しました。これらを組み合わせれば、よりWordPressを柔軟にカスタマイズすることができるので、是非工夫してみてください。

related story