web-dev-qa-db-ja.com

パーマリンクをリセットした後も書き換えられるカスタム投稿タイプ404

私はカスタム投稿タイプを作成しました。(単純化された)引数は以下のとおりです。

register_post_type(
    'Event',
    'public' => true,
    'rewrite' => array( 'slug' => 'eventy'),
    'has_archive' => false,
    'hierarchical' => false
)

それは一般的にうまくいきます。しかし、私がfunctions.phpのURLを書き換えようとしたら、例えば:

function my_post_type_link_filter_function( $post_link, $id = 0, $leavename = FALSE ) {
   return str_replace('eventy', 'eventx', $post_link);
}
add_filter('post_type_link', 'my_post_type_link_filter_function', 1, 3);

その結果、WordPressによって生成されたリンク、リストなどに新しい「eventx」URLが正しく表示されます。しかし、私がそれらの 'eventx' URLに行くとき、私は404を得ます。 'eventy' URLに行くことはまだうまくいきます。

私は、パーマリンクの設定をデフォルトにして投稿名に戻すことを何度も試みました。これはパーマリンクをリセットし、私がオンラインで見た多くの人々のためにこの問題を修正することになっています。私には違います。

誰が原因が何かを知っていますか?これをトラブルシューティングするにはどうすればよいですか。私はURL書き換えの理論が苦手です。

あなたが興味を持っているのであれば、私の目的は上記の些細な出来事→eventxの置き換えではありません。私は実際には、イベントが開始された年月のURLを(公開されたときではなく)そのURLに入れたいのです。この些細なx→yの書き換えでも404秒がかかるので、デバッグをするともっと基本的な問題があることに気付きました。

読んでくれてありがとう!

[説明を追加]

現時点で私は言う「釣り旅行」と呼ばれる3つのイベント(私のカスタム投稿タイプの投稿)を言っています。これらはデフォルトで以下のようにパーマリンクを割り当てられます

  • mysite.com/events/fishing-trip
  • mysite.com/events/fishing-trip-2
  • mysite.com/events/fishing-trip-3

これは退屈で不正です。

代わりに欲しい

  • mysite.com/events/2013/january/fishing-trip
  • mysite.com/events/2013/may/fishing-trip
  • mysite.com/events/2013/may/fishing-trip-2
  • mysite.com/events/2014/march/fishing-trip

よりきれいでより有益です。

私は以下のようなカテゴリスタイルのページを持つことには興味がありません。

  • mysite.com/events/2013

年月はURLの単なる装飾的なものです。

7
Jonathan

手順1、カスタムイベントの年と月のクエリ変数の書き換えタグを追加してから、rewrite引数のslug引数にこれらのタグを使用してイベント投稿タイプを登録します。

function wpa83531_register_event_post_type(){

    add_rewrite_tag('%event_year%','(\d+)');
    add_rewrite_tag('%event_month%','(.+)');

    register_post_type( 'event',
        array(
            'public' => true,
            'rewrite' => array( 'slug' => 'events/%event_year%/%event_month%' ),
            'has_archive' => false,
            'hierarchical' => false,
            'supports' => array('custom-fields', 'title', 'editor')
        )
    );

}
add_action( 'init', 'wpa83531_register_event_post_type' );

ステップ2、投稿タイプのリンクをフィルタリングして、これらのタグをカスタムフィールドevent_yearおよびevent_monthの値で置き換えます。カスタムフィールドが存在しない場合は、デフォルト値がいくつか挿入されるので、少なくとも投稿をエラーなしでプレビューできます。

function wpa83531_event_post_link( $permalink, $post, $leavename ) {
    if ( stripos( $permalink, '%event_year%' ) == false )
        return $permalink;

    if ( is_object( $post ) && 'event' == $post->post_type ) {

        $default_year = '1970';
        $default_month = 'january';

        if( $event_year = get_post_meta( $post->ID, 'event_year', true ) ){
            $permalink = str_replace( '%event_year%', $event_year, $permalink );
        } else {
            $permalink = str_replace( '%event_year%', $default_year, $permalink );
        }

        if( $event_month = get_post_meta( $post->ID, 'event_month', true ) ){
            $permalink = str_replace( '%event_month%', $event_month, $permalink );
        } else {
            $permalink = str_replace( '%event_month%', $default_month, $permalink );
        }

    }

    return $permalink;
}

add_filter( 'post_type_link', 'wpa83531_event_post_link', 10, 3 );
8
Milo

あなたのregister_post_type()で 'rewrite' => falseを設定しなければなりません。そしてregister_post_type()を閉じた後に追加します。

// 404 CPT WP bug...

global $wp_rewrite;
$projet_structure = '/projets/%projet%';
$wp_rewrite->add_rewrite_tag("%projet%", '([^/]+)', "projet=");
$wp_rewrite->add_permastruct('projet', $projet_structure, false);

projet は私のCPTです。

あなたは ここでチェック もっとできる。

0
Alex