Wordpress Custom Post Type - Same Post Name, Diffe

2019-07-18 04:28发布

I have 4 Custom Post Types:

Services FAQs Prices Before and After

I want to be able to have the same post names within each of these post types, example:

Services
Skin (example.com/Services/skin)
Cream (example.com/Services/cream)
Body (example.com/Services/body)

FAQs
Skin (example.com/FAQs/skin)
Cream (example.com/FAQs/cream)
Body (example.com/FAQs/body)

Prices
Skin (example.com/Prices/skin)
Cream (example.com/Prices/cream)
Body (example.com/Prices/body)

Before and After
Skin (example.com/before-and-after/skin)
Cream (example.com/before-and-after/cream)
Body (example.com/before-and-after/body)

How can I do this? Right now if I make a new post with the same name as a current one, it adds a "-2" or "-3" to the end of the posts slug:

BAD:

example.com/services/body

example.com/faqs/body-2

example.com/prices/body-3

example.com/before-and-after/body-4

SOMEONE PLEASE HELP!!!!!

add_action('init', 'create_post_type_html5'); // Add our HTML5 Blank Custom Post Type
function create_post_type_html5()
 {
  register_taxonomy_for_object_type('category', 'html5-blank'); // Register Taxonomies for Category
register_taxonomy_for_object_type('post_tag', 'html5-blank');
register_post_type('html5-blank', // Register Custom Post Type
    array(
    'labels' => array(
        'name' => __('Services', 'html5blank'), // Rename these to suit
        'singular_name' => __('Services', 'html5blank'),
        'add_new' => __('Add New', 'html5blank'),
        'add_new_item' => __('Add New Services', 'html5blank'),
        'edit' => __('Edit', 'html5blank'),
        'edit_item' => __('Edit Services', 'html5blank'),
        'new_item' => __('New Services', 'html5blank'),
        'view' => __('View Services', 'html5blank'),
        'view_item' => __('View Services', 'html5blank'),
        'search_items' => __('Search Services', 'html5blank'),
        'not_found' => __('No Servicess found', 'html5blank'),
        'not_found_in_trash' => __('No Service\'s found in Trash', 'html5blank')
    ),
    'rewrite' => array('slug' => 'service','with_front' => true),
    'public' => true,
    'hierarchical' => true, // Allows your posts to behave like Hierarchy Pages
    'has_archive' => true,
    'supports' => array(
        'title',
        'editor',
        'excerpt',
        'thumbnail'
    ), // Go to Dashboard Custom HTML5 Blank post for supports
    'can_export' => true, // Allows export in Tools > Export
    'taxonomies' => array(
        'post_tag',
        'category'
    ) // Add Category and Post Tags support
));


 }

标签: wordpress
6条回答
等我变得足够好
2楼-- · 2019-07-18 05:00

There is only one solution. Your posts need a unique identifier (slug) and cannot be named the same in the url. Except if they are hierarchical. And you can do that with custom post types. Use :

        register_post_type(
            'customposttype', 
            array(
                'label' => '...',
                'description' => '...',
                'public' => true,
                'exclude_from_search' => false,
                'hierarchical' => true, ...

Then you will be able to have identical names with different custom post types

查看更多
祖国的老花朵
3楼-- · 2019-07-18 05:00

One solution may be to change your rewrite rules for with_front to false. For example, if you set

'rewrite => array( 
    'slug' => 'service',
    'with_front' => 'false'
)

you should be able to use the same categories/taxonomies in each one without conflicts.

Depending on what you're doing, you may have to define a unique taxonomy for each custom post type as well.

查看更多
姐就是有狂的资本
4楼-- · 2019-07-18 05:04

Mind not to post different codes on the two questions you have sent.

查看更多
【Aperson】
5楼-- · 2019-07-18 05:14

I think that this is a bug not yet solved by wordpress programmer team. Here are some other explanation about it : Allow duplicate slugs for different content

I found an uncorrect written code in this function: wp_unique_post_slug located in the core file (wp_includes/post.php) checking wether the permalink inserted is unique or not.

Unfortunately, I was forced to hack core code to fix the bug. I've replaced this code portion started from line 2859:

} elseif ( in_array( $post_type, $hierarchical_post_types ) ) {
    // Page slugs must be unique within their own trees. Pages are in a separate
    // namespace than posts so page slugs are allowed to overlap post slugs.
    $check_sql = "SELECT post_name FROM $wpdb->posts WHERE post_name = %s AND post_type IN ( '" . implode( "', '", esc_sql( $hierarchical_post_types ) ) . "' ) AND ID != %d AND post_parent = %d LIMIT 1";
    $post_name_check = $wpdb->get_var( $wpdb->prepare( $check_sql, $slug, $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_ID, $post_parent ) );
            $suffix++;
        } while ( $post_name_check );
        $slug = $alt_post_name;
    }
}

