Пробел как дополнительный делитель тегов
В 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, что было б вообще замечательно.
Нельзя изменять файлы движка. При его обновлении Ваши правки затрутся.
К сожалению, в движке напрямую не предусмотрено, чтобы можно было изменить разделитель, да оно и понятно почему. Вдруг надо ввести метку из 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 в метабоксе. При написании слова и нажатии "пробел" метка автоматически сформируется, как раньше. В блочном редакторе (Гутенберг) я пока не разбирался. Надо также отменить, что невозможно предусмотреть сразу два варианта использования. Тут или запятая, или пробел, или любой другой разделитель. Только один вариант делителя.