Итак, как бы было замечательно, если бы теги выдавались не просто обычным списком по популярности, а в зависимости от того, какой заголовок в данный момент на странице. Ведь если в заголовке например название статьи, то выдавались бы тогда теги, связанные именно с этой статьей. Нет ничего сложно, достаточно немного знание php и некоторых функций wordpress. Приступим :) .

Разделим задачу на два блока, первый – берём заголовок и разбиваем его на слова, второй – сравниваем получившиеся слова с нашими тегами и выводим те, которые подходят по сравнению.

Первая часть самая лёгкая. За заголовок отвечает функция wp_title, забьём её в переменную, уберём лишние знаки препинания и разбиваем на слова (полноценным словом будем считать часть текста, которая отделена от остальных пробелом).

$tit = wp_title('', false);
$name=str_replace (' - ', ' ', $tit);
$name=str_replace (',', '', $name);
$name=str_replace ('.', '', $name);
$name=str_replace (':', '', $name);
$zah=explode(' ', trim($name));

Приступим к основной части. Чтобы получить список тегов используется функция get_tags. Для надёжности разобьём ещё и теги на слова, ведь порой теги бывают из пары слов. Алгоритм проверки сводим к следующему: необходимо проверить входит ли каждое из наших получившихся слов в название тега или наоборот, входит ли тег в слово. Например, если слово из заголовка муж, то ему соответственно подойдут теги мужчина и мужественный, действительно и обратное. Так же не забудем отсеять слова меньше 3-х букв, т.к. это обычно только предлоги, если их оставить, то от слова на выведутся все теги, содержащие этот слог(например, название, знание и др.). Во всём этом нам помогут функции eregi(ищет вхождение шаблона в строке), mb_strtolower(переводит слова к нижнему регистру в зависимости от используемой кодировки на сайте) и iconv_strlen(находит длину строки, необходимо указать кодировку).

Собственно получившийся код:

$tag_array = get_tags('orderby=count&order=DESC&number=0');
$tit = wp_title('', false);
$name=str_replace (' - ', ' ', $tit);
$name=str_replace (',', '', $name);
$name=str_replace ('.', '', $name);
$name=str_replace (':', '', $name);
$zah=explode(' ', trim($name));
if(count($zah)>0)
{	 
	 for ($x = 0; $x < count($tag_array); $x++)
	 {
		  for($z=0; $z<count($zah); $z++)
		  {
			   if(iconv_strlen($zah[$z], 'UTF-8')>3)
			   {
					$slov=explode(' ', $tag_array[$x]->name);
 
					for($y=0; $y<count($slov); $y++)
					{
						 if(eregi("^(".mb_strtolower($zah[$z]).")(.*)", $slov[$y]) or eregi("^(".$slov[$y].")(.*)", mb_strtolower($zah[$z])))
						 {
							  echo '<a href="' . get_option('home') . '/tag/' . $tag_array[$x]->slug . '/" rel="tag">';
							  echo $tag_array[$x]->name;
							  echo '</a> ';
							  unset($tag_array[$x]);
							  break;
						 }
					}
			   }
		  } 
	 }
}

Можно добавить ещё сюда проверку, что если нет тегов, то ничего не выводим, ещё можно вместо отсева по количеству букв сделать просто отсев определённых слов, используя в str_replace массив некоторых значений, но основную мысль я донёс, а дальше уже дело вашего творчества ;) .

Оставить комментарий