Удалите настраиваемый слаг базы таксономии из архива постоянная ссылка

Я ищу правило перезаписи для удаления слага базового таксономии (темы) из постоянной ссылки на архив таксономии 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_rulesfilter вы можете изменить правила перезаписи. Замените слаг таксономии в двух местах, чтобы он работал для вашей таксономии. Сбросьте правила перезаписи, чтобы увидеть, как они работают.

      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 );
Другие вопросы по тегам