パーマリンクは、サイト内のコンテンツの、特定部分にアクセスする際に使用されるリンクです。

例えば、Kinstaのホームページへのリンクは「https://kinsta.com/」、ブログへのリンクは「https://kinsta.com/blog/」、ブログの中の記事へのリンクは「https://kinsta.com/blog/wordpress-widgets/」を使用します。

パーマリンクは、アーカイブページや静的ページ、独自のURLを必要とするサイト内のコンテンツに使用されます。

この記事では、パーマリンクの仕組み、サイト向けに最適化する方法、設定画面やコードからパーマリンクを設定する方法を紹介します。

WordPressパーマリンクとは?

WordPressパーマリンクは、WordPress公式ドキュメントで次のように定義されています。

「個々のブログ投稿、または、カテゴリーリストや他のブログ投稿リストへの永続的なリンク」

サイト内の各ページ(投稿、固定ページ、アーカイブページ、404ページなど)には、それぞれ固有のパーマリンクがあります。

例えばホームページのアドレスが「yoursite.com」であれば、ブログは「yoursite.com/blog」になります。

また、ブログに「featured」(特集)カテゴリーがあれば、URLは以下のいずれかになります。

  • yoursite.com/category/featured
  • yoursite.com/blog/featured
  • yoursite.com/featured.

個々の投稿にも独自のパーマリンクがあります。テーマのテンプレートファイルは、テンプレートタグthe_permalink()を使って記事のURLを取得し、クリック可能なリンクを作成します。

WordPressはこれを利用して、個々の記事に固有のパーマリンクを取得し、<a>要素内に出力して、ブログの記事一覧リンクを作成します。

このテンプレートタグの美しいのは、わずかなコードを使用するだけで、サイト上の任意の記事へのリンクを取得できる点です。テーマ内にリンクをハードコードする必要はありません。

パーマリンク、スラッグ、リンクの違い

この記事では、主にパーマリンクについて解説しますが、スラッグについても説明します。では、両者の違いは何でしょうか?

パーマリンクは、投稿へのリンク全体を指します。先に挙げたウィジェットに関するKinstaの投稿へのリンクでは「https://kinsta.com/blog/wordpress-widgets/」です。

一方、スラッグは、パーマリンクの最後の部分を指し、投稿に固有です。上の例でスラッグは「wordpress-widgets」です。

スラッグは投稿のタイトルに基づいて自動的に生成されます。また、手動で投稿のスラッグを作成することもできます。手動で作成する方法(と、手動でつけたくなる理由)については、この記事の後半で説明します。

WordPressパーマリンクの作成方法

静的なウェブサイト内でのURLは、リソースの名前とディレクトリパスによってリソースを識別します。

https://example.com/path/to/resource/wordpress-permalinks.html

適切に構造化されたURLが必要であれば、適切に構造化されたファイルシステムと適切に名前付けされたリソースがあれば十分です。

しかし、動的なウェブサイトでは、データベース中心のCMSを使用して管理されます。URLにはいくつかのパラメータが含まれ、パラメータの値がデータベースに対して実行されるクエリを決定します。

次の例を見てください。

https://example.com/?key1=val1&key2=val2

セパレーターである「?」と、クエリ文字列を構成する「&」で区切られたキーと値のペアがあります。ただしこのURL形式では、ユーザビリティとアクセシビリティの要件を満たさないため、より意味のある、SEOに優しいパーマリンクに変換する必要があります。

「汚い(Ugly)」URLを最適化されたパーマリンクに変換する方法はウェブサーバーに依存します。Apacheユーザーであれば、ルートフォルダの.htaccessファイルに「rewrite」ディレクティブのセットを追加する必要があります。Nginxユーザーであれば、メインの構成ファイルに「try_file」ディレクティブを追加します。

しかし、安心してください。ほとんどの場合、ウェブサーバを1行1行構成する必要はありません。代わりに、WordPressが実行します。

管理者ユーザーは管理画面から、素早く簡単にカスタムリライトルールを設定できます。さらに、上級者や開発者は、WordPress Rewrite APIの機能やフックを使用して、高度なレベルでパーマリンクをカスタマイズできます。

WordPressクエリの概要

WordPressでは、WordPressデータベースに対してクエリを構築、実行、結果を保存する特定の目的で、WP_Queryクラスが提供されています。このクラスのおかげでクエリに注意を払う必要はありません。WP_Queryが自動的にリクエストを処理し、クエリを構築し、実行してくれるからです。WordPressはテンプレート階層に応じて、リクエストされたリソースを返します。

デフォルトでWordPressは、単一の投稿、ページ、投稿タイプに加え、カテゴリ、タグ、日付、投稿者などの順に並べられた多数のアーカイブへのリクエストも受け付けます。

さらに、デフォルトの機能だけでは十分でない場合、開発者は新たにWP_Queryクラスのインスタンス(クエリオブジェクト)を作成し、または、クエリを実行する前に既存インスタンスに特定のパラメータを渡して、カスタムクエリを作成できます。

クエリパラメータは「クエリ変数」と呼ばれ、3つのグループに分けられます。

パブリッククエリ変数

パブリッククエリ変数は、パブリックなリクエスト(つまり、URL)で使用できることを意味します。この変数を使用してある投稿者の投稿だけをクエリできます。

?author=12?
author_name=mickey

カテゴリー別、タグ別のクエリ

?cat=4,5,6
?category_name=CMS
?tag=wordpress

日時別のクエリ

?monthnum=201601
?year=2015?w=13
?day=31

投稿別、ページ別のクエリ

?p=123
?name=hello-world
?page_id=234

他にも多くの使い方があります。

プライベートクエリ変数

