<?xml version="1.0" encoding="UTF-8"?> <rss version="2.0"
xmlns:content="http://purl.org/rss/1.0/modules/content/"
xmlns:wfw="http://wellformedweb.org/CommentAPI/"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:atom="http://www.w3.org/2005/Atom"
xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
><channel><title>realloc's asylum | realloc's asylum</title> <atom:link href="http://lloc.de/it/feed" rel="self" type="application/rss+xml" /><link>http://lloc.de/it/</link> <description>Blog su programmazione, ottimizzazione siti web e marketing</description> <lastBuildDate>Thu, 09 Sep 2010 15:55:34 +0000</lastBuildDate> <language>en</language> <sy:updatePeriod>hourly</sy:updatePeriod> <sy:updateFrequency>1</sy:updateFrequency> <generator>http://wordpress.org/?v=3.0.1</generator> <item><title>WordPress + Database = WPDB</title><link>http://lloc.de/it/wordpress-database-wpdb.html</link> <comments>http://lloc.de/it/wordpress-database-wpdb.html#comments</comments> <pubDate>Thu, 09 Sep 2010 15:40:23 +0000</pubDate> <dc:creator>realloc</dc:creator> <category><![CDATA[Wordpress @it]]></category> <category><![CDATA[database]]></category> <category><![CDATA[wordpress]]></category> <category><![CDATA[wpdb]]></category><guid isPermaLink="false">http://lloc.de/?p=1138</guid> <description><![CDATA[Mi risulta facile immaginare come sia possibile l&#8217;elevato numero di hack per WordPress che usano il database ma non le funzionalità proprie del CMS. Tuttavia, solo perché qualcosa apparentemente funziona non significa che sia giusto o che funzioni anche su altre installazioni. Con un paio di martellate si può adattare tutto anche allo sviluppo di software [...]]]></description> <content:encoded><![CDATA[<p style="text-align: justify;">Mi risulta facile immaginare come sia possibile l&#8217;elevato numero di hack per WordPress che usano il database ma non <a href="http://codex.wordpress.org/Function_Reference/wpdb_Class">le funzionalità proprie del CMS</a>. Tuttavia, solo perché qualcosa apparentemente funziona non significa che sia giusto o che funzioni anche su altre installazioni.</p><p style="text-align: justify;">Con un paio di martellate si può adattare tutto anche allo sviluppo di software o di componenti per WordPress. Almeno questa è l&#8217;impressione che ho quando vedo alcune strutture che in certi forum compaiono con la descrizione “non funziona”. Gli errori si potrebbero però evitare sin dall&#8217;inizio – soprattutto lavorando con il database – se si usassero funzionalità testate.</p><p style="text-align: justify;">In WordPress esiste una classe che mette a disposizione tutto ciò che è necessario per usare un database. La classe <strong>WPDB</strong> non si dovrebbe però utilizzare direttamente perché esiste già un&#8217;istanza a cui si può ricorrere tramite la variabile globale $<strong>wpdb</strong>. E&#8217; importante sapere che con le funzionalità di questo oggetto non si possono soltanto inoltrare richieste alle tabelle di WordPress ma sono anche disponibili tutti i contenuti del database della configurazione.</p><p style="text-align: justify;">Oltre al metodo generico <a href="http://codex.wordpress.org/Function_Reference/wpdb_Class#SELECT_Generic_Results">get_results</a>, che è da preferire alla funzione <em>mysql_query</em> di PHP, ci sono anche metodi per richieste diverse e altri per la manipolazione, la modifica, l&#8217;inserimento e la cancellazione dei dati. A questo proposito vorrei anche evidenziare i meccanismi di WordPress che offrono più <a href="http://codex.wordpress.org/Data_Validation#Database">sicurezza contro SQL-Injections</a>.</p><p style="text-align: justify;">Per ragioni di sicurezza si consiglia spesso di <a href="http://robrota.com/wordpress-in-sicurezza-cambiare-il-prefisso-delle-tabelle-del-database">cambiare il prefisso delle tabelle di WordPress</a>. Sono completamente d&#8217;accordo tuttavia &#8211; per fare un esempio &#8211; una richiesta diretta alla tabella <em>wp_options</em> non funzionerebbe più. <a href="http://codex.wordpress.org/Function_Reference/wpdb_Class#Tables">WPDB però referenzia già le tabelle</a> base dell&#8217;installazione, così è possibile scrivere statement SQL in modo più generico. Alla fine esiste anche la proprietà <em>$wpdb-&gt;prefix</em> che conosce anche il prefisso usato.</p><p><strong>Similar Posts:</strong><ul class="similar-posts"><li><a href="http://lloc.de/it/la-transients-api-di-wordpress.html" rel="bookmark" title="2. settembre 2010">La Transients API di WordPress</a></li><li><a href="http://lloc.de/it/pimp-a-wordpress-standard-widget.html" rel="bookmark" title="3. settembre 2010">Pimp a WordPress-Standard-Widget</a></li><li><a href="http://lloc.de/it/visualizzare-dati-xml-con-wordpress.html" rel="bookmark" title="7. settembre 2010">Visualizzare dati xml con wordpress</a></li><li><a href="http://lloc.de/it/parsing-link-reloaded.html" rel="bookmark" title="3. settembre 2010">Parsing link reloaded</a></li></ul><p></p> ]]></content:encoded> <wfw:commentRss>http://lloc.de/it/wordpress-database-wpdb.html/feed</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Visualizzare dati xml con wordpress</title><link>http://lloc.de/it/visualizzare-dati-xml-con-wordpress.html</link> <comments>http://lloc.de/it/visualizzare-dati-xml-con-wordpress.html#comments</comments> <pubDate>Tue, 07 Sep 2010 15:23:12 +0000</pubDate> <dc:creator>realloc</dc:creator> <category><![CDATA[Codice]]></category> <category><![CDATA[Wordpress @it]]></category><guid isPermaLink="false">http://lloc.de/?p=1133</guid> <description><![CDATA[Strano titolo? Lo trovo anch&#8217;io. Ma &#8220;visualizzare dati xml con wordpress&#8221; è solo un esempio dei longtail con cui i motori di ricerca mandano i visitatori al mio blog. Non ho problemi con questo, anzi! Diventa solo problematico quando riesco a capire di che cosa si tratta e vedo che viene usato il codice di [...]]]></description> <content:encoded><![CDATA[<p style="text-align: justify;">Strano titolo? Lo trovo anch&#8217;io. Ma &#8220;visualizzare dati xml con wordpress&#8221; è solo un esempio dei longtail con cui i motori di ricerca mandano i visitatori al mio blog. Non ho problemi con questo, anzi! Diventa solo problematico quando riesco a capire di che cosa si tratta e vedo che viene usato il codice di articoli preistorici, che ovviamente non è più attuale.</p><p style="text-align: justify;">WordPress fornisce diverse possibilità sopratutto in questo caso. Prima di cominciare però dovrebbe essere chiaro come si elaborano i dati (premesso che i dati siano disponibili su un server remoto) e dove li si vuole visualizzare. Quando l&#8217;obiettivo è mostrarli soltanto in una pagina, si può cercare una soluzione con un nuovo <a href="http://codex.wordpress.org/Pages#Page_Templates">Page-Template</a>. Per visualizzare l&#8217;output regolarmente prima o dopo il content dell&#8217;articolo si può cercare una soluzione con un altro filtro per <em>the_content()</em>.</p><p style="text-align: justify;">La terza possibilità è l&#8217;uso dello <a href="http://codex.wordpress.org/Shortcode_API">Shortcode API</a> di WordPress, flessibile e potente. In un articolo si scrive per esempio <strong>[countryinfo]</strong> e WordPress proverà a eseguire la funzionalità nel caso in cui sia definito uno <em>shortcode</em> corrispondente. Con un parametro l&#8217;output è ancora più flessibile: <strong>[countryinfo country="de"]</strong>. Per abilitare WordPress  dovete aggiungere qualche riga di codice nel file functions.php del tema o in un proprio <a href="http://codex.wordpress.org/Plugin_API">plugin</a>.</p><p style="text-align: justify;">In fondo si definisce soltanto una funzione che si registra con <em>add_shortcode</em>. In questa funzione si può usare <em>shortcode_atts</em> per elaborare i parametri disponibili dopo l&#8217;uso in un <em>array</em>. Si deve sapere però che l&#8217;array viene normalizzato, vale a dire ridotto ai parametri definiti. In più la funzione si aspetta che il nome dei parametri sia <em>lowercase</em> (minuscolo).</p><div class="scgeshi-container"><div class="php scgeshi"><span class="kw2">&lt;?php</span><br /> <br /> <span class="kw2">function</span> my_countryinfo <span class="br0">&#40;</span><span class="re0">$atts</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br /> &nbsp; &nbsp; <a href="http://www.php.net/extract"><span class="kw3">extract</span></a> <span class="br0">&#40;</span><br /> &nbsp; &nbsp; &nbsp; &nbsp; shortcode_atts <span class="br0">&#40;</span><br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.php.net/array"><span class="kw3">array</span></a> <span class="br0">&#40;</span><br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&quot;lang&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;de&quot;</span><span class="sy0">,</span><br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&quot;country&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;DE&quot;</span><span class="sy0">,</span><br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#41;</span><span class="sy0">,</span><br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$atts</span><br /> &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#41;</span><br /> &nbsp; &nbsp; <span class="br0">&#41;</span><span class="sy0">;</span><br /> &nbsp; &nbsp; <span class="re0">$output</span> <span class="sy0">=</span> <span class="st0">&quot;&quot;</span><span class="sy0">;</span><br /> &nbsp; &nbsp; <span class="re0">$result</span> <span class="sy0">=</span> wp_remote_get <span class="br0">&#40;</span><span class="st0">&quot;http://ws.geonames.org/countryInfo?lang=&quot;</span> <span class="sy0">.</span> <span class="re0">$lang</span> <span class="sy0">.</span> <span class="st0">&quot;&amp;country=&quot;</span> <span class="sy0">.</span> <span class="re0">$country</span><span class="br0">&#41;</span><span class="sy0">;</span><br /> &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">!</span>is_wp_error <span class="br0">&#40;</span><span class="re0">$result</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br /> &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// $result['body'] contains the requested content</span><br /> &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$output</span> <span class="sy0">=</span> <span class="re0">$result</span><span class="br0">&#91;</span><span class="st0">&quot;body&quot;</span><span class="br0">&#93;</span><span class="sy0">;</span><br /> &nbsp; &nbsp; <span class="br0">&#125;</span><br /> &nbsp; &nbsp; <span class="kw1">return</span> <span class="re0">$output</span><span class="sy0">;</span><br /> <span class="br0">&#125;</span><br /> add_shortcode <span class="br0">&#40;</span><span class="st0">&quot;countryinfo&quot;</span><span class="sy0">,</span> <span class="st0">&quot;my_countryinfo&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br /> <br /> <span class="sy1">?&gt;</span></div></div><p style="text-align: justify;">L&#8217;esempio (una richiesta a <em>GeoNames</em>) fa esattamente quanto detto finora. La funzione extract esporta le variabili nel namespace della funzione. In alternativa, si può usare l&#8217;output di <em>shortcode_atts</em> anche direttamente. Resta aperta la domanda su come si elaborano file remoti. Per non scoprire l&#8217;acqua calda ed evitare problemi, è consigliato l&#8217;uso della <a href="http://codex.wordpress.org/HTTP_API">HTTP-API di WordPress</a>. Anche questo è mostrato chiaramente nell&#8217;esempio.</p><p style="text-align: justify;">L&#8217;ultimo passo è l&#8217;elaborazione dei dati. PHP 4 è morto! Viva PHP 5 e SimpleXML o JSON, a seconda del formato preferito. Se intendete lavorare con RDF leggete anche l&#8217;articolo <a href="http://lloc.de/it/xml-json-e-rdf.html">XML, JSON e RDF</a>. Il resto del lavoro però lo lascio a voi. Buon divertimento con l&#8217;implementazione della vostra soluzione.</p><p><strong>Similar Posts:</strong><ul class="similar-posts"><li><a href="http://lloc.de/it/pimp-a-wordpress-standard-widget.html" rel="bookmark" title="3. settembre 2010">Pimp a WordPress-Standard-Widget</a></li><li><a href="http://lloc.de/it/wordpress-database-wpdb.html" rel="bookmark" title="9. settembre 2010">WordPress + Database = WPDB</a></li><li><a href="http://lloc.de/it/la-transients-api-di-wordpress.html" rel="bookmark" title="2. settembre 2010">La Transients API di WordPress</a></li><li><a href="http://lloc.de/it/xml-json-e-rdf.html" rel="bookmark" title="7. settembre 2010">XML, JSON e RDF</a></li><li><a href="http://lloc.de/it/parsing-link-reloaded.html" rel="bookmark" title="3. settembre 2010">Parsing link reloaded</a></li></ul><p></p> ]]></content:encoded> <wfw:commentRss>http://lloc.de/it/visualizzare-dati-xml-con-wordpress.html/feed</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>XML, JSON e RDF</title><link>http://lloc.de/it/xml-json-e-rdf.html</link> <comments>http://lloc.de/it/xml-json-e-rdf.html#comments</comments> <pubDate>Tue, 07 Sep 2010 09:28:24 +0000</pubDate> <dc:creator>realloc</dc:creator> <category><![CDATA[Codice]]></category><guid isPermaLink="false">http://lloc.de/?p=1131</guid> <description><![CDATA[Grazie alle funzioni native, l&#8217;elaborazione di XML (eXtensible Markup Language) e JSON (JavaScript Object Notation) non costituisce più un problema. Anche se JSON in fondo è pensato per applicazioni Ajax , preferisco il formato anche in PHP quando voglio e posso evitare l&#8217;overhead dei dati XML. Il Geonames-Webservices è un buon punto di partenza per qualche esempio [...]]]></description> <content:encoded><![CDATA[<p style="text-align: justify;">Grazie alle funzioni native, l&#8217;elaborazione di <strong>XML</strong> (eXtensible Markup Language) e <strong>JSON</strong> (JavaScript Object Notation) non costituisce più un problema. Anche se JSON in fondo è pensato per applicazioni Ajax , preferisco il formato anche in PHP quando voglio e posso evitare l&#8217;overhead dei dati XML.</p><p style="text-align: justify;">Il <a href="http://www.geonames.org/export/ws-overview.html">Geonames-Webservices</a> è un buon punto di partenza per qualche esempio perché presenta le funzioni del servizio che sono in grado di fornire i dati in almeno questi due formati. In più le funzioni di Geonames sono probabilmente molto interessanti per tanti Webmaster. Chi è interessato a richieste diverse dovrebbe consultare la documentazione del Webservice.</p><p style="text-align: justify;">Per una richiesta generica con la query london basta l&#8217;URL seguente:</p><p style="text-align: justify;"><em>http://ws.geonames.org/search?q=london&amp;maxRows=10</em></p><p style="text-align: justify;">Il parametro maxRows controlla il numero dei risultati. Per definizione il risultato viene fornito in XML. Se si vuole il formato JSON si deve aggiungere il parametro type:</p><p style="text-align: justify;"><em>http://ws.geonames.org/search?q=london&amp;maxRows=10&amp;type=json</em></p><p style="text-align: justify;">Dando un&#8217;occhiata più specifica alla lista dei Geonames-Services si scopre che si può richiedere anche il formato <strong>RDF</strong> (Resource Description Framework). Chiunque voglia entrare nel mondo del Semantic Web dovrebbe dedicarsi a prendere confidenza con questo formato.  Se non avete ancora idea di che cosa si tratti, un buon punto di partenza è <a href="http://dbpedia.org/About">DBpedia</a>.</p><p style="text-align: justify;">Le funzioni ovvero i metodi SimpleXML di PHP falliscono con RDF. Anche se il formato viene chiamato RDF/XML la classe SimpleXML presenta problemi con i due punti negli XML-Entities. Le soluzioni però ci sono. Personalmente preferisco Arc. Il pacchetto va semplicemente caricato e messo a disposizione sul server.</p><p style="text-align: justify;">Come elaborare con PHP tutti e tre i formati descritti, è illustrato dal code seguente:</p><div class="scgeshi-container"><div class="php scgeshi"><span class="kw2">&lt;?php</span><br /> <br /> <span class="re0">$url</span> <span class="sy0">=</span> <span class="st0">&quot;http://ws.geonames.org/search?q=london&amp;maxRows=10&quot;</span><span class="sy0">;</span><br /> <span class="re0">$xml</span> <span class="sy0">=</span> <a href="http://www.php.net/simplexml_load_file"><span class="kw3">simplexml_load_file</span></a> <span class="br0">&#40;</span><span class="re0">$url</span><span class="br0">&#41;</span><span class="sy0">;</span><br /> <br /> <span class="kw1">echo</span> <span class="st0">&quot;Ausgabe des SimpleXML-Objects: &lt;pre&gt;&quot;</span> <span class="sy0">.</span> <br /> &nbsp; &nbsp; <a href="http://www.php.net/print_r"><span class="kw3">print_r</span></a> <span class="br0">&#40;</span><span class="re0">$xml</span><span class="sy0">,</span> <span class="kw4">TRUE</span><span class="br0">&#41;</span> <span class="sy0">.</span> <br /> &nbsp; &nbsp; <span class="st0">&quot;&lt;/pre&gt;&quot;</span><span class="sy0">;</span><br /> <br /> <span class="re0">$json</span> <span class="sy0">=</span> <a href="http://www.php.net/file_get_contents"><span class="kw3">file_get_contents</span></a> <span class="br0">&#40;</span><span class="re0">$url</span> <span class="sy0">.</span> <span class="st0">&quot;&amp;type=json&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br /> <span class="re0">$arr</span> <span class="sy0">=</span> <a href="http://www.php.net/json_decode"><span class="kw3">json_decode</span></a> <span class="br0">&#40;</span><span class="re0">$json</span><span class="br0">&#41;</span><span class="sy0">;</span><br /> <br /> <span class="kw1">echo</span> <span class="st0">&quot;Ausgabe der JSON-Daten als Array: &lt;pre&gt;&quot;</span> <span class="sy0">.</span> <br /> &nbsp; &nbsp; <a href="http://www.php.net/print_r"><span class="kw3">print_r</span></a> <span class="br0">&#40;</span><span class="re0">$arr</span><span class="sy0">,</span> <span class="kw4">TRUE</span><span class="br0">&#41;</span> <span class="sy0">.</span> <br /> &nbsp; &nbsp; <span class="st0">&quot;&lt;/pre&gt;&quot;</span><span class="sy0">;</span><br /> <br /> <span class="kw1">include_once</span> <span class="br0">&#40;</span><span class="st0">&quot;arc/ARC2.php&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br /> <span class="re0">$parser</span> <span class="sy0">=</span> ARC2<span class="sy0">::</span><span class="me2">getRDFParser</span> <span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br /> <span class="re0">$parser</span><span class="sy0">-&gt;</span><span class="me1">parse</span> <span class="br0">&#40;</span><span class="re0">$url</span> <span class="sy0">.</span> <span class="st0">&quot;&amp;type=rdf&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br /> <span class="re0">$triples</span> <span class="sy0">=</span> <span class="re0">$parser</span><span class="sy0">-&gt;</span><span class="me1">getTriples</span> <span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br /> <br /> <span class="kw1">echo</span> <span class="st0">&quot;Ausgabe der RDF-Daten als Array: &lt;pre&gt;&quot;</span> <span class="sy0">.</span> <br /> &nbsp; &nbsp; <a href="http://www.php.net/print_r"><span class="kw3">print_r</span></a> <span class="br0">&#40;</span><span class="re0">$triples</span><span class="sy0">,</span> <span class="kw4">TRUE</span><span class="br0">&#41;</span> <span class="sy0">.</span> <br /> &nbsp; &nbsp; <span class="st0">&quot;&lt;/pre&gt;&quot;</span><span class="sy0">;</span><br /> <br /> <span class="sy1">?&gt;</span></div></div><p style="text-align: justify;">Chi è interessato all&#8217;output delle richieste può vedere anche <a href="http://lloc.de/code/xml-json-rdf.php">lo script in azione</a>.</p><p style="text-align: justify;">Have fun!</p><p><strong>Similar Posts:</strong><ul class="similar-posts"><li><a href="http://lloc.de/it/visualizzare-dati-xml-con-wordpress.html" rel="bookmark" title="7. settembre 2010">Visualizzare dati xml con wordpress</a></li><li><a href="http://lloc.de/it/la-transients-api-di-wordpress.html" rel="bookmark" title="2. settembre 2010">La Transients API di WordPress</a></li><li><a href="http://lloc.de/it/parsing-link-reloaded.html" rel="bookmark" title="3. settembre 2010">Parsing link reloaded</a></li><li><a href="http://lloc.de/it/pimp-a-wordpress-standard-widget.html" rel="bookmark" title="3. settembre 2010">Pimp a WordPress-Standard-Widget</a></li></ul><p></p> ]]></content:encoded> <wfw:commentRss>http://lloc.de/it/xml-json-e-rdf.html/feed</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Pimp a WordPress-Standard-Widget</title><link>http://lloc.de/it/pimp-a-wordpress-standard-widget.html</link> <comments>http://lloc.de/it/pimp-a-wordpress-standard-widget.html#comments</comments> <pubDate>Fri, 03 Sep 2010 17:18:04 +0000</pubDate> <dc:creator>realloc</dc:creator> <category><![CDATA[Codice]]></category> <category><![CDATA[Wordpress @it]]></category> <category><![CDATA[modifica]]></category> <category><![CDATA[standard widget]]></category> <category><![CDATA[wordpress]]></category><guid isPermaLink="false">http://lloc.de/?p=1125</guid> <description><![CDATA[Poco tempo fa ho presentato un hack che nasconde il Link-Widget nella homepage del blog. La decisione di cercare una soluzione del tipo “quick &#38; dirty” era in parte dovuta al mio gusto personale e in parte alla curiosità di capire che cosa succede all&#8217;interno di WordPress una volta attivato un widget. Alla fine ho [...]]]></description> <content:encoded><![CDATA[<p style="text-align: justify;">Poco tempo fa ho presentato un hack che <a href="http://lloc.de/das-link-widget-auf-der-startseite-deaktivieren.html">nasconde il Link-Widget nella homepage</a> del blog. La decisione di cercare una soluzione del tipo “quick &amp; dirty” era in parte dovuta al mio gusto personale e in parte alla curiosità di capire che cosa succede all&#8217;interno di WordPress una volta attivato un widget. Alla fine ho presentato una soluzione non molto bella e nemmeno raccomandabile in un ambiente più complesso.</p><p style="text-align: justify;">A questo punto, prima di presentare una soluzione un po&#8217; più elegante, voglio scrivere due righe sui widget. In rete viaggiano tante spiegazioni diverse su cosa sia un WordPress Widget. Ci sono anche articoli che descrivono questa funzionalità come qualcosa a metà strada fra tema e plugin. Ma questa la definirei una semplificazione e, di fatto, non è così!</p><p style="text-align: justify;">Naturalmente i widget esistono per definizione per essere presentati nelle sidebar dinamiche. Ma per questo motivo non diventano automaticamente una parte di un tema. Nel controllo dei widget, che si trova nel pannello di amministrazione, i widget restano disponibili, se il codice non si trova nel <em>functions.php</em> del tema, anche quando si cambia il design.</p><p style="text-align: justify;">Per un widget il fatto che il suo codice esista nel core di WordPress, nel <em>functions.php</em> del tema o in un file di un plugin, è del tutto indifferente. Importante è solo attenersi alle regole, ovvero seguire la <a href="http://codex.wordpress.org/Widgets_API">Widget-API</a>. Tra l&#8217;altro, personalmente trovo anche la denominazione API un po&#8217; infelice.</p><p style="text-align: justify;">Parlerei piuttosto di un Framework o per essere più preciso di una raccolta delle classi con qualche esempio predefinito, gli Standard Widget. Tutti i widget devono estendere la classe <em>WP_Widget</em> e devono implementare pochi metodi per integrarsi bene.</p><p style="text-align: justify;">A questo punto la domanda, perché non estendere i widget standard, è ovvia. È possibile determinare da soli quando mostrare un widget e quando no? La risposta è sì … e non solo: alla fine la soluzione risulta non solo efficace ma anche molto semplice.</p><div class="scgeshi-container"><div class="php scgeshi"><span class="kw2">&lt;?php</span><br /> <br /> <span class="kw2">class</span> MY_Widget_Links <span class="kw2">extends</span> WP_Widget_Links <span class="br0">&#123;</span><br /> <br /> &nbsp; &nbsp; <span class="kw2">function</span> widget <span class="br0">&#40;</span><span class="re0">$args</span><span class="sy0">,</span> <span class="re0">$instance</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br /> &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">!</span>is_front_page <span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">&amp;&amp;</span> <span class="sy0">!</span>is_home <span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; parent<span class="sy0">::</span><span class="me2">widget</span> <span class="br0">&#40;</span><span class="re0">$args</span><span class="sy0">,</span> <span class="re0">$instance</span><span class="br0">&#41;</span><span class="sy0">;</span><br /> &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br /> &nbsp; &nbsp; <span class="br0">&#125;</span><br /> <br /> <span class="br0">&#125;</span><br /> <br /> <span class="kw2">function</span> mywidgetlinks_load <span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br /> &nbsp; &nbsp; unregister_widget <span class="br0">&#40;</span><span class="st_h">'WP_Widget_Links'</span><span class="br0">&#41;</span><span class="sy0">;</span><br /> &nbsp; &nbsp; register_widget <span class="br0">&#40;</span><span class="st_h">'MY_Widget_Links'</span><span class="br0">&#41;</span><span class="sy0">;</span><br /> <span class="br0">&#125;</span><br /> add_action <span class="br0">&#40;</span><span class="st_h">'widgets_init'</span><span class="sy0">,</span> <span class="st_h">'mywidgetlinks_load'</span><span class="br0">&#41;</span><span class="sy0">;</span><br /> <br /> <span class="sy1">?&gt;</span></div></div><p style="text-align: justify;">Il codice si può inserire per esempio nel file <em>functions.php</em> del tema e si può spiegare anche con poche parole:</p><p style="text-align: justify;">La classe <em>MY_Widget_Links</em> estende il widget standard responsabile per la visualizzazione della blogroll. Il metodo <em>widget</em> che rende l&#8217;output controlla prima tramite i tag condizionali se la pagina non è la nostra homepage e, in tal caso, ricorre al metodo della classe parent. Presento poi una funzione che viene triggerata quando i widget vengono inizializzati, che disattiva il widget standard e infine attiva la versione modificata.</p><p><strong>Similar Posts:</strong><ul class="similar-posts"><li><a href="http://lloc.de/it/visualizzare-dati-xml-con-wordpress.html" rel="bookmark" title="7. settembre 2010">Visualizzare dati xml con wordpress</a></li><li><a href="http://lloc.de/it/wordpress-database-wpdb.html" rel="bookmark" title="9. settembre 2010">WordPress + Database = WPDB</a></li><li><a href="http://lloc.de/it/la-transients-api-di-wordpress.html" rel="bookmark" title="2. settembre 2010">La Transients API di WordPress</a></li><li><a href="http://lloc.de/it/xml-json-e-rdf.html" rel="bookmark" title="7. settembre 2010">XML, JSON e RDF</a></li><li><a href="http://lloc.de/it/parsing-link-reloaded.html" rel="bookmark" title="3. settembre 2010">Parsing link reloaded</a></li></ul><p></p> ]]></content:encoded> <wfw:commentRss>http://lloc.de/it/pimp-a-wordpress-standard-widget.html/feed</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Parsing link reloaded</title><link>http://lloc.de/it/parsing-link-reloaded.html</link> <comments>http://lloc.de/it/parsing-link-reloaded.html#comments</comments> <pubDate>Fri, 03 Sep 2010 16:03:34 +0000</pubDate> <dc:creator>realloc</dc:creator> <category><![CDATA[Codice]]></category> <category><![CDATA[Wordpress @it]]></category> <category><![CDATA[dom]]></category> <category><![CDATA[funzione]]></category> <category><![CDATA[link]]></category> <category><![CDATA[parsing]]></category><guid isPermaLink="false">http://lloc.de/?p=1124</guid> <description><![CDATA[Tre anni fa ho scritto un articolo in tedesco con il titolo Backlinks gecheckt che riceve sorprendentemente ancora una notevole quantità di traffico. Devo ammettere che le informazioni sono già piuttosto vecchiotte e non rappresentano più una soluzione per diverse problematiche nel mondo attuale. Il parsing dei link con le regular expression in realtà è [...]]]></description> <content:encoded><![CDATA[<p style="text-align: justify;">Tre anni fa ho scritto un articolo in tedesco con il titolo <a href="http://lloc.de/backlinks-gecheckt.html">Backlinks gecheckt</a> che riceve sorprendentemente ancora una notevole quantità di traffico. Devo ammettere che le informazioni sono già piuttosto vecchiotte e non rappresentano più una soluzione per diverse problematiche nel mondo attuale. Il parsing dei link con le regular expression in realtà è tutt&#8217;altro che una buona idea. HTML è context-free e le regular expression non trovano quasi regolarmente nulla.</p><p style="text-align: justify;">Più promettenti sono le diverse <a href="http://www.php.net/manual/de/domdocument.loadhtmlfile.php">funzioni DOM</a> già disponibili dall&#8217;introduzione di PHP5. Ma l&#8217;utilizzo con i siti di oggi, che spesso si servono di codici non validi, presenta ancora qualche insidia. Per fortuna esiste una soluzione che uso da tempo e con la quale si possono evitare le problematiche descritte sopra: il <a href="http://simplehtmldom.sourceforge.net/">PHP Simple HTML DOM Parser</a>.</p><p style="text-align: justify;">Il parsing dei link nei documenti HTML diventa con questa library un gioco da ragazzi. Con i meccanismi di WordPress che aiutano a rilevare pagine remote, chiunque abbia familiarità con la sintassi di jQuery si troverà benissimo. Il mio piccolo esempio mostra come si usa il parser da uno script al di fuori dell&#8217;installazione di WordPress. L&#8217;obiettivo è mostrare tutti i link della mia homepage con l&#8217;attributo nofollow:</p><p><div class="scgeshi-container"><div class="php scgeshi"><span class="kw2">&lt;?php</span><br /> <br /> <span class="kw1">require</span> <span class="br0">&#40;</span><span class="st_h">'../wp-load.php'</span><span class="br0">&#41;</span><span class="sy0">;</span><br /> <span class="kw1">require_once</span> <span class="br0">&#40;</span><span class="st_h">'simple_html_dom.php'</span><span class="br0">&#41;</span><span class="sy0">;</span><br /> <br /> <span class="re0">$result</span> <span class="sy0">=</span> wp_remote_get <span class="br0">&#40;</span><span class="st_h">'http://lloc.de/'</span><span class="br0">&#41;</span><span class="sy0">;</span><br /> <span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">!</span>is_wp_error <span class="br0">&#40;</span><span class="re0">$result</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br /> &nbsp; &nbsp; <span class="re0">$html</span> <span class="sy0">=</span> str_get_html <span class="br0">&#40;</span><span class="re0">$result</span><span class="br0">&#91;</span><span class="st_h">'body'</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy0">;</span><br /> &nbsp; &nbsp; <span class="kw1">foreach</span> <span class="br0">&#40;</span><span class="re0">$html</span><span class="sy0">-&gt;</span><span class="me1">find</span> <span class="br0">&#40;</span><span class="st_h">'a'</span><span class="br0">&#41;</span> <span class="kw1">as</span> <span class="re0">$a</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br /> &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><a href="http://www.php.net/isset"><span class="kw3">isset</span></a> <span class="br0">&#40;</span><span class="re0">$a</span><span class="sy0">-&gt;</span><span class="me1">rel</span><span class="br0">&#41;</span> <span class="sy0">&amp;&amp;</span> <span class="kw4">false</span> <span class="sy0">!==</span> <a href="http://www.php.net/strpos"><span class="kw3">strpos</span></a> <span class="br0">&#40;</span><span class="st_h">'nofollow'</span><span class="sy0">,</span> <a href="http://www.php.net/strtolower"><span class="kw3">strtolower</span></a> <span class="br0">&#40;</span><span class="re0">$a</span><span class="sy0">-&gt;</span><span class="me1">rel</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> <br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">echo</span> <span class="re0">$a</span><span class="sy0">-&gt;</span><span class="me1">href</span> <span class="sy0">.</span> <span class="st_h">' -&gt; '</span> <span class="sy0">.</span> <span class="re0">$a</span><span class="sy0">-&gt;</span><span class="me1">rel</span> <span class="sy0">.</span> <span class="st_h">'&lt;br/&gt;'</span><span class="sy0">;</span><br /> &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br /> &nbsp; &nbsp; <span class="br0">&#125;</span><br /> <span class="br0">&#125;</span></div></div><strong>Similar Posts:</strong><ul class="similar-posts"><li><a href="http://lloc.de/it/visualizzare-dati-xml-con-wordpress.html" rel="bookmark" title="7. settembre 2010">Visualizzare dati xml con wordpress</a></li><li><a href="http://lloc.de/it/pimp-a-wordpress-standard-widget.html" rel="bookmark" title="3. settembre 2010">Pimp a WordPress-Standard-Widget</a></li><li><a href="http://lloc.de/it/wordpress-database-wpdb.html" rel="bookmark" title="9. settembre 2010">WordPress + Database = WPDB</a></li><li><a href="http://lloc.de/it/la-transients-api-di-wordpress.html" rel="bookmark" title="2. settembre 2010">La Transients API di WordPress</a></li><li><a href="http://lloc.de/it/xml-json-e-rdf.html" rel="bookmark" title="7. settembre 2010">XML, JSON e RDF</a></li></ul><p></p> ]]></content:encoded> <wfw:commentRss>http://lloc.de/it/parsing-link-reloaded.html/feed</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>La Transients API di WordPress</title><link>http://lloc.de/it/la-transients-api-di-wordpress.html</link> <comments>http://lloc.de/it/la-transients-api-di-wordpress.html#comments</comments> <pubDate>Thu, 02 Sep 2010 19:03:59 +0000</pubDate> <dc:creator>realloc</dc:creator> <category><![CDATA[Codice]]></category> <category><![CDATA[Wordpress @it]]></category> <category><![CDATA[api]]></category> <category><![CDATA[cache]]></category> <category><![CDATA[transient]]></category> <category><![CDATA[wordpress]]></category><guid isPermaLink="false">http://lloc.de/?p=1122</guid> <description><![CDATA[Già dalla versione 2.8 di WordPress esiste un meccanismo nel core che permette il caching dei dati: la Transients API. Con poche righe di codice ci si può risparmiare tutto lo stress di funzionalità proprie che servono soltanto a velocizzare un plugin o una pagina con dati già elaborati. Le funzioni della Transients API sono simili alla WordPress [...]]]></description> <content:encoded><![CDATA[<p style="text-align: justify;">Già dalla versione 2.8 di WordPress esiste un meccanismo nel core che permette il caching dei dati: la <a href="http://codex.wordpress.org/Transients_API">Transients API</a>. Con poche righe di codice ci si può risparmiare tutto lo stress di funzionalità proprie che servono soltanto a velocizzare un plugin o una pagina con dati già elaborati.</p><p style="text-align: justify;">Le funzioni della <em>Transients API</em> sono simili alla WordPress <a href="http://codex.wordpress.org/Options_API">Options API</a> che dovrebbe rendere l&#8217;implementazione molto facile. Oltre ai nomi delle funzioni c&#8217;è solo una differenza: un parametro aggiuntivo che definisce la scadenza all&#8217;inserimento di un transient.</p><p style="text-align: justify;">La <em>Transients API</em> ricorre a funzionalità della <em>Options API</em> se per esempio non vengono usati meccanismi di memcache. Dando un&#8217;occhiata al codice stesso della API si capisce perché non è detto che i dati verranno salvati nella tabella <em>wp_options</em>. Bisogna tenere in mente solo questo e altre due piccole cose.</p><p style="text-align: justify;">Quando la <em>Transients API</em> invece usa la wp_options il primo problema è che la colonna <em>option_name</em> è per definizione un <em>varchar(64)</em>. Nomi più lunghi vengono automaticamente accorciati. Non sembrerebbe così drammatico ma è utile sapere che i transients verranno salvati col prefisso <em>_transient_</em>.</p><p style="text-align: justify;">Una seconda riga nel db che contiene il <em>timestamp</em> della scadenza assume automaticamente il prefisso <em>_transient_timeout_</em> che significa che la lunghezza massima effettiva di un nome di un transient è limitata a 45 caratteri. Se si vuole inserire un transient con l&#8217;URL nel nome, l&#8217;uso di <a href="http://php.net/manual/de/function.md5.php">md5()</a> sembrerebbe utile perché genera una stringa di 32 caratteri.</p><p style="text-align: justify;">A questo punto serve un piccolo esempio di codice per spiegare come il mio plugin <a href="http://lloc.de/it/wp-scgeshi">scGeSHi</a> risolve la problemtica quando rileva i codici dai server remoti e li salva temporaneamente nel cache:</p><div class="scgeshi-container"><div class="php scgeshi"><span class="kw2">&lt;?php</span><br /> <br /> <span class="re0">$name</span> <span class="sy0">=</span> <span class="st_h">'scg_'</span> <span class="sy0">.</span> <a href="http://www.php.net/md5"><span class="kw3">md5</span></a> <span class="br0">&#40;</span><span class="re0">$href</span><span class="br0">&#41;</span><span class="sy0">;</span><br /> <span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw4">false</span> <span class="sy0">===</span> <span class="br0">&#40;</span><span class="re0">$value</span> <span class="sy0">=</span> get_transient <span class="br0">&#40;</span><span class="re0">$name</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br /> &nbsp; &nbsp; <span class="re0">$response</span> <span class="sy0">=</span> wp_remote_get <span class="br0">&#40;</span><span class="re0">$href</span><span class="br0">&#41;</span><span class="sy0">;</span><br /> &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">!</span>is_wp_error <span class="br0">&#40;</span><span class="re0">$response</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br /> &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$value</span> <span class="sy0">=</span> <a href="http://www.php.net/trim"><span class="kw3">trim</span></a> <span class="br0">&#40;</span><span class="re0">$response</span><span class="br0">&#91;</span><span class="st_h">'body'</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy0">;</span><br /> &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">!</span><a href="http://www.php.net/empty"><span class="kw3">empty</span></a> <span class="br0">&#40;</span><span class="re0">$value</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; set_transient <span class="br0">&#40;</span><span class="re0">$name</span><span class="sy0">,</span> <span class="re0">$value</span><span class="sy0">,</span> <span class="nu0">86400</span><span class="br0">&#41;</span><span class="sy0">;</span><br /> &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br /> &nbsp; &nbsp; <span class="br0">&#125;</span><br /> <span class="br0">&#125;</span><br /> <br /> <span class="sy1">?&gt;</span></div></div><p style="text-align: justify;">Un secondo problema ha solo indirettamente a che fare con la <em>Transients API</em>. Le funzionalità della <em>Options API</em> usano le funzioni <em>serialize()</em> e <em>unserialize()</em>, cosa che diventa problematica con gli oggetti <a href="http://www.php.net/manual/de/book.simplexml.php">SimpleXML</a>. Durante il test di <a href="http://wordpress.org/extend/plugins/mylco/">myLCO</a> me ne sono ricordato a mie spese.</p><p style="text-align: justify;">Chi conosce queste piccole insidie ha però a disposizione un meccanismo molto robusto e veloce per il caching dei dati. Anche non usando la <em>Transients API</em> a questo punto è possibile capire cosa sono le righe in wp_options che hanno un prefisso <em>_transient_</em>. In ogni caso non dovrebbe essere un problema cancellarle. WordPress o il plugin responsabile eventualmente creano di nuovo i dati necessari.</p><p><strong>Similar Posts:</strong><ul class="similar-posts"><li><a href="http://lloc.de/it/wordpress-database-wpdb.html" rel="bookmark" title="9. settembre 2010">WordPress + Database = WPDB</a></li><li><a href="http://lloc.de/it/visualizzare-dati-xml-con-wordpress.html" rel="bookmark" title="7. settembre 2010">Visualizzare dati xml con wordpress</a></li><li><a href="http://lloc.de/it/pimp-a-wordpress-standard-widget.html" rel="bookmark" title="3. settembre 2010">Pimp a WordPress-Standard-Widget</a></li><li><a href="http://lloc.de/it/xml-json-e-rdf.html" rel="bookmark" title="7. settembre 2010">XML, JSON e RDF</a></li><li><a href="http://lloc.de/it/parsing-link-reloaded.html" rel="bookmark" title="3. settembre 2010">Parsing link reloaded</a></li></ul><p></p> ]]></content:encoded> <wfw:commentRss>http://lloc.de/it/la-transients-api-di-wordpress.html/feed</wfw:commentRss> <slash:comments>0</slash:comments> </item> </channel> </rss>