Итак, как бы было замечательно, если бы теги выдавались не просто обычным списком по популярности, а в зависимости от того, какой заголовок в данный момент на странице. Ведь если в заголовке например название статьи, то выдавались бы тогда теги, связанные именно с этой статьей. Нет ничего сложно, достаточно немного знание php и некоторых функций wordpress. Приступим :).
Разделим задачу на два блока, первый – берём заголовок и разбиваем его на слова, второй – сравниваем получившиеся слова с нашими тегами и выводим те, которые подходят по сравнению.
Первая часть самая лёгкая. За заголовок отвечает функция wp_title, забьём её в переменную, уберём лишние знаки препинания и разбиваем на слова (полноценным словом будем считать часть текста, которая отделена от остальных пробелом).
1 2 3 4 5 6 |
$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(находит длину строки, необходимо указать кодировку).
Собственно получившийся код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
$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 массив некоторых значений, но основную мысль я донёс, а дальше уже дело вашего творчества ;).