プライベートクエリ変数は、URLクエリ文字列に追加されることを目的としていません。スクリプト(プラグインやテーマのfunctions.phpファイル)の中だけで使われてクエリに影響を与えます。

以下のクエリ文字列は、期待した結果を返しません。

?meta_key=city&meta_value=London

meta_keymeta_valueは、クエリ文字列で定義できない、プライベートクエリ変数です。後で見るように、これらはクエリオブジェクトのインスタンスに渡す必要があります。

Codexのパブリッククエリ変数とプライベートクエリ変数の完全なリストを参照してください。

カスタムクエリ変数

カスタムクエリ変数はユーザー定義変数であり、パブリッククエリ変数と同様にURLクエリ文字列に渡すことができます。パブリッククエリ変数とカスタムクエリ変数の主な違いは、WordPressはカスタムクエリ変数を処理しないため、クエリをカスタマイズするにはプラグインから値を取得する必要がある点です。

では、パーマリンクに戻りましょう。

汚いパーマリンクとクエリ変数

「汚いパーマリンク」では、クエリ文字列がそのまま表示されます。つまり、URLの一部に、返されるリソースを決定するクエリ変数(クエリ文字列)のセットが含まれます。

パーマリンク設定画面の基本設定
パーマリンク設定画面の基本設定

例として、以下のURLを考えてみます。

https://example.com/?cat=5
https://example.com/?cat=5,7,9

このURLのレスポンスとして、WordPressは指定したカテゴリーに属する投稿のアーカイブを返します。

URLごとに1つのパラメータに限定されるわけではありません。次の例では、より複雑なクエリを構築しています。

?author_name=lucy&category_name=WebDev?tag=wordpress&m=201606

最初のクエリ文字列のauthor_nameとcategory_nameは、WebDevカテゴリの指定した投稿者によるすべての投稿を要求します。2番目のクエリ文字列のtagとmは、「wordpress」とタグ付けされ、2016年6月に公開されたすべての投稿を要求します。

このように、複数のクエリ変数を設定し、クエリ文字列に適切な「key=value」のペアを追加することで、WordPressでは高度なクエリを実行することができます。

美しいパーマリンク:より良い代替

「美しいパーマリンク(Pretty Permalinks)」を有効にすることで、使い勝手の良い、アクセスしやすい、SEOに配慮したURL構造を設定できます。以下のURLを比較してみます。

https://example.com/?p=123
https://example.com/wordpress-permalinks/

この例では、汚いパーマリンクはp変数とその値(投稿ID)から構成され、美しいURLは投稿のスラッグで構成されます。

WordPressのパーマリンク設定画面では、下図のように、4つの美しいパーマリンク形式から選択できます。

見た目の整ったパーマリンク
見た目の整ったパーマリンク

しかし、デフォルトの形式に制限される必要はありません。WordPressでは、1つ以上の構造タグを設定することで、美しいパーマリンク形式をカスタマイズすることができます。

カスタム構造オプション
カスタム構造オプション

この記事の後半で、詳しくご紹介します。

なぜ美しいパーマリンクが重要なのか?

WordPressサイトで美しいパーマリンクを使うことには2つのメリットがあります。SEOとユーザーエクスペリエンスです。

検索エンジンは、投稿が何について書かれているかを知る指標としてURLを使用します。パーマリンクの内容が投稿の内容と関連していれば、検索エンジンは、何についての投稿か、そして、正しく主張しているとおりのものかを判断することができます。

ユーザーエクスペリエンスの面でもユーザーがURLを簡単に覚えて使用できる、美しいパーマリンクの方が優れています。連絡先ページのURLが「yoursite.com/?p=456」だったら誰も覚えようとはしないでしょう。「yoursite.com/contact」にすべきです。

パーマリンク、スラッグ、SEO

投稿スラッグは、投稿のURLの一番最後の部分です。WordPressのパーマリンク設定で投稿名を使うように設定している場合、投稿「How to create pretty permalinks」のスラッグは、自動的に「yoursite.com/how-to-creat-pretty-permalinks/」と生成されます。

これは一応、正しいスラッグです。ユーザー向けには、投稿がどのようなものであるかを伝え、検索エンジン向けには、ターゲットとするキーワード「pretty permalinks」が含まれています。

しかし、ここからさらに改善できます。

スラッグは、ターゲットとするキーワードを含むのに十分な長さが必要ですが、ユーザーの記憶に残りやすく、検索エンジンを不要な単語で混乱させない程度には十分短くなければなりません(「WordPressでSEOフレンドリーなパーマリンクを作成する方法」を参照してください)。

したがって、投稿「how to create pretty permalinks」のスラッグは省略して「pretty-permalinks」、URLは「yoursite.com/pretty-permalinks/」が良いでしょう。また、美しいパーマリンク関連の記事が複数あり、ハウツー記事に特定のスラッグを指定する場合には、例えば「create-pretty-permalinks」、URLは「yoursite.com/create-pretty-permalinks」を使用できます。

また、さらに一歩進んでSEOを向上させたければ、「WordPress」を含めるのも手です。例えば「example.com/create-wordpress-pretty-permalinks」です。

検索結果にリンクが表示された際、ユーザーが読めないほど長いものにならないよう注意してください。以下は、「wordpress permalinks」の検索語でKinstaブログを検索した時の、2件の結果です。

Googleの「WordPress permalinks」による検索結果
Googleの「WordPress permalinks」による検索結果

両方のスラッグとも最適化されています。最初の記事のスラッグは「wordpress-premalinks-url-rewriting」で、キーワードをターゲットにしていることを示しています。2つ目の記事のスラッグは「wordpress-slug」で、さらに焦点を絞っています。

これらのスラッグ内に無駄な単語はありません。検索エンジンに投稿が何であるかを伝える一方、余計なことは伝えていません。

