web-dev-qa-db-ja.com

カスタム投稿タイプに/%postname%を使用する

次のように、パーマリンクをページと同じスペースに配置する必要があるカスタム投稿タイプがあります。

/an-example-thing  <--  custom post type 'thing'
/about-the-things  <--  a normal page

これはそれを推奨する方法ではありません しかし、私は実際には選択肢がありません - それがクライアントが指定したものです。

register_post_type でカスタムタイプを作成し、 カスタム投稿パーマリンク プラグインを使用して、次のようにパーマリンクを設定します。

/%thing%/

しかしながら、これは私のカスタム投稿を認識するルールと通常のページのルールとの間に矛盾を生じさせます - それはすべての通常のページを404に変えます。この問題は、パーマリンクが次のように変更されると解消されます。

/things/%thing%/

Monkeyman Rewrite Analyzer を使用すると、カスタム投稿のルールが最初にくることがわかります。冗長ルールを使用するように強制しても、

global $wp_rewrite;
$wp_rewrite->use_verbose_page_rules = true;

カスタム投稿タイプのルールは、ページの詳細ルールよりも優先度が高いため、404を取得します。

最初にthingsを探したいのですが、その名前のものが見つからない場合はページを探してください。逆の方法でも問題ありません。 404を打つ前にthingsとページの両方を探すように説得する方法はありませんか?

5
Marcus Downing

あなたは私のリライトアナライザーを使うための1つのボーナスポイントから始めます:-)

確かに、冗長なページ規則を使用していても、バージョン3.1(またはその周辺のもの)以降、分類法の書き換え規則はそれ以前でもあります。 I 最近別の質問に答えました 実際にトップに移動する方法があります。冗長なページルールを使用しても構わない場合(25ページを超えない場合など)、これは機能します。

冗長なページ規則が不要な場合は、URLがページまたはカスタム投稿タイプを参照する可能性がある「あいまいな」状況に対処できるように、コアのWPクラスを拡張する必要があります。マイク かつてこれを行うための素晴らしい方法を提供しました 。彼の答えはカスタム分類法用に書かれていますが、カスタム投稿タイプにも適応できるはずです。

2
Jan Fabry

私は1つの解決策を見つけました、しかしそれは 本当に ugly: 404ルーティングへのフック 配信されるべきページを配信することです。私は同様に扱うべきマルチサイト接頭辞があるので、コードは少し複雑です。

theme/404.php

<?php
global $current_blog;
$prefix = $current_blog->path;
$path = $_SERVER['REQUEST_URI'];
$path = preg_replace("!^$prefix!i", "", $path);
$path = preg_replace("!\?.*$!i", "", $path);
$path = trim($path, '/');
$page = get_page_by_path($path);

if (isset($page)) {
  $template = get_post_meta($page->ID, '_wp_page_template', true);
  if (empty($template))
    $template = get_page_template();
  query_posts("post_type=page&id={$page->ID}");
  include($template);
  die;
}
?>
...actually handle a 404...

ページを識別したら、query_postsをもう一度実行してすべてのデータを正しくロードする必要があります。これは理想的な解決策には程遠いですが、少なくとも私にとってはうまくいきました。誰かがそれを提案することができれば私は喜んでそれをより良い解決策に置き換えたいと思います。

0
Marcus Downing

この問題に対処するプラグインが2つあります。

これは 各カスタム投稿タイプページに特定のルールを追加することでスラッグを削除します。

これは の方が進んでいるようです、あなたが望む任意のスラッグ構造体を設定することができますが、それは開発者によって放棄されます。

他のルールが干渉していたため、最初はMonkeyman Rewrite Analyzerを使用してデバッグする必要がありましたが、両方とも動作するようになりました。

0
Adam Bell