【问题标题】:Allow duplicate taxonomy slugs wordpress允许重复的分类蛞蝓 wordpress
【发布时间】:2012-09-30 03:51:34
【问题描述】:

我正在尝试在我的主题中设置分层分类法,该分类法也使用分层 slug 重写。

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

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

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

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

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

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

或者有没有更好的方法来构建分类?

我想要的结果是:

xyz.com/honda/alabama xyz.com/toyota/阿拉巴马州

谢谢。

【问题讨论】:

  • 你不能把它重新排序到xyz.com/alabama/toyota吗?并让 state 成为父母?
  • 我可以,但是当我添加 xyz.com/california/toyota 时,它将是 xyz.com/califorina/toyota-2/ 当子类别重复时,我试图阻止 -2明显不同的多个父分类。我认为这是一个 wordpress 数据库问题,我正在寻找解决方法或插件来修复。
  • 您能在帖子中添加自定义字段吗?所以选择一个,state 或 make 作为类别,然后将 cat=STATE&meta_key=make&meta_value=toyota 添加到您的 WP_Query 中?

标签: wordpress taxonomy


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    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 文件中。

    【讨论】:

    • 嗨@Mani,最好避免仅链接的答案,因为如果链接失效或被防火墙阻止等,答案将变得无用。您能否编辑您的问题以包含相关部分您在答案本身中发布的链接?保留链接以供参考,但就目前而言,您的答案需要改进。
    • 代码不是关于允许重复的分类 slug 而是关于允许重复的 post slug。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-15
      • 2020-04-06
      • 1970-01-01
      相关资源
      最近更新 更多