我希望我的自定义帖子类型产品不使用任何标签,例如:domain.com/product-name。下面的代码很好地解决了该问题,但是它无法用于子页面,例如:domain.com/product-name/product-name-feature,它是404s。
我最初尝试将自定义帖子类型的重写标记赋予'/',虽然这对于自定义帖子类型非常有用,但它杀死了正常页面(404)。因此,如果解决方案是使用'/'然后修复普通页面,那也可以。
// Post Type
function base_types() {
$labels = array(
'name' => 'Products & Features',
'singular_name' => 'Product',
'add_new' => 'Add New',
'add_new_item' => 'Add New Product / Feature',
'edit_item' => 'Edit Product',
'new_item' => 'New Product',
'all_items' => 'All',
'view_item' => 'View Product / Feature',
'search_items' => 'Search Product / Feature',
'not_found' => 'None found',
'not_found_in_trash' => 'None found in Trash',
'parent_item_colon' => '',
'menu_name' => 'Products / Features'
);
$args = array(
'labels' => $labels,
'public' => true,
'publicly_queryable' => true,
'show_ui' => true,
'show_in_menu' => true,
'query_var' => true,
'rewrite' => array( 'slug' => 'product', 'with_front' => false ),
'capability_type' => 'page',
'has_archive' => false,
'hierarchical' => true,
'menu_position' => 10,
'with_front' => false,
'menu_icon' => 'dashicons-chart-bar',
'supports' => array( 'title', 'editor', 'author', 'page-attributes' )
);
register_post_type( 'product', $args );
}
add_action( 'init', 'base_types' );
// Rewrites
function remove_slug( $post_link, $post, $leavename ) {
if ( 'product' != $post->post_type || 'publish' != $post->post_status ) {
return $post_link;
}
if( $post->post_parent ) {
$parent = get_post($post->post_parent);
$post_link = str_replace( '/' . $post->post_type . '/' . $parent->post_name . '/', '/' . $parent->post_name . '/', $post_link );
}
else {
$post_link = str_replace( '/' . $post->post_type . '/', '/', $post_link );
}
return $post_link;
}
add_filter( 'post_type_link', 'remove_slug', 10, 3 );
function parse_request( $query ) {
if ( ! $query->is_main_query() || 2 != count( $query->query ) || ! isset( $query->query['page'] ) ) {
return;
}
if ( ! empty( $query->query['name'] ) ) {
$query->set( 'post_type', array( 'post', 'product', 'page' ) );
}
}
add_action( 'pre_get_posts', 'parse_request' );
第一级页面按预期工作。 子页面获得正确的永久链接,但它们为404。
任何人都可以帮助或指出正确的方向吗?谢谢。
答案 0 :(得分:0)
此问题通过使用/%post_id%/
的自定义结构来解决在其他任何地方都找不到此答案,所以将其添加到我自己中。