Настраивать уникальные пули страниц во всех типах сообщений

У меня есть сайт со многими настраиваемыми типами сообщений, и мне нужна уникальная пуля для каждой страницы.

То, что я вижу, – это то, что WordPress проверяет только конфликты slug в типе сообщения перед добавлением «-2», «-3». Поэтому я могу иметь «actor / foo», «book / foo», «book / foo-2». Я не хочу этого. Я хочу, чтобы каждый foo имел свой собственный slug независимо от типа сообщения.

Я хочу избежать использования перезаписи на slug, и я бы предпочел не редактировать какой-либо источник WP вне плагинов / тем.

Это возможно?

Solutions Collecting From Web of "Настраивать уникальные пули страниц во всех типах сообщений"

Уникальный пул для сообщений выполняется с помощью wp_unique_post_slug() . Глядя на источник, возвращенный слизень фильтруется wp_unique_post_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; }