bbPress terms filtering & hacks
Jul 19 2010Дана задача: сделать, чтобы облако тегов в bbPress выглядело как облако тегов, а не как огромная надпись «News» в окружении других букв. Т.е. нужно убрать этот самый тег «News», чтобы всё выглядело более или менее нормально. В общем случае необходимо убрать теги, которые встречаются со слишком большим отрывом от остальных.
Есть несколько способов различной степени кривости. Я, как мне кажется, выбрал тот, что требует наименьшей крови: даже шаблон править не пришлось. Было бы отлично, если бы мы фильтровали теги прямо в функции вывода тегов, но так уж сложилось, что bbPress не поощряет таких изысков.
Пойдём обходными путями: будем фильтровать вывод get_terms по условию. В условии и прячется самая соль. Определение того, что нам нужно отфильтровать теги производится согласно стеку вызовов. Т.е. если мы находит в нём вызов функции вывода облака тегов, то необходима фильтрация:
function better_bb_tag_heat_map_exclude_filter($terms)
{
$isCaptured = false;
foreach (debug_backtrace() as $call)
{
if (isset($call['function']) && $call['function'] == 'bb_tag_heat_map')
{
$isCaptured = true;
break;
}
}
if ($isCaptured)
{
return better_bb_tag_heat_map_sort($terms);
}
return $terms;
}
add_filter('get_terms', 'better_bb_tag_heat_map_exclude_filter');
В функции фильтрации прибегаем к помощи теории вероятностей и математической статистике — будем выбирать только те записи, у которых интервал до математического ожидания меньше, чем к максимальному значению, поделённый надвое. Дисперсию использовать я как-то не захотел здесь :) Код не покажу пока что — там не сложно. Выложу вместе с плагином, как будет время.
В качестве бонуса баг в bbPress, который может вам покалечить нервы. Пока что в качестве обходного пути можно возвращать из фильтра array_values($terms), вместо $terms, где у нас ключи могут начинаться не с 0 или пропускаться. Впрочем, это то же самое, если бы новый массив заводили. Глупо и неэффективно.
Если в php4 foreach обходит объекты не по ссылке, то можно было бы обходить array_keys() тем же foreach(). bbPress & WordPress как всегда на высоте со своим кодом, да.
{ Tags: array_keys, array_values, bbpress, filters, foreach, php, wordpress }




Recent Comments