スラッグをSEOに最適化するには、まずパーマリンク設定画面で「投稿名」を選択し、次に執筆の際に各記事ごとに手動でスラッグを編集してください。

パーマリンク、スラッグ、ユーザーエクスペリエンス

美しいパーマリンクや短くて覚えやすいスラッグを使うことには、ユーザーエクスペリエンス的にもメリットがあります。

Jacob Nielsen氏による1999年の投稿によると、有用なウェブサイトには以下が必要です。

  • 覚えやすく、綴りも簡単なドメイン名
  • 短いURL
  • 入力しやすいURL
  • サイト構造を可視化するURL
  • URLの末尾を削除することで一層上の情報アーキテクチャに移動可能なURL
  • 変化しない永続的なURL

URLは、さまざまな手段で保存したり共有されるため、決して変更するべきではありません。これがパーマリンクと呼ばれる理由です。さらに、URLは、専門家でないユーザーにとっても即座に、直感的にわかるという意味で、セマンティックであるべきです。

そのため、投稿を公開した後にパーマリンクを変更できますが、良い考えではありません。なぜなら、元のパーマリンクはすでに共有されているかもしれないからです。もし変更する必要がある場合は、WordPressリダイレクトのベストプラクティスに従ってください。

WordPressでパーマリンク設定を変更する方法

WordPressでは、いくつかの方法でパーマリンクを変更できます。

  • パーマリンク設定画面で、美しいパーマリンク構造を設定できます。サイトを構築したらすぐに実行してください。
  • パーマリンク画面では、タグやカテゴリーのパーマリンク構造を編集できます。
  • 記事を作成、執筆する際に、記事ごとに個別にスラッグを編集できます。
  • カスタム投稿タイプを登録する際に、リンク構造を指定できます。デフォルトを使用するか、上書きするかを選択できます。
  • パーマリンクの構造を変更するプラグインを書くことができます。
  • リダイレクトを使用して、古いパーマリンクから新しいパーマリンクを指すことができます。

それぞれを見ていきましょう。

サイト全体でパーマリンクの設定を編集する

パーマリンクを設定する際にはまず、パーマリンク設定画面を開いてください。「設定」>「パーマリンク設定」からアクセスします。

パーマリンク設定画面
パーマリンク設定画面

共通設定

 

最初のセクションでは、単一投稿の設定を行います。オプションは以下のとおりです。

  • 基本:リンクに投稿IDを使用します。ブラウザには意味がありますが、人間や検索エンジンにはあまり意味がありません。例:com/?p=123
  • 日付と投稿名:投稿が公開された日付と名前(正確にはスラッグ)から成ります。例:com/2020/06/01/my-post/
  • 月と投稿名:「日付と投稿名」の短縮版で、年月だけで日がありません。例:com/2020/06/my-post/
  • 数字ベース:「基本」と同様に投稿IDを使用しますがユーザーフレンドリーではありません。例:com/123
  • 投稿名:日付や投稿IDを含まず、スラッグのみを使用します。例:com/my-post/
  • カスタム構造:独自のカスタム構造を作成します。タグを使用して投稿データに基づいた情報を取得し、文字列を使用して投稿によって変化しないテキストを追加します。

タグは、%文字で囲まれた特定のキーワードです。WordPressでは以下のようなタグが用意されています。

  • %year%:投稿が公開された年(4桁)
  • %monthnum%:投稿が公開された月(2桁)
  • %day%:投稿が公開された日(2桁)
  • %hour%:投稿が公開された時(2桁)
  • %minute%:投稿が公開された分(2桁)
  • %second%:投稿が公開された秒(2桁)
  • %post_id%:投稿の一意のID(整数)
  • %postname%:投稿のスラッグ(サニタイズされた、投稿のタイトルを表す文字列)
  • %category%:カテゴリのスラッグ
  • %author%:投稿者のスラッグ

「カスタム構造」のラジオボタンを選択して、次のいずれかの文字列をテキストフィールドに追加してみてください。

  • /%author%/%postname%/
  • /%year%/%postname%/
  • /%category%/%postname%/

これらの文字列は、以下に示すように、特定の意味のある、美しいパーマリンクを生成します。

example.com/rachelmccollin/wordpress-permalinks/
example.com/2020/wordpress-permalinks/
example.com/CMS/wordpress-permalinks/

最初の例で結果のURLは、投稿の投稿者をハイライトしています。他の2つの例では、それぞれ投稿の公開年と投稿カテゴリーが含まれています。サイトの目的にあったフォーマットを選択してください。

必要なオプションを選択したら、「オプション」セクションに移動するか、「変更を保存」をクリックして設定を保存します。

オプションのパーマリンク設定

パーマリンク設定画面では単一投稿に対する設定と同様に、カテゴリやタグアーカイブのカスタム構造を設定できます。

ここで設定しない場合、デフォルトではパーマリンクの最後に「/category/category-slug/」を含みます。たとえばカテゴリー「feature」がある場合、そのアーカイブページは「yoursite.com/category/featured」になります。

オプションのパーマリンク設定
オプションのパーマリンク設定

これはパーマリンク設定画面のオプションセクションで変更できます。例えば、カテゴリアーカイブのパーマリンクとして「yoursite.com/blog/featured/」を使用したければ、「カテゴリーベース」フィールドに「blog」と入力してください。バックスラッシュを挿入したり、タグを使用したりする必要はありません。

記事やページごとにパーマリンクやスラッグを変更する方法

WordPressサイトで美しいパーマリンク構造を設定したら、次に個々の記事やページのスラッグを最適化できます。

