首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Wordpress自定义邮政类型-相同的邮政名称,不同的邮政类型

Wordpress自定义邮政类型-相同的邮政名称,不同的邮政类型
EN

Stack Overflow用户
提问于 2012-11-23 20:16:17
回答 6查看 4.2K关注 0票数 3

我有4种自定义邮政类型:

服务常见问题前后的价格

我希望能够在每种帖子类型中都有相同的帖子名称,例如:

服务 皮肤(example.com/Services/皮肤) “奶油”(example.com/Services/ Cream ) Body (example.com/Services/body) 常见问题 皮肤(example.com/常见问题/皮肤) 奶油(example.com/常见问题/奶油) Body (example.com/FAQ/body) 价格 皮肤(example.com/Price/皮肤) 奶油(example.com/Price/ Cream ) Body (example.com/Price/body) 前后 皮肤(example.com/前后/皮肤) 霜(example.com/前后/霜) Body (example.com/前后/body)

我该怎么做?现在,如果我创建一个与当前帖子同名的新帖子,它会在帖子的末尾添加一个"-2“或"-3”:

坏:

example.com/services/body Example.com/常见问题/正文-2 example.com/prices/body-3 Example.com/前后/body-4

救命啊!

代码语言:javascript
复制
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
));


 }
EN

回答 6

Stack Overflow用户

发布于 2013-07-08 17:21:28

我编写了一个函数,该函数可以添加到主题的functions.php文件中,其中包括mboynes在此票证中编写的修补程序:http://core.trac.wordpress.org/ticket/18962#comment:14

代码语言:javascript
复制
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);
票数 7
EN

Stack Overflow用户

发布于 2012-12-03 16:04:53

我认为这是一个尚未被wordpress程序员团队解决的bug。下面是一些关于它的其他解释:允许不同内容的重复鼻涕虫

我在这个函数中发现了一个不正确的编写代码:位于核心文件(wp_include/post.php)中的wp_unique_post_slug检查插入的permalink是否唯一。

不幸的是,我被迫黑了核心代码来修复这个错误。我已经替换了从第2859行开始的代码部分:

代码语言:javascript
复制
} 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;
    }
}

用我写的这段代码:

代码语言:javascript
复制
} 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

}

请..。如果任何人知道任何其他的解决方案,或更重要的是,如果任何人知道任何不可预测的后果,将影响我找到的解决方案,请告诉我,我会非常感激!

票数 2
EN

Stack Overflow用户

发布于 2012-11-23 21:16:53

只有一个解决办法。您的帖子需要一个唯一的标识符(slug),不能在url中使用相同的名称。除非它们是等级的。您可以使用自定义的post类型来实现这一点。用途:

代码语言:javascript
复制
        register_post_type(
            'customposttype', 
            array(
                'label' => '...',
                'description' => '...',
                'public' => true,
                'exclude_from_search' => false,
                'hierarchical' => true, ...

然后,您将能够具有不同的自定义post类型的相同名称。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13535245

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档