Seesaaブログからワードプレスへの引越しでスラッグとリダイレクトの問題を解決

Seesaa Blog (シーサーブログ)からワードプレスサイトへの引越し方法は調べればたくさん出てくるんですが、以下の2点で躊躇していました。

  • パーマリンク (スラッグ)がシーサーブログの記事タイトル
  • 記事のリダイレクトがcanonicalの運用が微妙

これらが解決したのでシェアしたいと思います。ちなみにSeesaaブログは旧システムでのお話です。実際に運用したわけではなく、プログラムの動作を確認したまでです。その点ご了承願います。

パーマリンク (スラッグ)がシーサーブログの記事タイトル

多くの引越し方法でパーマリンク (以降スラッグ)がシーサーブログの記事タイトルになっているのですが、それ以外の対応に関してはこちらのブログ記事で見事に解決されていました。

リダイレクトをスマートに!SeesaaブログからWordPressへ引越し | 電脳系職人

特に「<% article.basename %>」の発見は目から鱗でした。とてもセンスのある方だなと思いました。というのもこれがわかることで記事単位の処理が可能になるからです。例えば「000000000.html」というページを「https://example.com/[post_name]/」へリダイレクトしたい場合は以下のようにすればOK。。。

<% if:article.basename eq '000000000.html' %>
<link rel="canonical" href="https://example.com/[post_name]/">
<meta http-equiv="refresh" content="0;url=https://example.com/[post_name]/">
<% /if %>

と言いたいところですダメでした。”.”が問題なのかと思い「shorten」で削ってみましたがダメでした。というわけで、記事の判別は、タイムスタンプを利用しようかなと思います。

<% article.createstamp %>

「yyyy-mm-dd hh:mm:ss」というタイムスタンプの記事を「https://example.com/[post_name]/」へリダイレクトしたい場合は以下のようにすればOKです。

<% if:article.createstamp eq 'yyyy-mm-dd hh:mm:ss' %>
<link rel="canonical" href="https://example.com/[post_name]/">
<meta http-equiv="refresh" content="0;url=https://example.com/[post_name]/">
<% /if %>

ただ、これは確実ではなくてタイムスタンプを操作していたり、偶然の一致もありえるので気になる場合はlogを操作して調べないといけません。ここまでして記事単位の処理が必要なのかと言われると、そうでもなくてシーサーブログのある特定の記事だけリダイレクトしたい場合や引越し先のワードプレスサイトのパーマリンクを既に指定してしまっている場合です。

記事のリダイレクトがcanonicalの運用が微妙

多くの引越し方法で紹介されているのが以下のリダイレクト方法です。シーサーブログでは現状この方法しかないのでしょうがないのですが、問題は記述箇所です。

<link rel="canonical" href="https://example.com/[post_name]/">
<meta http-equiv="refresh" content="0;url=https://example.com/[post_name]/">

いずれもheadタグ内を推奨しており、canonicalに関してはbodyタグ内だと無視されるようです。そもそもシーサーブログではheadタグの開始直後にcanonicalを自動で挿入されています。追加で記述する場合canonicalが2つ存在することになり、これもNGです。もう一度、リダイレクトについて整理すると、headタグ内に上記の2行を挿入し、canonicalは1つとすることです。

これが実現できたので紹介したいと思います。しかし、条件があって「PC デザイン > コンテンツ」内の「ヘッダー」と「左サイドバー」はHTMLの手打ちとなります。「ヘッダー」はシーサーブログの変数で同じように表示することができるのですが、「左サイドバー」に関しては、ちょっと難しいです。

説明するのはデフォルトの「PC デザイン > HTML」、および「PC デザイン > コンテンツ > 記事 > コンテンツHTML」の場合です。かつ、個別記事をリダイレクトする場合です。

PC デザイン > HTML

