<?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>voragine.net</title>
	<atom:link href="http://voragine.net/feed" rel="self" type="application/rss+xml" />
	<link>http://voragine.net</link>
	<description>Autonomía digital y tecnológica.</description>
	<lastBuildDate>Fri, 04 May 2012 17:37:02 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Cómo conseguir un sitio multilingüe con un WordPress Multisite: un sitio para cada idioma</title>
		<link>http://voragine.net/wordpress/como-conseguir-un-sitio-multilingue-con-un-wordpress-multisite-un-sitio-para-cada-idioma</link>
		<comments>http://voragine.net/wordpress/como-conseguir-un-sitio-multilingue-con-un-wordpress-multisite-un-sitio-para-cada-idioma#comments</comments>
		<pubDate>Fri, 04 May 2012 17:37:02 +0000</pubDate>
		<dc:creator>skotperez</dc:creator>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[Wordpress MU]]></category>
		<category><![CDATA[Wordpress multilingüe]]></category>
		<category><![CDATA[Wordpress Multisite]]></category>

		<guid isPermaLink="false">http://voragine.net/?p=972</guid>
		<description><![CDATA[Conseguir un sitio multilingüe ha sido uno de los problemas históricos de WordPress. En el principio de los tiempos se hacía diferenciando los idiomas por categorías, luego empezaron a aparecer plugins; por fin apareció uno completo, fiable y estable, y al poco tiempo se volvió de pago (aunque no dejó de ser una buena opción). La alternativa siempre ha sido crear una instalación independiente para cada idioma, lo cual solía ser un infierno a nivel de mantenimiento; desde la versión 3.0 de WordPress y la integración estable de la estructura <em>multisite</em> esta posibilidad se democratizó y dejó de crear héroes. Tras leer <strong><a title="Build a multilingual site with WordPress -- Netmagazine" href="http://www.netmagazine.com/tutorials/build-multilingual-site-wordpress">Build a multilingual site with WordPress</a></strong>, y haber probado previamente las opciones que acabo de comentar, he llegado a la conclusión de que la opción <em>multisite</em> para conseguir un sitio multilingüe es ventajosa.]]></description>
			<content:encoded><![CDATA[<p>Conseguir un sitio multilingüe ha sido uno de los problemas históricos de WordPress. En el principio de los tiempos se hacía diferenciando los idiomas por categorías, luego empezaron a aparecer plugins; por fin apareció uno completo, fiable y estable, y al poco tiempo se volvió de pago (aunque no dejó de ser una buena opción). La alternativa siempre ha sido crear una instalación independiente para cada idioma, lo cual solía ser un infierno a nivel de mantenimiento; desde la versión 3.0 de WordPress y la integración estable de la estructura <em>multisite</em> esta posibilidad se democratizó y dejó de crear héroes. Tras leer <strong><a title="Build a multilingual site with WordPress -- Netmagazine" href="http://www.netmagazine.com/tutorials/build-multilingual-site-wordpress">Build a multilingual site with WordPress</a></strong>, y haber probado previamente las opciones que acabo de comentar, he llegado a la conclusión de que la opción <em>multisite</em> para conseguir un sitio multilingüe es ventajosa.</p>
<p>A continuación enumero y desarrollo todos los pasos necesarios para, <strong>partiendo de una instalación convencional de WordPress, conseguir un sitio multilingüe</strong>.</p>
<ul>
<li><strong><a title="Cómo activar el WordPress MU en WordPress 3.0 -- voragine.net" href="http://voragine.net/wordpress/como-activar-el-wordpress-mu-en-wordpress-3-0">Convertir una instalación convencional de WordPress en un </a><em><a title="Cómo activar el WordPress MU en WordPress 3.0 -- voragine.net" href="http://voragine.net/wordpress/como-activar-el-wordpress-mu-en-wordpress-3-0">multisite</a></em></strong>. Una vez hecho esto, hay que crear cada uno de los sitios en <em>My Sites :: Network Admin :: Sites</em>.</li>
<li><strong>Configurar el idioma para cada sitio creado del <em>multisite</em>, para que los paneles de administración estén en el idioma correcto</strong>. Para ello hay que conseguir los archivos de regionalización <code>.mo</code> y <code>.po</code> correspondientes; podemos encontrarlos dentro del paquete WordPress de dicho idioma, en la carpeta <code>wp-content/languages/</code>, así que basta descargar el paquete de wordpress.org. Luego los subimos a nuestro servidor, a la carpeta <code>wp-content/languages</code> y en cada sitio de la red, seleccionamos el idioma deseado en Settings<em> :: General</em>.</li>
<li><strong><a title="Multisite Language Switcher -- WordPress Plugins" href="http://wordpress.org/extend/plugins/multisite-language-switcher/installation/">Instalar el plugin Multisite Language Switcher</a></strong>. El plugin hay que configurarlo en cada uno de los sitios. Esto puedo parecer tedioso pero en realidad proporciona flexibilidad a costa de un trabajo extra relativamente escaso.El selector de idiomas se puede incorporar a la página mediante un widget o mediante el siguiente código, que permite mayor personalización:
<pre class="brush: php; title: ; notranslate">if ( function_exists( 'the_msls' )) the_msls();</pre>
<p>Para relacionar contenido &#8211;páginas, posts, e incluso las categorías y las etiquetas bajo las que los clasificamos&#8211; entre los diferentes sitios, de manera que se pueda saltar entre diferentes traducciones del mismo contenido, el plugin añade una columna en las listas de posts, de páginas y de categorías que nos permitirá hacerlo de manera sencilla e intuitiva.</li>
<li><strong><em><a title="Cómo traducir un tema de WordPress -- voragine.net" href="http://voragine.net/wordpress/como-traducir-un-tema-de-wordpress">Regionalizar</a></em><a title="Cómo traducir un tema de WordPress -- voragine.net" href="http://voragine.net/wordpress/como-traducir-un-tema-de-wordpress"> un tema</a></strong>. Lo preparamos para que sea traducible sencillamente mediante la edición de un archivo que contenga las cadenas a traducir.</li>
<li><strong><a title="Cómo y por qué crear un tema “hijo”, child theme, para WordPress -- voragine.net" href="http://voragine.net/wordpress/como-y-por-que-crear-un-tema-hijo-child-theme-para-wordpress">Crear un <em>child theme</em> en WordPress</a></strong>. Este paso no es extrictamente necesario, pero puede ser muy útil para aligerar el mantenimiento de los diferentes sitios. Al ser cada sitio una traducción, es lógico pensar que todos usarán el mismo theme, aunque quizás necesitemos mínimas diferencias entre ellos (colores por motivos culturales, archivos de configuración por motivos de programación&#8230;). Un <em>parent theme</em> y <em>child themes</em> para cada sitio nos permitirá gestionar estas diferencias sin necesidad de duplicar temas, código y mantenimiento.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://voragine.net/wordpress/como-conseguir-un-sitio-multilingue-con-un-wordpress-multisite-un-sitio-para-cada-idioma/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Cómo y por qué crear un tema &#8220;hijo&#8221;, child theme, para WordPress</title>
		<link>http://voragine.net/wordpress/como-y-por-que-crear-un-tema-hijo-child-theme-para-wordpress</link>
		<comments>http://voragine.net/wordpress/como-y-por-que-crear-un-tema-hijo-child-theme-para-wordpress#comments</comments>
		<pubDate>Fri, 04 May 2012 14:15:20 +0000</pubDate>
		<dc:creator>skotperez</dc:creator>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[child theme]]></category>
		<category><![CDATA[parent theme]]></category>
		<category><![CDATA[theme]]></category>
		<category><![CDATA[Wordpress MU]]></category>
		<category><![CDATA[Wordpress Multisite]]></category>

		<guid isPermaLink="false">http://voragine.net/?p=976</guid>
		<description><![CDATA[Los temas hijos, <strong><em><a title="Child Themes -- WordPress Codex" href="http://codex.wordpress.org/Child_Themes">child themes</a></em></strong>, en WordPress son aquellos que heredan las características de otro tema "padre", <em>parent theme</em>, del que dependen. La utilidad de los <em>child themes</em> reside en poder personalizar un sitio sin tener que crear un tema desde cero, ya que lo que no se defina en el <em>child theme</em>, éste lo heredará del <em>parent theme</em>.]]></description>
			<content:encoded><![CDATA[<p>Los temas hijos, <strong><em><a title="Child Themes -- WordPress Codex" href="http://codex.wordpress.org/Child_Themes">child themes</a></em></strong>, en WordPress son aquellos que heredan las características de otro tema &#8220;padre&#8221;, <em>parent theme</em>, del que dependen. La utilidad de los <em>child themes</em> reside en poder personalizar un sitio sin tener que crear un tema desde cero, ya que lo que no se defina en el <em>child theme</em>, éste lo heredará del <em>parent theme</em>.</p>
<p>Para que WordPress reconozca un tema como <em>child</em>, lo único que debemos hacer es <strong>definirlo convenientemente en el archivo <code>style.css</code></strong>, el único que tenemos que incluir en la carpeta del tema obligatoriamente. Para ello, incluimos la definición <code>Template</code> en la descripción comentada al principio de <code>style.css</code>, y le asignamos como valor el nombre de la carpeta del <em>parent theme</em>:</p>
<pre class="brush: css; title: ; notranslate">
Template: parenttheme
</pre>
<p>La carpeta con el nuevo child theme la subiremos a la carpeta de temas (<code>wp-content/themes/</code>), <strong>no a la del tema del que depende</strong>; podemos llamarla como queramos.</p>
<p>Luego solo nos queda seleccionar el <em>child theme</em> en el gestor para activarlo.</p>
<p>Una posible cabecera completa para el <code>style.css</code> de un <em>child theme</em>:</p>
<pre class="brush: css; title: ; notranslate">
/*
Theme Name:     Child Theme
Theme URI:      http://example.com/
Description:    Child theme for the Parent theme
Author:         Your name here
Author URI:     http://example.com/about/
Template:       parenttheme
Version:        0.1.0
*/
</pre>
<p>En este <code>style.css</code> podemos definir los estilos del <em>child theme</em> por completo. Si solo queremos redefinir unos cuantos y heredar el resto, tenemos que hacer una <strong>llamada a la hoja de estilos del <em>parent theme</em></strong> para incluir sus estilos:</p>
<pre class="brush: css; title: ; notranslate">
@import url(&quot;../parenttheme/style.css&quot;);
</pre>
<p>Hay que tener claro que merece la pena recurrir a un <em>child theme</em> para hacer modificaciones de estilo o añadir algún contenido específico mediante una plantilla de página que el parent theme no tenga. Cuando son necesarias modificaciones estructurales de un tema, desarrollar un <em>child theme</em> empieza a ser dudoso.</p>
<p>Un <em>child theme</em> puede servir para modificar a nivel de estilo un tema que nos hemos descargado y del que no queremos dejar de tener la última versión. Usando un child theme podremos actualizar el tema sin miedo a perder los cambios que hayamos realizado.</p>
<p>Otro caso en el que los <em>child themes</em> son útiles es para gestionar un WordPress Multisite y permitir que cada sitio de la red pueda modificar su plantilla sin multiplicar el mantenimiento.</p>
]]></content:encoded>
			<wfw:commentRss>http://voragine.net/wordpress/como-y-por-que-crear-un-tema-hijo-child-theme-para-wordpress/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Cómo añadir dinámicamente campos a un formulario HTML con jQuery</title>
		<link>http://voragine.net/weblogs/como-anadir-dinamicamente-campos-a-un-formulario-html-con-jquery</link>
		<comments>http://voragine.net/weblogs/como-anadir-dinamicamente-campos-a-un-formulario-html-con-jquery#comments</comments>
		<pubDate>Fri, 30 Mar 2012 08:00:53 +0000</pubDate>
		<dc:creator>skotperez</dc:creator>
				<category><![CDATA[Desarrollo web]]></category>
		<category><![CDATA[form]]></category>
		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">http://voragine.net/?p=956</guid>
		<description><![CDATA[El siguiente script de jQuery incorpora dos botones a un formulario HTML que permiten añadir y eliminar campos a voluntad. Lo encontré en el recomendable <strong><a title="jQuery – Dynamically Adding Form Elements -- Charlie Griefer's blog" href="http://charlie.griefer.com/blog/2009/09/17/jquery-dynamically-adding-form-elements/">blog de Charlie Griefer</a></strong>. En la página de Charlie se puede probar <a title="Dynamically Adding Form Elements. Demo -- Charlie Griefer Blog" href="http://charlie.griefer.com/blog/jquery-dynamically-adding-form-elements/">una demo</a>.]]></description>
			<content:encoded><![CDATA[<p>El siguiente script de jQuery incorpora dos botones a un formulario HTML que permiten añadir y eliminar campos a voluntad. Lo encontré en el recomendable <strong><a title="jQuery – Dynamically Adding Form Elements -- Charlie Griefer's blog" href="http://charlie.griefer.com/blog/2009/09/17/jquery-dynamically-adding-form-elements/">blog de Charlie Griefer</a></strong>. En la página de Charlie se puede probar <a title="Dynamically Adding Form Elements. Demo -- Charlie Griefer Blog" href="http://charlie.griefer.com/blog/jquery-dynamically-adding-form-elements/">una demo</a>.</p>
<pre class="brush: jscript; title: ; notranslate">
$(document).ready(function() {
  $('#btnDel').attr('disabled','disabled');
  $('#btnAdd').click(function() {
    var num = $('.clonedInput').length; // how many &quot;duplicatable&quot; input fields we currently have
    var newNum = new Number(num + 1); // the numeric ID of the new input field being added

    // create the new element via clone(), and manipulate it's ID using newNum value
    var newElem = $('#input' + num).clone().attr('id', 'Add' + newNum);

    // manipulate the name/id values of the input inside the new element
    newElem.children(':last').attr('id', 'name' + newNum).attr('name', 'name' + newNum);

    // insert the new element after the last &quot;duplicatable&quot; input field
    $('#input' + num).after(newElem);

    // enable the &quot;remove&quot; button
    $('#btnDel').attr('disabled',false);

    // business rule: you can only add 10 names
    if (newNum == 10)
      $('#btnAdd').attr('disabled','disabled');
  });

  $('#btnDel').click(function() {
    var num = $('.clonedInput').length; // how many &quot;duplicatable&quot; input fields we currently have
    $('#input' + num).remove(); // remove the last element

    // enable the &quot;add&quot; button
    $('#btnAdd').attr('disabled',false);

    // if only one element remains, disable the &quot;remove&quot; button
    if (num-1 == 1)
      $('#btnDel').attr('disabled','disabled');
  });

});
</pre>
<p>Y ahora el DOM:</p>
<pre class="brush: xml; title: ; notranslate">
&lt;form id=&quot;testform&quot;&gt;
   &lt;fieldset id=&quot;input1&quot; class=&quot;clonedInput&quot;&gt;
      &lt;label&gt;Name&lt;/label&gt;
      &lt;input type=&quot;text&quot; name=&quot;name1&quot; id=&quot;name1&quot; /&gt;
   &lt;/fieldset&gt;
   &lt;fieldset&gt;
      &lt;label&gt;Need more fields?&lt;/label&gt;
      &lt;inputtype=&quot;button&quot; id=&quot;btnAdd&quot; value=&quot;+&quot; /&gt;
      &lt;input type=&quot;button&quot; id=&quot;btnDel&quot; value=&quot;-&quot; /&gt;
   &lt;/fieldset&gt;
&lt;/form&gt;
</pre>
]]></content:encoded>
			<wfw:commentRss>http://voragine.net/weblogs/como-anadir-dinamicamente-campos-a-un-formulario-html-con-jquery/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cómo actualizar una cuenta de Twitter mediante PHP y OAuth: aplicación para publicar en el timeline de un usuario</title>
		<link>http://voragine.net/weblogs/como-actualizar-una-cuenta-de-twitter-mediante-php-y-oauth-aplicacion-para-publicar-en-el-timeline-de-un-usuario</link>
		<comments>http://voragine.net/weblogs/como-actualizar-una-cuenta-de-twitter-mediante-php-y-oauth-aplicacion-para-publicar-en-el-timeline-de-un-usuario#comments</comments>
		<pubDate>Thu, 22 Mar 2012 15:16:00 +0000</pubDate>
		<dc:creator>skotperez</dc:creator>
				<category><![CDATA[Desarrollo web]]></category>
		<category><![CDATA[Scripting y programación]]></category>
		<category><![CDATA[cRT]]></category>
		<category><![CDATA[OAuth]]></category>
		<category><![CDATA[Twitter]]></category>
		<category><![CDATA[twitter API]]></category>
		<category><![CDATA[twitteroauth]]></category>

		<guid isPermaLink="false">http://voragine.net/?p=944</guid>
		<description><![CDATA[Para <strong><a title="Actualizar Twitter a través de PHP y OAuth -- Más que WordPress" href="http://www.masquewordpress.com/actualizar-twitter-a-traves-de-php-y-oauth/">actualizar una cuenta de Twitter desde una web externa</a></strong> hay crear una aplicación que utilice el sistema de autentificación OAuth. Para ello hay que registrarla en la <a title="Twitter Developers API" href="https://dev.twitter.com/">página de desarrolladores de Twitter</a>. Para comunicarse con Twitter a través de OAuth se pueden usar varias librerías ya preparadas; en este caso usaremos <strong><a title="Librería twitteroauth -- github.com" href="http://github.com/abraham/twitteroauth">twitteroauth</a></strong> de <a title="Abraham -- github.com" href="http://github.com/abraham">Abraham,</a> que consiste en dos archivos: <code>OAuth.php</code> y <code>twitteroauth.php</code>.]]></description>
			<content:encoded><![CDATA[<p>Para <strong><a title="Actualizar Twitter a través de PHP y OAuth -- Más que WordPress" href="http://www.masquewordpress.com/actualizar-twitter-a-traves-de-php-y-oauth/">actualizar una cuenta de Twitter desde una web cualquiera</a></strong> hay crear una aplicación que utilice el sistema de autentificación OAuth. Para ello hay que registrarla en la <a title="Twitter Developers API" href="https://dev.twitter.com/">página de desarrolladores de Twitter</a>. Para comunicarse con Twitter a través de OAuth se pueden usar varias librerías ya preparadas; en este caso usaremos <strong><a title="Librería twitteroauth -- github.com" href="http://github.com/abraham/twitteroauth">twitteroauth</a></strong> de <a title="Abraham -- github.com" href="http://github.com/abraham">Abraham,</a> que consiste en dos archivos: <code>OAuth.php</code> y <code>twitteroauth.php</code>.</p>
<p>Primero <strong>registramos la aplicación</strong> en la <a title="Applications -- Twitter developers API" href="https://dev.twitter.com/apps">base de datos de Twitter</a>. Es importante configurar el acceso de la aplicación con permisos de lectura y escritura, en la pestaña Settings. Luego generamos las cuatro claves que validarán la aplicación, que luego hay que añadir al código PHP: consumer key, consumer secret, access token y access token secret.</p>
<p>Después, reunimos en un archivo PHP los trozos de código que necesitamos. Incluimos la librería twitteroauth y validamos la aplicación con las cuatro claves que hemos generado:</p>
<pre class="brush: php; title: ; notranslate">
require('twitteroauth.php'); // incluimos la librería para comunicarnos con twitter
define('_CONSUMER_KEY','tuConsumerKey'); // consumer key
define('_CONSUMER_SECRET','tuConsumerSecret'); // consumer secret
define('_OAUTH_TOKEN','tuOAuthToken'); // access token
define('_OAUTH_TOKEN_SECRET','tuOAuthTokenSecret'); // access token secret
</pre>
<p>Creamos una función que realizará la conexión:</p>
<pre class="brush: php; title: ; notranslate">
function getConnectionWithAccessToken() {
  $connection = new TwitterOAuth(_CONSUMER_KEY, _CONSUMER_SECRET,_OAUTH_TOKEN, _OAUTH_TOKEN_SECRET);
  return $connection;
}
</pre>
<p>Ejecutamos la conexión:</p>
<pre class="brush: php; title: ; notranslate">
// Ejecutamos la conexión
$connection = getConnectionWithAccessToken();
</pre>
<p>Publicamos en twitter, utilizando la conexión:</p>
<pre class="brush: php; title: ; notranslate">
//Publicamos el mensaje en twitter
$mensaje = &quot;Publicando un mensaje en una cuenta de Twitter utilizando OAuth.&quot;;
$twitter= $connection-&gt;post('statuses/update', array('status' =&gt; $mensaje) );
</pre>
<p>No es necesario preocuparse por los enlaces incluidos en el mensaje ya que Twitter los acortará convenientemente él solito. Lo que sí que tenemos que tener en cuenta es que <a href="https://dev.twitter.com/discussions/670">si la hora de nuestro servidor está mal configurada obtendremos un error</a> diciéndonos que hay un desfase de tiempo demasiado grande, y el tweet no se publicará:</p>
<pre class="brush: php; title: ; notranslate">
Error Timestamp out of bounds
</pre>
<p>Para detectar éste o cualquier otro error conviene hacer un <code>echo</code> de la variable <code>$twitter</code>, que almacenará los errores en caso de producirse, cuando ejecutemos el archivo PHP.</p>
<p>Más información:</p>
<ul>
<li><a title="Using @abraham's PHP twitteroauth Library -- Twitter Developers API" href="https://dev.twitter.com/docs/auth/oauth/single-user-with-examples#php">Using @abraham&#8217;s PHP twitteroauth Library</a></li>
<li><a title="Actualizar Twitter a través de PHP y OAuth -- Más que WordPress" href="http://www.masquewordpress.com/actualizar-twitter-a-traves-de-php-y-oauth/">Actualizar Twitter a través de PHP y OAuth</a></li>
<li><a title="twitteroauth / DOCUMENTATION -- github.com" href="https://github.com/abraham/twitteroauth/blob/master/DOCUMENTATION">twitteroauth documentation on github</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://voragine.net/weblogs/como-actualizar-una-cuenta-de-twitter-mediante-php-y-oauth-aplicacion-para-publicar-en-el-timeline-de-un-usuario/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cómo llamar scripts de manera segura y adecuada en WordPress</title>
		<link>http://voragine.net/wordpress/como-llamar-scripts-de-manera-segura-y-adecuada-en-wordpress</link>
		<comments>http://voragine.net/wordpress/como-llamar-scripts-de-manera-segura-y-adecuada-en-wordpress#comments</comments>
		<pubDate>Wed, 21 Mar 2012 15:01:46 +0000</pubDate>
		<dc:creator>skotperez</dc:creator>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[wp_enqueue_script]]></category>

		<guid isPermaLink="false">http://voragine.net/?p=942</guid>
		<description><![CDATA[WordPress tiene funciones para todo, y cada vez más. Por ejemplo <code><a title="wp_enqueue_script -- WordPress Codex" href="http://codex.wordpress.org/Function_Reference/wp_enqueue_script">wp_enqueue_script</a></code> que llama a un script de manera segura, y se asegura antes de que no ha sido invocado ya. En la página del Codex de WordPress sobre esta función, se listan además <strong><a title="Default scripts included with WordPress -- WordPress Codex" href="http://codex.wordpress.org/Function_Reference/wp_enqueue_script#Default_scripts_included_with_WordPress">todos los scripts que vienen incluidos con WordPress</a></strong>: útil listado.]]></description>
			<content:encoded><![CDATA[<p>WordPress tiene funciones para todo, y cada vez más. Por ejemplo <code><a title="wp_enqueue_script -- WordPress Codex" href="http://codex.wordpress.org/Function_Reference/wp_enqueue_script">wp_enqueue_script</a></code> que llama a un script de manera segura, y se asegura antes de que no ha sido invocado ya. En la página del Codex de WordPress sobre esta función, se listan además <strong><a title="Default scripts included with WordPress -- WordPress Codex" href="http://codex.wordpress.org/Function_Reference/wp_enqueue_script#Default_scripts_included_with_WordPress">todos los scripts que vienen incluidos con WordPress</a></strong>: útil listado.</p>
]]></content:encoded>
			<wfw:commentRss>http://voragine.net/wordpress/como-llamar-scripts-de-manera-segura-y-adecuada-en-wordpress/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Desobedeciendo la Ley Sinde-Wert</title>
		<link>http://voragine.net/cultura-libre/desobedeciendo-la-ley-sinde-wert</link>
		<comments>http://voragine.net/cultura-libre/desobedeciendo-la-ley-sinde-wert#comments</comments>
		<pubDate>Thu, 01 Mar 2012 12:23:46 +0000</pubDate>
		<dc:creator>skotperez</dc:creator>
				<category><![CDATA[Cultura libre]]></category>
		<category><![CDATA[ley sinde-wert]]></category>

		<guid isPermaLink="false">http://voragine.net/?p=935</guid>
		<description><![CDATA[<p>Con el enlace de más abajo me sumo a la <strong><a title="Wert de enlaces" href="http://www.wertdeenlaces.net/">campaña de desobediencia contra la Ley Sinde-Wert</a></strong>, que entra hoy, 1 de marzo de 2012, en vigor.</p>
<p><a title="wertdeenlaces.net" href="http://www.wertdeenlaces.net"><img style="vertical-align: middle; border: 0;" src="http://wertdeenlaces.net/labios.png" alt="labioswert" /></a> <a style="text-decoration: none; color: #383838; font: 10px Consolas,Courrier,monospace;" href="http://www.wertdeenlaces.net/enlace.php">Bájame</a></p>
<p>Para más información sobre la Ley:</p>
<ul>
	<li><a title="Contra la ley Sinde-Wert comparte, comparte, comparte! -- X.net" href="http://whois--x.net/contra-la-ley-sinde-wert-comparte">Contra la ley Sinde-Wert comparte, comparte, comparte!</a></li>
	<li><a title="¿Cómo funcionará la Ley Sinde? Preguntas frecuentes -- Revista GQ" href="http://www.revistagq.com/articulos/como-funcionara-la-ley-sinde-preguntas-frecuentes/16199">¿Cómo funcionará la Ley Sinde? Preguntas frecuentes</a></li>
</ul>]]></description>
			<content:encoded><![CDATA[<p>Con el enlace de más abajo me sumo a la <strong><a title="Wert de enlaces" href="http://www.wertdeenlaces.net/">campaña de desobediencia contra la Ley Sinde-Wert</a></strong>, que entra hoy, 1 de marzo de 2012, en vigor.</p>
<p><a title="wertdeenlaces.net" href="http://www.wertdeenlaces.net"><img style="vertical-align: middle; border: 0;" src="http://wertdeenlaces.net/labios.png" alt="labioswert" /></a> <a style="text-decoration: none; color: #383838; font: 10px Consolas,Courrier,monospace;" href="http://www.wertdeenlaces.net/enlace.php">Bájame</a></p>
<p>Como explican en la web de la campaña:</p>
<blockquote><p>Tú también puedes unirte a esta <a title="Lista de webs desobedientes Sinde-Wert" href="http://www.wertdeenlaces.net/index.php?lista">lista de webs desobedientes</a>. Sólo tienes que compartir el enlace que ponemos a tu disposición más abajo. El día 1 de marzo (día en que entra en vigor la ley), a primera hora de la mañana, el autor de dicha obra se ha comprometido a presentar una denuncia a todas las webs de esta lista. Poniendo nuestras páginas en primera fila de forma conjunta y coordinada conseguiremos evidenciar los peligros de esta ley y al mismo tiempo demostrar su ineficacia. Seremos la primera línea de choque de una ley diseñada por y para una industria obsoleta que impide el surgimiento de otras formas de producción-distribución cultural y que amenaza la libertad en la red. Internet quiere ser libre y lo será.</p></blockquote>
<p>Para más información sobre la Ley:</p>
<ul>
<li><a title="Contra la ley Sinde-Wert comparte, comparte, comparte! -- X.net" href="http://whois--x.net/contra-la-ley-sinde-wert-comparte">Contra la ley Sinde-Wert comparte, comparte, comparte!</a></li>
<li><a title="¿Cómo funcionará la Ley Sinde? Preguntas frecuentes -- Revista GQ" href="http://www.revistagq.com/articulos/como-funcionara-la-ley-sinde-preguntas-frecuentes/16199">¿Cómo funcionará la Ley Sinde? Preguntas frecuentes</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://voragine.net/cultura-libre/desobedeciendo-la-ley-sinde-wert/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>El espacio público como colchón social</title>
		<link>http://voragine.net/cultura-libre/el-espacio-publico-como-colchon-social</link>
		<comments>http://voragine.net/cultura-libre/el-espacio-publico-como-colchon-social#comments</comments>
		<pubDate>Thu, 01 Mar 2012 07:00:02 +0000</pubDate>
		<dc:creator>skotperez</dc:creator>
				<category><![CDATA[Cultura libre]]></category>
		<category><![CDATA[espacio híbrido]]></category>
		<category><![CDATA[espacio público]]></category>
		<category><![CDATA[sentient city]]></category>

		<guid isPermaLink="false">http://voragine.net/?p=927</guid>
		<description><![CDATA[Hace tiempo que <a title="Blog personal de Domenico Di Siena" href="http://urbanohumano.org">Domenico Di Siena</a> me hizo una serie de <a title="Sentient City &#124; entrevista a Alfonso Sánchez (@skotperez) -- Blog de Domenico Di Siena" href="http://urbanohumano.org/castellano/sentient-city-entrevista-a-alfonso-sanchez-skotperez/">preguntas para su investigación Espacios Sensibles - Hibirdación físico-digital para la Revitalización de los Espacios públicos</a>. Las preguntas fueron las siguientes:
¿Qué entiendes por espacio público?, ¿Cómo calificarías el espacio público de las ciudades de hoy?, ¿Cómo lo cambiarías?, ¿Qué papel pueden jugar las nuevas tecnologías en ese cambio? Y dieron como resultado el siguiente texto.]]></description>
			<content:encoded><![CDATA[<p><em>Hace tiempo que <a title="Blog personal de Domenico Di Siena" href="http://urbanohumano.org">Domenico Di Siena</a> me hizo una serie de <a title="Sentient City | entrevista a Alfonso Sánchez (@skotperez) -- Blog de Domenico Di Siena" href="http://urbanohumano.org/castellano/sentient-city-entrevista-a-alfonso-sanchez-skotperez/">preguntas para su investigación Espacios Sensibles &#8211; Hibirdación físico-digital para la Revitalización de los Espacios públicos</a>. Las preguntas fueron las siguientes:</em></p>
<ul>
<li><em>¿Qué entiendes por espacio público? (definición)</em></li>
<li><em>¿Cómo calificarías el espacio público de las ciudades de hoy? (cualidades y problemas)</em></li>
<li><em>¿Cómo lo cambiarías? (soluciones)</em></li>
<li><em>¿Qué papel pueden jugar las nuevas tecnologías en ese cambio? (espacios híbridos)</em></li>
</ul>
<p><em>Y dieron como resultado el siguiente texto:</em></p>
<p>El espacio público históricamente es el que cualquier persona puede usar siguiendo las normas de convivencia y las leyes del lugar en el que se encuentre dicho espacio. Tradicionalmente es un espacio físico y en la mayor parte de los casos se asocia a la calle, a los espacio abiertos. Esto lo convierte prácticamente en un espacio común sobre el que cualquier usuario tiene en teoría la misma capacidad de decisión. Al ser el espacio más plural es un colchón social para la ciudad ya que en teoría no tiene las restricciones de los espacio privados, al no poder dictar ningún dueño normas sobre él, y alberga usos y ocupaciones que los privados no permiten.</p>
<p>El crecimiento de las ciudades y de su población, y en consecuencia de su heterogeneidad, hace que el espacio público sufra una demanda mucho más diversa, lo que provoca la aparición de conflictos y por tanto de normas más restrictivas para poder mantener cierto orden. El crecimento exponencial de las ciudades hace que los espacios comunes también se despersonalicen y que los ciudadanos no los sientan como suyos, perdiendo así la responsabilidad que en otro tiempo tenían y que mantenía dichos espacios activos. Como consecuencia la gestión y el mantenimiento del espacio público es desde hace tiempo tarea y responsabilidad exclusiva de las administraciones.</p>
<p>Estas tareas no deben entenderse como mantenimiento frente al deterioro físico del espacio; de manera más amplia engloban actuación y pensamiento sobre el propio espacio: para qué debe usarse, de qué manera, qué quiero yo como ciudadano hacer en él, cuánto dinero hay que invertir en ellos.</p>
<p>Este distanciamiento del ciudadano del espacio que posée con sus conciudadanos convierte el espacio público, en definitiva, en propiedad de las administraciones. Podríamos decir que es un espacio privado propiedad de las administraciones. Y como cualquier espacio privado obedece a los deseos y objetivos de sus dueños. En muchos casos de beneficio económico. Muchas de las actuaciones de las administraciones sobre el espacio público se entienden mejor desde este enfoque.</p>
<p>En el mejor de los casos, aunque los objetivos de la administración sobre el espacio que gestiona sean legítimos, o moralmente aceptables, no pueden ser igual de completos, igual de representativos, que los pensados y ejecutados por la ciudadanía en su conjunto. Esto provoca una distancia entre la ciudad legal, la planificada por la administración, y la ciudad real, la vivida por los ciudadanos. Así, cada vez más ciudadanos sienten ajeno el espacio público y lo abandonan, y cada vez más ciudadanos son excluidos del uso del espacio público.</p>
<p>Las nuevas tecnologías permiten conectar a la gente. Permiten crear el tejido social que el espacio público crea y demanda al mismo tiempo. Podríamos decir que crea una capa de relación independiente del espacio físico, permite que la interacción no sea presencial. Todas estas características convierten a las nuevas tecnnologías en herramientas de creación de redes. El espacio público local puede conectarse además con otros espacios públicos remotos y alimentarse de ellos, generándose así una red de espacios. Además, la horizontalidad de internet permite que la voz de cualquier ciudadano valga lo mismo o llegue a tantos oídos que la de cualquier administración, y agiliza los actuales mecanismos de participación y decisión.</p>
<p>Por otra parte la filosofía que tiene detrás todo el movimiento del software libre, heredada después por todo el movimiento de la cultura libre, debería servir de inspiración para la creación de una red de espacios públicos de código abierto, en cambio constante, flexible, con posibilidades de adaptación a las, cada vez, más rápidas y fugaces exigencias de la ciudad global. La idea de no empezar de cero implícita en el desarrollo de software libre, reutilizando el código que otro programdor ha creado previamente, debería ser uno de los pilares para la construcción de los espacios públicos y de la ciudad en su conjunto, que debería saber rehabilitar y reutilizar lo existente, pesar la ciudad por capas que se van superponiendo y enriqueciendo la ciudad.</p>
]]></content:encoded>
			<wfw:commentRss>http://voragine.net/cultura-libre/el-espacio-publico-como-colchon-social/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cómo detectar si se está haciendo scroll en una página y cómo cuantificarlo con jQuery</title>
		<link>http://voragine.net/weblogs/como-detectar-si-se-esta-haciendo-scroll-en-una-pagina-y-como-cuantificarlo-con-jquery</link>
		<comments>http://voragine.net/weblogs/como-detectar-si-se-esta-haciendo-scroll-en-una-pagina-y-como-cuantificarlo-con-jquery#comments</comments>
		<pubDate>Wed, 29 Feb 2012 13:17:37 +0000</pubDate>
		<dc:creator>skotperez</dc:creator>
				<category><![CDATA[Desarrollo web]]></category>
		<category><![CDATA[Usabilidad]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[scroll]]></category>
		<category><![CDATA[scrollTop]]></category>

		<guid isPermaLink="false">http://voragine.net/?p=922</guid>
		<description><![CDATA[<a title="Use jQuery to Detect if User has Scrolled to the Bottom or Top of a Page -- DevCurry" href="http://www.devcurry.com/2010/10/use-jquery-to-detect-if-user-has.html">Detectar si se está haciendo scroll en el navegador y poder cuantificarlo</a> —saber la posición vertical de la página en la ventana del navegador— puede ser muy útil, por ejemplo para crear una barra de navegación que permanezca fija (fixed en CSS) y siempre visible. Valga como ejemplo, la <strong><a title="Thinkcommons -- Ambient Intelligent Network" href="http://thinkcommons.org/">página del proyecto Thinkcommons</a></strong> de <a title="Blog personal de Domenico Di Siena" href="http://urbanohumano.org">Domenico Di Siena</a>, en el que estoy colaborando. Esto lo podemos conseguir con <a title=".scrollTop() -- jQuery API" href="http://api.jquery.com/scrollTop/">la función <code>.scrollTop()</code> de jQuery</a>, que nos devuelve la altura en píxeles que ha quedado oculta por el borde superior de la ventana del navegador.]]></description>
			<content:encoded><![CDATA[<p><a title="Use jQuery to Detect if User has Scrolled to the Bottom or Top of a Page -- DevCurry" href="http://www.devcurry.com/2010/10/use-jquery-to-detect-if-user-has.html">Detectar si se está haciendo scroll en el navegador y poder cuantificarlo</a> —saber la posición vertical de la página en la ventana del navegador— puede ser muy útil, por ejemplo para crear una barra de navegación que permanezca fija (fixed en CSS) y siempre visible. Valga como ejemplo, la <strong><a title="Thinkcommons -- Ambient Intelligent Network" href="http://thinkcommons.org/">página del proyecto Thinkcommons</a></strong> de <a title="Blog personal de Domenico Di Siena" href="http://urbanohumano.org">Domenico Di Siena</a>, en el que estoy colaborando. Esto lo podemos conseguir con <a title=".scrollTop() -- jQuery API" href="http://api.jquery.com/scrollTop/">la función <code>.scrollTop()</code> de jQuery</a>, que nos devuelve la altura en píxeles que ha quedado oculta por el borde superior de la ventana del navegador.</p>
<p>La siguiente función de jQuery permite saber cuándo un elemento del DOM está en la parte superior de la ventana del navegador para, en ese momento, cambiarle las propiedades de estilo necesarias y que permanezca siempre visible. Básicamente asocia <code>.scrollTop()</code> al método <code><a title=".scroll() -- jQuery API" href="http://api.jquery.com/scroll/">.scroll()</a></code>:</p>
<pre class="brush: jscript; title: ; notranslate">
$(function () {
  var $win = $(window);
  // definir mediente $pos la altura en píxeles desde el borde superior de la ventana del navegador y el elemento
  var $pos = 140;
  $win.scroll(function () {
     if ($win.scrollTop()        $('.menu').removeClass('fijar');
     else {
       $('.menu').addClass('fijar');
     }
   });
});
</pre>
<p>Esto lo podemos aplicar a un elemento del DOM con la clase <code>menu</code>:</p>
<pre class="brush: xml; title: ; notranslate">&lt;/pre&gt;
&lt;ul class=&quot;menu fijar&quot;&gt;
	&lt;li&gt;Item 1&lt;/li&gt;
	&lt;li&gt;Item 2&lt;/li&gt;
	&lt;li&gt;Item 3&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;
</pre>
<p>que cuando se encuentre en la parte superior de la ventana adquirira la clase <code>fijar</code>:</p>
<pre class="brush: xml; title: ; notranslate">&lt;/pre&gt;
&lt;ul class=&quot;menu fijar&quot;&gt;
	&lt;li&gt;Item 1&lt;/li&gt;
	&lt;li&gt;Item 2&lt;/li&gt;
	&lt;li&gt;Item 3&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;
</pre>
<p>Los estilos CSS que darán propiedades al elemento los podemos definir de la siguiente manera:</p>
<pre class="brush: css; title: ; notranslate">
.menu {
  position: absolute;
  top: 140px;
}
.fijar {
  position: fixed !important;
  top: 0 !important;
  z-index: 100;
}
</pre>
]]></content:encoded>
			<wfw:commentRss>http://voragine.net/weblogs/como-detectar-si-se-esta-haciendo-scroll-en-una-pagina-y-como-cuantificarlo-con-jquery/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Personalizando la lista de comentarios de WordPress: callback en wp_list_comments</title>
		<link>http://voragine.net/wordpress/personalizando-la-lista-de-comentarios-de-wordpress-callback-en-wp_list_comments</link>
		<comments>http://voragine.net/wordpress/personalizando-la-lista-de-comentarios-de-wordpress-callback-en-wp_list_comments#comments</comments>
		<pubDate>Tue, 21 Feb 2012 07:02:01 +0000</pubDate>
		<dc:creator>skotperez</dc:creator>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[comentarios]]></category>
		<category><![CDATA[functions.php]]></category>
		<category><![CDATA[wp_list_comments]]></category>

		<guid isPermaLink="false">http://voragine.net/?p=913</guid>
		<description><![CDATA[Antes de la versión 2.7 de WordPress la lista de comentarios se generaba con loop que recorría la array <code>$comments</code> mediante un <code>foreach</code>, de manera que se podía especificar el código a generar para cada comentario. A partir de dicha versión, se introdujo la función <code>wp_list_comments</code>, que genera ella solita la lista de comentarios, con unos valores por omisión que pueden no convenirnos. Para cambiarlos, <code>wp_list_comments</code> dispone del parámetro <code>callback</code>, que permite llamar a una segunda función que defina un código personalizado.]]></description>
			<content:encoded><![CDATA[<p>Antes de la versión 2.7 de WordPress la lista de comentarios se generaba con loop que recorría la array <code>$comments</code> mediante un <code>foreach</code>, de manera que se podía especificar el código a generar para cada comentario. A partir de dicha versión, se introdujo la función <code>wp_list_comments</code>, que genera ella solita la lista de comentarios, con unos valores por omisión que pueden no convenirnos. Para cambiarlos, <code>wp_list_comments</code> dispone del parámetro <code>callback</code>, que permite llamar a una segunda función que defina un código personalizado.</p>
<p>Además <code>wp_list_comments</code> ofrece la posibilidad de devolver todos los comentarios, solo los &#8220;humanos&#8221; o solo los pings, especificando el valor correcto con el parámetro <code>type</code>.</p>
<p>Podemos personalizar también distintos mensajes que se incluyen en la lista, como por ejemplo el texto del enlace para responder a un comentario.</p>
<p>El siguiente código devuelve una lista de comentarios tipo <code>lista ol</code> conteniendo únicamente los &#8220;humanos&#8221; (excluyendo los pings), define algunos mensajes personalizados y hace una llamada mediante <code>callback</code> a la función <code>custom_comment</code> que define la estructura de la lista:</p>
<pre class="brush: php; title: ; notranslate">
// human comments list
wp_list_comments( array(
  'style' =&gt; 'ol',
  'type' =&gt; 'comment',
  'reply_text' =&gt; 'responder a este comentario',
  'login_text' =&gt; 'iniciar sesión para comentar',
  'callback' =&gt; 'custom_comment'
 ) );
</pre>
<p>En este caso, la función al especificar la opción <code>style=ol</code>, debemos envolverla en un contenedor homónimo:</p>
<pre class="brush: xml; title: ; notranslate">
&lt;ol id=&quot;comments-list&quot;&gt;
&lt;?php wp_list_comments(); ?&gt;
&lt;/ol&gt;&lt;!-- end #comments-list --&gt;
</pre>
<p>La función <code>custom_comment</code> debemos alojarla en el archivo <code>functions.php</code> de nuestro theme y debe tener una estructura parecida al siguiente ejemplo:</p>
<pre class="brush: php; title: ; notranslate">
// comprobamos que la función existe
if ( ! function_exists( 'custom_comment' ) ) :

  function custom_comment( $comment, $args, $depth ) {
    $GLOBALS['comment'] = $comment;
    // en el caso de que el comentario no sea humano
    switch ( $comment-&gt;comment_type ) :
      case 'pingback' :
      case 'trackback' :

        // código HTML para pings...

    break;
    // en el caso de que el comentario sea humano
      default :

        // si el comentario está pendiente de aprobación
        if ($comment-&gt;comment_approved == '0') {
           // mensaje y código HTML para comentarios pendientes de aprobación
	   // &quot;Tu comentario debe ser aprobado por un editor antes de publicarse.&quot;
           // o algo así

        // si el comentario está aprobado
        } else {
           // código HTML para cada comentario
           // incluir la comment_reply_link() para habilitar la respuesta a un comentario:
           // comment_reply_link( array_merge( $args, array( 'reply_text' =&gt; 'Responder a este comentario', 'depth' =&gt; $depth, 'max_depth' =&gt; $args['max_depth'] ) ) );
        } // end if comment is approved

    break;
    endswitch;
  } // end function custom_comment

endif; // end comprobación custom_comment()
</pre>
<p>Esta función diferencia la manera en la que se generan los comentarios humanos de los pingbacks y trackbacks. Si llamamos a la función <code>wp_list_comments</code> dos veces en nuestro archivo <code>comments.php</code> podemos separar los comentarios humanos de los pings:</p>
<pre class="brush: php; title: ; notranslate">
// human comments list
wp_list_comments( array(
  'style' =&gt; 'ol',
  'type' =&gt; 'comment',
  'reply_text' =&gt; 'responder a este comentario',
  'login_text' =&gt; 'iniciar sesión para comentar',
  'callback' =&gt; 'custom_comment'
 ) );

// pings list
wp_list_comments( array(
  'style' =&gt; 'ul',
  'type' =&gt; 'pings',
  'callback' =&gt; 'custom_comment'
 ) );
</pre>
<p>En el Codex de WordPress podemos encontrar todos los detalles de <strong><a title="Function Reference/wp list comments -- WordPress Codex" href="http://codex.wordpress.org/Function_Reference/wp_list_comments">cómo personalizar el uso de </a><code><a title="Function Reference/wp list comments -- WordPress Codex" href="http://codex.wordpress.org/Function_Reference/wp_list_comments">wp_list_comments</a></code></strong>.</p>
<p>Para saber cómo usar <code>wp_list_comments</code> se puede consultar la entrada de este blog <strong><a title="Entendiendo el sistema de comentarios en WordPress: wp_list_comments y comment_form -- voragine.net" href="http://voragine.net/wordpress/entendiendo-el-sistema-de-comentarios-en-wordpress-wp_list_comments-y-comment_form">Entendiendo el sistema de comentarios en WordPress: wp_list_comments y comment_form</a></strong>.</p>
]]></content:encoded>
			<wfw:commentRss>http://voragine.net/wordpress/personalizando-la-lista-de-comentarios-de-wordpress-callback-en-wp_list_comments/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Entendiendo el sistema de comentarios en WordPress: wp_list_comments y comment_form</title>
		<link>http://voragine.net/wordpress/entendiendo-el-sistema-de-comentarios-en-wordpress-wp_list_comments-y-comment_form</link>
		<comments>http://voragine.net/wordpress/entendiendo-el-sistema-de-comentarios-en-wordpress-wp_list_comments-y-comment_form#comments</comments>
		<pubDate>Mon, 20 Feb 2012 18:52:21 +0000</pubDate>
		<dc:creator>skotperez</dc:creator>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[comentarios]]></category>
		<category><![CDATA[comments_open]]></category>
		<category><![CDATA[comment_form]]></category>
		<category><![CDATA[have_comments]]></category>
		<category><![CDATA[next_comments_link]]></category>
		<category><![CDATA[post_password_required]]></category>
		<category><![CDATA[previous_comments_link]]></category>
		<category><![CDATA[wp_list_comments]]></category>

		<guid isPermaLink="false">http://voragine.net/?p=897</guid>
		<description><![CDATA[Desde la versión 2.7 de WordPress el sistema de comentarios incorporó varias capacidades nuevas como la posibilidad de responder a un comentario concreto y mostrar los comentarios anidados. Además se simplificó su uso, unificando su funcionamiento en unas cuantas funciones que permiten la más absoluta automatización con solo incluirlas en el código, respetando la posibilidad de personalización total. A continuación vamos a construir un sistema de comentarios básico para WordPress, para complejizarlo y personalizarlo después.

El código relativo a los comentarios se aloja en el archivo <code>comments.php</code> del theme. Básicamente consta de dos partes: <strong>la lista de comentarios</strong> y <strong>el formulario para añadir un comentario</strong>. La primera parte se controla con la función <a title="Function Reference/wp list comments -- WordPress Codex" href="http://codex.wordpress.org/Function_Reference/wp_list_comments"><code>wp_list_comments</code></a> y la segunda con la función <a title="Function Reference/comment form -- WordPress Codex" href="http://codex.wordpress.org/Function_Reference/comment_form"><code>comment_form</code></a>.]]></description>
			<content:encoded><![CDATA[<p>Desde la versión 2.7 de WordPress el sistema de comentarios incorporó varias capacidades nuevas como la posibilidad de responder a un comentario concreto y mostrar los comentarios anidados. Además se simplificó su uso, unificando su funcionamiento en unas cuantas funciones que permiten la más absoluta automatización con solo incluirlas en el código, respetando la posibilidad de personalización total. A continuación vamos a construir un sistema de comentarios básico para WordPress, para complejizarlo y personalizarlo después.</p>
<p>El código relativo a los comentarios se aloja en el archivo <code>comments.php</code> del theme. Básicamente consta de dos partes: <strong>la lista de comentarios</strong> y <strong>el formulario para añadir un comentario</strong>. La primera parte se controla con la función <a title="Function Reference/wp list comments -- WordPress Codex" href="http://codex.wordpress.org/Function_Reference/wp_list_comments"><code>wp_list_comments</code></a> y la segunda con la función <a title="Function Reference/comment form -- WordPress Codex" href="http://codex.wordpress.org/Function_Reference/comment_form"><code>comment_form</code></a>.</p>
<p>Es recomendable acompañar estos dos componentes básicos con una <strong>función que habilita la posibilidad de proteger una entrada con contraseña</strong>:</p>
<pre class="brush: php; title: ; notranslate">
if ( isset($_SERVER['SCRIPT_FILENAME']) &amp;&amp; 'comments.php' == basename($_SERVER['SCRIPT_FILENAME']) )
  die ('Please do not load this page directly. Thanks! / Por favor, no intentes acceder a esta página directamente. Gracias.');

if ( post_password_required() ) :
  echo 'Esta entrada está protegida con contraseña. Introduce la contraseá para leer los comentarios.';

  /* Esto código hace que no se siga ejecutando
     el código para la generación de comentarios,
     que salte para completar la carga de la página
     sin ellos */
  return;
endif;
</pre>
<p>Para generar <strong>la lista de comentarios</strong>, WordPress ejecuta un loop similar al de las entradas, que hay que envolver en una sentencia condicional que comprueba si hay comentarios mediante la función <code><a title="Function Reference/have comments -- WordPress Codex" href="http://codex.wordpress.org/Function_Reference/have_comments">have_comments</a></code>.</p>
<p>El segundo componente básico, <strong>el formulario para comentar</strong>, debe ir acompañado de una comprobación que garantice que el sistema de comentarios está abierto, de lo contrario no se mostrará. La función <code><a title="Function Reference/comments open -- WordPress Codex" href="http://codex.wordpress.org/Function_Reference/comments_open">comments_open()</a></code> usada dentro de una sentencia condicional nos lo permite.</p>
<p>Así para generar un sistema básico de comentarios debemos usar las siguientes funciones de WordPress:</p>
<ul>
<li><code>post_password_required</code></li>
<li><code>have_comments</code></li>
<li><code>wp_list_comments</code></li>
<li><code>comments_open</code></li>
<li><code>comment_form</code></li>
</ul>
<p>El código completo:</p>
<pre class="brush: php; title: ; notranslate">
if ( isset($_SERVER['SCRIPT_FILENAME']) &amp;&amp; 'comments.php' == basename($_SERVER['SCRIPT_FILENAME']) )
  die ('Please do not load this page directly. Thanks! / Por favor, no intentes acceder a esta página directamente. Gracias.');

&lt;div id=&quot;comments&quot;&gt;

  if ( post_password_required() ) :
    echo 'Esta entrada está protegida con contraseña. Introduce la contraseña para leer los comentarios.&lt;/div&gt;&lt;!-- end #comments --&gt;';

     /* Esto código hace que no se siga ejecutando
     el código para la generación de comentarios,
     que salte para completar la carga de la página
     sin ellos */
    return;
  endif;

  if ( have_comments() ) { // si la entrada tiene comentarios
    wp_list_comments();
  } else { // si la entrada no tiene comentarios
    if ( comments_open() ) { // si los comentarios están abiertos aunque no haya
       echo 'Aún no hay comentarios a esta entrada.';
    } else { // si los comentarios están cerrados
       echo 'Los comentarios están deshabilitados en esta entrada.';
    }
  } // fin if have_comments

&lt;/div&gt;&lt;!-- end #comments --&gt;

if ( comments_open() ) { // si los comentarios están habilitados
  comment_form();
}
</pre>
<p>Para que funcione plenamente la función <code>comment_form</code> debemos incluir en el archivo <code>header.php</code> de nuestro theme la siguiente línea, justo antes de la función <code>wp_head</code>:</p>
<pre class="brush: php; title: ; notranslate">
if ( is_singular() ) wp_enqueue_script( 'comment-reply' );
</pre>
<p>Esta línea de código habilitará las funciones necesarias para poder contestar directamente a un comentario.</p>
<p>A esta base le podemos añadir algunos funciones más. Por ejemplo, el loop de comentarios también dispone de un sistema de paginación, por el que se puede navegar con las funciones <code>previous_comments_link</code> y <code>next_comments_link</code>:</p>
<pre class="brush: xml; title: ; notranslate">
&lt;?php wp_list_comments(); ?&gt;
&lt;div id=&quot;comments-nav&quot;&gt;
   &lt;div class=&quot;nav-previous&quot;&gt;&lt;?php previous_comments_link('Comentarios anteriores'); ?&gt;&lt;/div&gt;
   &lt;div class=&quot;nav-next&quot;&gt;&lt;?php next_comments_link('Comentarios'); ?&gt;&lt;/div&gt;
&lt;/div&gt;
</pre>
<p>Referencias:</p>
<ul>
<li><a title="WordPress 2.7 Comments Enhancements -- Nothing to See Here" href="http://ottodestruct.com/blog/2008/wordpress-27-comments-enhancements/">WordPress 2.7 Comments Enhancements</a></li>
<li><a title="How to Add Nested Comments to Your WordPress Theme -- Bavotasan" href="http://bavotasan.com/2009/how-to-add-nested-comments-to-your-wordpress-theme/">How to Add Nested Comments to Your WordPress Theme</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://voragine.net/wordpress/entendiendo-el-sistema-de-comentarios-en-wordpress-wp_list_comments-y-comment_form/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

