2

何らかの理由で、同じ URL 構造を持つ複数の CPT を作成できません。たとえば、次のものが機能しません。

/cpt1/overview
/cpt1/events

/cpt2/overview
/cpt2/events

最終的に何が起こるかは次のとおりです。

/cpt1/overview
/cpt1/events

/cpt2/overview-2
/cpt2/events-2

wpのクリーンインストールで次のことを試して、何も混乱していないことを確認しました。

add_action( 'init', function() 
{
    register_post_type( 'cpt1', array(
        'labels' => array(
            'name'                  => __('CPT1'),
            'singular_name'         => _x('Page', 'singular name'),
            'add_new'               => _x('Add New', 'page'),
            'all_items'             => __('All Pages'),
            'add_new_item'          => __('Add New Page'),
            'edit_item'             => __('Edit Page'),
            'new_item'              => __('New Page'),
            'view_item'             => __('View Page'),
            'search_items'          => _x('Search Pages', 'plural'),
            'not_found'             => _x('No pages found', 'plural'),
            'not_found_in_trash'    => _x('No pages found in Trash', 'plural'), 
            'parent_item_colon'     => '',
        ),
        'public' => true,
        'has_archive' => true,
        'rewrite' => array( 'slug' => 'cpt1', 'with_front' => false ),
        'show_in_nav_menus' => false,
        'hierarchical' => true,
        'supports' => array( 'author', 'title', 'editor', 'custom-fields', 'page-attributes', 'revisions' ),
    ));
} );

add_action( 'init', function() 
{
    register_post_type( 'cpt2', array(
        'labels' => array(
            'name'                  => __('CPT2'),
            'singular_name'         => _x('Page', 'singular name'),
            'add_new'               => _x('Add New', 'page'),
            'all_items'             => __('All Pages'),
            'add_new_item'          => __('Add New Page'),
            'edit_item'             => __('Edit Page'),
            'new_item'              => __('New Page'),
            'view_item'             => __('View Page'),
            'search_items'          => _x('Search Pages', 'plural'),
            'not_found'             => _x('No pages found', 'plural'),
            'not_found_in_trash'    => _x('No pages found in Trash', 'plural'), 
            'parent_item_colon'     => '',
        ),
        'public' => true,
        'has_archive' => true,
        'rewrite' => array( 'slug' => 'cpt2', 'with_front' => false ),
        'show_in_nav_menus' => false,
        'hierarchical' => true,
        'supports' => array( 'author', 'title', 'editor', 'custom-fields', 'page-attributes', 'revisions' ),
    ));
} );

私ができることは何ですか?そしてどうやって?

さらなる発見

1

私はこれをさらに進めているので..ワードプレスは次のものをリダイレクトするようです(私が追加の設定をしなくても)...

/cpt2/overview/
/cpt2/events/

/cpt2/overview-2/
/cpt2/events-2/

2

次のwp関数wp_unique_post_slug(利用可能なフィルターを使用)を見つけました。これは、ページ/投稿のスラッグをチェックし、重複(-2、-3などを追加)が見つかった場合に一意のスラッグを返します..関数自体を見ると、 post_type チェックを行いますが、post_type が非階層として設定されている場合のみ..それ以外の場合は、すべての階層的な post_type を検索し、すべてから一意性をチェックします (例: 投稿、ページ、本、イベント ..)。

4

1 に答える 1

2

これは上記の問題に対する私の解決策です。より多くのフィードバックやより良い解決策が欲しいです...以下では、カスタム投稿タイプと階層内でのみスラッグの一意性をチェックするwp_unique_post_slugのコードを使用しています。

注: これは、cpt1 と cpt2 が独自のパーマリンク プレフィックスを使用するため機能します ...

add_filter( 'wp_unique_post_slug', function( $slug, $post_ID, $post_status, $post_type, $post_parent, $original_slug ) 
{
    if ( in_array( $post_type, array( 'cpt1', 'cpt2' ) ) )
    {
        // start with a base slug w/o any suffixes
        $slug = preg_replace( '/(-\d+)$/', '', $slug );

        global $wpdb, $wp_rewrite;

        $feeds = $wp_rewrite->feeds;
        if ( ! is_array( $feeds ) )
            $feeds = array();

        $check_sql = "SELECT post_name FROM $wpdb->posts WHERE post_name = %s AND post_type = %s AND ID != %d AND post_parent = %d LIMIT 1";

        $post_name_check = $wpdb->get_var( $wpdb->prepare( $check_sql, $slug, $post_type, $post_ID, $post_parent ) );

        if ( $post_name_check || in_array( $slug, $feeds ) || preg_match( "@^($wp_rewrite->pagination_base)?\d+$@", $slug )  || apply_filters( 'wp_unique_post_slug_is_bad_hierarchical_slug', false, $slug, $post_type, $post_parent ) ) {
            $suffix = 2;
            do {
                $alt_post_name = substr( $slug, 0, 200 - ( strlen( $suffix ) + 1 ) ) . "-$suffix";
                $post_name_check = $wpdb->get_var( $wpdb->prepare( $check_sql, $alt_post_name, $post_type, $post_ID, $post_parent ) );
                $suffix++;
            } while ( $post_name_check );
            $slug = $alt_post_name;
        }
    }

    return $slug;
}, 10, 6 );
于 2013-06-21T20:46:26.950 に答える