最適化を行うベストなタイミングは、コンテンツの作成中です。コンテンツの公開後に投稿のスラッグを変更すると投稿のURLが変更され、すでに共有したリンクが無効になるためです。

投稿のスラッグを編集するには、その投稿の投稿編集画面で作業します。「投稿」に移動し、編集する投稿を選択します(投稿を作成中の場合は、すでにその画面にいます)。

投稿編集画面で、右側の「ドキュメント」ペインを選択し、「パーマリンク」項目に移動します。開いていなければ、右の矢印をクリックします。

投稿編集画面でのパーマリンクの編集
投稿編集画面でのパーマリンクの編集

自動的に生成されたスラッグが、「URLスラッグ」フィールドに表示されます。編集して、スラッグを短くし、フォーカスを絞ることができます。

編集する前に、古いスラッグをコピーしておき、後でリダイレクトを設定する必要がある場合に備えましょう(公開済みの投稿の場合のみ)。

スラッグの編集
スラッグの編集

「公開」または「更新」ボタンをクリックして変更を保存します。

注意:既存の投稿のスラッグを編集すると、元のリンクを共有したユーザーに問題が発生します。この場合はリダイレクトを使用してください。

アーカイブページのパーマリンク設定を変更する方法

個々のアーカイブページのパーマリンク設定を変更するには、パーマリンク設定画面で「カテゴリーベース」や「タグベース」の設定を編集します。また、個別にカテゴリー、タグ、カスタムタクソノミーのスラッグを変更することもできます。

まず個別の設定方法を説明してから、カスタムタクソノミーや投稿タイプを登録する際のパーマリンクの編集に移ります。

カテゴリーとタグのスラッグの変更

変更するには、「投稿」>「カテゴリー」、または「投稿」>「タグ」に移動します。

カテゴリー編集画面
カテゴリー編集画面

スラッグを編集するカテゴリーやタグを検索し、名前をクリックします。

カテゴリースラッグの編集
カテゴリースラッグの編集

カテゴリーやタグのスラッグを入力します。WordPressはカテゴリーやタグの名前から自動的にスラッグを生成しますが、これに縛られる必要はありません。スラッグの指定は投稿と同じように、カテゴリーやタグの作成中に行ってください。後で実行する場合にはリダイレクトを設定する必要があります。

カスタムタクソノミーを設定した場合、あるいはプラグインによってカスタムタクソノミーが作成された場合、タクソノミー内の個々のタームのスラッグは、上と同じように編集できます。しかし、タクソノミー自身のスラッグを編集するには、コードを編集する必要があります。

カスタムタクソノミーのスラッグの変更

カスタムタクソノミーを登録すると、タクソノミーのアーカイブページは自動的にURL「yoursite.com/taxonomy/term」を持ちます。ここで「taxonomy」はタクソノミーID、「term」はタームのスラッグです。

例えば、言語のためのカスタムタクソノミーをID「kinsta_language」で登録するとします。他のプラグインで登録されるタクソノミーと区別するため、接頭辞が使用されています。ここで、スラッグ「french」のタームを作成するとします。

このタクソノミータームのアーカイブのURLは「yoursite.com/kinsta_language/french」になります。

しかし、接頭辞を含まず、もっとユーザーフレンドリーにできないでしょうか?それにはタクソノミーを登録する際、rewrite引数を使って変更します。

以下は、rewrite引数を含む、タクソノミーを登録するコードです。

function kinsta_register_taxonomy() {                

 // languages
 $labels = array(
  'name'=> __( 'Languages' ),
  'singular_name' => __( 'Language' ),
  'search_items' => __( 'Search Languages' ),
  'all_items' => __( 'All Languages' ),
  'edit_item' => __( 'Edit Languages' ),
  'update_item' => __( 'Update Languages' ),
  'add_new_item' => __( 'Add New Language' ),
  'new_item_name' => __( 'New Language Name' ),
  'menu_name' => __( 'Languages' ),
 );

 $args = array(
  'labels' => $labels,
  'hierarchical' => true,
  'sort' => true,
  'args' => array( 'orderby' => 'term_order' ),
  'rewrite' => array( 'slug' => 'language' ),
  'show_admin_column' => true,
  'show_in_rest' => true
 );

 register_taxonomy( 'kinsta_language', array( 'post', 'attachment' ), $args);   

}

add_action( 'init', 'kinsta_register_taxonomy' );

このコードの中で重要な行が以下です。

'rewrite' => array( 'slug' => 'language' ),

この行により、スラッグは「kinsta_language」(ID)から「language」(新しい値)に書き換えられます。結果、新しいURLは「yoursite.com/language/french」となり、よりユーザーフレンドリーになります。

カスタム投稿タイプのスラッグを変更する方法

カスタム投稿タイプイプもカスタムタクソノミーと同じように動作します。登録すると、カスタム投稿タイプのIDを含むURLを持ちます。

ここで例えば、カスタム投稿タイプ「kinsta_book」を登録して、その投稿タイプの投稿「Huckleberry Finn」を作成します。スラッグは「huckleberry-finn」とします。

このとき、URLは「yoursite.com/kinsta_book/huckleberry-finn」、投稿タイプのアーカイブのスラッグは「yoursite.com/kinsta_book」になります。

繰り返しになりますが、カスタム投稿タイプを登録する際にrewrite引数を使うことで変更できます。以下は、rewrite引数を含むコードです。

