web-dev-qa-db-ja.com

固定リンク書き換え404矛盾 - ワードプレス分類法/ CPT

サブページ(子ページ)が機能しなくなった理由を誰かが教えてくれるだろうか(例:www.mysite.com/type/childpage)。

私は "Type"と呼ばれるページを持っています、そして私は "Type"の子ページを持っていたいです(404エラー) - あなたが見ることができるように私も私のカスタム投稿の前にスラッグを書きたいですタイプ/分類法.

私は無駄にこのリンクから方法を試してみました: https://wordpress.stackexchange.com/questions/4127/custom-taxonomy-and-pages-rewrite-slug-conflict-gives-404

add_action( 'init', 'create_zombie_type' );

function create_zombie_type() {
register_post_type('zombies', 
array(  
'description' => 'Zombie custom post type',
'show_ui' => true,
'menu_position' => 5,
'menu_icon' => get_stylesheet_directory_uri() . '/images/zombies.png',
'exclude_from_search' => false,
'labels' => array(
    'name' => 'Zombies',
    'singular_name' => 'Zombie',
    'add_new' => 'Add New Zombie',
    'add_new_item' => 'Add New Zombie',
    'edit' => 'Edit Zombies',
    'edit_item' => 'Edit Zombie',
    'new_item' => 'New Zombie',
    'view' => 'View Zombie',
    'view_item' => 'View Zombie',
    'search_items' => 'Search Zombies',
    'not_found' => 'No zombies found',
    'not_found_in_trash' => 'No zombies found in Trash',
    'parent' => 'Parent Zombie',
),
'hierarchical' => false,
'supports' => array('title','editor','excerpt', 'trackbacks','custom-fields',     'comments','revisions','thumbnail','author','page-attributes'),
'public' => true,
'rewrite' => array('slug' => 'type/%freshness%', 'with_front' => false),
'taxonomies' => array('freshness')
) 
);
}




add_action( 'init', 'create_zombie_taxonomies' );

function create_zombie_taxonomies() {
register_taxonomy( 
'freshness', 
'zombies',
array( 
'labels' => array(
    'name' => 'Freshness',
    'singular_name' => 'Freshness',
    'search_items' =>  'Search Freshness',
    'popular_items' => 'Popular Freshness',
    'all_items' => 'All Freshness',
    'parent_item' => 'Parent Freshness',
    'parent_item_colon' => 'Parent Freshness:',
    'edit_item' => 'Edit Freshness', 
    'update_item' => 'Update Freshness',
    'add_new_item' => 'Add New Freshness',
    'new_item_name' => 'New Freshness Name'
), 
'hierarchical' => true, 
'public' => true,
'show_ui' => true,
'query_var' => 'freshness',
'show_tagcloud' => true,
'rewrite' => array( 'slug' => 'type', 'with_front' => false ) 
) 
   );

}



function filter_post_type_link($link, $post)
{
if ($post->post_type != 'zombies')
return $link;

if ($cats = get_the_terms($post->ID, 'freshness'))
$link = str_replace('%freshness%', array_pop($cats)->slug, $link);
return $link;
}

add_filter('post_type_link', 'filter_post_type_link', 10, 2);
5
Joe

/type/で始まる各ページに冗長なページルールを作成することもできますが、それを最新に保つには、ページ作成やそのようなものにフックする必要もあります。余分なページがそれほど多くない場合は、 all ページに対して詳細なページ規則を強制するほうが簡単な場合があります。その場合はWordPressがこれを行います。

add_action( 'init', 'wpse16902_init' );
function wpse16902_init() {
    $GLOBALS['wp_rewrite']->use_verbose_page_rules = true;
}

唯一の問題は、分類規則がそれの上にも置かれていることです(WP 3.1以降だと思います)。しかし、正しいフックを使えば、ページ規則を傍受して、それらを実際に一番上に配置することができます。

add_filter( 'page_rewrite_rules', 'wpse16902_collect_page_rewrite_rules' );
function wpse16902_collect_page_rewrite_rules( $page_rewrite_rules )
{
    $GLOBALS['wpse16902_page_rewrite_rules'] = $page_rewrite_rules;
    return array();
}

add_filter( 'rewrite_rules_array', 'wspe16902_prepend_page_rewrite_rules' );
function wspe16902_prepend_page_rewrite_rules( $rewrite_rules )
{
    return $GLOBALS['wpse16902_page_rewrite_rules'] + $rewrite_rules;
}

カスタム投稿タイプとカスタム分類法の書き換えルールが/type/%freshness%/のURLで互いに衝突している可能性があります。これらは、カスタム投稿タイプのアーカイブではなく、分類アーカイブにしたいと考えています。これに問題がある場合は、登録順を逆にしてください。まず分類法、次にカスタム投稿タイプです。

register_taxonomy(
    'freshness',
     array(), // Empty array, no post types linked
     array(
         'rewrite' => array(
             'slug' => 'type',
         )
     ),
 );
 register_post_type(
     'zombie',
     array(
         'rewrite' => array(
             'slug' => 'type/%freshness%',
         ),
         'taxonomies' => array( 'freshness' ),
     ),
 );

特別な注意:もしあなたの分類法URLが本当に/type/で始まっているなら、あなたはポストフォーマットアーカイブと衝突する可能性があります。 /type/aside/はデフォルトで "Aside"フォーマットの投稿をすべて表示します。この答えはゾンビのカスタム投稿タイプと分類法がほんの一例であると仮定しています、そしてあなたはあなたの本当の問題で別のURLフォーマットを使います。

8
Jan Fabry