読者です 読者をやめる 読者になる 読者になる

渡米生活。(日記)

渡米生活。本家から切り離しました。あまり渡米生活に関係のないプログラムネタや音楽ネタなど。

wordpress導入ログ 〜 自サイト内リンクにURLを埋め込まないようにするには

最近たてつづけにwordpressへの移行をやっていて、困ることが一点。
サーバ引っ越しとともにホームページもwpでちょっとリニューアルしよう、とかいうときに、新サーバの方で中身が出来るまで、今使っているドメインを新サーバに向けることができない、という点です。

まあ、最近のCMSはどれも、管理画面からドメインを設定することが出来るので、殆どの場合は、テスト中違うドメインでも困りません。
で、唯一面倒なのが、記事中に埋め込まれてしまった自サイト内リンクで、これは当然クリックすれば、旧ホームページの該当記事に飛んでしまいます。
これが、結構作業しているとうざい。


勿論、リンク先が

http://hogehoge.com/moge/moge.php

とかいうURLだった場合に、


<a href="/moge/moge.php">...</a>
とか書いて、ドメインを外すことはできます。
これなら、http://hogehoge.com/が、完成後http://myhome.com/になっても、リンクは切れません。

しかし、wordpressは、このドメイン以下のディレクトリ構造も自由に定義できるわけです……。
将来、引っ越しのときにこの部分も変えたいと思わないとは限らない。

というわけで、なんとか自サイト内リンクを自動生成する方法はないかな、と思っていたら、そのものズバリの例がありました。
なんでも、ショートコードを使うんだそうで。

WordPressカスタマイズメモ
antispambot()、get_permalink()をショートコードで。

すばらしい! これならURLを記事中に埋め込まなくて済む。
ログインしているときだけ見えるような場所、たとえば

<?php if ( is_user_logged_in() ) { ... } ?> 
とか書いて、{}の中に記事IDを埋め込んでおけば、目的の記事のIDもすぐに分かります。

ただし、実はコレも問題があって、引っ越しの際にwordpressのインポート/エクスポート機能を使ってしまうと、記事IDやらカテゴリーIDが変わってしまうんだそうです…(汗)
どうやら、記事を削除したりすると、その部分のIDが欠番になり、エクスポート/インポート時にそこをつめて新たに番号を振り直してしまうのだとか。
なんでそんな重要なキーが変わってしまう仕様にしているのか分かりませんが(汗)

上のリンクの例題で、IDの代わりにスラッグを使えば、自分でスラッグを書き換えない限り正しいリンクを引っ張ってくれますが、スラッグが全ての記事で重ならないように自分で管理して命名するのはかなり面倒。
(それに、スラッグでカテゴリIDを引っ張るのは関数が既にあるけど、スラッグから記事IDをとってくるのは自分で関数書かないとダメ)

wordpressのインポート/エクスポートではなく、mysqlダンプ機能とリストア機能を使えば、欠番IDは欠番のまま、勝手に番号が振り直されることはないので、問題を回避できます。

ただ、データベースの中身を真面目にみてみると、どうやら自動保存で増え続けるリビジョン記事の一つ一つ、アップロードした写真など、とにかく新しくレコードが出来る度に全部ひっくるめて通し番号をつけているようですね。

写真云々はともかく、自動保存のリビジョン記事にまで通し番号となると、テーブルサイズがあっという間にすごい大きさになって、idで検索するようなアルゴリズムが遅くなるんじゃないかという気も。
しかも、記事を消しても、自動保存のバックアップは消えてない……。
テストサイトで、公開記事はたかだか5つくらいしかないのに、既にIDが100近くまで使われていたのには驚きました。
こんな調子で増え続けたら、IDが枯渇しちゃうよ。

…というわけで、リビジョンをやめる方法へのリンク。

【WordPress】自動保存を止める

具体的には、wp-config.php


/** Sets up WordPress vars and included files. */
require_once(ABSPATH . 'wp-settings.php');
よりも上の部分に、こんなコードを埋めればいいらしい。

/**
* 自動リビジョンを停止する
*/
define('WP_POST_REVISIONS', false);
更に、今あるリビジョンは、phpMyAdminSQLタブを開き、次のように打てば消える。

DELETE FROM wp_posts WHERE post_type="revision";

ちなみに、どちらも、各記事に一つの自動保存レコードは消さないのでご安心を。
(自動保存くらいはONにしとかないと、ブラウザが死んだときに悲しいので)