{"id":88,"date":"2007-01-21T13:46:10","date_gmt":"2007-01-21T12:46:10","guid":{"rendered":"http:\/\/eriz.pc-inside.org\/weblog\/tworzymy-wlasny-sidebar-widzety-i-hover-w-ie-88.html"},"modified":"2007-04-23T15:02:17","modified_gmt":"2007-04-23T14:02:17","slug":"tworzymy-wlasny-sidebar-widzety-i-hover-w-ie","status":"publish","type":"post","link":"https:\/\/eriz.pcinside.pl\/weblog\/tworzymy-wlasny-sidebar-widzety-i-hover-w-ie-88.html","title":{"rendered":"Tworzymy w\u0142asny sidebar &#8211; &#8222;wid\u017cety&#8221; i :hover w IE"},"content":{"rendered":"<p>Jak zapewne zauwa\u017cyli\u015bcie, m\u00f3j sidebar w ko\u0144cu przeszed\u0142 pewn\u0105 metamorfoz\u0119. Zgodnie z tym, co sobie <a href=\"\/weblog\/nowy-skin-dla-webloga-74.html\">obieca\u0142em<\/a> zmieni\u0142em go, bo by\u0142 &#8222;niedopracowany&#8221;. Teraz postanowi\u0142em go &#8222;u\u0142ebodwazerowa\u0107&#8221; i podzieli\u0142em go na jakby wid\u017cety &#8211; s\u0105 one raczej klasyczne. Dodatkowymi s\u0105: kalendarz, najnowsze wpisy, losowe wpisy. Co do samej postaci list z linkami &#8211; \u017ceby nie straci\u0142y na zawarto\u015bci i aby nie zajmowa\u0142y tyle miejsca, to postanowi\u0142em opisy pokazywa\u0107 dopiero po wskazaniu mysz\u0105 linka.<\/p>\n<p>Teraz opisz\u0119 jak utworzy\u0107 ka\u017cdy z takich widget\u00f3w u siebie.<\/p>\n<p>Najpierw troch\u0119 teorii.<\/p>\n<p>Wszystkie opisy, kt\u00f3re pokazuj\u0105 si\u0119 po wskazaniu mysz\u0105 na link s\u0105 oparte na pseudoklasie <em>:hover<\/em>. Wszystko by by\u0142o OK, gdyby nie jeden problem: IE. Nie wiem, jak to jest w si\u00f3demce, ale we wszystkich pozosta\u0142ych na u\u017cycie <em>:hover<\/em> bez jakichkolwiek hack\u00f3w przegl\u0105darka zezwala tylko dla elementu <strong>&lt;a&gt;<\/strong>. Nie ma sensu pcha\u0107 osobnego skryptu tylko po to, aby pod IE si\u0119 m\u00f3g\u0142 opis pojawia\u0107. Owszem, mo\u017cna by by\u0142o wszystko wcisn\u0105\u0107 link, ale specyfikacja XHTML nie zezwala na umieszczanie link\u00f3w w linkach. Poza tym, inne obiekty niepotrzebnie by zmienia\u0142y wygl\u0105d. IE obs\u0142uguje technologi\u0119 zwan\u0105 <a href=\"http:\/\/msdn.microsoft.com\/workshop\/author\/behaviors\/overview.asp\">behaviours<\/a>. Wykorzysta\u0142 to autor <a href=\"http:\/\/www.xs4all.nl\/~peterned\/csshover.html\">whatever:hover<\/a>, kt\u00f3ra pozwala na &#8222;normalne&#8221; u\u017cywanie pseudoklas <em>:hover<\/em> czy <em>:focus<\/em> we wszystkich elementach. Ma tylko jedn\u0105 wad\u0119 &#8211; nie mo\u017cemy ich u\u017cy\u0107 w dynamicznie tworzonych obiektach (np. poprzez AJAX).<\/p>\n<p><!--more--><\/p>\n<p>Aby uaktywni\u0107 csshover w IE:<\/p>\n<ol>\n<li>\n<p>Skopiuj plik <em>csshover.htc<\/em> do jakiego\u015b katalogu. WXP od wersji z Service Packiem 2 wymaga r\u00f3wnie\u017c, aby serwer wysy\u0142aj\u0105cy plik ustawia\u0142 kodowanie na <em>text\/x-component htc<\/em>. Je\u015bli Tw\u00f3j dziennik stoi na serwerze obs\u0142ugiwanym przez Apache, to utw\u00f3rz plik <em>.htaccess<\/em> w katalogu z csshover i wpisz:<\/p>\n<p><code>AddEncoding text\/x-component htc<\/code><\/p>\n<p>Wolna linijka na ko\u0144cu <em>.htaccess<\/em> jest niezb\u0119dna.<\/p>\n<p>Mo\u017ce si\u0119 r\u00f3wnie\u017c zdarzy\u0107, \u017ce nie ma mo\u017cliwo\u015bci skorzystania z <em>.htaccess<\/em> lub dziennik posiadamy na serwerze innym ni\u017c Apache. W\u00f3wczas zmieniamy nazw\u0119 <em>csshover.htc<\/em> na <em>csshover.php<\/em> i na jego pocz\u0105tku dodajemy:<\/p>\n<p><code><?PHP\nheader('Content-type: text\/x-component htc');\n?><\/code>\n<\/li>\n<li>W sekcji <strong>&lt;head&gt;<\/strong> dopiszemy <a href=\"http:\/\/leksykot.top.hell.pl\/notatki\/www\/ie-hacks.shtml\">komentarz warunkowy<\/a>:<br \/>\n<code><!--[if IE]>\n\n<style type=\"text\/css\">\nbody {behavior: url('<?php bloginfo('template_directory'); ?>\/csshover.htc');}\n<\/style>\n\n\n<![endif]--><\/code><br \/>\nW zale\u017cno\u015bci od potrzeb zmieniamy \u015bcie\u017ck\u0119 do pliku albo rozszerzenie.\n<\/li>\n<\/ol>\n<p>To tyle je\u015bli chodzi o obs\u0142ug\u0119 przez przegl\u0105darki, teraz przejd\u0119 do opisu wykonania poszczeg\u00f3lnych wstawek:<\/p>\n<h3>Znowu troch\u0119 teorii<\/h3>\n<p>WordPress standardowo udost\u0119pnia nam pewien <a href=\"http:\/\/codex.wordpress.org\/Template_Tags\">wachlarz funkcji<\/a>, kt\u00f3re mo\u017cemy wykorzysta\u0107 w swoim szablonie. W naszym wypadku oka\u017c\u0105 si\u0119 one po prostu&#8230; niewystarczaj\u0105ce. Tak, dobrze napisa\u0142em. Oryginalne funkcje narzucaj\u0105 nam jeden ustalony schemat np. list z linkami, kt\u00f3ry mo\u017cemy co najwy\u017cej oddzieli\u0107 jednym tagiem. Ale co w sytuacji, gdy chcemy zrobi\u0107 co\u015b wi\u0119cej? W\u0142a\u015bnie, niezbyt wiele. Mamy jednak mo\u017cliwo\u015b\u0107 wykorzystania w\u0142asnych skrypt\u00f3w PHP w szablonach. I w\u0142a\u015bnie z tego skorzystamy. <img src=\"https:\/\/eriz.pcinside.pl\/weblog\/wp-includes\/images\/smilies\/e_wink.png\" alt=\";)\" class=\"wp-smiley\" style=\"height: 1em; max-height: 1em;\" \/><\/p>\n<p>Wi\u0119kszo\u015b\u0107 kodu (zapytania SQL), to skopiowane kawa\u0142ki oryginalnych funkcji WordPressa.<\/p>\n<h3>Kalendarz<\/h3>\n<p>Tu nie ma si\u0119 za bardzo nad czym rozwodzi\u0107. Zreszt\u0105, kod produkowany przez WordPress jest dobrze dopracowany i odpowiednio skonstruowanym CSS-em mo\u017cna z nim zrobi\u0107 praktycznie wszystko. Co trzeba do kalendarza? Ano, tylko tyle: <img src=\"https:\/\/eriz.pcinside.pl\/weblog\/wp-includes\/images\/smilies\/e_tongue.png\" alt=\":P\" class=\"wp-smiley\" style=\"height: 1em; max-height: 1em;\" \/><\/p>\n<p><code><?PHP\nget_calendar(2);\n?><\/code><\/p>\n<p>Liczba w parametrze funkcji okre\u015bla ilo\u015b\u0107 znak\u00f3w, kt\u00f3ra b\u0119dzie wy\u015bwietlana w nag\u0142\u00f3wkach tabeli przy dniach tygodnia (np. 1 &#8211; &#8222;w&#8221;, 2 &#8211; &#8222;wt&#8221;).<\/p>\n<h3>Blogroll\/w\u0142asne linki, itp.<\/h3>\n<p>Tu sytuacja b\u0119dzie troszk\u0119 bardziej skomplikowana, ale niekoniecznie. Po prostu b\u0119dzie wi\u0119cej PHP.<\/p>\n<p><code><\/p>\n<ul id=\"blogroll\" class=\"box\"><?PHP\n$links = $wpdb->get_results('SELECT * FROM '.$wpdb->links.' WHERE link_category=1 ORDER BY link_name');<br \/>\nforeach($links as $l){<br \/>\n\techo '<\/p>\n<li><a class=\"title\" href=\"'.$l->link_url.'\"'.($l->rel!='' ? 'rel=\"'.$l->rel.'\"' : '').'>'.$l->link_name.'<\/a><small>'.$l->link_description.'<\/small><\/li>\n<p>';<br \/>\n}<br \/>\n?><\/ul>\n<p><\/code><\/p>\n<p>Spowoduje to wy\u015bwietlenie listy z linkami oraz ich opisami. Domy\u015blnie sortowane wed\u0142ug nazwy, ale nic nie stoi na przeszkodzie, aby filtrowa\u0107 wyniki na podstawie innego klucza. Ich lista jest dost\u0119pna w <a href=\"http:\/\/codex.wordpress.org\/Database_Description\">WordPress Codex<\/a>.<\/p>\n<p>OK, lista ju\u017c jest, ale wygl\u0105da z lekka paskudnie. Najpierw zaopatrujemy si\u0119 w ikonki, np. <a href=\"http:\/\/famfamfam.com\/lab\/icons\/silk\/\">Silki<\/a>.<\/p>\n<p>Tak wygl\u0105da mniej wi\u0119cej m\u00f3j kawa\u0142ek arkusza styl\u00f3w:<\/p>\n<p><code lang=\"css\">ul.box<br \/>\n{list-style-type: none; padding: 0; margin: 0; border: 1px solid #DDD; width: 100%; } <\/p>\n<p>ul.box small<br \/>\n{ display: none; padding: 3px 0; color: #333; border-top: 2px solid #71BDFF; margin: 2px 0; } <\/p>\n<p>ul.box li<br \/>\n{ background: #F7F7F7 url('gfx\/asterisk_yellow.png') no-repeat; padding: 3px; padding-left: 23px; } <\/p>\n<p>ul.box li a.title<br \/>\n{ display: block; color: #555; font-weight: bold; text-decoration: none; border: none; width: 100%; } <\/p>\n<p>ul.box li:hover<br \/>\n{ background-color: #CCE6FF; } <\/p>\n<p>ul.box li:hover small<br \/>\n{ display: block; } <\/p>\n<p>ul.box a.title:hover<br \/>\n{ text-decoration: underline; } <\/p>\n<p>ul.box li:hover a.title<br \/>\n{ color: #000; } <\/p>\n<p>ul.box p<br \/>\n{ margin: 0; }<\/code><\/p>\n<p>Dostosuj i wklej do swojego CSS-a i tyle. <img src=\"https:\/\/eriz.pcinside.pl\/weblog\/wp-includes\/images\/smilies\/e_smile.png\" alt=\":)\" class=\"wp-smiley\" style=\"height: 1em; max-height: 1em;\" \/><\/p>\n<p>Dla bardziej wnikliwych: Elementem &#8222;trzymaj\u0105cym&#8221; opis jest tag <strong>&lt;small&gt;<\/strong> w stanie spoczynku jest on ukrywany, natomiast &#8211; przy najechaniu kursorem na element listy &#8211; zmieniana jest w\u0142asno\u015b\u0107 display w selektorze <em>ul.box li:hover small<\/em>. Niekoniecznie musi by\u0107 to widoczno\u015b\u0107 obiektu. Wszystko zale\u017cy od wyobra\u017ani, przepis masz. <img src=\"https:\/\/eriz.pcinside.pl\/weblog\/wp-includes\/images\/smilies\/e_wink.png\" alt=\";)\" class=\"wp-smiley\" style=\"height: 1em; max-height: 1em;\" \/><\/p>\n<p>Nast\u0119pne przyk\u0142ady b\u0119d\u0105 w wi\u0119kszo\u015bci wykorzystywa\u0142y powy\u017cszego CSS-a i koncepcj\u0119 opis\u00f3w. Zmienia\u0142 b\u0119dzie si\u0119 tylko kod PHP.<\/p>\n<h3>Ostatnie wpisy<\/h3>\n<p><code><\/p>\n<ul class=\"box\" id=\"lastEntries\"><?PHP\n$posts = $wpdb->get_results('SELECT ID, post_date, post_title, comment_count FROM '.$wpdb->posts.' WHERE post_status=\"publish\" ORDER BY post_date DESC LIMIT 5');<\/p>\n<p>foreach($posts as $l){<br \/>\n\techo '<\/p>\n<li><a class=\"title\" href=\"'.get_permalink($l->ID).'\">'.$l->post_title.'<\/a><small><strong>Kategorie:<\/strong> ';<br \/>\n\t$cats = get_the_category($l->ID);<\/p>\n<p>\t$cc = count($cats);<br \/>\n\tfor($a=0;$a<$cc;$a++){\n\t\t$cats[$a] = '<a href=\"'.get_category_link($cats[$a]->cat_ID).'\">'.$cats[$a]->cat_name.'<\/a>';<br \/>\n\t}<\/p>\n<p>\techo implode(', ', $cats);<\/p>\n<p>\techo '<br \/><strong>Komentarzy: <\/strong> '.$l->comment_count.'<br \/><strong>Data:<\/strong> ';<\/p>\n<p>\techo date('Y-m-d @ H:i:s', strtotime($l->post_date));<\/p>\n<p>\techo '<\/small><\/li>\n<p>';<br \/>\n}<br \/>\n?><\/ul>\n<p><\/code><\/p>\n<p>Podstawowe funkcje PHP s\u0105 wyr\u00f3\u017cnione, natomiast inne (pochodz\u0105ce z WP) s\u0105 opisane w <a href=\"http:\/\/codex.wordpress.org\">Codeksie<\/a>. Mo\u017cemy r\u00f3wnie\u017c zmieni\u0107 liczb\u0119 wy\u015bwietlanych wpis\u00f3w zmieniaj\u0105c <em>LIMIT 5<\/em> na dowoln\u0105 liczb\u0119.<\/p>\n<h3>Losowe wpisy<\/h3>\n<p>Sk\u0142adnia identyczna jak wy\u017cej, ale zmienia si\u0119 linijka z zapytaniem do bazy:<\/p>\n<p><code>$posts = $wpdb->get_results('SELECT ID, post_date, post_title, comment_count FROM '.$wpdb->posts.' WHERE post_status=\"publish\" ORDER BY RAND() LIMIT 5');<\/code><\/p>\n<h3>Kategorie<\/h3>\n<p><code><\/p>\n<ul class=\"box\" id=\"cats\"><?PHP\n\/\/nie myli\u0107 z kotami ;P\n$cats = $wpdb->get_results('SELECT cat_ID, cat_name, category_description, category_count FROM '.$wpdb->categories.' ORDER BY cat_name');<\/p>\n<p>foreach($cats as $c){<br \/>\n\techo '<\/p>\n<li><a class=\"title\" href=\"'.get_category_link($c->cat_ID).'\">'.$c->cat_name.'<\/a><small><strong>Opis:<\/strong> '.($c->category_description!='' ? $c->category_description : '(brak opisu)');\n<p>\techo '<br \/><strong>Wpis\u00f3w: <\/strong>'.$c->category_count;<\/p>\n<p>\techo '<\/small><\/li>\n<p>';<br \/>\n}<br \/>\n?>\n<\/ul>\n<p><\/code><\/p>\n<h3>Archiwa<\/h3>\n<p><code><\/p>\n<ul class=\"box\" id=\"archives\"><?PHP\n\/\/nazwy miesi\u0119cy\nglobal $month;\n\n$archives = $wpdb->get_results('SELECT DISTINCT YEAR(post_date) AS `year`, MONTH(post_date) AS `month`, count(ID) as posts FROM '.$wpdb->posts.' WHERE post_date < \"'.current_time('mysql').'\" AND post_date != \"0000-00-00 00:00:00\" AND post_status = \"publish\" GROUP BY YEAR(post_date), MONTH(post_date) ORDER BY post_date DESC');\n\nforeach($archives as $a){\n\techo '\n\n<li><a class=\"title\" href=\"'.get_month_link($a->year, $a->month).'\">'.sprintf(__('%1$s %2$d'), $month[zeroise($a->month,2)], $a->year).'<\/a><small><strong>Wpis\u00f3w:<\/strong> '.$a->posts.'<\/small><\/li>\n<p>';<br \/>\n}<br \/>\n?>\n<\/ul>\n<p><\/code><\/p>\n<h3>Last.fm<\/h3>\n<p><a href=\"http:\/\/lastfm.pl\">Last.fm<\/a> daje domy\u015blnie listy oparte na obrazkach. Ma to swoje zalety jak i wady. Powiedzia\u0142bym, \u017ce tych drugich jest wi\u0119cej:<\/p>\n<ul>\n<li>Zmniejszona dost\u0119pno\u015b\u0107 (syntezatory TTS nie potrafi\u0105, jeszcze, odczyta\u0107 tekstu z obrazk\u00f3w),<\/li>\n<li>Minimalne wr\u0119cz mo\u017cliwo\u015bci ustalania wygl\u0105du w\u0142asnego notowania.<\/li>\n<\/ul>\n<p>Co mo\u017cna zrobi\u0107? Pocz\u0105tkowo wydaje si\u0119, \u017ce nic. B\u0142\u0105d, da si\u0119. <img src=\"https:\/\/eriz.pcinside.pl\/weblog\/wp-includes\/images\/smilies\/e_smile.png\" alt=\":)\" class=\"wp-smiley\" style=\"height: 1em; max-height: 1em;\" \/> Mianowicie, po zalogowaniu do last.fm mamy link Narz\u0119dzia i \u0179r\u00f3d\u0142a danych. W\u0142a\u015bnie one przyjd\u0105 nam z pomoc\u0105. W poni\u017cszym skrypcie wykorzystamy plik TXT dla ostatnio odgrywanych utwor\u00f3w. Dost\u0119pny jest on pod adresem <em>http:\/\/ws.audioscrobbler.com\/1.0\/user\/U\u017bYTKOWNIK\/recenttracks.txt<\/em>.<\/p>\n<p>Napiszemy teraz skrypt, kt\u00f3ry b\u0119dzie \u00f3w plik cache&#8217;owa\u0142. Dlaczego?<\/p>\n<ul>\n<li>Na stronie mo\u017cemy przeczyta\u0107, \u017ce dozwolone jest maksymalnie jedno wys\u0142anie \u017c\u0105dania do \u017ar\u00f3d\u0142a danych na sekund\u0119. Niby du\u017co, ale przy wi\u0119kszej liczbie odwiedzin mo\u017cemy mie\u0107 problemy.<\/li>\n<li>Serwery s\u0105 cz\u0119sto przeci\u0105\u017cone.<\/li>\n<\/ul>\n<p>A wi\u0119c do roboty. W katalogu szablonu tworzymy plik <em>lastfm.cache.php<\/em> z zawarto\u015bci\u0105:<\/p>\n<p><code><?PHP\nfunction cacheTracks(){\n\t\/\/gdzie U\u017bYTKOWNIK, to wstaw sw\u00f3j login na last.fm\n\t$data = file_get_contents('http:\/\/ws.audioscrobbler.com\/1.0\/user\/U\u017bYTKOWNIK\/recenttracks.txt');\n\t\n\tif($data===false OR $data==''){\n\t\treturn file_get_contents(TEMPLATEPATH.'\/lastfm.cache');\n\t}\n\n\t$p = file_put_contents(TEMPLATEPATH.'\/lastfm.cache', $data);\n\t\/\/je\u015bli nie posiadamy PHP 5, to usu\u0144 poprzedni\u0105 linijk\u0119 i odkomentuj:\n\t#$p = fopen(TEMPLATEPATH.'\/lastfm.cache', 'w');\n\t#flock($p, LOCK_EX);\n\t#fwrite($p, $data);\n\t#fclose($p);\n\t\n\treturn $data;\n}\n\nif(!file_exists(TEMPLATEPATH.'\/lastfm.cache')){\n\t$data = cacheTracks();\n}else{\n\t\/\/zamiast 3600 wstaw czas w sekundach, na kt\u00f3ry ma by\u0107 cache'owana lista.\n\tif(time()-filemtime(TEMPLATEPATH.'\/lastfm.cache')>3600){<br \/>\n\t\t$data = cacheTracks();<br \/>\n\t}else{<br \/>\n\t\t$data = file_get_contents(TEMPLATEPATH.'\/lastfm.cache');<br \/>\n\t}<br \/>\n}<\/p>\n<p>if($data!=''){<br \/>\n\t$data = explode(\"\\n\", trim($data));<br \/>\n\t$tracks = array();<br \/>\n\tforeach($data as $r){<br \/>\n\t\t$a = explode(',', $r);<br \/>\n\t\t$track['time'] = $a[0];<br \/>\n\t\tunset($a[0]);<br \/>\n\t\t$track['name'] = implode(', ', $a);<br \/>\n\t\t$track['name'] = explode(' '.chr(226).' ', $track['name']);<br \/>\n\t\t$tracks[] = $track;<br \/>\n\t}<br \/>\n}else{<br \/>\n\t$tracks = array();<br \/>\n}<br \/>\n?><\/code><\/p>\n<p>Nast\u0119pnie, utw\u00f3rz plik <em>lastfm.cache<\/em> i ustaw mu prawa dost\u0119pu do zapisu<\/p>\n<p>Teraz w sidebarze:<\/p>\n<p><code><\/p>\n<ul class=\"box\" id=\"lastfm\">\n<?PHP\nrequire TEMPLATEPATH.'\/lastfm.cache.php';\nif(count($tracks)>0){<br \/>\n\tforeach($tracks as $t){<br \/>\n\t\techo '<\/p>\n<li><a href=\"http:\/\/lastfm.pl\/music\/'.urlencode($t['name'][0]).'\/_\/'.urlencode($t['name'][1]).'\" class=\"title\">'.$t['name'][1].'<\/a><small><strong>Wykonawca:<\/strong> <a href=\"http:\/\/lastfm.pl\/music\/'.urlencode($t['name'][0]).'\">'.$t['name'][0].'<\/a><br \/><strong>Odtwarzany<\/strong>: '.date('Y-m-d H:i:s', $t['time']).'<\/small><\/li>\n<p>';<br \/>\n\t}<br \/>\n}<br \/>\n?>\n<\/ul>\n<p><\/code><\/p>\n<h3>Del.ic.je<\/h3>\n<p>Teraz to samo dla <a href=\"http:\/\/del.icio.us\">Delicji<\/a>.<\/p>\n<p>Serwis pobieranie danych umo\u017cliwia tylko za po\u015brednictwem JSON\/RSS. Wybra\u0142em JSON. Post\u0119powanie praktycznie podobne do last.fm, ale nie do ko\u0144ca. Po pierwsze, musimy posiada\u0107 bibliotek\u0119, kt\u00f3ra umo\u017cliwi rozkodowanie danych JSON do postaci zmiennych PHP. Mamy dwa wyj\u015bcia: PHP5 posiada wbudowan\u0105 obs\u0142ug\u0119 JSON-a, ale 4 nie. Opisz\u0119 tu wersj\u0119 dla czw\u00f3rki i w komentarzach spos\u00f3b przej\u015bcia na PHP5.<\/p>\n<p>Je\u015bli mamy do dyspozycji PHP5 (5.2.0) z rozszerzeniem JSON, to mo\u017cemy ten punkt pomin\u0105\u0107.<\/p>\n<p><strong>PHP4<\/strong>: \u015aci\u0105gamy <a href=\"http:\/\/mike.teczno.com\/JSON\/JSON.phps\">\u017ar\u00f3d\u0142o<\/a> JSON-PHP i zapisujemy w folderze skina pod nazw\u0105 <em>json.php<\/em>. Teraz tworzymy pliki analogicznie jak w przypadku last.fm, ale o innych nazwach &#8211; <em>delicious.cache<\/em>, <em>delicious.cache.php<\/em>.<\/p>\n<p>Dla <em>delicous.cache<\/em> ustaw prawa do zapisu.<\/p>\n<p>delicious.cache.php:<\/p>\n<p><code><?PHP\nfunction cacheDelicious(){\n\t\/\/LOGIN - Tw\u00f3j login, count=10 - liczba zasysanych delicji\n\t$data = file_get_contents('http:\/\/del.icio.us\/feeds\/json\/LOGIN?count=10&#038;raw');\n\n\tif($data===false OR $data==''){\n\t\treturn file_get_contents(TEMPLATEPATH.'\/delicious.cache');\n\t}\n\t\n\tif($data==''){\n\t\treturn;\n\t}\n\t\n\t\/\/je\u015bli PHP z JSON, to wywal 2 poni\u017csze linijki\n\trequire 'json.php';\n\t$JSON = new Services_JSON;\n\t\/\/...dla 5 zmie\u0144 to na json_decode...\n\t$data = $JSON->decode($data);<\/p>\n<p>\t\/\/... a te cztery na file_put_contents(TEMPLATEPATH.'\/delicious.cache', serialize($data));<br \/>\n\t$p = fopen(TEMPLATEPATH.'\/delicious.cache', 'w');<br \/>\n\tflock($p, LOCK_EX);<br \/>\n\tfwrite($p, serialize($data));<br \/>\n\tfclose($p);<\/p>\n<p>\treturn $data;<\/p>\n<p>}<\/p>\n<p>if(!file_exists(TEMPLATEPATH.'\/delicious.cache')){<br \/>\n\t$data = cacheDelicious();<br \/>\n}else{<br \/>\n\tif(time()-filemtime(TEMPLATEPATH.'\/delicious.cache')>3600){<br \/>\n\t\t$data = cacheDelicious();<br \/>\n\t}else{<br \/>\n\t\t$data = file_get_contents(TEMPLATEPATH.'\/delicious.cache');<br \/>\n\t\t$data = unserialize($data);<br \/>\n\t}<br \/>\n}<br \/>\n?><\/code><\/p>\n<p>Teraz w sidebarze:<\/p>\n<p><code><\/p>\n<ul class=\"box\" id=\"delicious\"><?PHP\nrequire TEMPLATEPATH.'\/delicious.cache.php';\nif(count($data)>0){<br \/>\n\tforeach($data as $t){<br \/>\n\t\t$tags = array();<br \/>\n\t\tforeach($t->t as $u){<br \/>\n\t\t\t\/\/zamie\u0144 U\u017bYTKOWNIK na sw\u00f3j login<br \/>\n\t\t\t$tags[] = '<a href=\"http:\/\/del.icio.us\/U\u017bYTKOWNIK\/'.$u.'\">'.$u.'<\/a>';<br \/>\n\t\t}<\/p>\n<p>\t\t$tags = implode(', ', $tags);<\/p>\n<p>\t\techo '<\/p>\n<li><a href=\"'.$t->u.'\" class=\"title\">'.$t->d.'<\/a><small>'.($t->n!='' ? $t->n.'<br \/>' : '').'<strong>Tagi: <\/strong>'.$tags.'<\/small><\/li>\n<p>';<br \/>\n\t}<br \/>\n}<br \/>\n?><\/ul>\n<p><\/code><\/p>\n<h3>Dostosowanie do w\u0142asnych potrzeb<\/h3>\n<p>Jak zapewne zauwa\u017cy\u0142e\u015b(a\u015b), przy ka\u017cdym <strong>&lt;ul&gt;<\/strong> opr\u00f3cz nazwy klasy znajduje si\u0119 r\u00f3wnie\u017c ID. Pos\u0142u\u017cy ono nam do upi\u0119kszania poszczeg\u00f3lnych list, np. do zmiany ikonek:<\/p>\n<p><code lang=\"css\">#archives li<br \/>\n{ background-image: url('gfx\/calendar_view_day.png') !important;} <\/code><\/p>\n<p><del>My\u015bla\u0142em jeszcze o <a href=\"http:\/\/del.icio.us\">Delicjach<\/a>, ale musz\u0119 troch\u0119 posiedzie\u0107 nad tym, bo tam do dyspozycji jest tylko JSON. Kto wie, mo\u017ce kiedy b\u0119d\u0119 mia\u0142 czas&#8230; <img src=\"https:\/\/eriz.pcinside.pl\/weblog\/wp-includes\/images\/smilies\/e_smile.png\" alt=\":)\" class=\"wp-smiley\" style=\"height: 1em; max-height: 1em;\" \/><\/del> &#8211; korci\u0142o, korci\u0142o i jest. <img src=\"https:\/\/eriz.pcinside.pl\/weblog\/wp-includes\/images\/smilies\/e_smile.png\" alt=\":)\" class=\"wp-smiley\" style=\"height: 1em; max-height: 1em;\" \/><\/p>\n<p><small>Nanios\u0142em par\u0119 poprawek.<\/small><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Jak zapewne zauwa\u017cyli\u015bcie, m\u00f3j sidebar w ko\u0144cu przeszed\u0142 pewn\u0105 metamorfoz\u0119. Zgodnie z tym, co sobie obieca\u0142em zmieni\u0142em go, bo by\u0142 &#8222;niedopracowany&#8221;. Teraz postanowi\u0142em go &#8222;u\u0142ebodwazerowa\u0107&#8221; i podzieli\u0142em go na jakby wid\u017cety &#8211; s\u0105 one raczej klasyczne. Dodatkowymi s\u0105: kalendarz, najnowsze wpisy, losowe wpisy. Co do samej postaci list z linkami &#8211; \u017ceby nie straci\u0142y na [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[11,25],"tags":[30,41,66],"_links":{"self":[{"href":"https:\/\/eriz.pcinside.pl\/weblog\/wp-json\/wp\/v2\/posts\/88"}],"collection":[{"href":"https:\/\/eriz.pcinside.pl\/weblog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/eriz.pcinside.pl\/weblog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/eriz.pcinside.pl\/weblog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/eriz.pcinside.pl\/weblog\/wp-json\/wp\/v2\/comments?post=88"}],"version-history":[{"count":0,"href":"https:\/\/eriz.pcinside.pl\/weblog\/wp-json\/wp\/v2\/posts\/88\/revisions"}],"wp:attachment":[{"href":"https:\/\/eriz.pcinside.pl\/weblog\/wp-json\/wp\/v2\/media?parent=88"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/eriz.pcinside.pl\/weblog\/wp-json\/wp\/v2\/categories?post=88"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/eriz.pcinside.pl\/weblog\/wp-json\/wp\/v2\/tags?post=88"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}