headタグから「<% content_main %>」の手前の「<div id=”content”>」までをunless文で囲みます。つまり、個別記事の場合、headタグの内容を「<% content_main %>」内に記述してしまえということです。なぜこんなことをするかというとheadタグ開始直後に自動で挿入されるcanonicalを回避するのと、「<% content_main %>」内でしか使えない「<% article.basename %>」をはじめとする変数を利用するためです。

<% unless:page_name eq 'article' %>
<head>
[...]
<div id="content">
<% /unless %>

<% content_main %>

PC デザイン > コンテンツ > 記事 > コンテンツHTML

「PC デザイン > HTML」のunless文で囲んだ内容を最上部に「<% if:page_name eq ‘article’ %>」つまり「個別記事の場合」として記述します。「PC デザイン > HTML」でしか使えない変数があるため修正が必要になります。デフォルトの場合は、概ね以下のような内容になるのではないかと思います。

<% if:page_name eq 'article' %>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS" />
<title><% article.subject %>: <% blog.title %></title>
<meta name="description" content="<% article.subject | nl2br | tag_strip | remove_emoji  %>,<% blog.description | nl2br | tag_strip | remove_emoji %>" />
<meta name="keywords" content="<% blog.keywords | oneline | tag_strip | __or__ | blog.title | oneline | remove_emoji | tag_strip %><% if:article.topics %>,<% article.topics | oneline | tag_strip %><% /if %>" />
<meta http-equiv="Content-Style-Type" content="text/css" />
<meta http-equiv="Content-Script-Type" content="text/javascript" />
<link rel="stylesheet" href="<% blog.page_url %>styles-index.css" type="text/css" />
<link rel="stylesheet" href="<% site_info.blog_url %>/css/user-common.css" type="text/css" />
<link rel="alternate" href="<% blog.page_url %>index.rdf" type="application/rss+xml" title="RSS" />
<% if:blog.has_foaf -%>
<link rel="meta" type="application/rdf+xml" title="FOAF" href="<% blog.page_url %>foaf.rdf" />
<% /if -%>
</head>
<body>

<div id="container">
<script type="text/javascript" language="JavaScript" src="<% site_info.blog_url %>/contents/js/ad_plugin.js"></script>
<div id="banner">
<% content_header %>
<h1><a href="<% blog.page_url %>" accesskey="1"><% blog.title %></a></h1>
<span class="description"><% content.blog_desc.text | nl2br | __or__ | blog.description | nl2br %></span>
</div>

<div id="links-left">
<div class="sidetitle">サイドバー タイトル</div>
<div class="side">
サイドバー左
</div>
</div>

<div id="content">
<% /if %>

すべての記事をリダイレクトする場合は、headタグ内に、

<link rel="canonical" href="https://example.com/<% article.basename %>">
<meta http-equiv="refresh" content="0;url=https://example.com/<% article.basename %>">

と記述したり、ある個別記事はexample1.comやexample2.comへ、残る個別記事はexampleN.comへといった、

<% if:article.createstamp eq 'yyyy-mm-dd hh:mm:ss' %>
<link rel="canonical" href="https://example1.com/[post_name]/">
<meta http-equiv="refresh" content="0;url=https://example1.com/[post_name]/">
<% /if %>
<% if:article.createstamp eq 'yyyy-mm-dd hh:mm:ss' %>
<link rel="canonical" href="https://example2.com/[post_name]/">
<meta http-equiv="refresh" content="0;url=https://example2.com/[post_name]/">
<% else %>
<link rel="canonical" href="https://exampleN.com/<% article.basename %>">
<meta http-equiv="refresh" content="0;url=https://exampleN.com/<% article.basename %>">
<% /if %>

複雑で柔軟なリダイレクトも可能です。カテゴリーページのリダイレクトは試していないのですが、以下のような感じでできるんじゃないかと思います。

<% if:page_name eq 'category' -%>
[...]
<% if:category.name eq '日記' %>
[リダイレクト処理]
<% /if %>
[...]
<% /if %>