with this code written by me:

} elseif ( in_array( $post_type, $hierarchical_post_types ) ) {

    // HACK
    foreach($hierarchical_post_types as $pt){

            // Page slugs must be unique within their own trees. Pages are in a separate
            // namespace than posts so page slugs are allowed to overlap post slugs.                                

            // HACK
            $check_sql_andrea = "SELECT post_name FROM $wpdb->posts WHERE post_name = %s AND post_type = %s AND ID != %d AND post_parent = %d LIMIT 1";
            // HACK
            $post_name_check = $wpdb->get_var( $wpdb->prepare( $check_sql_andrea, $slug, $pt, $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";
                    // HACK
                    $post_name_check = $wpdb->get_var( $wpdb->prepare( $check_sql_andrea, $alt_post_name, $pt, $post_ID, $post_parent ) );
                    $suffix++;
                } while ( $post_name_check );
                $slug = $alt_post_name; 
                break;                          
            }
    }// END HACK

}

Please... Should anyone know any other solution to the case, or even more important should anyone know of any unpredictable consequence that would affect the solution I have found,please let me know, I would be really grateful!

查看更多
我想做一个坏孩纸
6楼-- · 2019-07-18 05:15

I have searched for other references to this problem (it occurs too with subcategories for different parent categories) and its even marked as enhancement for future release, in that ticket, I've found a reference to function wp_unique_post_slug in wp-includes/post.php. Maybe you should take a look at it and spot a way to fix the current WP misbehavior.

A dirty solution could be re-checking the full slug output and if there is no duplicates, trim the numeric suffix added, but I'm pretty newbie reading WP source code to offer more advice into this.

查看更多
倾城 Initia
7楼-- · 2019-07-18 05:17

I wrote a function that can be added to your theme's functions.php file that includes the patch written by mboynes in this ticket: http://core.trac.wordpress.org/ticket/18962#comment:14

function wp_cpt_unique_post_slug($slug, $post_ID, $post_status, $post_type, $post_parent, $original_slug) {
    if ( in_array( $post_status, array( 'draft', 'pending', 'auto-draft' ) ) )
        return $slug;

    global $wpdb, $wp_rewrite;

    // store slug made by original function
    $wp_slug = $slug;

    // reset slug to original slug
    $slug = $original_slug;

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

    $hierarchical_post_types = get_post_types( array('hierarchical' => true) );
    if ( 'attachment' == $post_type ) {
        // Attachment slugs must be unique across all types.
        $check_sql = "SELECT post_name FROM $wpdb->posts WHERE post_name = %s AND ID != %d LIMIT 1";
        $post_name_check = $wpdb->get_var( $wpdb->prepare( $check_sql, $slug, $post_ID ) );

        if ( $post_name_check || in_array( $slug, $feeds ) || apply_filters( 'wp_unique_post_slug_is_bad_attachment_slug', false, $slug ) ) {
            $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_ID ) );
                $suffix++;
            } while ( $post_name_check );
            $slug = $alt_post_name;
        }
    } elseif ( in_array( $post_type, $hierarchical_post_types ) ) {
        if ( 'nav_menu_item' == $post_type )
            return $slug;
        // Page slugs must be unique within their own trees. Pages are in a separate
        // namespace than posts so page slugs are allowed to overlap post slugs.
        $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;
        }
    } else {
        // Post slugs must be unique across all posts.
        $check_sql = "SELECT post_name FROM $wpdb->posts WHERE post_name = %s AND post_type = %s AND ID != %d LIMIT 1";
        $post_name_check = $wpdb->get_var( $wpdb->prepare( $check_sql, $slug, $post_type, $post_ID ) );

        if ( $post_name_check || in_array( $slug, $feeds ) || apply_filters( 'wp_unique_post_slug_is_bad_flat_slug', false, $slug, $post_type ) ) {
            $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 ) );
                $suffix++;
            } while ( $post_name_check );
            $slug = $alt_post_name;
        }
    }

    return $slug;
}
add_filter('wp_unique_post_slug', 'wp_cpt_unique_post_slug', 10, 6);
查看更多
登录 后发表回答