你好@jonasl:
我问了一个澄清的问题,但我会继续,至少开始回答。
WordPress内核中控制post段塞并向其添加数字以使其唯一的功能是wp_unique_post_slug()
. 在WordPress 3.0.3中,您可以在/wp-includes/post.php
. 我在下面完整地复制了它,供您审阅。
你会注意到它说“附件段塞在所有类型中都必须是唯一的”,所以如果你的孩子post_type=\'attachments\'
那么这就是迫使他们与众不同的原因。此外,您会注意到,post类型必须具有\'hierarchical\'=>true
或者,这将迫使他们在所有帖子中都是独一无二的。
function wp_unique_post_slug( $slug, $post_ID, $post_status, $post_type, $post_parent ) {
if ( in_array( $post_status, array( \'draft\', \'pending\', \'auto-draft\' ) ) )
return $slug;
global $wpdb, $wp_rewrite;
$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 ) ) {
$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 ) ) {
// 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( \'@^(page)?\\d+$@\', $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, $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 ) ) {
$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;
}
如果您没有将附件作为子项使用(我担心这是基于您的问题),那么您可以将帖子类型定义为
\'hierarchical\'=>true
. 如果你做不到这一点,我可能会建议你在插入帖子的过程中伪造它,但我不能保证这样做不会导致WordPress中的其他帖子被破坏。
如果您are使用附件并需要它,也许你可以解释更多你想要实现的目标,以便我们可以建议一个替代方案。