Фильтр Синонимов — Реверс термина при добавлении
Кто-то у себя на сайте настраивал поисковую фильтрацию запросов, корректировку фраз??
Первая часть вопроса
Бывают разные случаи, иногда настроен поиск по четким совпадениям, иногда поиск с пропуском дефиса ну и так далее. А бывает люди не грамотно пишут.
Никогда не задумывался про настройку, посмотрел логи и вот время пришло.
Был у меня фильтр для отчистки пробелов, на его базе буду фильтровать и фразы
/****[000] Search Filter */ function many_spase($query) { if ($query->is_search && !is_admin()) { $text = preg_replace('|[\s]+|s', ' ', get_search_query()); $text = preg_replace( "~( \x{C2}\x{A0}|\x{C2}\x{A0} )~m", ' ', $text ); $text = trim($text); // синонимы $synonyms = array( 'кот' => array('кошка', 'котик', 'котенок', 'котяра'), 'автомобиль' => array('машина', 'авто', 'транспорт'), // синонимы ); // проверка шляпы сверху if (isset($synonyms[$text])) { $text = $synonyms[$text][array_rand($synonyms[$text])]; } $query->query_vars['s'] = trim($text); $query->set('posts_per_page', 20); } } add_action('pre_get_posts', 'many_spase', 1);
Есть ли какие то элегантные решения, интересно на будущее.
Вторая часть вопроса
связана с добавлением тегов\терминов таким образом чтоб вордпресс искал в базе данных термин с разным порядком слов, и в случае нахождения схождений, сообщал автору. Работаю на сайте с фишками и часто возникают проблемы с японскими персонажами, имена и фамилии пишутся не в таком порядке как у нас, из-за чего плодятся клоны терминов . Код ниже в обсуждении решает вопрос и сообщает нам что есть термин которые ищется, но порядок слов другой. Важно то, что код не запрещает добавлять новый термин с другим порядком слов
РЕШЕНИЕ
добавляем врезку - код написал как смог с английским описанием, мало ли кому понадобится. Тут сразу подумал, что можно врезать подмену кириллицы, чтоб поиск автоматически выдавал когда на кириллическую раскладку забыл поменять на латинскую, но поиск выдавал возможные термины.
ВАЖНО
Нужно не забывать про оптимизацию, можно установить фильтры, чтоб не перегружать поиском все таксономии и не на всех страницах.
wp-admin/includes/ajax-actions.php
function wp_ajax_ajax_tag_search() {
$results = get_terms( // код ); // а тут свой код - проверьте переменные, уже есть несколько обновлений функции с разными переменными if( $results && ! is_wp_error( $results ) && !empty( $results ) ){ // wp_die(); } else { // count word - does not work for cyrillic - use this if ( str_word_count( $s , 0, "АаБбВвГгДдЕеЁёЖжЗзИиЙйКкЛлМмНнОоПпРрСсТтУуФфХхЦцЧчШшЩщЪъЫыЬьЭэЮюЯя" ) == 2 ) { // if ( str_word_count($search) == 2 ){ // reverse words $s = explode(' ', $s); $s = $s[1] . ' ' . $s[0]; // new check query if two words $results = get_terms( $taxonomy, array( 'name__like' => $s, 'fields' => 'names', 'hide_empty' => false ) ); } }
Третья часть вопроса
не хватает ajax и PHP запрета добавления клонов с разным порядком слов. Если есть желание, запрет можно внедрить через PHP. Код сырой, нужны функции обработки массивов и сравнения терминов.
function disallow_insert_term($term, $taxonomy) { $user = wp_get_current_user(); $term = term_exists( $term ); if ( $taxonomy === 'post_tag' && $term !== false && $term == NULL ) { return new WP_Error( 'disallow_insert_term', __('Your role does not have permission to add terms to this taxonomy') ); } return $term; } add_filter('pre_insert_term', 'disallow_insert_term', 10, 2);
А все в основном на горьком опыте )) Время сейчас такое, никто, и я тоже, не хочет учить азы оптимизация и программирования
Ориентир примерно такой
function many_spase($query) { if ($query->is_search && !is_admin()) { $text = preg_replace('|[\s]+|s', ' ', get_search_query()); $text = preg_replace( "~( \x{C2}\x{A0}|\x{C2}\x{A0} )~m", ' ', $text ); $text = trim($text); // синонимы $synonyms = array( 'кот' => array('кошка', 'котик', 'котенок', 'котяра'), 'автомобиль' => array('машина', 'авто', 'транспорт'), // синонимы ); // проверка шляпы сверху if (isset($synonyms[$text])) { $text = $synonyms[$text][array_rand($synonyms[$text])]; } $query->query_vars['s'] = trim($text); $query->set('posts_per_page', 20); } } add_action('pre_get_posts', 'many_spase', 1);
Только фраз то дофига может быть, надо прикинуть как сделать поудобней
Тут еще 2 подхода может быть, хотел влезть в код, но руки не дошли.
Думал в таксономиях произвольные поисковые поля сделать, чтоб таксономия в поиск тоже шла по разным фразам.
А далее еще задумка была, чтоб если вдруг добавлю новый термин в таксономию "Вася Петечкин" шла параллельная проверка по синонимам термина и "Вася Петечкин" == "Петечкин Вася". А то бывает когда добавляю авторов, героев, актеров, у них иногда имена склоняются Мария, Маша ну и так далее, в итоге плодятся термины, хотя суть идет про одного человека.
Вообще, у меня на одном сайте порядка 20 таксономий, и приходится при написании статьи шарить по всей странице, в итоге запилил код и сделал одно поле INPUT куда вставляю все таксономии подряд, а код уже сам распределят, что куда нужно.
Вот откуда тема с синимами и пошла
Надо как то автоматизировать добавление синонимов, в случае "Вася Петечкин" == "Петечкин Вася" - то есть поменять слова местами, это легко, но вот как то автоматизировать чтобы автоматически допилить чтобы была имитация ошибок например, вот тут вопрос
Возможно по какой то базе проверять, я хз
По поводу поиска, фильтра на изменения порядка есть, там настраивается искать точно, искать все в порядке написания , искать по всем словам.
По поводу добавления таксономии, нужно найти фильтр который при отправке термина в базу, делал 2 проверки по слагу - мне только дошло, что нужно 2 фильтра поискать 1 конвертирует слаг, это от ва есть а второй тот который врезается перед обновлением термина
Ну чего, так и нет решения?
Пока не занимался, сейчас мало времени остаётся на кодинг
нашел старый код для админки терминов, в редакторе записи\поста тоже срабатывает но не работает с автокомплитом
Сейчас можно хотя бы фильтр установить для "Дядя Вася" и "Вася Дядя". Допилить не успел, буду пробовать .
А вообще нужно лезть в код autocomplete для терминов в редакторе поста .
function disallow_insert_term($term, $taxonomy) { $user = wp_get_current_user(); $term = term_exists( $term ); if ( $taxonomy === 'post_tag' && $term !== false && $term == NULL ) { return new WP_Error( 'disallow_insert_term', __('Your role does not have permission to add terms to this taxonomy') ); return $term; } add_filter('pre_insert_term', 'disallow_insert_term', 10, 2);
пои идее тут нужно править
/wp-includes/js/jquery/ui/autocomplete.js
/wp-admin/js/tags-suggest.js
Идем дальше
буду пробовать врезаться тут - давно эту штуку искал
https://wp-kama.ru/function/wp_ajax_ajax_tag_search
https://wp-kama.ru/hook/ajax_term_search_results
kolshix, ты всегда такие интересные вопросы задаёшь, респект тебе