Подршка » Додаци и унапређења » cirilicna pretraga u wordpressu

  • Imam php klasu koja konvertuje cirilica-latinica za datu promeljivu. Gde u wordpress-u mogu da pronadjem promenljivu koja sadrzi unetu rec za pretragu na sajtu koji pokrece wp i da primenim klasu za preslovljavanje pre nego sto odradi pretragu kako bi rezultat pretrage cirilicnog sajta bio dobar i ako korisnik unese kljucnu rec latinicom?

Посматрање 11 одговора - 1 до 11 (од укупно 11)
  • Уредник Milan Dinić

    (@dimadin)

    Погледај како је додатак Search Everything урађен, требало би да додаш филтер за posts_search.

    Thread Starter meraklija_nis

    (@meraklija_nis)

    Meni treba prva linija u kodu wordpressa gde se koristi promenljiva koja nosi vrednost reci za pretragu koju je uneo korisnik (u svim temama vidim da se zove $s).

    I hocu da ubacim liniju koda koja ce da prebaci tekst iz latinice u cirilicu i dalje da wordpress radi sa promenljivom sve po redovnom postupku, pa i da u rezultat pretrage prikaze trazenu rec na cirilici (jer je odmah posle unosa konvertovan sadrzaj u cirilicu).

    Уредник Avram

    (@avram)

    Loš ti je pristup. Ako izmeniš kôd samog Vordpresa, sa prvim sledećim update-om sve će te izmene biti poništene pa ćeš sa svakom novom verzijom WP-a morati da vršiš izmene ponovo.

    Уредник Milan Dinić

    (@dimadin)

    Као што каже Аврам, не ваља ти то тако. Све измене које правиш у Вордпресу би требало да правиш преко сопствених функција које ћеш ставити или у свом посебном додатку или у датотеци теме functions.php.

    Стави негде ту класу да видимо како изгледа, па можда направимо и додатак који би онда могли сви да користе.

    Thread Starter meraklija_nis

    (@meraklija_nis)

    To sto sam lepo nazvao klasa zapravo nije klasa, ali zavrsava posao na klasicnim php stranicama:

    $conv_lat1250_cir1251=array("Nj"=>"Ś","NJ"=>"Ś","Lj"=>"Š","LJ"=>"Š","nj"=>"ś","lj"=>"š","A"=>"Ŕ","B"=>"Á","V"=>"Â","G"=>"Ă","D"=>"Ä","Đ"=>"€","E"=>"Ĺ","Ž"=>"Ć","Z"=>"Ç","I"=>"Č","J"=>"Ł","K"=>"Ę","L"=>"Ë","M"=>"Ě","N"=>"Í","O"=>"Î","P"=>"Ď","R"=>"Đ","S"=>"Ń","T"=>"Ň","Ć"=>"Ž","U"=>"Ó","F"=>"Ô","H"=>"Ő","C"=>"Ö","Č"=>"×","Dž"=>"Ź","Š"=>"Ř","a"=>"ŕ","b"=>"á","v"=>"â","g"=>"ă","d"=>"ä","đ"=>"","e"=>"ĺ","ž"=>"ć","z"=>"ç","i"=>"č","j"=>"Ľ","k"=>"ę","l"=>"ë","m"=>"ě","n"=>"í","o"=>"î","p"=>"ď","r"=>"đ","s"=>"ń","t"=>"ň","ć"=>"ž","u"=>"ó","f"=>"ô","h"=>"ő","c"=>"ö","č"=>"÷","dž"=>"ź","š"=>"ř");
    $s=strtr($s,$conv_lat1250_cir1251);

    …i kao sto sam rekao trazim mesto u kodu wordpress-a gde da umetnem ovaj kod da prebacuje pismo. Promenljiva $s ako je poslata latinicom ima da predje u cirilicu.

    Ako se iz ove inicijative izrodi dodatak koje ce raditi ovaj posao bila bi korist za sve korisnike wp na cirilici… jer, cirilicni wp sajt moze da se pretrazuje samo ako se ukuca rec za pretragu cirilicom.

    Уредник Avram

    (@avram)

    Imam ja brdo klasa/funkcija za preslovljavanje ćirilice u latinicu. Obrnuto preslovljavanje (iz latinice u ćirilicu) neće raditi dobro u pojedinim slučajevima, kao što je npr. reč „injekcija“.

    Ćirilično „инјекција“ se preslovljava u latinicu kako treba: „injekcija“. Ali ako probaš da reč „injekcija“ po automatizmu presloviš u ćirilicu (ono što tebi treba – latinica u ćirilicu) dobićeš „ињекција“, što je nepravilno. Sigurno ima još sličnih primera (kojih sad ne mogu da se setim), ali ako možeš da živiš sa tim, onda ne bi trebalo da ima većih problema 🙂

    Thread Starter meraklija_nis

    (@meraklija_nis)

    Poznat mi je problem, isto se dešava i sa mojim preslovljavanjem.
    Sve to nije bitno jer i samu ključnu reč prebačenu na ćirilicu želim da prikažem na stranici sa rezultatom, a korisnik u specijalnim situacijama može da primeti razliku. Samo da ja krenem od nule sa ćiriličnom pretragom kada korisnik unese reč za pretragu latinicom…

    Уредник Milan Dinić

    (@dimadin)

    Imam ja brdo klasa/funkcija za preslovljavanje ćirilice u latinicu. Obrnuto preslovljavanje (iz latinice u ćirilicu) neće raditi dobro u pojedinim slučajevima, kao što je npr. reč „injekcija“….

    Ма знам ја то него мислих да пошто већ човек зна конкретно шта је проблем, можда има и неко боље решење од познатих.

    А овде није ни битно да буде правилно пресловљавање пошто нама треба само „испод хаубе“.

    Имам скицу могућег решења у глави, у наредним данима можда буде и нечег конкретног.

    Thread Starter meraklija_nis

    (@meraklija_nis)

    Problem sam za sada rešio tako što javascript preslovljava u cirilicu odmah u polju za unos ključne reči.

    Voleo bih da vidim i druga rešenja i još uvek tražim promenljivu koja sadrži vrednost ključne reči za pretragu u wordpressu.

    Уредник Avram

    (@avram)

    Ja sam tražio ali u Codexu ne nađoh nikakvu dokumentaciju za posts_search filter. Ako bi Milan mogao da kaže nešto više o tome verujem da bih mogao prilično lako i brzo da napravim dodatak koji bi vršio posao… ako uopšte treba da se „hook-uje“ posts_search, ja to videh da je Milan gore pomenuo.

    Уредник Milan Dinić

    (@dimadin)

    Ево назнака два могућа решења. Да напоменем да она нису спремна за јавну употребу, тако да их користите ИСКЉУЧИВО за испробавање и побољшање (касније видети зашто).

    function md_convert_script($text)
        {
    	$replace = array(
    	"A" => "А",
    	"B" => "Б",
    	"V" => "В",
    	"G" => "Г",
    	"D" => "Д",
    	"Đ" => "Ђ",
    	"E" => "Е",
    	"Ž" => "Ж",
    	"Z" => "З",
    	"I" => "И",
    	"J" => "Ј",
    	"K" => "К",
    	"L" => "Л",
    	"Lj" => "Љ",
    	"M" => "М",
    	"N" => "Н",
    	"Nj" => "Њ",
    	"O" => "О",
    	"P" => "П",
    	"R" => "Р",
    	"S" => "С",
    	"T" => "Т",
    	"Ć" => "Ћ",
    	"U" => "У",
    	"F" => "Ф",
    	"H" => "Х",
    	"C" => "Ц",
    	"Č" => "Ч",
    	"Dž" => "Џ",
    	"Š" => "Ш",
    	"a" => "а",
    	"b" => "б",
    	"v" => "в",
    	"g" => "г",
    	"d" => "д",
    	"đ" => "ђ",
    	"e" => "е",
    	"ž" => "ж",
    	"z" => "з",
    	"i" => "и",
    	"j" => "ј",
    	"k" => "к",
    	"l" => "л",
    	"lj" => "љ",
    	"m" => "м",
    	"n" => "н",
    	"nj" => "њ",
    	"o" => "о",
    	"p" => "п",
    	"r" => "р",
    	"s" => "с",
    	"t" => "т",
    	"ć" => "ћ",
    	"u" => "у",
    	"f" => "ф",
    	"h" => "х",
    	"c" => "ц",
    	"č" => "ч",
    	"dž" => "џ",
    	"š" => "ш",
        );
    	return strtr($text, $replace);
        }
    function md_get_search_terms()
    	{
    		global $wp_query, $wpdb;
    		$s = $wp_query->query_vars['s'];
    		$sentence = $wp_query->query_vars['sentence'];
    		$search_terms = array();
    
    		if ( !empty($s) )
    		{
    			// added slashes screw with quote grouping when done early, so done later
    			$s = stripslashes($s);
    			if ($sentence)
    			{
    				$search_terms = array($s);
    			} else {
    				preg_match_all('/".*?("|$)|((?<=[\\s",+])|^)[^\\s",+]+/', $s, $matches);
    				$search_terms = array_map(create_function('$a', 'return trim($a, "\\"\'\\n\\r ");'), $matches[0]);
    			}
    		}
    		return $search_terms;
    	}
    function md_lattocyr_search_filter($search) {
    		global $wp_query, $wpdb;
    		$s = $wp_query->query_vars['s'];
    		$search_terms = md_get_search_terms();
    		$exact = $wp_query->query_vars['exact'];
    		//$search = '';
    
    		if ( !empty($search_terms) && is_search() ) {
    			// Building search query
    			$n = ($exact) ? '' : '%';
    			$searchand = ' OR ';
    			foreach($search_terms as $term) {
    				$term = md_convert_script($term);
    				$term = addslashes_gpc($term);
    				$search .= "{$searchand}(($wpdb->posts.post_title LIKE '{$n}{$term}{$n}') OR ($wpdb->posts.post_content LIKE '{$n}{$term}{$n}'))";
    
    			}
    			$sentence_term = $wpdb->escape($s);
    			if (!$sentence && count($search_terms) > 1 && $search_terms[0] != $sentence_term )
    			{
    				$term = md_convert_script($term);
    				$term = addslashes_gpc($term);
    				$search .= "{$searchand}(($wpdb->posts.post_title LIKE '{$n}{$term}{$n}') OR ($wpdb->posts.post_content LIKE '{$n}{$term}{$n}'))";
    
    			}
    
    			/*if ( !empty($search) )
    			$search = " OR ({$search}) ";*/
    
    		}
    
    		return $search;
    }
    add_filter('posts_search', 'md_lattocyr_search_filter');
    function md_lattocyr_search_filter($search) {
    		global $wp_query, $wpdb;
    		$s = $wp_query->query_vars['s'];
    		$search_terms = md_get_search_terms();
    		$exact = $wp_query->query_vars['exact'];
    		//$search = '';
    
    		if ( !empty($search_terms) && is_search() ) {
    			// Building search query
    			$n = ($exact) ? '' : '%';
    			$searchand = ' OR ';
    			foreach($search_terms as $term) {
    				$url = 'http://www.google.com/uds/Gtransliterate?langpair=en|sr&q=' . $term . '&key=notsupplied&v=1.0';
    				$response = wp_remote_request($url);
    				if ( is_wp_error( $response ) )
    					die('error1');
    				$my_body = wp_remote_retrieve_body($response);
    				$encoded = json_decode($my_body, true);
    				if ($encoded[responseData][transliterations][0][transliteratedWords]) {
    					foreach($encoded[responseData][transliterations][0][transliteratedWords] as $term) {
    						//$term = convert_script($term);
    						$term = addslashes_gpc($term);
    						$search .= "{$searchand}(($wpdb->posts.post_title LIKE '{$n}{$term}{$n}') OR ($wpdb->posts.post_content LIKE '{$n}{$term}{$n}'))";
    					}
    				}
    			}
    
    			$sentence_term = $wpdb->escape($s);
    			if (!$sentence && count($search_terms) > 1 && $search_terms[0] != $sentence_term )
    			{
    				$url = 'http://www.google.com/uds/Gtransliterate?langpair=en|sr&q=' . $term . '&key=notsupplied&v=1.0';
    				$response = wp_remote_request($url);
    				if ( is_wp_error( $response ) )
    					die('error1');
    				$my_body = wp_remote_retrieve_body($response);
    				$encoded = json_decode($my_body, true);
    				if ($encoded[responseData][transliterations][0][transliteratedWords]) {
    					//$term = convert_script($term);
    					$term = addslashes_gpc($encoded[responseData][transliterations][0][transliteratedWords]);
    					$search .= "{$searchand}(($wpdb->posts.post_title LIKE '{$n}{$term}{$n}') OR ($wpdb->posts.post_content LIKE '{$n}{$term}{$n}'))";
    				}
    			}
    
    			/*if ( !empty($search) )
    			$search = " OR ({$search}) ";*/
    
    		}
    
    		return $search;
    }
    add_filter('posts_search', 'md_lattocyr_search_filter');

    Прво решење је брже и захтева мање ресурса али је непрецизније, док је друго супротно од свега.

    Дакле, у првом користимо обичну замену знакова, међутим проблеми су:

    1. као што је Аврам рекао, изузеци
    2. шта ако корисник не укуца Гајеву латиницу већ енглеску?

    Друго решење користи Гуглов пресловљивач који даје више могућих исхода пресловљавања, тако да kuca и куца и кућа. То додуше може да прави и проблем када корисник експлицитно жели само један исход.

    Примећене мане оба решења:

    1. у претрагу се укључују и нацрти и ревизије, и вероватно приватни чланци
    2. уколико се користи прилагођени изборник, он „полуди“
    3. постоји проблем са тражењем израза (упити који имају знаке навода, нпр. "ovo je dobro")

    Понављам, немојте стављати ово на јавно веб место, распитаћу се како отклонити ове проблеме или наћи боље.

    Ja sam tražio ali u Codexu ne nađoh nikakvu dokumentaciju za posts_search filter.

    Документација обично садржи оне са највећом применом, мада и ту није све ажурно. Најбоље је копати по извору, или тражити примену у другим додацима.

Посматрање 11 одговора - 1 до 11 (од укупно 11)
  • Тема „cirilicna pretraga u wordpressu„ је закључана за нове одговоре.