function kinsta_register_post_type() {

 // books
 $labels = array(
  'name' => __( 'Books' ),
  'singular_name' => __( 'Book' ),
  'add_new' => __( 'New Book' ),
  'add_new_item' => __( 'Add New Book' ),
  'edit_item' => __( 'Edit Book' ),
  'new_item' => __( 'New Book' ),
  'view_item' => __( 'View Book' ),
  'search_items' => __( 'Search Books' ),
  'not_found' =>  __( 'No Books Found' ),
  'not_found_in_trash' => __( 'No Books found in Trash' ),
 );

 $args = array(
  'labels' => $labels,
  'has_archive' => true,
  'public' => true,
  'hierarchical' => false,
  'supports' => array(
   'title',
   'editor',
   'excerpt',
   'custom-fields',
   'thumbnail',
   'page-attributes'
  ),
  'taxonomies' => array( 'kinsta_language', 'category'),
  'rewrite'   => array( 'slug' => 'book' )
 );
 
 register_post_type( 'kinsta_book', $args );

}

add_action( 'init', 'kinsta_register_post_type' );

スラッグに対して重要な行は以下です。

'rewrite'   => array( 'slug' => 'book' )

これで、書籍のURLは「yoursite.com/book/huckleberry-finn」、アーカイブは「yoursite.com/book」になります。

カスタムフィールドを使ったパーマリンクの編集

WordPressでは、パブリッククエリ変数やプライベートクエリ変数に加えて、開発者や上級者向けに独自のカスタムクエリ変数を定義できます。カスタムクエリ変数は一度登録すると、パブリッククエリ変数と同様にクエリ文字列に追加でき、その値を使ってクエリに影響を与えられます。

ここでは、カスタムクエリ変数を利用してカスタムメタクエリ(カスタムフィールドで投稿を取得するクエリ)を作成する方法を紹介します。

このゴールを達成するため、カスタム変数を登録し、値を取得し、値に応じてクエリを変更するプラグインを開発します。

以下はサンプルコードです。

wp-content/pluginsディレクトリにプラグインを作成します。クエリ変数を登録する関数を追加してください。

/**
 * Register custom query vars
 *
 * @param array $vars The array of available query variables
 */

function myplugin_register_query_vars( $vars ) {

 $vars[] = 'city';
 return $vars;

}

add_filter( 'query_vars', 'myplugin_register_query_vars' );

query_varsフィルタを使用すると、クエリ実行前にパブリッククエリの変数を追加、削除、変更できます。このサンプルのコールバック関数では、引数に利用可能な変数の配列を格納し、新しい変数を追加して同じ配列を返します。

次に、以下の関数を追加します。変数の値を使ってクエリを変更します。

/**
 * Build a custom query
 *
 * @param $query obj The WP_Query instance (passed by reference)
 *
 */

function myplugin_pre_get_posts( $query ) {

 // check if the user is requesting an admin page
 // or current query is not the main query
 if ( is_admin() || ! $query->is_main_query() ){
  return;
 }

 $city = get_query_var( 'city' );

 // add meta_query elements
 if( !empty( $city ) ){
  $query->set( 'meta_key', 'city' );
  $query->set( 'meta_value', $city );
  $query->set( 'meta_compare', 'LIKE' );
 }

}

add_action( 'pre_get_posts', 'myplugin_pre_get_posts', 1 );

pre_get_postsアクションフックは、クエリが作成された後、かつ、実行される前にトリガーされます。このアクションにコールバック関数をフックすれば、クエリが実行される前に変更を加えられます。次のように動作します。

  • コールバック関数は$queryオブジェクトのインスタンスを保持します。これは値渡しでなく参照渡しです。つまり、クエリオブジェクトへの変更はオブジェクトのコピーではなく、元のクエリに影響を与えます。このため、どのクエリが実行されるのか(メインクエリ)を確認する必要があります。
  • 次に、get_query_var関数を使って、現在のクエリ文字列から「city」の値を取得します。
  • 最後に、$cityが空でなければ、メタクエリ要素「meta_key」「meta_value」「meta_compare」を設定できます。これらはプライベートクエリ変数で、パブリックなリクエストでは使用できません。スクリプト内でのみ設定できます。

プラグインを有効にして、いくつかの投稿にカスタムフィールド「city」を追加してください。次に、「設定」>「パーマリンク設定」にアクセスし、パーマリンクを更新します。特に何かをする必要はなく、ただパーマリンク設定画面を開くだけで十分です。

次のようなURLでチェックします。

https://example.com/?city=London

このリクエストに応えてWordPressは、フィールド「city」の値が「London」のすべての投稿を返します。

最後のタスクとして、上の汚いURLを美しいパーマリンク構造に変換します。プラグインに次の関数を追加してください。

/**
* Add rewrite tags and rules
*/

function myplugin_rewrite_tag_rule() {

 add_rewrite_tag( '%city%', '([^&]+)' );
 add_rewrite_rule( '^city/([^/]*)/?', 'index.php?city=$matches[1]','top' );

}

add_action('init', 'myplugin_rewrite_tag_rule', 10, 0);

add_rewrite_tag関数add_rewrite_rule関数は、Rewrite APIの一部です。add_rewrite_tagはWordPressにクエリ変数「city」を知らせ、add_rewrite_ruleは新しいリライトルールを指定します。どちらの関数もinitアクションにフックする必要があります。新しいタグとルールにより次のURLを使用することができます。

https://example.com/city/London/

WordPressは、カスタムフィールド「city」の値が「London」の投稿のアーカイブを返します。

注意:新しいリライトルールを追加した場合、WordPressのパーマリンクは、管理画面の「設定」>「パーマリンク設定」で更新する必要があります。

WooCommerceでパーマリンクを変更する方法

WooCommerceは、独自のカスタム投稿タイプとカスタムタクソノミーを作成し、デフォルトのパーマリンクを定義します。

すべてのパーマリンク設定やスラッグは編集できます。

商品カテゴリー、タグ、属性のパーマリンクの変更

