web-dev-qa-db-ja.com

ページ区切り付きカスタム投稿のURL構造を変更する

スライドショー用のカスタム投稿タイプがあります。これはページ区切り付きの投稿を作成し、各スライドは別々のページです。各スライドのデータはカスタムフィールドに保存され、各スライドのタイトルセットはキーslide{$i}-titleを付けてカスタムフィールドに保存されます($iはスライド番号、たとえばslide1-title)。

現在のところ、後続の各ページのURLは、次のように、パーマリンク後のページに追加される番号です(ページ付けされたページのURLの標準的な書式設定方法です)。 http://example.com/post-title/2/ ページ/スライド2および http://example.com/post-title/3/ ページ/スライド3の場合。

各ページのURLに増分番号ではなくスライドのタイトルを追加するように変更するにはどうすればよいですか?

例: http://example.com/post-title/slide-2-title/ page/slide 2および http://example.com/post-title/slide- 3タイトル/ ページ/スライド3の場合。

4
matt

URL構造の変更は常に2つの部分で構成されています。1つはコードで生成したURLを変更するもの、もう1つは新しい構造の着信URLを処理するものです。私は2番目の、そしておそらく最も理解されていない部分に焦点を当てます。

入ってくるURLは異なる書き換え規則に一致します。これはURLに一致できる正規表現です。これらの式には、URLの一部をキャプチャしてさまざまなクエリ変数に送信するキャプチャグループを含めることができます。これは(たとえば)データベースクエリの構築に使用されます。カスタム投稿タイプslideshowを作成すると、書き換えルールの1つは次のようになります。

スライドショー/([^ /] +)(/ [0-9] +)?/?$ 
 => index.php?slideshow = $一致[1]&page = $一致[ 2] 

これは、slideshow/で始まるURL、次に/以外のすべて、そして任意で(?/および任意の桁数のURLと一致することを意味します。最初の一致はslideshowクエリ変数に送信され、2番目の一致はpage変数に送信されます。たとえば、slideshow/nature/2slideshownatureに、page2に設定します。私はあなたの現在のルールを理解しデバッグするのに役立つかもしれないプラグインを書いた。

slideshow/nature/slide-2-canyon/のような構造体と一致させたいです。この正規表現は次のようになります。

 slideshow/// 'slideshow /'
([^ /] +)//で始まります。//' /'
以外のもの(/ slide- // Then) slide  -  '
([0-9] +)//ページ番号
( - ([^ /] +))?//スライドのタイトル:'  -  'およびそれ以外のもの追加する必要はないのでオプションですので、追加する必要はありません。

スライドショーの名前とページ番号をキャプチャしたいです。一致インデックスを取得するための最初の '('を数えるので、完全な書き換え規則は次のようになります。

スライドショー/([^ /] +)(/ s​​lide  - ([0-9] +)( - ([^ /] +))?)?/?$ 
 => index .php?slideshow = $一致[1]&page = $一致[3] 

さて、これを書き換えルールに追加するだけです。同様のルールが投稿の添付ファイルの照合に使用されるため、必ず一番上に配置してください。カスタムルールがリストの一番下にある場合はヒットしません。

add_rewrite_rule(
    'slideshow/([^/]+)(/slide-([0-9]+)(-([^/]+))?)?/?$',
    'index.php?slideshow=$matches[1]&page=$matches[3]',
    'top'
);

この行を一度だけ呼び出してからflush_rewrite_rules()を呼び出すだけで十分です。あるいは、プラグインのアクティベーションフックをいじらないようにするには、すべてのinitadd_rewrite_rule()を呼び出します。その後、「パーマリンク」設定ページを読み込んでルールをフラッシュします。あなたがすべてのページロードのルールをフラッシュしない限り、それは高価な計算であるので。

あなたに残された唯一のことは新しいフォーマットのページリンクを生成することです。 wp_link_pages() はその出力を変更するためのフィルタを提供していないようです。出力形式を1つだけ選択した場合は、関数の半分だけが必要です。

8
Jan Fabry