0

我正在尝试在我的主题中建立一个分层分类法,它也使用分层 slug 重写。

我有汽车品牌作为自定义分类。这将列出本田、丰田等类别……</p>

然后在每个品牌下,它会根据地理按子类别细分,例如

本田 - 阿拉巴马州 - 德克萨斯州 丰田 - 阿拉巴马州 - 德克萨斯州

我遇到的问题是有多个相同名称的子类别存在于不同的主要类别中,但完全独立。

示例:xyz.com/honda/alabama xyz.com/toyota/alabama-2

Wordpress 在第二个类别的末尾附加一个 -2。有没有办法防止永久链接中的-2?

还是有更好的方法来构建分类?

我想要的结果是:

xyz.com/honda/alabama xyz.com/toyota/Alabama

谢谢你。

4

3 回答 3

0

我很高兴终于找到了解决这个问题的方法。可以在此处找到详细说明:http ://www.cuberis.com/2013/07/wordpress-duplicate-slugs-for-different-post-types/ 。

这篇文章基本上说这是一个已知问题,有一个可用的补丁但该补丁需要编辑核心文件,可以使用以下功能解决(如果需要):

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);

该函数应包含在主题的 functions.php 文件中。

于 2015-04-22T21:21:35.190 回答
0

技术上的答案是您需要重新组织类别,WordPress 不执行它,不是很有帮助,但是您可以。从业务角度来看,我们使用(付费)插件来允许重复的 slug,它应该是内置在 WordPress 中的,但你去吧。

于 2014-01-06T22:52:25.213 回答
0

您可以使用页面而不是帖子来执行此操作。改用页面来重构您的网站。

于 2021-11-18T03:53:34.483 回答