WordPress プラグインの All In One SEO Pack を手直し

All In One SEO Pack プラグインはとてもよくできたプラグインなのだが、月別アーカイブなどの日付ベースのアーカイブを表示したときにページタイトルがおかしくなる。
例えば、「2008年 11月 | ブログ名」のようになってほしいところが「2008 11月 | ブログ名」のようになる。実はこれは internationalize の問題のようだが、簡単に解決できそうにないので、All In One SEO Pack の方に少し手を加えた。

	function replace_title($content, $title) {
		$title = trim(strip_tags($title));
		
		$title_tag_start = "<title>";
		$title_tag_end = "</title>";
		$len_start = strlen($title_tag_start);
		$len_end = strlen($title_tag_end);
		$title = stripcslashes(trim($title));
		$start = strpos($content, $title_tag_start);
		$end = strpos($content, $title_tag_end);
		
		$this->title_start = $start;
		$this->title_end = $end;
		$this->orig_title = $title;
		
		if ($start && $end) {
			$header = substr($content, 0, $start + $len_start) . $title .  substr($content, $end);
		} else {
			// this breaks some sitemap plugins (like wpg2)
			//$header = $content . "<title>$title</title>";
				
			$header = $content;
		}
	
		return $header;
	}

を以下のように変える。

	function replace_title($content, $title) {
		if($title != "") {
			$title = trim(strip_tags($title));
			
			$title_tag_start = "<title>";
			$title_tag_end = "</title>";
			$len_start = strlen($title_tag_start);
			$len_end = strlen($title_tag_end);
			$title = stripcslashes(trim($title));
			$start = strpos($content, $title_tag_start);
			$end = strpos($content, $title_tag_end);
			
			$this->title_start = $start;
			$this->title_end = $end;
			$this->orig_title = $title;
			
			if ($start && $end) {
				$header = substr($content, 0, $start + $len_start) . $title .  substr($content, $end);
			} else {
				// this breaks some sitemap plugins (like wpg2)
				//$header = $content . "<title>$title</title>";
				
				$header = $content;
			}
		} else {
			$header = $content;
		}
		
		return $header;
	}

こうすると、All In One SEO Pack の設定画面でタイトル欄を空欄にした場合には、タイトルの書き換えを行わないようになるので、All In One SEO プラグインの設定で「Archive Title Format:」の欄を空欄にしてやる。

あとは、日付ベースのアーカイブテンプレート内で、正しいタイトルを生成してやればいい。僕の場合はこんな風に書いてある。

<title><?php if ( is_single() ) { wp_title(); } elseif (is_category()) { single_cat_title(); } elseif (is_tag()) { single_tag_title(); } elseif (is_day()) { the_time('Y-m-d'); } elseif (is_month()) { the_time('Y 年 F'); } elseif (is_year()) { the_time('Y 年'); ?> | <?php bloginfo('name'); ?></title>

All In One SEO Pack WordPress Plugin | Semper Fi Web Design


追記(2008.12.03)>

この方法だと、2ページ目以降のページタイトルが「- Part 2」のようになってしまうことを発見。
All In One SEO Pack の paged_title() の部分のコードを以下のように書き換えてやる必要がある。

<?php
	function paged_title($title) {
		if($title != "") {// ADDED BY minorio
			// the page number if paged
			global $paged;
			
			// simple tagging support
			global $STagging;
	
			if (is_paged() || (isset($STagging) && $STagging->is_tag_view() && $paged)) {
				$part = $this->internationalize(get_option('aiosp_paged_format'));
				if (isset($part) || !empty($part)) {
					$part = " " . trim($part);
					$part = str_replace('%page%', $paged, $part);
					$this->log("paged_title() [$title] [$part]");
					$title .= $part;
				}
			}
		}// ADDED BY minorio
		return $title;
	}
?>