投稿記事のURLを自動で連番にする方法

全般

以前の記事でパーマリンク設定の「数字ベース」が連番ではないということに触れたが、今回はその理由を説明し、そして記事のURLを自動で連番にして採番を行う方法を紹介したい。

スポンサーリンク

なぜ「数字ベース」の数字は飛び飛びなのか

この現象を説明すると、「数字ベース」は「記事のID」を割り振ったものであるからだ。

「記事のID」とは、F12キーを押して開発者ツール(デベロッパーツールとも)を開き、「Elements」の<body>に続く英字をみたらわかるだろう。HTMLの長い羅列の中に、「post-〇〇〇(〇〇〇は数字)」という単語を確認できるはずだ。これが記事のIDである。例えパーマリンク設定を「%postname%(記事名)」にしていても開発者ツールを開いて要素を確認したらやはり投稿記事毎にIDが割り振られているはずである。

そしてこの「記事ID」は投稿記事だけに使われるものではない。固定ページはもちろん、執筆する際に使う「投稿の編集」ページ、下書きやリビジョン、カテゴリーやタグの作成、記事に使うためにメディアにアップロードした画像・動画・音声・PDFなどの様々なファイルetc…そのすべてにIDが割り振られてゆく。

そして、そもそもWordPressにおける「ID」とは「?□□□=○○○」と表される動的URLを静的URLに変えて表しているものなのだ。

つまり、「数字ベース」で表示される「/archives/○○○」は、投稿の編集で使われ、リビジョンや保存した下書きで使われ、サムネ用にアップロードした画像で使われ、記事を更新したときに使われ…(以下略)て、と数多に消費された動的URLの末に、ようやっと記事を投稿する際に「記事ID」を「/archives/123」と表したURLが割り振られるのである。

これが数字ベースが連番ではない理由である。

事前に準備しておくこと

簡単に説明すると、どちらの方法も「%postname%(投稿名)」に設定し、投稿名の部分に数字を順番に割り振っていくことで、投稿記事のURLを連番にする方法になる。

そのため、事前にパーマリンク設定やプラグインの導入が必要になってくる。

また、phpファイルを編集するので必ずファイルのバックアップを取ることも忘れずに

パーマリンク設定

まずは設定からパーマリンク設定を開き、「カスタム構造」を選択する。

そして、下に表示されている利用可能なタグの中から「%postname%」を選択する。もちろん、コピペなどで「/%postname%」と入力してもよい。後ろに付くスラッシュ(トレイリングスラッシュ)はあっても無くてもいいのだが、無いほうが見栄えがいいので私は付けていない(あったほうがいいとは言われている)。

旧エディター設定

そして「変更を保存」ボタンを押す

また、「/%postname%」の前部に、「/archives」や「/posts」などの任意の英単語を入れることで数字だけのURLになることを防ぎ、検索エンジンにインデックスされやすくなると言われているのでやっておくのもいいだろう。

旧エディター設定

ただし、ドメインと連番の間に任意の英単語を挿むとWordPressの仕組み上、のちのち大きな問題が発生してしまう。この問題については後々の記事で詳しく説明したい。

Classic Editorプラグインの導入

私が前に執筆した記事で、現行のGutenberg Editorでは事前にパーマリンクを設定する部分は一度下書きとして保存しなければ現れないと書いた。

そして今回紹介するPHPを編集することでURLを連番にする方法は、「スラッグ」と表記されるパーマリンク編集ボックスが事前に表示される旧エディターでしか作動しない

そのため、Classic Editorプラグインが必要になる

まず最初に上記のプラグインを導入・有効化し、新規投稿を押して投稿を編集画面を開く

そして、投稿を編集ページ右上の「表示ボックス」を開き「スラッグ」にチェックマークを入れる。

旧エディター設定

旧エディター設定

旧エディター設定

このように、スラッグが表示されていればOK

また、執筆をGutenbergで行いたい場合は、下記に記載している連番の設定をしたのち旧エディターを有効化してからスラッグに数字が入力されていることを確認し、なにかタイトルだけ入力してから下書きを保存してタブを落とし、旧エディターを停止させる

このようにすることで、記事のURLが連番になった状態でGutenbergを使って執筆することが出来る。

記事のURLを連番にする方法

それでは、説明を行っていく。

二通りの方法があり、そのうちの片方はあまりお勧めはできないのだが、備考がてらに書き記しておく。

再三になるが、phpファイルをいじるのでバックアップを必ず忘れないように

方法1:meta-boxes.phpを書き換える方式

/wp-admin/includes/meta-boxes.php内を書き換えることで自動で連番化するという方法

ただし、いろいろ欠点があるのでこの方法はあまりお勧めできないのだが、一応紹介しておく

まずはFTPソフトを接続、もしくはサーバーのコントロールパネルにアクセスし、wp-adminからincludesファイルを開き、meta-boxes.phpを探す。

そして、meta-boxes.phpのファイルをFTPソフトなら自分のPCにコピー、コントロールパネルのファイルマネージャーなら自分のPCに ダウンロードして必ずバックアップを控えておく。

