добавить фильтр, чтобы добавить класс для тега ссылки в wordpress

Я хочу добавить фильтр для проверки ссылки, сгенерированной get_the_tag_list в WP. Он вызывает get_the_term_list

function get_the_term_list( $id, $taxonomy, $before = '', $sep = '', $after = '' ) {
$terms = get_the_terms( $id, $taxonomy );

if ( is_wp_error( $terms ) )
    return $terms;

if ( empty( $terms ) )
    return false;

$links = array();

foreach ( $terms as $term ) {
    $link = get_term_link( $term, $taxonomy );
    if ( is_wp_error( $link ) ) {
        return $link;
    }
    $links[] = '<a href="' . esc_url( $link ) . '" rel="tag">' . $term->name . '</a>';
}

Я хочу добавить class="tag", но я не уверен, как написать фильтр для моего файла functions.php, чтобы настроить только бит $links[] этой функции. Могу ли я просто исключить старый набор ссылок и каким-то образом добавить свой измененный?

Я думал добавить что-то вроде этого, но как-то не так:

add_filter('get_the_term_list','replace_content');
function replace_content($links[])
{
    $links[] = str_replace('<a href="', '<a class="tag" href="', $links[]);
    return $links[];
}

person antonanton    schedule 22.08.2015    source источник
comment
Какую версию Wordpress вы используете? И это только для таксономии tags?   -  person TeeDeJee    schedule 22.08.2015


Ответы (1)


Вы сделали пару ошибок. Сначала добавить фильтр на get_the_term_list не получится, потому что это не фильтр. Если вы посмотрите в коде get_the_term_list, вы увидите такую ​​строку (в зависимости от вашей версии WP)

$term_links = apply_filters( "term_links-$taxonomy", $term_links );

Таким образом, вы можете добавить фильтр на term_links-$taxonomy в вашем случае, таксономия является тегом.

Вторая ошибка, которую вы допустили, это str_replace в сочетании с массивом. Если вы хотите использовать массив, вам не нужно добавлять [] после переменной. Это только для назначения части после = следующему элементу массива. В этом случае вы делаете str_replace для всего массива, поэтому вы должны использовать $links вместо $links[] как в назначении, так и в str_replace, иначе вы добавите новый массив (с заменой строки) после всех ссылок вашего текущего массива.

add_filter( "term_links-post_tag", 'add_tag_class');

function add_tag_class($links) {
    return str_replace('<a href="', '<a class="tag" href="', $links);
}
person TeeDeJee    schedule 22.08.2015
comment
Спасибо за объяснение! У меня это в моей версии: $term_links = apply_filters( "term_links-$taxonomy", $links ); . и чтобы ответить на ваш другой вопрос, да, это только для тегов. Я использую теги как имена людей, поэтому я хочу добавить к ним класс no-wrap, чтобы они не нарушали имена, если их много. Пробовал вашу версию, но я, кажется, не замечаю, что она перехватывает этот хук $links, поскольку класс не применяется - person antonanton; 22.08.2015
comment
@antonanton Моя ошибка, это должно быть term_links-post_tag вместо term_links-tag. Смотрите мою правку. - person TeeDeJee; 22.08.2015
comment
спасибо @TeeDeJee, отлично работает. Гораздо проще, чем я мог себе представить - person antonanton; 22.08.2015