商品カテゴリー、タグ、属性のパーマリンクを編集するには、「構造」と「スラッグ」の2つの方法があります。これらは通常のカテゴリーやタグと同じように動作します。

パーマリンク構造を編集するには、「設定」>「パーマリンク設定」にアクセスし、「オプション」セクションに移動します。WooCommerceがいくつかのフィールドを追加しています。

WooCommerceがインストールされている場合の、パーマリンク設定のオプションセクション
WooCommerceがインストールされている場合の、パーマリンク設定のオプションセクション

ここでは、WooCommerceによって追加された3つのカスタムタクソノミーのパーマリンク設定を編集できます。

  • 商品カテゴリーベース:デフォルトは「/product-category/」ですが、ストアで異なる用語を使用している場合は、これを変更できます。変更した内容が通常のカテゴリーの設定と衝突しないことを確認してください。
  • 商品タグベース:デフォルトは「/product-tag/」ですが、必要に応じて変更できます。通常の投稿タグと衝突しないことを確認してください。
  • 商品属性ベース:他の2つのタクソノミーとは異なる動きをし、異なる構造を持ちます。ここで追加したものの後に、常に、個々の属性名のスラッグ(例:size)と、属性自身(ターム。例:large)が追加されます。

個々のカテゴリやタグのスラッグを編集する場合は、「商品」>「カテゴリー」、または「商品」>「タグ」に移動し、投稿タグや投稿カテゴリーと同じ方法で編集します。

商品カテゴリーのスラッグの編集
商品カテゴリーのスラッグの編集

属性の編集は、属性だけでなく、属性のタームもあるため異なります。

まず、「商品」>「属性」に移動します。

商品属性画面
商品属性画面

新しい属性を作成する際には、タグやカテゴリーと同じように「スラッグ」フィールドを使用してスラッグを設定します。また、既存の属性のスラッグを編集するには、右側のリストの属性の下にある「編集」リンクをクリックします。

商品の属性のスラッグの編集
商品の属性のスラッグの編集

「更新」をクリックして変更を保存します。

属性のタームのスラッグを編集するには、属性画面に移動して、属性の横にある「条件設定」リンクをクリックします。属性のタームのリストが表示されます。

商品属性のタームのリスト
商品属性のタームのリスト

カテゴリーやタグと同じように、タームのスラッグを編集できます。タームは、このタームを持つ商品のアーカイブのURLに追加されます。

商品のパーマリンクを変更する

商品のパーマリンクは、「設定」>「パーマリンク設定」で編集します。「商品パーマリンク」セクションまで下にスクロールしてください。

商品のパーマリンク設定
商品のパーマリンク設定

ここでは、商品の4つのパーマリンク設定を選択できます。

  • デフォルト:すでに美しいパーマリンクを有効にしている場合は、各商品の「/product/」ベースのスラッグを使用します。
  • ショップ名ベース:「/product/」の代わりに「/shop/」を使用します。
  • ショップ名とカテゴリーベース:現在の商品カテゴリーをURLに挿入します。正しく商品カテゴリーを設定している場合、ターゲットにしたいキーワードが追加される可能性もありますが、長いURLが作成されるため、ユーザーエクスペリエンスの向上にはなりません。
  • カスタムベース:ストアにマッチする言葉を使用して独自のURL構造を作成します。ベースは完全に削除できません。何かのテキストを指定する必要があります。

必要なオプションを選択したら、「変更を保存」ボタンをクリックして選択内容を保存します。

また、商品編集画面でも投稿やページと同じように、個別の商品のスラッグを編集できます。

プラグインでWordPressパーマリンクを変更する方法

サードパーティ製のプラグインを使用すると、デフォルトのWordPressパーマリンク設定画面での設定以上に、パーマリンクの設定をカスタマイズできます。

Custom Permalinks WordPressプラグイン
Custom Permalinks WordPressプラグイン
  • Custom Permalinksプラグインを使用すると、URLに自由に投稿カテゴリやタグを設定できます。また、リダイレクトも設定でき、古いURLをそのまま使用できます。
  • Permalink Manager Liteプラグインはカスタム投稿タイプと、プロ版でカスタムタクソノミーをサポートします。リダイレクトも含み、WooCommerceやYoastなどのサードパーティ製プラグインと連携できます。

phpMyAdminでWordPressのパーマリンクを変更する方法

自分が何をしているのか理解していて、かつ、何も壊さない自信があるなら、phpMyAdminを使用してパーマリンクを編集することもできます。

この方法は、何らかの理由でパーマリンク設定画面にアクセスできない場合に必要になる可能性があります。

まず、データベースをバックアップしてください。これからデータベースを直接、編集していきます。ミスを犯した場合に備えてバックアップしておきます。

phpMyAdminにアクセスします。

KinstaユーザーであればMyKinstaにログインし、作業するサイトを選択してください。

情報画面で下にスクロールして、「phpMyAdminを開く」ボタンをクリックします。

MyKinstaの「phpMyAdminを開く」ボタン
MyKinstaの「phpMyAdminを開く」ボタン

データベースのユーザー名とパスワードを入力してphpMyAdminにアクセスします。これらの情報は、情報画面にもあります。

上部の「データベース」タブをクリックして、作業するデータベースを選択します。

phpMyAdminのデータベース構造
phpMyAdminのデータベース構造

wp_options」テーブルを選択し、「option_name」列にある「permalink_structure」エントリを探します。最初のページに表示されない場合は、次ページ以降に移動してください。

permalink_structureエントリを検索する
permalink_structureエントリを検索する

エントリの左側の「Edit」リンクをクリックし、「option_value」フィールドの下に使用するパーマリンク構造を追加します。パーマリンク設定画面の説明で確認したタグを使用してください。

パーマリンク構造の編集
パーマリンク構造の編集