それからmeta-boxes.phpを開き、838行目から851行目の間に以下のようなコードが書かれている(post_slug_meta_boxをコピーしてからctrl+Fで呼び出したキーワード検索にペーストで入力して探したほうが素早く見つけることができる)。

/**
 * Display slug form fields.
 *
 * @since 2.6.0
 *
 * @param object $post
 */
function post_slug_meta_box( $post ) {
	/** This filter is documented in wp-admin/edit-tag-form.php */
	$editable_slug = apply_filters( 'editable_slug', $post->post_name, $post );
	?>
<label class="screen-reader-text" for="post_name"><?php _e( 'Slug' ); ?></label><input name="post_name" type="text" size="13" id="post_name" value="<?php echo esc_attr( $editable_slug ); ?>" />
	<?php
}

この部分をこのように書き換える。

/**
 * Display slug form fields.
 *
 * @since 2.6.0
 *
 * @param object $post
 */
function post_slug_meta_box( $post ) {
	/** This filter is documented in wp-admin/edit-tag-form.php */
	$editable_slug = apply_filters( 'editable_slug', $post->post_name, $post );
	?>
<label class="screen-reader-text" for="post_name"><?php _e('Slug') ?></label><input name="post_name" type="text" size="13" id="post_name"
    value="<?php
    if(get_post_status() == 'publish'){
    	echo esc_attr( apply_filters('editable_slug', $post->post_name) );
    	} else {
    	echo count_user_posts(1) + 1; } ?>" />
    <?php
}

上記のコードをコピペして書き換えたら保存してファイルを閉じればよい。

こうすることで、現在の記事数を確認し、新しく執筆する際は「現在の記事数+1」をスラッグ部分に入力する処理がすべて自動で行われる

また、以前の記事を更新する際はURLの変更を行わせないように条件分岐がなされている

この方法における問題点

この方法の仕組みは、 現在の「公開されている記事数」を自動で数えて、そこから新規に記事を書く際に1を足した数字をスラッグに自動で入力している

つまるところこの方法の大きな問題点は、以前投稿した記事を削除・未公開にした場合、URLが以前に投稿した記事のURLと重複した状態となり、例えば「https://example.com/1-2」のようになってしまうのだ。

誰しも以前書いた記事を消したりひっこめたりしないとは限らない。そしてこの方法だと、途中で記事を削除もしくは未公開にするたびに、その次に投稿する際は必ず「○○○-2」のURLを持つ記事が作られてしまう

融通がまったく利かないので、 この方法を使用することは勧めない。ただ、このような方法があるということも知っておくといいだろう。

方法2:functions.phpにコードを追加する方式

これは、functions.phpに「直前の投稿記事のスラッグが数字のみだった場合、新しく記事を投稿する際にスラッグの部分に以前の一番大きな数字から1を足した状態の数字が自動で入力されている」処理を行うコードを追加することで連番になるという方法。

また、直前の記事のURLが数字のみではない英単語を組み合わせたスラッグだった場合、それを無視する処理が行われるため、meta-boxes.phpで紹介したような重複URLが生まれる問題がなく、また固定ページでは自動入力が働かない処理も行ってくれる。

つまり、この方法は先に紹介した「公開されている投稿記事数そのものを数える」meta-boxes.phpを編集する方法とは全く違い、「以前の記事に数字だけのスラッグがある場合、そのなかで一番大きな数字を取得する」方法である。そのためとても融通が利くので、自動連番設定を行う場合にはこちらの方法を強くお勧めする


それでは説明のほうに移りたい。

まずはWordPressの左サイドバーにある「外観」から「テーマエディター」を開く

そして、テーマの編集画面の右に「編集するテーマを選択」という部分で現在使っているテーマの「子テーマ」を選択し、「テーマファイル」から「テーマのための関数(functions.php)」を選択する。親テーマと子テーマの見分け方については、親テーマを編集しようとすると下の方に「注意: これは現在の親テーマ内のファイルです。」というダイアログが出るため判別可能である。

親テーマを選んでいた場合はこのようなダイアログが表示される。

そして、functions.phpに下記のコードをコピペする(参考元サイト)。

// 投稿記事のスラッグの連番化
function mycus_serial_number_slug($slug) {
    global $post;
    // 固定ページは無視
    if (($slug) || ($post->post_type == 'page')) {
        return $slug;
    }
    global $wpdb;
    $slug = $wpdb->get_var("select max(cast(post_name as unsigned)) from {$wpdb->posts} where post_type = 'post' and post_status not in ('object', 'attachment', 'inherit') and post_name regexp '^[0-9]+$'");
    $slug ++;
    return $slug;
}
// フィルターフック
add_filter('editable_slug', 'mycus_serial_number_slug');

これをコピペしたあと「ファイルを更新」を押してファイルが更新されたことを確認しよう。

これで新しく記事を書く際に連番化の処理が行われていることを確認できるはずだ。


以上でURLの連番化の説明を終える。

ちなみに、私は二番目に紹介した方法を使用している。

もし数字ベースの飛び飛びURLが気になる方はぜひこの方法を参考にしてほしい。