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; } ?>