我有4种自定义帖子类型:
服务 常见问题解答 价格 之前和之后
我希望能够在每个帖子类型中使用相同的帖子名称,例如:
服务
皮肤(example.com/Services/skin)
奶油 (example.com/Services/cream)
正文(example.com/Services/body)常见问题
皮肤(example.com/FAQs/skin)
奶油 (example.com/FAQs/cream)
正文(example.com/FAQs/body)价格
皮肤(example.com/Prices/skin)
奶油 (example.com/Prices/cream)
正文(example.com/Prices/body)之前和之后
皮肤(example.com/before-and-after/skin)
奶油 (example.com/before-and-after/cream)
正文(example.com/before-and-after/body)
我该怎么做?现在,如果我创建一个与当前名称相同的新帖子,它会添加一个" -2"或" -3"到帖子结尾:
坏:
example.com/services/body
example.com/faqs/body-2
example.com/prices/body-3
example.com/before-and-after/body-4
有人请帮助!!!!!
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
));
}
答案 0 :(得分:6)
我编写了一个可以添加到主题的functions.php文件中的函数,该文件包含此票证中由mboynes编写的补丁: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);
答案 1 :(得分:2)
我认为这是wordpress程序员团队尚未解决的问题。 以下是其他一些解释:Allow duplicate slugs for different content
我在这个函数中找到了一个不正确的编写代码:wp_unique_post_slug位于核心文件(wp_includes / post.php)中,检查插入的永久链接是否唯一。
不幸的是,我被迫破解核心代码来修复bug。 我已经替换了从第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;
}
}
我写的这段代码:
} 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 :(得分:0)
只有一种解决方案。您的帖子需要唯一标识符(slug),并且在网址中的名称不能相同。除非他们是等级的。你可以使用自定义帖子类型来做到这一点。使用:
register_post_type(
'customposttype',
array(
'label' => '...',
'description' => '...',
'public' => true,
'exclude_from_search' => false,
'hierarchical' => true, ...
然后,您将能够使用不同的自定义帖子类型具有相同的名称
答案 3 :(得分:0)
我搜索了其他对这个问题的引用(它也发生在subcategories for different parent categories)并且甚至标记为enhancement for future release,在该票证中,我找到了对函数的引用 wp_unique_post_slug 。也许你应该看看它并找出解决当前WP不当行为的方法。
一个脏的解决方案可能是重新检查完整的slug输出,如果没有重复,修剪添加的数字后缀,但我很新手阅读 WP源代码提供更多建议。
答案 4 :(得分:0)
一种解决方案可能是将rewrite
的{{1}}规则更改为false。例如,如果您设置
with_front
你应该能够在每个类别/分类中使用相同的类别/分类而不会发生冲突。
根据您正在做的事情,您可能还必须为每个自定义帖子类型定义一个唯一的分类。
答案 5 :(得分:0)
请注意,不要在发送的两个问题上发布不同的代码。