문제

I'd like my custom post type, products, to not use a slug, eg: domain.com/product-name. The code below sorts that out nicely, however it fails to work with child pages, eg: domain.com/product-name/product-name-feature, it 404s.

I originally tried giving the custom post type the rewrite slug as '/', and while this was great for the custom post type, it killed normal pages (404). So if the solution is to use '/' and then fix normal pages, that's fine too.

// 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' );

First level pages work as expected. The child pages get the correct permalink, but they 404.

Can anyone help or point in the right direction? Thank you.

도움이 되었습니까?

해결책

This was solved by using the Permalink Setting: Custom Structure of /%post_id%/

Didn't find this answer anywhere else, so added it in myself.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 wordpress.stackexchange
scroll top