我有一个网站,有许多自定义的帖子类型,我需要一个独特的slug为每个页面。
我看到的是,wordpress在添加“-2”、“-3”之前,只检查post类型中的段塞冲突。所以我可以有“演员/foo”,“书/foo”,“书/foo-2”。我不想那样。我希望每个foo都有自己的slug,无论帖子类型如何。
我希望避免在slug上使用重写,并且我不希望编辑插件/主题之外的任何WP源。
这可能吗?
我有一个网站,有许多自定义的帖子类型,我需要一个独特的slug为每个页面。
我看到的是,wordpress在添加“-2”、“-3”之前,只检查post类型中的段塞冲突。所以我可以有“演员/foo”,“书/foo”,“书/foo-2”。我不想那样。我希望每个foo都有自己的slug,无论帖子类型如何。
我希望避免在slug上使用重写,并且我不希望编辑插件/主题之外的任何WP源。
这可能吗?
POST的唯一slug是由wp_unique_post_slug()
. 查看返回的段塞的过滤源wp_unique_post_slug
. 所以我们可以用我们自己的替换这个生成的slug。
您将在源代码中注意到,附件需要在所有类型中都具有唯一的slug,因此我们将只使用其中的代码。
您给出的示例似乎是非层次式的-并且不清楚您是否希望slug对于层次式帖子类型是唯一的(默认情况下,它只需要在树中是唯一的)-因此在下面的示例中,我忽略了层次式帖子类型。
add_filter(\'wp_unique_post_slug\', \'wpse72553_cross_type_unique_slugs\',10,5);
function wpse72553_cross_type_unique_slugs( $slug, $post_ID, $post_status, $post_type, $post_parent ){
global $wpdb, $wp_rewrite;
//Don\'t touch hierarchical post types
$hierarchical_post_types = get_post_types( array(\'hierarchical\' => true) );
if( in_array( $post_type, $hierarchical_post_types ) )
return $slug;
if( \'attachment\' == $post_type ){
//These will be unique anyway
return $slug;
}
$feeds = $wp_rewrite->feeds;
if ( ! is_array( $feeds ) )
$feeds = array();
//Lets make sure the slug is really unique:
$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;
}
return $slug;
}
我写了以下函数…add_filter(\'post_type_link\', \'events_permalink_structure\', 10, 4); function events_permalink_structure($post_link, $post, $leavename, $sample) { if ( false !== strpos( $post_link, \'%event_type%\' ) ) { $event_type