kernel panic in userspace

my own self destruction
  • Blog
  • about
  • articles
    • Virtualbox bridge
    • linux blogging
    • Gentoo on Acer Extensa 5630Z
  • code
    • @unfollowr
    • WordPress
      • WordPress-bbPress syncronization
      • IE Warning
      • PostAds
    • Callisto overlay
    • @listwatcher
  • CV
  • belarusian
  • russian
  • english

wordpress categories parentness

Oct 23 2009
  • belarusian
  • russian

А это снова я со своим 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)

Так, при явном приведении типов, всё прекрасно работает. Такая вот демоническая динамическая типизация получается. Отсюда и урок: все типы надо явно приводить, а не надеяться, что язык это сделает за тебя. И тип параметров указывать как можно строже. Только бы управления памятью не захотелось %) Не попадайтесь :)

  • belarusian
  • russian

А гэта зноў я са сваім 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)

Так, пры яўным прывядзеньні тыпаў, усё прыўкрасна працуе. Такая вось дэманічная дынамічная тыпізацыя атрымліваецца. Адсюль і вывад: усе тыпы трэба яўна прыводзіць, а не чакаць, што мова зробіць гэта за цябе. І тып параметраў вызначаць як мага дакладней. Толькі б да кіраваньня памяцьцю рукі не палезьлі %) Не пападайцеся :)

« i hate wp plugins developers jQuery val() & change() tricks »

Tags
category, cat_is_ancestor_of, coding, dynamic typing, int, php, style, wordpress
Categories
Belarusian, Runix, Russian
Meta
Subscribe [ru] Subscribe [be] Comments rss Trackback
Similar
wordpress queries | multilanguage wordpress + jLanguage hacking | dathumbs still alive | WordPress – bbPress syncronization | twitter & jLanguage fix

One response to “wordpress categories parentness”

Oct 23 2009
Solid (19:13:57) :

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

Leave a comment

You can use these tags : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>


RSS antisocial feeling

  • Ворачиваться в страну шпрот собираешься?
  • (via priskorbno) хочу. давно хотел. где купить?
  • ??
  • "((foldl (+) 0 [1..100]) ^ 2) - (foldl (+) 0 (map (^ 2) [1..100]))"
  • ?

Tags

bash belarus blog blogs bugs coding concerts download friends fun gentoo google images internet javascript kde language life links linux livejournal me money music overlays perl photos php plugins portage projects rss school shell social social networks ssh studying tests twitter ubuntu univer vkontakte wifi wordpress

links

  • asocial feeling
  • Callisto overlay
  • daThumbs
  • last.fm
  • twitter
  • Vkontakte
  • ~idioteque

Recent Comments

  • Daniil.Cravetz on drafts
  • neagaoleg on Hide Mentions in Twitter Web Interface
  • neagaoleg on about
  • Martina Bella on @unfollowr
  • gamersroute.com on WordPress-bbPress syncronization
  • gamersroute.com on WordPress-bbPress syncronization
  • JohnnyBCool on @unfollowr
  • bobrik on @listwatcher
  • Alper on @listwatcher
  • itomi on WordPress-bbPress syncronization

Archives

  • January 2010 (1)
  • November 2009 (2)
  • October 2009 (5)
  • September 2009 (2)
  • August 2009 (2)
  • July 2009 (3)
  • June 2009 (1)
  • April 2009 (2)
  • March 2009 (1)
  • February 2009 (1)
  • January 2009 (2)
  • December 2008 (12)
  • November 2008 (17)
  • October 2008 (20)
  • September 2008 (13)
  • August 2008 (25)
  • July 2008 (18)
  • June 2008 (15)
  • May 2008 (7)
  • March 2008 (1)
  • February 2008 (9)
  • January 2008 (11)
  • December 2007 (24)
  • November 2007 (27)
  • October 2007 (21)

Meta

  • Log in
  • Entries RSS
  • Comments RSS
  • WordPress.org

Creative Commons License rss comments rss valid xhtml