<?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 &#187; WordPress</title>
	<atom:link href="http://voragine.net/archivo/wordpress/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 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>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>
		<item>
		<title>Cómo hacer un loop en WordPress con los post de los últimos días, meses o años</title>
		<link>http://voragine.net/wordpress/como-hacer-un-loop-en-wordpress-con-los-post-de-los-ultimos-dias-meses-o-anos</link>
		<comments>http://voragine.net/wordpress/como-hacer-un-loop-en-wordpress-con-los-post-de-los-ultimos-dias-meses-o-anos#comments</comments>
		<pubDate>Fri, 30 Dec 2011 11:17:55 +0000</pubDate>
		<dc:creator>skotperez</dc:creator>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[add_filter]]></category>
		<category><![CDATA[loop]]></category>
		<category><![CDATA[wp_query]]></category>

		<guid isPermaLink="false">http://voragine.net/?p=861</guid>
		<description><![CDATA[Que no es lo mismo que hacer un loop con los post de la última semana, del último mes o del último año. Para <strong><a title="Class Reference/WP Query -- WordPress Codex" href="http://codex.wordpress.org/Class_Reference/WP_Query#Time_Parameters">conseguir un loop con las entradas de los últimos días, meses o años</a></strong> tenemos que crear una función que añada un filtro temporal a la query.]]></description>
			<content:encoded><![CDATA[<p>Que no es lo mismo que hacer un loop con los post de la última semana, del último mes o del último año. Para <strong><a title="Class Reference/WP Query -- WordPress Codex" href="http://codex.wordpress.org/Class_Reference/WP_Query#Time_Parameters">conseguir un loop con las entradas de los últimos días, meses o años</a></strong> tenemos que crear una función que añada un filtro temporal a la query. Por ejemplo, para obtener los post de los últimos doce meses:</p>
<pre class="brush: php; title: ; notranslate">
function filter_where( $where = '' ) {
  $where .= &quot; AND post_date &gt; '&quot; . date('Y-m-d', strtotime('-365 days')) . &quot;'&quot;;
  return $where;
}
</pre>
<p>A continuación filtramos la query. La variable <code>$query_string</code> contiene la query sin modificar, el loop correspondiente a la página que se esté cargando.</p>
<pre class="brush: php; title: ; notranslate">
add_filter( 'posts_where', 'filter_where' );
$query = new WP_Query( $query_string );
  while ($query-&gt;have_posts()) : $query-&gt;the_post();
    include &quot;loop.php&quot;;
  endwhile;
remove_filter( 'posts_where', 'filter_where' );
</pre>
<p>Si se quiere aplicar el filtro a una query específica, basta sustituir <code>$query_string</code> por parámetros de <code><a title="Class Reference/WP Query -- WordPress Codex" href="http://codex.wordpress.org/Class_Reference/WP_Query">WP_query</a></code>.</p>
]]></content:encoded>
			<wfw:commentRss>http://voragine.net/wordpress/como-hacer-un-loop-en-wordpress-con-los-post-de-los-ultimos-dias-meses-o-anos/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Dos formas para saber si una página tiene subpáginas en WordPress</title>
		<link>http://voragine.net/wordpress/dos-formas-para-saber-si-una-pagina-tiene-subpaginas-en-wordpress</link>
		<comments>http://voragine.net/wordpress/dos-formas-para-saber-si-una-pagina-tiene-subpaginas-en-wordpress#comments</comments>
		<pubDate>Wed, 16 Nov 2011 07:35:51 +0000</pubDate>
		<dc:creator>skotperez</dc:creator>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[functions.php]]></category>
		<category><![CDATA[get_pages]]></category>
		<category><![CDATA[has_children]]></category>
		<category><![CDATA[page]]></category>

		<guid isPermaLink="false">http://voragine.net/?p=822</guid>
		<description><![CDATA[Sencilla <strong><a title="WordPress has_children() function -- Forrst" href="http://forrst.com/posts/WordPress_has_children_function-DmS">función para saber si una página tiene subpáginas</a></strong>. Si se invoca sin parámetro evaluará la página actual; si se provee un identificador de página como parámetro, evaluará esa página. A mí no me acaba de convencer ni funcionar, pero ahí queda. Prefiero <a title="How to Check if a WordPress Page Has Children/subpages -- jeangalea.com" href="http://www.jeangalea.com/posts/wordpress/check-wordpress-page-childrensubpages/">el viejo método del count</a>.]]></description>
			<content:encoded><![CDATA[<p>Sencilla <strong><a title="WordPress has_children() function -- Forrst" href="http://forrst.com/posts/WordPress_has_children_function-DmS">función para saber si una página tiene subpáginas</a></strong>. Si se invoca sin parámetro evaluará la página actual; si se provee un identificador de página como parámetro, evaluará esa página.</p>
<pre class="brush: php; title: ; notranslate">
function has_children($child_of = null) {
	if(is_null($child_of)) {
		global $post;
		$child_of = ($post-&gt;post_parent != '0') ? $post-&gt;post_parent : $post-&gt;ID;
	}
	return (wp_list_pages(&quot;child_of=$child_of&amp;echo=0&quot;)) ? true : false;
}
</pre>
<p>Basta incluir la función en el archivo <code>functions.php</code>.</p>
<p>Si no se quiere depender de functions.php o se necesita la consulta puntualmente, siempre se puede recurrir al <a title="How to Check if a WordPress Page Has Children/subpages -- jeangalea.com" href="http://www.jeangalea.com/posts/wordpress/check-wordpress-page-childrensubpages/">viejo método del count</a>:</p>
<pre class="brush: php; title: ; notranslate">
$children = get_pages('child_of='.$post-&gt;ID);?&gt;
if( count( $children ) != 0 ) { // Has Children }
else { // No children }
</pre>
]]></content:encoded>
			<wfw:commentRss>http://voragine.net/wordpress/dos-formas-para-saber-si-una-pagina-tiene-subpaginas-en-wordpress/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cómo meter el contenido de una entrada de WordPress en una variable sin perder los saltos de línea</title>
		<link>http://voragine.net/wordpress/como-meter-el-contenido-de-una-entrada-de-wordpress-en-una-variable-sin-perder-los-saltos-de-linea</link>
		<comments>http://voragine.net/wordpress/como-meter-el-contenido-de-una-entrada-de-wordpress-en-una-variable-sin-perder-los-saltos-de-linea#comments</comments>
		<pubDate>Tue, 15 Nov 2011 09:36:20 +0000</pubDate>
		<dc:creator>skotperez</dc:creator>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[apply_filters]]></category>
		<category><![CDATA[get_the_content]]></category>
		<category><![CDATA[the_content]]></category>

		<guid isPermaLink="false">http://voragine.net/?p=818</guid>
		<description><![CDATA[Uno de mis eternas batallas con WordPress, perdida hasta ahora, recientemente ganada: para almacenar información de las entradas de tu página (el título, la fecha, la URL...) en variables para usarlas más adelante, WordPress provee de unas funciones magníficas que devuelven la información sin hacer <code>echo</code>. El problema viene con la función de este tipo para el contenido, <code><a title="Function Reference/get the content -- WordPress Codex" href="http://codex.wordpress.org/Function_Reference/get_the_content">get_the_content</a></code>, que permite almacenar el contenido de una entrada en una variable.]]></description>
			<content:encoded><![CDATA[<p>Uno de mis eternas batallas con WordPress, perdida hasta ahora, recientemente ganada: para almacenar información de las entradas de tu página (el título, la fecha, la URL&#8230;) en variables para usarlas más adelante, WordPress provee de unas funciones magníficas que devuelven la información sin hacer <code>echo</code>. El problema viene con la función de este tipo para el contenido, <code><a title="Function Reference/get the content -- WordPress Codex" href="http://codex.wordpress.org/Function_Reference/get_the_content">get_the_content</a></code>, que permite almacenar el contenido de una entrada en una variable:</p>
<pre class="brush: php; title: ; notranslate">$post_text = get_the_content();</pre>
<p>pero le quita los saltos de línea, destruyendo los párrafos.</p>
<p>Para que esto no ocurra hay que aplicarle el filtro que WordPress aplica a la función <code>the_content</code> pero no a <code>get_the_content</code>.</p>
<pre class="brush: php; title: ; notranslate">
$post_text = get_the_content();
$post_text = apply_filters( 'the_content', $post_text );
</pre>
]]></content:encoded>
			<wfw:commentRss>http://voragine.net/wordpress/como-meter-el-contenido-de-una-entrada-de-wordpress-en-una-variable-sin-perder-los-saltos-de-linea/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Cómo traducir un tema de WordPress</title>
		<link>http://voragine.net/wordpress/como-traducir-un-tema-de-wordpress</link>
		<comments>http://voragine.net/wordpress/como-traducir-un-tema-de-wordpress#comments</comments>
		<pubDate>Mon, 07 Nov 2011 08:51:27 +0000</pubDate>
		<dc:creator>skotperez</dc:creator>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[gettext]]></category>
		<category><![CDATA[load_theme_textdomain]]></category>
		<category><![CDATA[poedit]]></category>

		<guid isPermaLink="false">http://voragine.net/?p=813</guid>
		<description><![CDATA[Para conseguir un <strong>tema de WordPress traducible</strong> tenemos que etiquetar adecuadamente las cadenas a traducir en el código, crear un archivo con todas estas cadenas y sus equivalentes en el idioma deseado, y configurar nuestro tema con las funciones adecuadas para que utilize los archivos de traducción.]]></description>
			<content:encoded><![CDATA[<p>Para conseguir un <strong>tema de WordPress traducible</strong> tenemos que etiquetar adecuadamente las cadenas a traducir en el código, crear un archivo con todas estas cadenas y sus equivalentes en el idioma deseado, y configurar nuestro tema con las funciones adecuadas para que utilize los archivos de traducción.</p>
<h3>Etiquetando las cadenas a traducir en el código</h3>
<p>Para ello utilizamos la notación <code>__('cadena a traducir','nombre_tema')</code> y <code>_e('cadena a traducir','nombre_tema')</code>. La primera sencillamente nota que es una cadena a traducir, la segunda además hace <code>echo</code> de la cadena. En ambos casos el primer parámetro es la cadena; el segundo indica cual es el contexto de la traducción, normalmente se utiliza el nombre del tema. La cadena a traducir puede contener etiquetas HTML y para evitar errores de codificación, es mejor usar <a title="Códigos HTML - Caracteres y símbolos" href="http://www.ascii.cl/es/codigos-html.htm">códigos HTML para los caracteres especiales</a>, como las tildes. Por ejemplo:</p>
<pre class="brush: php; title: ; notranslate">
_e('&lt;strong&gt;Error 404&lt;/strong&gt;. La página que buscas no se encuentra', 'mi_tema');
the_content(__('Leer más...', 'mi_tema'));
</pre>
<h3>Creando un archivo con las cadenas de traducción</h3>
<p>El <a title="GNU `gettext' utilities" href="http://www.gnu.org/software/gettext/manual/gettext.html">paquete gettext</a> y el sistema de archivos <code>.po</code> y <code>.mo</code> permite <strong><a title="Creating POT Files -- WordPress Codex" href="http://codex.wordpress.org/User:Skippy/Creating_POT_Files">crear archivos con todas las cadenas a traducir automáticamente</a></strong>. La mejor opción es instalarse el programa <a title="PoEdtit -- Sourceforge" href="http://sourceforge.net/projects/poedit/">PoEdit</a>, una interfaz para gettext que facilita mucho el proceso. El archivo <code>.po</code> contendrá todas las cadenas y sus traducciones; cuando salvemos el archivo se generará automáticamente otro archivo con la compilación del archivo <code>.po</code>. Este otro archivo <code>.mo</code> es el que usará la web para traducir.</p>
<p>Conviene tener en cuenta las reglas de nomenclatura de estos archivos, ya que nombrarlo inadecuadamente puede hacer que WordPress no tenga en cuenta las traducciones. El nombre debe estar formado por el <strong><a title="Language Codes -- gettext manual" href="http://www.gnu.org/software/gettext/manual/html_chapter/gettext_16.html#Language-Codes">código del idioma</a></strong> y el <strong><a title="Country Codes -- gettext manual" href="http://www.gnu.org/software/gettext/manual/html_chapter/gettext_16.html#Country-Codes">código del país</a></strong>. Por ejemplo, <code>de_DE.mo</code> para el alemán.</p>
<h3>Configuración del tema para que sea traducible</h3>
<p>Para indicar a WordPress que nuestro tema es traducible tenemos que incluir una función en el archivo <code>functions.php</code>, crear la subcarpeta <code>languages/</code> dentro de la del tema, y alojar allí el archivo <code>.mo</code>. También conviene alojar el archivo <code>.po</code> aunque no es necesario para que la traducción funcione.</p>
<p>La función se encargará de cargar las cadenas de traducción del archivo correcto, mediante <code><a title="Function Reference/load theme textdomain -- WordPress Codex" href="http://codex.wordpress.org/Function_Reference/load_theme_textdomain">load_theme_textdomain()</a></code>.</p>
<pre class="brush: php; title: ; notranslate">
add_action('after_setup_theme', 'my_theme_setup');
function my_theme_setup(){
    load_theme_textdomain('mi_tema', get_template_directory() . '/languages');
}
</pre>
<p>Después creamos la carpeta <code>languages/</code> y subimos a ella el archivo con las traducciones.</p>
<h3>Más información</h3>
<ul>
<li><a title="How to localize WordPress themes and plugins with GetText -- IcanLocalize" href="http://blog-en.icanlocalize.com/installing-wordpress-for-multiple-language-blogs/how-to-localize-wordpress-themes-and-plugins-with-gettext/">How to localize WordPress themes and plugins with GetText</a></li>
<li><a title="Installing WordPress in Your Language -- WordPress Codex" href="http://codex.wordpress.org/Installing_WordPress_in_Your_Language"> Installing WordPress in Your Language</a></li>
<li><a title="Translate a WordPress Theme in 3 Easy Steps -- SoloStream" href="http://www.solostream.com/blog/tutorials/translate-wordpress-theme/"> Translate a WordPress Theme in 3 Easy Steps</a></li>
<li><a title="How to Translate a WordPress Theme -- App Themes" href="http://www.appthemes.com/blog/how-to-translate-a-wordpress-theme/"> How to Translate a WordPress Theme</a></li>
<li><a title="How to make a translatable WordPress theme -- Cats who code" href="http://www.catswhocode.com/blog/how-to-make-a-translatable-wordpress-theme"> How to make a translatable WordPress theme</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://voragine.net/wordpress/como-traducir-un-tema-de-wordpress/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Howto sobre $wpdb: cómo consultar, insertar o modificar la base de datos a voluntad en WordPress</title>
		<link>http://voragine.net/wordpress/howto-sobre-wpdb-como-consultar-insertar-o-modificar-la-base-de-datos-a-voluntad-en-wordpress</link>
		<comments>http://voragine.net/wordpress/howto-sobre-wpdb-como-consultar-insertar-o-modificar-la-base-de-datos-a-voluntad-en-wordpress#comments</comments>
		<pubDate>Tue, 25 Oct 2011 11:17:36 +0000</pubDate>
		<dc:creator>skotperez</dc:creator>
				<category><![CDATA[Breves]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[base de datos]]></category>
		<category><![CDATA[wpdb]]></category>

		<guid isPermaLink="false">http://voragine.net/?p=783</guid>
		<description><![CDATA[<strong><a title="Advanced WordPress Queries -- wp.tutsplus.com" href="http://wp.tutsplus.com/tutorials/advanced-wordpress-queries-part-1/">Advanced WordPress Queries</a></strong>, en wp.tutsplus.]]></description>
			<content:encoded><![CDATA[<p><strong><a title="Advanced WordPress Queries -- wp.tutsplus.com" href="http://wp.tutsplus.com/tutorials/advanced-wordpress-queries-part-1/">Advanced WordPress Queries</a></strong>, en wp.tutsplus.</p>
]]></content:encoded>
			<wfw:commentRss>http://voragine.net/wordpress/howto-sobre-wpdb-como-consultar-insertar-o-modificar-la-base-de-datos-a-voluntad-en-wordpress/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

