web-dev-qa-db-ja.com

カスタム投稿タイプの書き換えルールが機能しない、書き換え順序を変更する方法

私は4つか5つのCodexページ、何十ものStackexchangeページ、そしてこれを解決しようとしている4つか5つの開発者ブログを調べました。

著者というカスタム投稿タイプがあります。 CPTが正しく設定され、私はCodexからCPTフレームワークを引っ張り出し、そしてCPTジェネレータに対してそれをチェックしました。管理者画面は作成者の投稿を正しく作成、編集、および一覧表示します。URLは正しいフォーマットのexample.com/author/post_name/です。作者アーカイブも動作します。

しかし、私がすることは何もフロントエンドにそのページを表示しません。それは404以外の何ものでもありません。

私はパーマリンクページとWP-CLIを介して何十回も書き直しをフラッシュしました。私はカスタムポストタイプのパーマリンクもインストールしており、同じ問題を抱えています。

CPTはここにあります:

add_action( 'init', 'to4_cpt_author' );

function to4_cpt_author() {
  $labels = array(
    'name'               => _x( 'Authors', 'post type general name' ),
    'singular_name'      => _x( 'Author', 'post type singular name' ),
    'menu_name'          => _x( 'Authors', 'admin menu' ),
    'name_admin_bar'     => _x( 'Author', 'add new on admin bar' ),
    'add_new'            => _x( 'Add New', 'author' ),
    'add_new_item'       => __( 'Add New Author' ),
    'new_item'           => __( 'New Author' ),
    'edit_item'          => __( 'Edit Author' ),
    'view_item'          => __( 'View Author' ),
    'all_items'          => __( 'All Authors' ),
    'search_items'       => __( 'Search Authors' ),
    'parent_item_colon'  => __( 'Parent Authors:' ),
    'not_found'          => __( 'No authors found.' ),
    'not_found_in_trash' => __( 'No authors found in Trash.' )
  );

  $args = array(
    'labels'             => $labels,
    'description'        => __( 'Author post type.' ),
    'public'             => true,
    'publicly_queryable' => true,
    'show_ui'            => true,
    'show_in_menu'       => true,
    'query_var'          => 'author',
    'rewrite'            => array('slug' => 'author', 'with_front' => true ),
    'capability_type'    => 'post',
    'has_archive'        => true,
    'hierarchical'       => false,
    'menu_position'      => 9,
    'supports'           => array( 'title', 'editor', 'author', 'thumbnail', 'excerpt', 'comments' ),
    'taxonomies'         => array( 'admin_tag', 'post_tag' ),
    'menu_icon'          => 'dashicons-id-alt'

  );

  register_post_type( 'author', $args );
}

私はQuery Monitorプラグインをインストールしました、そしてそれは私に次の書き換えが一致することを教えてくれます。

All Matching Rewrite Rules
Rule                            Query
([^/]*)/([^/]*)/?$              post_type=post
                                &name=$matches[2]
                                &meta=$matches[1]

^author/([^/]*)/?               post_type=author
                                &name=$matches[1]

author/([^/]+)(?:/([0-9]+))?/?$ author=$matches[1]
                                &page=$matches[2]

(.?.+?)(?:/([0-9]+))?/?$        pagename=$matches[1]
                                &page=$matches[2]

2番目のクエリ^author/([^/]*)/?は、私が書いたものです。

function to4_rewrite_rule() {
    add_rewrite_rule( '^author/([^/]*)/?', 'index.php?post_type=author&name=$matches[1]','top' );
}
add_action('init', 'to4_rewrite_rule', 10, 0);

しかし、一番上のクエリが最初に一致するように見えるので、私は404を取得しています。 Query Monitorは、生成されたクエリをname=catherine-collins&post_type=postとして表示します(name=catherine-collins &post_type=author)。

そのクエリはどこから来ていて、どのようにして降格しますか?私のテーマやプラグインのどこにも他のadd_rewrite_ruleはありませんので、これがコアだと思います。テーマは私自身のカスタムプラグインがいくつかのカスタム投稿タイプを定義しているTwenty-17です。

3
Slam

すでに問題を発見しましたが、これと同じ問題に遭遇する人々のために、 rewrite_rules_array フィルタを使用して、特定の規則を書き換え規則の最後に移動する基本的なコードを次に示します。

([^/]*)/([^/]*)/?$のルールを移動したいとします。

add_filter("rewrite_rules_array", function($rules) {
    $keys = array_keys($rules);
    foreach($keys as $rule) {
        if($rule == '([^/]*)/([^/]*)/?$') {
            $value = $rules[$rule];
            unset($rules[$rule]);
            $rules[$rule] = $value;
            break;
        }
    }
    return $rules;
});

これを有効にするには、ルールをフラッシュ/更新する必要があります。パーマリンクの設定をバックエンドに保存するだけでそれを達成できます。

1
janh

ええ、それは結局のところユーザーエラーでした。

数ヶ月前、私はYeostを使って実験し、rewrite_rules_array is functions.phpを追加しました。 add_rewrite_ruleよりも優先されていました。削除すると、カスタム投稿の種類は通常どおりに機能しました。

これが問題のコードです。

add_filter( 'rewrite_rules_array', 'my_rewrite_rules_array');
function my_rewrite_rules_array($rules) {
    $rules = array('([^/]*)/([^/]*)/?$' => 'index.php?post_type=post&name=$matches[2]&meta=$matches[1]') + $rules;
    return $rules;
}

これは、Atomを使用してサイトフォルダ全体で'([^/]*)/([^/]*)/?$'を非grep検索することで解決されました。

0
Slam