子帖子和非唯一帖子名称

时间:2010-12-27 作者:Jonas Lejon

我正在尝试创建如下子帖子:

/post/info//post2/info/

使用wp\\u insert\\u post()和我几乎成功了。我正在将post\\u parent设置为父post ID,post\\u类型需要为“attachment”。

但是问题是post\\u名称需要唯一,因此子页面需要是info、info2等,而这不是我想要的。因此,当将post\\u名称设置为相同时,当访问/post/info/和/post2/info/时,我将在一个页面上获取所有子页面。

有人知道是否有可能做到这一点吗?

1 个回复
最合适的回答,由SO网友:MikeSchinkel 整理而成

你好@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使用附件并需要它,也许你可以解释更多你想要实现的目标,以便我们可以建议一个替代方案。

结束

相关推荐