Pergunta

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.

Foi útil?

Solução

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a wordpress.stackexchange
scroll top