WordPress как на ладони
Очень Удобный и Быстрый Хостинг для сайтов на WordPress. Пользуюсь сам и вам рекомендую!

Пробел как дополнительный делитель тегов

В wp теги (метки) разделяются запятыми. В wp-includes/post.php (строка 4349) прописано так:

function wp_set_post_terms( $post_id = 0, $tags = '', $taxonomy = 'post_tag', $append = false ) {
	$post_id = (int) $post_id;

	if ( ! $post_id ) {
		return false;
	}

	if ( empty( $tags ) ) {
		$tags = array();
	}

	if ( ! is_array( $tags ) ) {
		$comma = _x( ',', 'tag delimiter' );
		if ( ',' !== $comma ) {
			$tags = str_replace( $comma, ',', $tags );
		}
		$tags = explode( ',', trim( $tags, " \n\t\r\0\x0B," ) );
	}

Но встала задача, делить метки как с запятой, так и с пробелом. Т.е. слова «слово,слово1,слово2» и «слово слово1 слово2» в равной степени каждое слово станет меткой. Сейчас же второй вариант становится одной меткой «слово слово1 слово2».

Решил вопрос добавлением строки «$comma = _x( ',', 'tag delimiter' );», получилось:

function wp_set_post_terms( $post_id = 0, $tags = '', $taxonomy = 'post_tag', $append = false ) {
	$post_id = (int) $post_id;

	if ( ! $post_id ) {
		return false;
	}

	if ( empty( $tags ) ) {
		$tags = array();
	}

	if ( ! is_array( $tags ) ) {
		$comma = _x( ' ', 'tag delimiter' );
		$comma = _x( ',', 'tag delimiter' );
		if ( ' ' !== $comma ) {
			$tags = str_replace( $comma, ' ', $tags );
		}
		$tags = explode( ' ', trim( $tags, " \n\t\r\0\x0B," ) );
	}

Вроде как работает, но чувствую, что решение идиотское. Подскажите, пожалуйста, более правильное решение, возможно добавлением какого-нибудь фильтра в functions.php, что было б вообще замечательно.

0
serg.pervushin
5 лет назад
  • 1
    campusboy4754 www.youtube.com/c/wpplus

    Нельзя изменять файлы движка. При его обновлении Ваши правки затрутся.

    К сожалению, в движке напрямую не предусмотрено, чтобы можно было изменить разделитель, да оно и понятно почему. Вдруг надо ввести метку из 2 слов? У меня часто бывают метки из 2 слов, а то и больше. С разделителем "пробел" этого сделать не удастся.

    Но если прям уж сильно хочется, то рассуждаем. В функции используется _x( ',', 'tag delimiter' ) - это функция перевода. Перейдя в неё и глубже по цепочке, можно найти хук gettext_with_context, то есть мы можем переопределить значение. Вот так:

    add_filter( 'gettext_with_context', 'change_tag_delimiter', 10, 4 );
    
    function change_tag_delimiter( $translation, $text, $context, $domain ) {
    	if ( $text === ',' && $context === 'tag delimiter' && $domain === 'default' ) {
    		$translation = ' ';
    	}
    
    	return $translation;
    }

    Этот вариант работает только в классическом редакторе. Причем это влияет и на JS в метабоксе. При написании слова и нажатии "пробел" метка автоматически сформируется, как раньше. В блочном редакторе (Гутенберг) я пока не разбирался. Надо также отменить, что невозможно предусмотреть сразу два варианта использования. Тут или запятая, или пробел, или любой другой разделитель. Только один вариант делителя.

    Комментировать
На вопросы могут отвечать только зарегистрированные пользователи. Вход . Регистрация