Go」をクリックしてください。パーマリンクが更新されます。

(さらに情報が必要な場合は、「WordPressのURLを変更する方法」を参照してください。)

画像パーマリンクの操作

すべての画像にはパーマリンクがあり、サイトにアップロードした画像やメディアファイルにもそれぞれ専用に作成された、多くのリンクがあります。

  • アップロードした、元の画像へのリンク
  • 「設定」>「メディア」で設定したメディアサイズで生成された、新しい画像へのリンク

元の画像へのリンク

画像をアップロードすると、サーバー上に保存された画像ファイルへの固有のリンクが作成されます。これには、保存されている場所へのパス「wp-content/uploads」が含まれます。

また、画像をアップロードした日付も含まれます。来月、または来年に同じファイル名で別の画像をアップロードしても、画像は固有のファイルパスを持つため、混乱することはありません。

たとえば2020年4月1日に画像「funnycat.jpg」をアップロードした場合、リンクは「yoursite.com/wp-content/uploads/04/funnycat.jpg」となります。「04」は4月にアップロードされたことを示します。WordPressではuploadsディレクトリ内に、月ごとの番号の付いたフォルダを作成しています。

画像ではないファイルをアップロードした場合、URLは同じように動作します。例:「yoursite.com/wp-content/uploads/04/document.pdf

ある月に同じ名前のファイルを複数アップロードした場合、WordPressはファイル名の最後に数字を追加します。たとえば「funnycat.jpg」という別の画像をアップロードすると、「funnycat-1.jpg」になります。

元の画像へのリンクが必要な場合や、正しく動作しているかを確認するには、これらの方法でリンクを取得できます。

また、添付ファイルへのリンクを取得するには、「メディア」>「ライブラリ」でファイルをクリックしてください。ファイルの編集画面が表示され、右側の「ファイルのURL」フィールドにURLが表示されます。

元の画像へのリンク
元の画像へのリンク

WordPressが提供するwp_get_attachment_image()関数を使用しても画像ファイルへリンクできます。この方法は、将来添付ファイルが移動されてもリンクが変わらないため、より優れた方法になります。wp_get_attachment_image()関数は、プラグインやテーマのテンプレートファイルで使用され、引数に添付ファイルの固有のIDを取ります。

手元の環境で画像「funnycat.jpgのIDは4995でした。IDは画像の編集画面を開き、ブラウザウィンドウの上部にあるURLをクリックすると取得できます。最後の数字がIDです。

テンプレートファイルやプラグインでこの画像を取得するには、次のコードを使用します。

<?php wp_get_attachment image( ‘4995’ ); ?>

これでフルサイズの画像を取得できます。出力する場合はechoを追加します。

<?php echo wp_get_attachment image( ‘4995’ ); ?>

異なるサイズの画像へのリンク

またWordPressでは、サイトに設定されている画像サイズ設定を使って画像が作成されます。画像サイズは、「設定」>「メディア」で設定します。

メディア設定画面
メディア設定画面

画像が「大サイズ」の設定よりも大きい場合は、「大」「中」「サムネイル」の3つの画像が作成されます。

作成される画像では、この「大」「中」「サムネイル」を使用しません。将来的に設定が変更される可能性があるためです。代わりに、ファイル名にはファイルの縦横のサイズを使用し、元の画像と同じ場所、「wp-content/uploads」の月フォルダに保存します。

最も簡単にリンクを調べるにはFTPクライアントを使用して、指定された月にアップロードされたすべての画像を検索してくさい。

FTPクライアントで表示した、アップロードされた画像の一覧
FTPクライアントで表示した、アップロードされた画像の一覧

サイトにアップロードした画像「funnycat.jpg」を見てみます。上のスクリーンショットで確認できます。

WordPressは、サイトの画像サイズ設定を使って追加のファイルを作成しています。

  • funnycat-150×150.jpg
  • funnycat-222×300.jpg
  • funnycat-300×200.jpg
  • funnycat-757×1024.jpg
  • funnycat-768×1040.jpg
  • funnycat-1135×1536.jpg
  • funnycat-1513×2048.jpg

標準以外の画像があるのは、追加の画像サイズで画像を利用するプラグインを使っており、テーマ内のページテンプレートの一つが追加のカスタムサイズを設定しているためです。必要であれば、これらへのリンクをハードリンクとして使用できます。

しかし画像にリンクする場合は、上で見たwp_get_attachment_image()関数を使用して、画像サイズのパラメータを追加する方が良いでしょう。

次のコードは中サイズの画像を出力します。

<?php echo wp_get_attachment image( ‘4995’, ‘medium’ ); ?>

コード内にハードリンクを作成するよりも、はるかに堅牢な方法で画像を取得できます。

異なるコンテンツタイプのパーマリンクをリダイレクトする方法

既存の投稿のスラッグの編集や、サイト全体でのパーマリンク設定の変更は、共有済みの投稿へのリンクに問題を起こす可能性があります。たとえば、ユーザーが古いリンクをクリックすると、404ページにリダイレクトされます。

古いリンクから新しいリンクへのリダイレクトを作成することで、この問題を解決できます。

個々の投稿やページをリダイレクトする

古い投稿へのスラッグから新しい投稿にリダイレクトするには、これら2つのURLのリダイレクトルールを設定する必要があります。

Kinstaを使用している場合は、MyKinstaダッシュボードリダイレクトルールを作成できます。

サイトのメニューで「リダイレクト」オプションをクリックしてください。

MyKinstaでのリダイレクト
MyKinstaでのリダイレクト

「リダイレクトルールの追加」ボタンをクリックして、リダイレクトルールポップアップを開きます。

MyKinstaのリダイレクトルールの追加画面
MyKinstaのリダイレクトルールの追加画面

