カスタム分類とページ書き換えスラッグの競合により404が発生する


9

カスタム分類を作成するためにカスタム投稿タイプUIプラグインを使用しています。私は、テクノロジーとクライアントの2つのカスタム分類法を持つプロジェクト(カスタム投稿タイプ)で構成されるポートフォリオを持っています。クライアントの分類法にはのカスタム書き換えスラグがportfolio/clients/あり、テクノロジー分類法にはのカスタム書き換えスラグがあります。portfolio/

書き換え:
portfolio/html <-ページはHTMLを使用してすべてのプロジェクトを表示します
portfolio/clients/client-a<-ページはクライアントAのすべてのプロジェクトを表示します

ここで、URLスラグのあるクライアント用のランディングページを作成しようとすると/portfolio/clients、404ページが表示されます。これは、テクノロジー分類法のURLの書き換えが競合しているためだと思います。私はそれがテクノロジー分類法でそれを検索するので、それが存在しない場合は404ページを吐き出していると思います。では、url rewrite slugを機能させるにはどうすれば、を押したときに/portfolio/clients404ページが返されず、正しいページテンプレートが使用されますか?

回答:


16

「部分的な詳細な書き換えルール」が必要なようです。詳細な書き換えルールとは、WordPressがページと投稿の違いを理解できないため、すべてのページが上に配置されることを意味します。ここでは、フォームのすべてのURLがこの分類を除いportfolio/([^/]+)/portfolio分類からのものであるため、可能だと考えていますportfolio/clients/。これを書き換えルールの上に置く必要があるため、より一般的なポートフォリオ分類の前に一致します。また、すべての書き換えルールを強制的に冗長にすることもできますが、ページ数が多い場合はパフォーマンスに影響します。

この回答は、書き直しのルールを理解したばかりで書かれているので、それが良い方法であり、サンプルコードにエラーが多すぎないことを願っています。

ページは1つの書き換えルールだけを生成するのではなく、グループを生成します。

  • (pagename)/trackback/?$
  • (pagename)/feed/(feed|rdf|rss|rss2|atom)/?$
  • (pagename)/(feed|rdf|rss|rss2|atom)/?$
  • (pagename)/page/?([0-9]{1,})/?$
  • (pagename)/comment-page-([0-9]{1,})/?$
  • (pagename)(/[0-9]+)?/?$

これらを自分で作成する必要はありませんWP_Rewrite。の機能を再利用できます。そのpage_rewrite_rules()メソッドを見てください。冗長モードの場合、すべてのページ(を介してpage_uri_index())とその添付ファイルのリストを取得し、%pagename%書き換えタグを上書きして、このページの書き換えルールを生成します。これもできます:

// We only generate them for this page
$page_uri = 'portfolio/clients';
// Returns site root + '%pagename%'
$page_structure = $wp_rewrite->get_page_permastruct();
// Everywhere you see %pagename% in the structure used to generate rules
// in the next step, replace it with our fixed page name
$wp_rewrite->add_rewrite_tag('%pagename%', "({$page_uri})", 'pagename=');
// This generates the group given above
$page_rewrite_rules = $wp_rewrite->generate_rewrite_rules($page_structure, EP_PAGES);

これにより、ページのルールがわかりますが、ページで使用されている添付ファイルのルールはまだわかりません。それらも必要な場合は、添付ファイルごとに手順を繰り返しますが、add_rewrite_tag('%pagename%', "({$attachment_uri})", 'attachment=')(詳細についてはpage_rewrite_rules()を参照してください)。

ルールはわかりましたが、何らかの方法で完全な書き換え構造に追加する必要があります。これはで実行できますがadd_rewrite_rule()$page_rewrite_rules配列で生成されたすべてのルールに対して呼び出す必要があります。このため、配列を変更するだけでよいので、多くの人rewrite_rules_arrayフィルターにフックします。

add_filter('rewrite_rules_array', 'add_verbose_portfolio_clients_page');
function add_verbose_portfolio_clients_page($rewrite_rules)
{
    global $wp_rewrite;

    // The previous code snippet comes here, where we generate $page_rewrite_rules

    // Our rules have priority, they should be on top
    $rewrite_rules = array_merge($page_rewrite_rules, $rewrite_rules);

    return $rewrite_rules;
}

このフィルターを組み込んだ後、書き換えルールをフラッシュする必要があります(非常に重いため、ページをロードするたびに1つではありません)。これを行うには、を呼び出すflush_rewrite_rules()か、[パーマリンク]設定ページにアクセスします。


優秀な!ありがとう、Jan!これはうまくいきました。これ以上の説明はありませんでした。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.