wordpress categories parentness
Oct 23 2009А это снова я со своим WordPress как с писанной торбой. Снова я зол и недоволен, потому что искал баги методом бинарного поиска, расставляя контрольные точки по всему шаблону, да ещё потом и по плагину небезызвестного Alex King. Тот ещё подлец, скажу я вам, не идеальный код пишет, мягко говоря.
Но я вообще не на него обозлился (хоть из-за него всё полетело), а для начала на тех, кто писал шаблон одному из моих заказчиков. Там в коде запросто можно встретить перлы в стиле:
$id = $categories[0]->parent;
if ($id = 123)
{
// do some shitty stuff
}
Я даже не о том, что некие магические числа тут (там одна магия, на самом деле), я к тому, что так проверяется, входит ли категория поста в некую высшую категорию. Мало того, что категорий может быть много (а что, если вторая содержится в родительской?), так ещё и вложенность не проверяется. Бил бы по рукам. Топором. Для начала.
Но это ещё не всё. В WordPress есть замечательная функция cat_is_ancestor_of, которая всё проверяет рекурсивно, но вот только работает она будто бы не для языка с динамической типизацией написана. На вход принимает id категорий, которые я ей благополучно скармливал через
$parent = 3; // некая родительская категория
$categories = wp_get_post_categories($post->ID);
foreach ($categories as $category)
{
if (cat_is_ancestor_of($parent, $category))
{
$id = $parent;
break;
}
}
Только вот такой код не будет у вас работать, так же как не заработал у меня, несмотря на правильность вложенности. На вход оба параметра принимаются как int, а wp_get_post_categories возвращает массив строк! Внутри cat_is_ancestor_of делается проверка is_int(), которую строки не проходят (пока не глянешь в код — не узнаешь никак, вот тебе и инкапсуляция), так что приходится менять вызов cat_is_ancestor_of на нечто в стиле
cat_is_ancestor_of($parent, (int) $category)
Так, при явном приведении типов, всё прекрасно работает. Такая вот демоническая динамическая типизация получается. Отсюда и урок: все типы надо явно приводить, а не надеяться, что язык это сделает за тебя. И тип параметров указывать как можно строже. Только бы управления памятью не захотелось %) Не попадайтесь :)




Завлекательно ты про код так пишешь) В общем удивительно, что прежний програмер хотя бы это сделал( хотя грустно…