リダイレクトを追加するには、「301リダイレクト」を選択し、「リダイレクト元」に古いスラッグを、「リダイレクト先」に新しいスラッグを入力します。

「リダイレクトルールを追加」ボタンをクリックすると、リダイレクトが設定されます。

Kinstaを使用していない場合は、リダイレクトプラグインを使用してリダイレクトを設定できます。Redirectionプラグインは最も人気のあるプラグインです。手動でリダイレクトを設定できるだけでなく、スラッグへの変更を監視して自動的にリダイレクトを設定します。リダイレクトループを避けるように注意してください。「too many redirects」エラーが発生すると、ページが読み込まれません。

以下は、1件の投稿のスラッグを変更したところ、プラグインがこれを感知し、リダイレクトルール設定した様子です。

Redirectionプラグインのリダイレクトルール設定
Redirectionプラグインのリダイレクトルール設定

アーカイブページのリダイレクト

パーマリンク設定画面のオプションセクションでアーカイブページの構造を変更すると、カテゴリアーカイブへの古いリンクを使用していたすべてのユーザーは404ページにリダイレクトされます。これを回避するにはワイルドカードリダイレクトを設定する必要があります。

MyKinstaでは、以前使用していたベース構造と、現在使用しているベース構造を指定してリダイレクトルールを作成してください。末尾にはワイルドカードを表すアスタリスクを使用します。

「リダイレクト元」フィールドには、カテゴリへの古いパスをワイルドカードと共に入力します。「/oldslug/(.*)$」の形式を取る必要があります。「リダイレクト先」は「/newslug/$1」の形式です。

たとえば、カテゴリーURLの構造を変更してカテゴリー名の前にデフォルトの「category」の代わりに「blog」を使用する場合、「リダイレクト元」フィールドには「/category/(.*)$」、「リダイレクト先」フィールドには「/blog/$1」を入力します。

MyKinstaでワイルドカードリダイレクトを追加する
MyKinstaでワイルドカードリダイレクトを追加する

Redirectionプラグインを使用している場合は、ワイルドカードのアスタリスクが正規表現のため、まずRegex関数を有効化する必要があります。

「ツール」>「Redirection」に移動し、画面の「新しい転送ルールを追加」セクションに移動します。

Redirectionプラグインで新しいリダイレクトルールを作成する
Redirectionプラグインで新しいリダイレクトルールを作成する

「URL Options/Regex」ドロップダウンをクリックし、「Regex」ボックスをオンにします。

Redirectionプラグインでワイルドカードリダイレクトを設定する
Redirectionプラグインでワイルドカードリダイレクトを設定する

「Source URL」フィールドにカテゴリーへの古いパスをワイルドカード付きで入力します。「/oldslug/(.*)$」の形式を取る必要があります。「Target URL」には「/newslug/$1」の形式で指定してください。MyKinstaの場合とまったく同じように動作します。

WordPressサイトにおけるリダイレクトのベストプラクティスを動画でご紹介しています。

WordPressパーマリンクのトラブルシューティング

まれに、パーマリンクが思ったように動作しない場合があります。対処法を以下に示します。

投稿タイプを登録したが、パーマリンクが動作しない

新しい投稿タイプやタクソノミーを登録しても、関連するアーカイブページや投稿タイプの投稿へのリンクが動作しない場合があります。

単にWordPressがカスタム投稿タイプやタクソノミーのパーマリンク設定への変更を知らないためです。設定を更新するには、「設定」>「パーマリンク設定」に移動してください。何かを変更したり、「変更を保存」ボタンをクリックする必要はありません。画面を開くだけで十分です。

パーマリンクが思ったように動作しない

パーマリンクが思ったように動作せず、また、カスタム投稿タイプやタクソノミーを登録した直後でない場合は、以下のヒントを試してみてください。

  • ブラウザで正しくURLが入力されているかを確認してください。
  • 「設定」>「パーマリンク設定」に移動し、設定を確認してください。タグが正しいか、見落としや間違った構文を使用していないかを確認してください。
  • キャッシュプラグインを使用している場合は、ウェブサイトのキャッシュをクリアしてください。キャッシュはリンクの変更を妨げます。
  • パーマリンクの設定を変更した場合、ウェブサイトのコンテンツ内に古い、切れたリンクがあるかもしれません。リンクを編集するか、リダイレクトを設定してください。
  • 投稿のスラッグを手動で変更したか、また編集が必要かを確認してください。
  • リダイレクトプラグインや、リダイレクト機能を含むプラグインのインストールを確認してください。インストールされている場合は、設定で追加したリダイレクトを確認してください。
  • 投稿タイプやリンクに影響を与えるプラグインがある場合はこれを無効にして、問題が解決するかどうかを確認してください。
  • パーマリンクの設定画面にアクセスできない場合は、上で説明した方法でphpMyAdminからパーマリンクを編集してください。

以上のヒントに従えば、パーマリンクは期待したとおりに動作するはずです。

まとめ

パーマリンクはWordPressの非常に便利な機能です。パーマリンクを使用してユーザーエクスペリエンスを向上し、検索エンジンのランキングを上げることができます。

上の解説に従うことでパーマリンクは最適化されます。また、希望したとおりに動作するようすべての投稿タイプ、タクソノミー、カスタムスラッグを構成できます。

さて、次は、あなたの番です。どのようにパーマリンクを管理していますか?上のパーマリンクの説明で抜けていることはありませんか?もしもご意見があれば、是非、下のコメント欄から教えてください。

Rachel McCollin

Rachel McCollin has been helping people build websites with WordPress since 2010. She's a huge fan of self-hosted WordPress and wants to help as many people as possible create an awesome website with it.