web-dev-qa-db-ja.com

カスタム分類法とページ書き換えスラグの競合404

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

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

/portfolio/clientsというURLのスラグを持つクライアント用のランディングページを作成しようとすると、404ページが表示されます。これは、技術分類のURLの書き換えが矛盾しているためと確信しています。私はそれが技術分類学でそれを捜しているので、私は推測しています、それはそれから存在しません、そしてそれはそれが404ページを吐き出します。では、/portfolio/clientsを打っても404ページが返されず、正しいページテンプレートが使用されるように、URL書き換えスラグをどのように機能させるにはどうすればよいですか。

9
jaysonp

あなたは「部分冗長書き換え規則」を必要としているようです。冗長な書き換え規則は、WordPressがページと投稿の違いを把握できないため、すべてのページが一番上に表示されることを意味します。 portfolio/([^/]+)/という形式のすべてのURLは、portfolio/clients/を除いて、あなたのportfolioタクソノミーからのものであるため、ここでそれは可能だと思います。あなたはそれを書き換え規則の上に置かなければならないでしょう、それでそれはより一般的なポートフォリオ分類学の前にマッチします。おそらく、すべての書き換え規則を冗長にすることもできますが、大量のページがある場合はパフォーマンスに影響します。

この答えは書き換え規則についての私の得た理解で書かれています、それで私はそれがそれをする良い方法であり、例のコードが多すぎるエラーを含んでいないことを願っています。

ページは書き換え規則を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% rewriteタグを上書きし、このページの書き換えルールを生成します。 。これもできます。

// 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回ではなく1回)。これを行うには、flush_rewrite_rules()を呼び出すか、または「パーマリンク」設定ページにアクセスしてください。

16
Jan Fabry