同じ投稿スラッグに対する自動採番をとめる方法とその周辺

wordpressでは、同じ投稿スラッグの記事を追加すると、自動的に番号が振られます。例えば、「http://www.example.com/wordpress」という記事がすでにある場合に、「wordpress」という投稿スラッグの記事をさらに追加しようとすると、「http://www.example.com/wordpress-2」というように番号が振られるのです。

これは、パーマリンクの設定が、投稿名だけ、つまりpostnameだけの場合なら意味があると思います。昔書いたタイトルなんていちいち覚えていないことも多いし、たまたま同じタイトルの記事を書いてしまうことがあるかもしれませんからね。しかし、パーマリンクの設定を「日付と投稿名」にしている場合などは、この自動採番機能は不要だと思います。むしろ、同じタイトルの記事を追加したいこともあるんじゃないかと思います。ここでは、この自動採番機能のとめかたとそれにまつわることを、自分用の覚書もかねてまとめておきたいと思います。

自動採番機能の止め方

いきなり、答えを書いておきたいと思います。wordpressのフォルダの中にある、wp-includesフォルダ内のpost.phpファイルのwp_unique_post_slugという関数のはじめの部分を次のように編集します。これでOKです。

function wp_unique_post_slug( $slug, $post_ID, $post_status, $post_type, $post_parent ) {
//  if ( in_array( $post_status, array( 'draft', 'pending', 'auto-draft' ) ) )
    if ( 1 )
        return $slug;

上のコードにたどりつくまで

上のように関数をいじればそれで解決しますが、どうやってそこにたどりついたかを参考までに書いておきます。

まずは、記事の投稿画面でのパーマリンクの部分のhtmlを見てみると、次のようになっています。

<span id="sample-permalink" tabindex="-1">http://www.example.com/<span id="editable-post-name" title="クリックしてパーマリンクのこの部分を編集">(投稿スラッグ)</span>/</span>

おそらく、wordpressのほうで、editable-post-nameというIDの要素の内容を設定しているはずです。そして、その部分を修正すれば、自動採番機能がとめれるのではないか、と予想できます。

そこで、wordpressの全ファイルの中から、「editable-post-name」という単語を検索してみると、phpファイルが一つヒットします。wp-adminフォルダの中にある、includesフォルダ内のpost.phpファイルです。ちなみに、上で修正したファイルと同じ名前ですが、フォルダの場所が違うので要注意です。

さて、次に、このファイルで「editable-post-name」が含まれている部分を探してみます。すると、get_sample_permalink_htmlという名前の関数にだけ含まれていることがわかります。この関数の中をよくよく見てみると、「editable-post-name」の要素の内容に「$post_name」という値が設定されています。さらに、「$post_name」という変数には、次のように値が設定されています。

list($permalink, $post_name) = get_sample_permalink($post->ID, $new_title, $new_slug);

今度は、ここに出てくる「get_sample_permalink」という関数を検索してみます。すると、同じファイル内で定義されていることがわかります。返している値をたどっていくとどうやらこの部分があやしいようです。

$post->post_name = wp_unique_post_slug($post->post_name, $post->ID, $post->post_status, $post->post_type, $post->post_parent);

このwp_unique_post_slugという関数、名前から考えると、投稿スラッグをユニークなものにするために処理するっぽい感じがします。この関数をwordpressの全ファイルから検索してみます。すると、wp-includesフォルダ内のpost.phpファイルがヒットします。関数の中身を見てみると、やはりここの部分で投稿スラッグの自動採番が行われています。$suffix という変数が番号の役目をしてるっぽいです。

このwp_unique_post_slugという関数は、投稿が下書きなどの場合は採番しないという処理が一番はじめに入っています。そこでその部分を、どんな場合でも採番しない、というように変えます。これが上で書いた対処法です。実際、同じ投稿スラッグで記事を書いてみても、「-2」がつかないことが確認できます。

自動採番問題にいつ気付いたのか

この自動採番問題(?) に気付いたのは、wordpressのバージョンアップを行ったときです。もともと、静的なサイトをわざわざwordpressに移行したサイトを持っていました。もともとのサイトでは、「http://www.example.com/category/01.html」というようにhtmlの名前には単に数字を振っていただけでした。この形を保ったまま、wordpressに移行していました。

昔のバージョンでは問題なかったのですが、バージョンアップし、記事を編集しようとすると、保存するたびに「01-2」となってしまうのでした。何度保存しても改善されず、困っていました。そこでいろいろ調べた結果、この自動採番問題の発見にたどりついたのでした。他のカテゴリーにも「01」という名前のページがあったため、採番されていたというわけです。

自動採番問題に対する試行錯誤

この「同じ投稿スラッグの記事が投稿された場合に自動採番される問題」ですが、はじめはもっと簡単に対処できると思っていました。jQueryを使って、記事の投稿画面の投稿スラッグをあらわすeditable-post-nameの要素の内容から、無理やり「-2」をとればいいんじゃね? と思っていました。

しかし、この方法では、管理画面上の表示から「-2」は消えますが、実際には消えていませんでした。この記事が表示されるURLは、「-2」がついている方だったのです。つまり、自動採番は、管理画面上の情報では上書きされず、記事が保存されるたびに内部で計算されているらしいのです。そのため、小手先の変更では無理で、上のようにソースをいじるという解決方法が必要なのでした。

まとめ

パーマリンクの設定が投稿名だけの時は効果のある、自動採番。ただ、どちらかというと投稿名がバッティングして問題になることはあまりないかなぁと思います。もし自動採番するなら、パーマリンクの設定も混みでURLがバッティングしていたら採番するというように変わればいいなぁ、と思います。パーマリンクを設定するたびに採番することになるから、ハードルはかなり高そうですけどね。

前の記事:
引っ越してきました。
次の記事:
html5 のタグ一覧