Удалите настраиваемый слаг базы таксономии из архива постоянная ссылка
Я ищу правило перезаписи для удаления слага базового таксономии (темы) из постоянной ссылки на архив таксономии WordPress.
Примером функциональности, которую я ищу, является следующее:
http://website.com/topic/health
удалил бы /topic
базовый слизень и статьhttp://website.com/health/
Я уверен, что это возможно с помощью правил перезаписи, но как это будет выглядеть?
2 ответа
При регистрации пользовательской таксономии либо удалите
rewrite
аргумент или установите его в
false
.
add_action( 'init', 'namespace_register_taxonomy' );
/**
* Register a private 'Topic' taxonomy for post type 'Post'.
*/
function namespace_register_taxonomy() {
$args = [
'label'. => __( 'Genre', 'textdomain' ),
'public' => true,
'rewrite' => false,
];
register_taxonomy( 'topic', 'post', $args );
}
С использованием{$permastructname}_rewrite_rules
filter вы можете изменить правила перезаписи. Замените слаг таксономии в двух местах, чтобы он работал для вашей таксономии. Сбросьте правила перезаписи, чтобы увидеть, как они работают.
add_filter( 'topic_rewrite_rules', 'namespace_topic_rewrite_rules' );
/**
* Filters rewrite rules used for individual permastructs.
*
* @param string[] $rules Array of rewrite rules generated for the current permastruct, keyed by their regex pattern.
* @return string[] Array of rewrite rules.
*/
public function namespace_topic_rewrite_rules( array $rules ): array {
$terms = get_terms(
[
'taxonomy' => 'topic',
'hide_empty' => false,
]
);
$slugs = wp_list_pluck( $terms, 'slug' );
$slugs_pattern = '(' . implode( '|', array_unique( $slugs ) ) . ')';
$new_rules = [];
foreach ( $rules as $pattern => $query ) {
$pattern = str_replace( 'topic/([^/]+)', $slugs_pattern, $pattern );
$new_rules[ $pattern ] = $query;
}
return $new_rules;
}
Теперь, когда страница архива работает, необходимо изменить ссылку на страницу архива терминов.
add_filter( 'term_link', 'namespace_topic_term_link', 10, 3 );
/**
* Remove base from Topic taxonomy term link.
*
* @param string $termlink Term link URL.
* @param \WP_Term $term Term object.
* @param string $taxonomy Taxonomy slug.
* @return string Term link URL.
*/
public function namespace_topic_term_link( string $termlink, \WP_Term $term, string $taxonomy ): string {
if ( 'topic' === $taxonomy ) {
$termlink = str_replace( 'topic/', '', $termlink );
}
return $termlink;
}
Надеюсь, приведенный ниже код поможет вам:
function custom_topic_link( $link, $term, $taxonomy )
{
if ( $taxonomy !== 'topic' )
return $link;
return str_replace( 'topic/', '', $link );
}
add_filter( 'term_link', 'custom_topic_link', 10, 3 );