De El Wiki de Loretahur
Saltar a: navegación, buscar
(Deshecha la edición 94 de Loretahur (disc.))
(Panel de administración)
 
(No se muestran 4 ediciones intermedias del mismo usuario)
Línea 1: Línea 1:
 
== La estructura de WordPress  ==
 
== La estructura de WordPress  ==
  
Internamente WordPress se compone de los siguientes ficheros y carpetas:  
+
Internamente WordPress se compone de los siguientes ficheros y carpetas:
  
*'''wp-config.php''': fichero de configuración. Aquí está almacenado el usuario y el nombre de la base de datos, así como otros datos de seguridad. Es importante que este fichero no tenga lectura más que por el owner del mismo. Este fichero no se machaca con las actualizaciones de WP.  
+
*'''wp-config.php''': fichero de configuración. Aquí está almacenado el usuario y el nombre de la base de datos, así como otros datos de seguridad. Es importante que este fichero no tenga lectura más que por el owner del mismo. Este fichero no se machaca con las actualizaciones de WP.
*'''wp-admin''' y '''wp-includes''': carpetas que guardan los ficheros php que hacen que funcione el blog. Ambas carpetas se machacan con las actualizaciones  
+
*'''wp-admin''' y '''wp-includes''': carpetas que guardan los ficheros php que hacen que funcione el blog. Ambas carpetas se machacan con las actualizaciones
*'''wp-content''': esta carpeta guarda los datos y configuraciones propias del blog. No se toca nada en la actualizaciones de WP. La estructura interna es la siguiente:  
+
*'''wp-content''': esta carpeta guarda los datos y configuraciones propias del blog. No se toca nada en la actualizaciones de WP. La estructura interna es la siguiente:
**'''uploads''': todas las imágenes, vídeos y archivos que se suban a la librería de wordpress. Normalmente se organiza por años y luego por meses. Ejemplo: uploads/2009/12.  
+
**'''uploads''': todas las imágenes, vídeos y archivos que se suban a la librería de wordpress. Normalmente se organiza por años y luego por meses. Ejemplo: uploads/2009/12.
**'''plugins''': todos los plugins que tenemos disponibles para el blog (aunque no estén activos).  
+
**'''plugins''': todos los plugins que tenemos disponibles para el blog (aunque no estén activos).
**'''languages''': aquí van los ficheros .mo de los idiomas en los que queremos tener WP (tanto la parte visible como la de administración). Para indicar luego que el blog esté en un idioma u otro, habrá que añadir una línea en wp-config.php como la que sigue: define ('WPLANG', 'es_ES'); donde es_ES es el nombre del fichero .mo (tienen que coincidir en nombre).  
+
**'''languages''': aquí van los ficheros .mo de los idiomas en los que queremos tener WP (tanto la parte visible como la de administración). Para indicar luego que el blog esté en un idioma u otro, habrá que añadir una línea en wp-config.php como la que sigue: define ('WPLANG', 'es_ES'); donde es_ES es el nombre del fichero .mo (tienen que coincidir en nombre).
 
**'''themes''': todas las plantillas que tenemos disponibles para "vestir" al blog. Nosotros nos centraremos en esta carpeta.
 
**'''themes''': todas las plantillas que tenemos disponibles para "vestir" al blog. Nosotros nos centraremos en esta carpeta.
  
Como podemos ver, una instalación de WordPress es muy portable. Si nos queremos cambiar de servidor o hosting, bastará con que nos llevemos estas carpetas y la Base de Datos exportada en un simple .sql. No requiere de otras configuraciones más complejas.  
+
Como podemos ver, una instalación de WordPress es muy portable. Si nos queremos cambiar de servidor o hosting, bastará con que nos llevemos estas carpetas y la Base de Datos exportada en un simple .sql. No requiere de otras configuraciones más complejas.
  
 
== La estructura básica de un theme  ==
 
== La estructura básica de un theme  ==
Línea 17: Línea 17:
 
Las plantillas o themes son la capa de presentación de los blogs o páginas web que se monten. Se puede cambiar esta capa sin que la información se vea afectada. WordPress reconoce automáticamente los siguientes ficheros y los interpreta:  
 
Las plantillas o themes son la capa de presentación de los blogs o páginas web que se monten. Se puede cambiar esta capa sin que la información se vea afectada. WordPress reconoce automáticamente los siguientes ficheros y los interpreta:  
  
[[Image:Cuerpo.jpg|right|Cuerpo.jpg]]  
+
[[Image:Cuerpo.jpg|right]]
 
+
 
*'''header.php''': aquí se define la cabecera de la página.  
 
*'''header.php''': aquí se define la cabecera de la página.  
 
*'''footer.php''': aquí se define el pie de página.  
 
*'''footer.php''': aquí se define el pie de página.  
Línea 25: Línea 24:
 
*'''single.php''': este es el fichero que se interpreta cuando se carga un post concreto.  
 
*'''single.php''': este es el fichero que se interpreta cuando se carga un post concreto.  
 
*'''archive.php''': igual que single.php pero para las páginas de categorías y etiquetas.  
 
*'''archive.php''': igual que single.php pero para las páginas de categorías y etiquetas.  
*'''category.php''': plantilla para las categorías. Cuando un usuario pincha sobre el enlace de una categoría, WordPress prueba si existe el fichero ''category.php''. Si no lo encuentra, carga ''archive.php''. Y si éste tampoco lo encuentra, se va a por el ''index.php''. Más adelante veremos un gráfico con la interpretación jerárquica que hace WordPress.  
+
*'''category.php''': plantilla para las categorías. Cuando un usuario pincha sobre el enlace de una categoría, WordPress prueba si existe el fichero ''category.php''. Si no lo encuentra, carga ''archive.php''. Y si éste tampoco lo encuentra, se va a por el ''index.php''. Más adelante veremos un gráfico con la interpretación jerárquica que hace WordPress.
 
*'''comments.php''': plantilla de los comentarios.  
 
*'''comments.php''': plantilla de los comentarios.  
*'''searchform.php''': formulario de búsqueda.  
+
*'''searchform.php''': formulario de búsqueda.
*'''search.php''': página donde se muestran los resultados de una búsqueda.  
+
*'''search.php''': página donde se muestran los resultados de una búsqueda.
 
*'''functions.php''': aquí se recogerán funciones propias del theme. Por ejemplo, si queremos registrar varias barras laterales para que aparezcan en la sección de widgets, indicar a WP dónde están los ficheros de idiomas, quitar filtros, ...  
 
*'''functions.php''': aquí se recogerán funciones propias del theme. Por ejemplo, si queremos registrar varias barras laterales para que aparezcan en la sección de widgets, indicar a WP dónde están los ficheros de idiomas, quitar filtros, ...  
 
*'''style.css''': fichero con los estilos.  
 
*'''style.css''': fichero con los estilos.  
Línea 35: Línea 34:
 
Desde el apartado de administración se podrá configurar la apariencia de una forma muy visual mediante widgets (en el apartado Apariencia --> Widgets). Aquí aparecen las barras laterales definidas y múltiples funcionalidades que se pueden colocar: comentarios recientes, posts recientes, buscador, una caja donde introducir nuestro propio código html, ...  
 
Desde el apartado de administración se podrá configurar la apariencia de una forma muy visual mediante widgets (en el apartado Apariencia --> Widgets). Aquí aparecen las barras laterales definidas y múltiples funcionalidades que se pueden colocar: comentarios recientes, posts recientes, buscador, una caja donde introducir nuestro propio código html, ...  
  
También desde el apartado de administración (Ajustes --> Lectura) podemos configurar que la portada que se carga de nuestra web sea una página y no el formato blog de entradas, dándole más carácter de página web.  
+
También desde el apartado de administración (Ajustes --> Lectura) podemos configurar que la portada que se carga de nuestra web sea una página y no el formato blog de entradas, dándole más carácter de página web.
  
== Sidebars ==
+
==Sidebars==
  
 
Podríamos cargar diferentes sidebars con la misma metodología que los headers y los footers (explicada más adelante), pero existe una manera para que generemos un espacio dentro del apartado de los ''widgets''.  
 
Podríamos cargar diferentes sidebars con la misma metodología que los headers y los footers (explicada más adelante), pero existe una manera para que generemos un espacio dentro del apartado de los ''widgets''.  
  
Para que aparezcan en la sección de widgets las diferentes sidebars que queramos "alimentar" desde el panel de administración, hay que registrarlas en el fichero functions.php de la siguiente forma:  
+
Para que aparezcan en la sección de widgets las diferentes sidebars que queramos "alimentar" desde el panel de administración, hay que registrarlas en el fichero functions.php de la siguiente forma:
  
<br>
 
<div style="text-align: left;" class="mw-geshi" dir="ltr"><div class="php source-php"><pre class="de1"><span class="kw1">if</span> <span class="br0">(</span> <span class="kw3">function_exists</span><span class="br0">(</span><span class="st_h">'register_sidebars'</span><span class="br0">)</span> <span class="br0">)</span> <span class="br0">{</span> register_sidebar<span class="br0">(</span><span class="kw3">array</span><span class="br0">(</span> <span class="st_h">'name'</span> <span class="sy0">=&gt;</span> <span class="st_h">'Barra Lateral Derecha'</span><span class="sy0">,</span> <span class="st_h">'before_widget'</span> <span class="sy0">=&gt;</span> <span class="st_h">'código html que queremos que se cargue al inicio de la barra'</span><span class="sy0">,</span> <span class="st_h">'after_widget'</span> <span class="sy0">=&gt;</span> <span class="st_h">'código html que queremos que se cargue al final de la barra'</span><span class="sy0">,</span> <span class="st_h">'before_title'</span> <span class="sy0">=&gt;</span> <span class="st_h">'código html que queremos que se cargue al inicio del título de la barra'</span><span class="sy0">,</span> <span class="st_h">'after_title'</span> <span class="sy0">=&gt;</span> <span class="st_h">'código html que queremos que se cargue al final del título de la barra'</span><span class="sy0">,</span> <span class="br0">)</span><span class="br0">)</span><span class="sy0">;</span> register_sidebar<span class="br0">(</span><span class="kw3">array</span><span class="br0">(</span> <span class="st_h">'name'</span> <span class="sy0">=&gt;</span> <span class="st_h">'Barra Lateral Izquierda'</span><span class="sy0">,</span> <span class="st_h">'before_widget'</span> <span class="sy0">=&gt;</span> <span class="st_h">'código html que queremos que se cargue al inicio de la barra'</span><span class="sy0">,</span> <span class="st_h">'after_widget'</span> <span class="sy0">=&gt;</span> <span class="st_h">'código html que queremos que se cargue al final de la barra'</span><span class="sy0">,</span> <span class="st_h">'before_title'</span> <span class="sy0">=&gt;</span> <span class="st_h">'código html que queremos que se cargue al inicio del título de la barra'</span><span class="sy0">,</span> <span class="st_h">'after_title'</span> <span class="sy0">=&gt;</span> <span class="st_h">'código html que queremos que se cargue al final del título de la barra'</span><span class="sy0">,</span> <span class="br0">)</span><span class="br0">)</span><span class="sy0">;</span> <span class="br0">}</span></pre></div></div>
 
<br> Para usarlas posteriormente, la llamada será de la siguiente forma:
 
  
<br>
+
<syntaxhighlight lang="php">
<div style="text-align: left;" class="mw-geshi" dir="ltr"><div class="php source-php"><pre class="de1"><span class="kw2">&lt;?php</span> <span class="kw1">if</span> <span class="br0">(</span> <span class="sy0">!</span><span class="kw3">function_exists</span><span class="br0">(</span><span class="st_h">'dynamic_sidebar'</span><span class="br0">)</span> <span class="sy0">||</span> <span class="sy0">!</span>dynamic_sidebar<span class="br0">(</span><span class="st_h">'Barra Lateral Izquierda'</span><span class="br0">)</span> <span class="br0">)</span> <span class="sy0">:</span> <span class="kw1">echo</span> <span class="st0">"El usuario no ha puesto widgets en esta barra"</span><span class="sy0">;</span> <span class="kw1">endif</span><span class="sy0">;</span> <span class="sy1">?&gt;</span></pre></div></div>
+
if ( function_exists('register_sidebars') )
<br>  
+
{
 +
    register_sidebar(array(
 +
        'name' => 'Barra Lateral Derecha',
 +
        'before_widget' => 'código html que queremos que se cargue al inicio de la barra',
 +
        'after_widget' => 'código html que queremos que se cargue al final de la barra',
 +
        'before_title' => 'código html que queremos que se cargue al inicio del título de la barra',
 +
        'after_title' => 'código html que queremos que se cargue al final del título de la barra',
 +
    ));
 +
    register_sidebar(array(
 +
        'name' => 'Barra Lateral Izquierda',
 +
        'before_widget' => 'código html que queremos que se cargue al inicio de la barra',
 +
        'after_widget' => 'código html que queremos que se cargue al final de la barra',
 +
        'before_title' => 'código html que queremos que se cargue al inicio del título de la barra',
 +
        'after_title' => 'código html que queremos que se cargue al final del título de la barra',
 +
    ));
 +
}
 +
</syntaxhighlight>
  
== Cabeceras y Footers personalizados  ==
 
<div style="text-align: left;" class="mw-geshi" dir="ltr"><div class="php source-php"><pre class="de1"><span class="kw2">&lt;?php</span> <span class="kw1">if</span> <span class="br0">(</span>is_category<span class="br0">(</span><span class="st_h">'Cine'</span><span class="br0">)</span><span class="br0">)</span> <span class="br0">{</span> get_footer<span class="br0">(</span><span class="st_h">'Cine'</span><span class="br0">)</span><span class="sy0">;</span> <span class="br0">}</span> <span class="kw1">else</span> <span class="br0">{</span> get_footer<span class="br0">(</span><span class="br0">)</span><span class="sy0">;</span> <span class="br0">}</span> <span class="sy1">?&gt;</span></pre></div></div>
 
<br> De esta forma tan sencilla podemos cargar ficheros php personalizados para mostrar diferentes footers o cabeceras según estemos en una categoría u otra. En el ejemplo, si estamos en la categoría de ''Cine'' se cargará ''footer-cine.php''. Si no, se cargará ''footer.php''.
 
  
Sería exactamente lo mismo para las cabeceras (''header-cine.php'' vs. ''header.php''):  
+
Para usarlas posteriormente, la llamada será de la siguiente forma:
  
<br>
 
<div style="text-align: left;" class="mw-geshi" dir="ltr"><div class="php source-php"><pre class="de1"><span class="kw2">&lt;?php</span> <span class="kw1">if</span> <span class="br0">(</span>is_category<span class="br0">(</span><span class="st_h">'cine'</span><span class="br0">)</span><span class="br0">)</span> <span class="br0">{</span> get_header<span class="br0">(</span><span class="st_h">'cine'</span><span class="br0">)</span><span class="sy0">;</span> <span class="br0">}</span> <span class="kw1">else</span> <span class="br0">{</span> get_header<span class="br0">(</span><span class="br0">)</span><span class="sy0">;</span> <span class="br0">}</span> <span class="sy1">?&gt;</span></pre></div></div>
 
<br> Es decir, lo que WordPress busca es el fichero ''header-slug.php'' (el '''slug''' es el permalink. Es decir, la versión url del nombre: una cadena sin mayúsculas, sin tildes, con guiones en vez de espacios).
 
  
== Categorías y etiquetas personalizadas  ==
+
<syntaxhighlight lang="php">
 +
<?php if ( !function_exists('dynamic_sidebar') || !dynamic_sidebar('Barra Lateral Izquierda') ) :
 +
          echo "El usuario no ha puesto widgets en esta barra";
 +
      endif; ?>
 +
</syntaxhighlight>
  
Para cargar diferentes presentaciones dependiendo de la categoría o la etiqueta sobre la que se pinche, podemos crear un php igual que lo hacíamos con las cabeceras, es decir ''category-slug.php'' o ''tag-slug.php'' o bien con el siguiente formato de nombre ''category-XX.php'' o ''tag-XX.php'' (donde XX es el id que tiene internamente esa categoría o etiqueta). De esta forma, podríamos ponerle una cabecera, un footer y un sidebar personalizados dependiendo de la categoría o la etiqueta en la que estemos.
 
  
Aquí vemos el orden en el que WordPress busca los ficheros y los carga:
+
== Cabeceras y Footers personalizados ==
  
[[Image:Template Hierarchy.png]]
 
  
Para cualquiera de las vistas que no tenga un archivo de plantilla separado, WordPress usará ''index.php'' de manera predeterminada. Si un visitante solicita un artículo individual, WordPress primero buscará un archivo llamado ''single.php''. Si ese archivo existe, será utilizado para presentar el artículo. Si ese archivo no existe, WordPress utilizará ''index.php''.  
+
<syntaxhighlight lang="php">
 +
<?php if (is_category('Cine')) {
 +
get_footer('Cine');
 +
} else {
 +
get_footer();
 +
} ?>
 +
</syntaxhighlight>
 +
 
 +
 
 +
De esta forma tan sencilla podemos cargar ficheros php personalizados para mostrar diferentes footers o cabeceras según estemos en una categoría u otra. En el ejemplo, si estamos en la categoría de ''Cine'' se cargará ''footer-cine.php''. Si no, se cargará ''footer.php''.
 +
 
 +
Sería exactamente lo mismo para las cabeceras (''header-cine.php'' vs. ''header.php''):
 +
 
 +
 
 +
<syntaxhighlight lang="php">
 +
<?php if (is_category('cine')) {
 +
get_header('cine');
 +
} else {
 +
get_header();
 +
} ?>
 +
</syntaxhighlight>
 +
 
 +
 
 +
Es decir, lo que WordPress busca es el fichero ''header-slug.php'' (el '''slug''' es el permalink. Es decir, la versión url del nombre: una cadena sin mayúsculas, sin tildes, con guiones en vez de espacios).
 +
 
 +
== Categorías y etiquetas personalizadas ==
 +
 
 +
Para cargar diferentes presentaciones dependiendo de la categoría o la etiqueta sobre la que se pinche, podemos crear un php igual que lo hacíamos con las cabeceras, es decir ''category-slug.php'' o ''tag-slug.php'' o bien con el siguiente formato de nombre ''category-XX.php'' o ''tag-XX.php'' (donde XX es el id que tiene internamente esa categoría o etiqueta). De esta forma, podríamos ponerle una cabecera, un footer y un sidebar personalizados dependiendo de la categoría o la etiqueta en la que estemos.
 +
 
 +
Aquí vemos el orden en el que WordPress busca los ficheros y los carga:
 +
 
 +
[[Archivo:Template Hierarchy.png]]
 +
 
 +
Para cualquiera de las vistas que no tenga un archivo de plantilla separado, WordPress usará ''index.php'' de manera predeterminada. Si un visitante solicita un artículo individual, WordPress primero buscará un archivo llamado ''single.php''. Si ese archivo existe, será utilizado para presentar el artículo. Si ese archivo no existe, WordPress utilizará ''index.php''.
  
<br>
 
  
 
== Templates  ==
 
== Templates  ==
Línea 77: Línea 117:
 
Podemos crear plantillas con comportamientos propios a los que luego asignar a cada '''página'''. Desde el editor de páginas estáticas hay una opción para aplicar plantillas. Para que un fichero php sea interpretado por WordPress como una template, hay que incluir al inicio del mismo el siguiente código:  
 
Podemos crear plantillas con comportamientos propios a los que luego asignar a cada '''página'''. Desde el editor de páginas estáticas hay una opción para aplicar plantillas. Para que un fichero php sea interpretado por WordPress como una template, hay que incluir al inicio del mismo el siguiente código:  
  
<br>
+
 
<div style="text-align: left;" class="mw-geshi" dir="ltr"><div class="php source-php"><pre class="de1"><span class="coMULTI">/*  
+
<syntaxhighlight lang="php">
 +
/*  
 
Template Name: Nombre-plantilla  
 
Template Name: Nombre-plantilla  
*/</span></pre></div></div>  
+
*/
<br>
+
</syntaxhighlight>
 +
 
  
 
== The Loop  ==
 
== The Loop  ==
  
El [http://codex.wordpress.org/es:The_Loop_in_Action bucle] es el proceso más importante de WordPress, aquel que nos devuelve y recorre todos los posts que corresponden al fichero desde el que se invoca:  
+
El [http://codex.wordpress.org/es:The_Loop_in_Action bucle] es el proceso más importante de WordPress, aquel que nos devuelve y recorre todos los posts que corresponden al fichero desde el que se invoca:
 +
* Si se le llama desde ''index.php'', nos devuelve los últimos posts que se hayan escrito (tantos como tengamos definidos que deberían formar parte de la portada en el apartado de administración).
 +
* Si se le llama desde ''archive.php'', nos devuelve los posts de una etiqueta determinada o de una categoría concreta (dependerá de quién haga la llamada a ese fichero).
  
*Si se le llama desde ''index.php'', nos devuelve los últimos posts que se hayan escrito (tantos como tengamos definidos que deberían formar parte de la portada en el apartado de administración).
+
Por tanto, es en este bucle donde procesaremos la colección de posts.
*Si se le llama desde ''archive.php'', nos devuelve los posts de una etiqueta determinada o de una categoría concreta (dependerá de quién haga la llamada a ese fichero).
+
  
Por tanto, es en este bucle donde procesaremos la colección de posts.
 
  
<br>
+
<syntaxhighlight lang="php">
<div style="text-align: left;" class="mw-geshi" dir="ltr"><div class="php source-php"><pre class="de1"><span class="kw2">&lt;?php</span> get_header<span class="br0">(</span><span class="br0">)</span><span class="sy0">;</span> <span class="kw1">if</span> <span class="br0">(</span>have_posts<span class="br0">(</span><span class="br0">)</span><span class="br0">)</span> <span class="sy0">:</span> <span class="kw1">while</span> <span class="br0">(</span>have_posts<span class="br0">(</span><span class="br0">)</span><span class="br0">)</span> <span class="sy0">:</span> the_post<span class="br0">(</span><span class="br0">)</span><span class="sy0">;</span> the_content<span class="br0">(</span><span class="br0">)</span><span class="sy0">;</span> <span class="kw1">endwhile</span><span class="sy0">;</span> <span class="kw1">endif</span><span class="sy0">;</span> get_sidebar<span class="br0">(</span><span class="br0">)</span><span class="sy0">;</span> get_footer<span class="br0">(</span><span class="br0">)</span><span class="sy0">;</span> <span class="sy1">?&gt;</span></pre></div></div>
+
<?php
<br>  
+
get_header();
 +
if (have_posts()) :
 +
  while (have_posts()) : the_post();
 +
      the_content();
 +
  endwhile;
 +
endif;
 +
get_sidebar();
 +
get_footer();  
 +
?>
 +
</syntaxhighlight>
  
*'''wp_query-&gt;current_post''': nos devuelve el número del post en el que estamos dentro del loop. Un ejemplo de uso en el que mostramos el contenido para los tres primeros posts y sólo el título para el resto:
 
  
<br>
+
* '''wp_query->current_post''': nos devuelve el número del post en el que estamos dentro del loop. Un ejemplo de uso en el que mostramos el contenido para los tres primeros posts y sólo el título para el resto:
<div style="text-align: left;" class="mw-geshi" dir="ltr"><div class="php source-php"><pre class="de1"><span class="kw2">&lt;?php</span> <span class="kw1">if</span> <span class="br0">(</span>have_posts<span class="br0">(</span><span class="br0">)</span><span class="br0">)</span> <span class="sy0">:</span> <span class="kw1">while</span> <span class="br0">(</span>have_posts<span class="br0">(</span><span class="br0">)</span><span class="br0">)</span> <span class="sy0">:</span> the_post<span class="br0">(</span><span class="br0">)</span><span class="sy0">;</span> <span class="kw1">if</span> <span class="br0">(</span><span class="re0">$wp_query</span><span class="sy0">-&gt;</span><span class="me1">current_post</span> <span class="sy0">&lt;</span> <span class="nu0">3</span><span class="br0">)</span> <span class="br0">{</span> the_content<span class="br0">(</span><span class="br0">)</span><span class="sy0">;</span> <span class="br0">}</span> <span class="kw1">else</span> <span class="br0">{</span> the_title<span class="br0">(</span><span class="br0">)</span><span class="sy0">;</span> <span class="br0">}</span> <span class="kw1">endwhile</span><span class="sy0">;</span> <span class="kw1">endif</span><span class="sy0">;</span> <span class="sy1">?&gt;</span></pre></div></div>
+
Sin embargo, nosotros también podemos controlar qué posts nos devolverá ese loop mediante la función [http://codex.wordpress.org/Function_Reference/query_posts query_posts]. Esa función regenera la consulta y filtra los posts en base a los parámetros que le pongamos:  
+
  
 +
 +
<syntaxhighlight lang="php">
 +
<?php if (have_posts()) :
 +
      while (have_posts()) : the_post();
 +
  if ($wp_query->current_post < 3) {
 +
                  the_content();
 +
  }
 +
          else {
 +
                  the_title();
 +
          }
 +
      endwhile;
 +
      endif; ?>
 +
</syntaxhighlight>
 +
 +
Sin embargo, nosotros también podemos controlar qué posts nos devolverá ese loop mediante la función [http://codex.wordpress.org/Function_Reference/query_posts query_posts]. Esa función regenera la consulta y filtra los posts en base a los parámetros que le pongamos:
 
*'''cat=ID''': filtra por esa categoría. Si al id se le pone un guión por delante, muestra los posts de todas las categorías menos de esa.  
 
*'''cat=ID''': filtra por esa categoría. Si al id se le pone un guión por delante, muestra los posts de todas las categorías menos de esa.  
*'''tag=slug''': filtra por etiqueta. En esta ocasión se le pasa el slug. Si queremos usar el ID de la etiqueta, pondremos el parámetro tag_id.  
+
*'''tag=slug''': filtra por etiqueta. En esta ocasión se le pasa el slug. Si queremos usar el ID de la etiqueta, pondremos el parámetro tag_id.
*'''author=ID''': filtra por usuario, usando el ID del mismo.  
+
*'''author=ID''': filtra por usuario, usando el ID del mismo.
*'''order=ASC''' u '''order=DESC''': indica la ordenación de los resultados, ascendente o descendente.  
+
*'''order=ASC''' u '''order=DESC''': indica la ordenación de los resultados, ascendente o descendente.
*'''year=año''': filtra por año.  
+
*'''year=año''': filtra por año.
*'''monthnum=mes''': filtra por mes.  
+
*'''monthnum=mes''': filtra por mes.
*'''day=día''': filtra por día.  
+
*'''day=día''': filtra por día.
 
*'''posts_per_page=número''': número de posts por página
 
*'''posts_per_page=número''': número de posts por página
  
Ejemplo:  
+
Ejemplo:
 +
 
 +
 
 +
<syntaxhighlight lang="php">
 +
<?php
 +
query_posts('posts_per_page=5&author=3&tag=discos');
 +
 
 +
//The Loop
 +
if ( have_posts() ) : while ( have_posts() ) : the_post();
 +
..
 +
endwhile; else:
 +
..
 +
endif;
 +
 
 +
//Reset Query
 +
wp_reset_query(); ?>
 +
</syntaxhighlight>
  
<br>
 
<div style="text-align: left;" class="mw-geshi" dir="ltr"><div class="php source-php"><pre class="de1"><span class="kw2">&lt;?php</span> query_posts<span class="br0">(</span><span class="st_h">'posts_per_page=5&amp;author=3&amp;tag=discos'</span><span class="br0">)</span><span class="sy0">;</span> &nbsp; <span class="co1">//The Loop</span> <span class="kw1">if</span> <span class="br0">(</span> have_posts<span class="br0">(</span><span class="br0">)</span> <span class="br0">)</span> <span class="sy0">:</span> <span class="kw1">while</span> <span class="br0">(</span> have_posts<span class="br0">(</span><span class="br0">)</span> <span class="br0">)</span> <span class="sy0">:</span> the_post<span class="br0">(</span><span class="br0">)</span><span class="sy0">;</span> <span class="sy0">..</span> <span class="kw1">endwhile</span><span class="sy0">;</span> <span class="kw1">else</span><span class="sy0">:</span> <span class="sy0">..</span> <span class="kw1">endif</span><span class="sy0">;</span> &nbsp; <span class="co1">//Reset Query</span> wp_reset_query<span class="br0">(</span><span class="br0">)</span><span class="sy0">;</span> <span class="sy1">?&gt;</span></pre></div></div>
 
 
== Funciones  ==
 
== Funciones  ==
  
*[http://codex.wordpress.org/Function_Reference/the_permalink the_permalink()]: nos dará la url del post que estemos tratando dentro del loop. No tiene parámetros. Con [http://codex.wordpress.org/Template_Tags/get_permalink get_permalink()] tendremos que mostrarlo nosotros por pantalla con un echo, pero nos permite que, si tenemos el ID del post y se lo pasamos por parámetro, lo usemos fuera del loop: ''get_permalink($post-&gt;ID)''.  
+
*[http://codex.wordpress.org/Function_Reference/the_permalink the_permalink()]: nos dará la url del post que estemos tratando dentro del loop. No tiene parámetros. Con [http://codex.wordpress.org/Template_Tags/get_permalink get_permalink()] tendremos que mostrarlo nosotros por pantalla con un echo, pero nos permite que, si tenemos el ID del post y se lo pasamos por parámetro, lo usemos fuera del loop: ''get_permalink($post-&gt;ID)''.
*[http://codex.wordpress.org/Function_Reference/the_title the_title($before, $after, $echo)]: muestra el título del post y también es necesario usarlo dentro del loop. Los parámetros $after y $before nos permite introducir cadenas de texto que irán delante y detrás respectivamente. Por ejemplo, si queremos que el título vaya con las etiquetas html &lt;h3&gt;, podemos hacer la siguiente llamada: the_title('&lt;h3&gt;', '&lt;/h3&gt;'). El parámetro $echo nos sirve para indicar si queremos que muestre el título por pantalla (si lo ponemos a ''true'') o no para hacer algún tratamiento con ese título (si lo ponemos a ''false''). Con [http://codex.wordpress.org/Template_Tags/get_the_title get_the_title(ID)] sucede igual que get_permalink pero para el título del post.  
+
*[http://codex.wordpress.org/Function_Reference/the_title the_title($before, $after, $echo)]: muestra el título del post y también es necesario usarlo dentro del loop. Los parámetros $after y $before nos permite introducir cadenas de texto que irán delante y detrás respectivamente. Por ejemplo, si queremos que el título vaya con las etiquetas html &lt;h3&gt;, podemos hacer la siguiente llamada: the_title('&lt;h3&gt;', '&lt;/h3&gt;'). El parámetro $echo nos sirve para indicar si queremos que muestre el título por pantalla (si lo ponemos a ''true'') o no para hacer algún tratamiento con ese título (si lo ponemos a ''false''). Con [http://codex.wordpress.org/Template_Tags/get_the_title get_the_title(ID)] sucede igual que get_permalink pero para el título del post.
*[http://codex.wordpress.org/Function_Reference/the_content the_content()]: muestra el cuerpo del post.Se usa dentro del loop. Tiene también su versión [http://codex.wordpress.org/Function_Reference/get_the_content get_the_content()].  
+
*[http://codex.wordpress.org/Function_Reference/the_content the_content()]: muestra el cuerpo del post.Se usa dentro del loop. Tiene también su versión [http://codex.wordpress.org/Function_Reference/get_the_content get_the_content()].
 
*[http://codex.wordpress.org/Function_Reference/the_excerpt the_excerpt()]: muestra lo que hayamos introducido en el campo Extracto. Se usa dentro del loop. Tiene su versión [http://codex.wordpress.org/Function_Reference/get_the_excerpt get_the_excerpt()].
 
*[http://codex.wordpress.org/Function_Reference/the_excerpt the_excerpt()]: muestra lo que hayamos introducido en el campo Extracto. Se usa dentro del loop. Tiene su versión [http://codex.wordpress.org/Function_Reference/get_the_excerpt get_the_excerpt()].
  
<br>
 
<div style="text-align: left;" class="mw-geshi" dir="ltr"><div class="php source-php"><pre class="de1"><span class="kw2">&lt;?php</span> <span class="kw1">if</span><span class="br0">(</span><span class="sy0">!</span><span class="kw3">empty</span><span class="br0">(</span><span class="re0">$post</span><span class="sy0">-&gt;</span><span class="me1">post_excerpt</span><span class="br0">)</span><span class="br0">)</span> <span class="br0">{</span> <span class="co1">// Si tiene extracto, lo muestra</span> the_excerpt<span class="br0">(</span><span class="br0">)</span><span class="sy0">;</span> <span class="br0">}</span> <span class="kw1">else</span> <span class="br0">{</span> <span class="co1">// Si no, muestra el contenido del post</span> the_content<span class="br0">(</span><span class="br0">)</span><span class="sy0">;</span> <span class="br0">}</span> <span class="sy1">?&gt;</span></pre></div></div>
 
<br>
 
  
*[http://codex.wordpress.org/Function_Reference/the_time the_time()]: muestra la fecha por cada post. Le podemos pasar por parámetro el [http://codex.wordpress.org/Formatting_Date_and_Time formato] de esa fecha:  
+
<syntaxhighlight lang="php">
**l = Nombre completo del día de la semana.  
+
<?php if(!empty($post->post_excerpt)) {
**F = Nombre completo para el mes.  
+
// Si tiene extracto, lo muestra
**j = Día numérico.  
+
the_excerpt();
**m = Mes con dos dígitos.  
+
} else {
**Y = Año con cuatro dígitos.  
+
// Si no, muestra el contenido del post
**y = Año con dos dígitos.  
+
the_content();
 +
} ?>
 +
</syntaxhighlight>
 +
 
 +
 
 +
*[http://codex.wordpress.org/Function_Reference/the_time the_time()]: muestra la fecha por cada post. Le podemos pasar por parámetro el [http://codex.wordpress.org/Formatting_Date_and_Time formato] de esa fecha:
 +
**l = Nombre completo del día de la semana.
 +
**F = Nombre completo para el mes.
 +
**j = Día numérico.
 +
**m = Mes con dos dígitos.
 +
**Y = Año con cuatro dígitos.
 +
**y = Año con dos dígitos.
 
**Para escapar letras, usaremos la barra \. Por ejemplo, para poner la palabra "de" le pasaremos "\d\e"
 
**Para escapar letras, usaremos la barra \. Por ejemplo, para poner la palabra "de" le pasaremos "\d\e"
  
<br>
 
<div style="text-align: left;" class="mw-geshi" dir="ltr"><div class="php source-php"><pre class="de1"><span class="kw2">&lt;?php</span> the_time<span class="br0">(</span><span class="st_h">'l, j \d\e F, Y'</span><span class="br0">)</span><span class="sy0">;</span> <span class="co1">//Nos muestra Martes, 14 de Septiembre, 2010&nbsp;?&gt;</span></pre></div></div>
 
<br>
 
  
*[http://codex.wordpress.org/Function_Reference/the_date the_date()]: igual que the_time pero muestra la fecha solo en el primer post de un grupo que haya sido publicado el mismo día.  
+
<syntaxhighlight lang="php">
*[http://codex.wordpress.org/Function_Reference/bloginfo Bloginfo]: nos ofrece numerosa información de nuestro blog que luego podremos plasmar en otros apartados (tiene se versión [http://codex.wordpress.org/Function_Reference/get_bloginfo get_bloginfo]):  
+
<?php the_time('l, j \d\e F, Y'); //Nos muestra Martes, 14 de Septiembre, 2010 ?>
**bloginfo('name'): muestra por pantalla el nombre del blog.  
+
</syntaxhighlight>
**bloginfo('description'): muestra por pantalla el nombre del blog.  
+
 
**bloginfo('url'): muestra por pantalla la dirección del blog.  
+
 
**bloginfo('stylesheet_url'): muestra por pantalla la ruta del fichero de estilos (style.css).  
+
*[http://codex.wordpress.org/Function_Reference/the_date the_date()]: igual que the_time pero muestra la fecha solo en el primer post de un grupo que haya sido publicado el mismo día.
**bloginfo('template_url'): muestra por pantalla la ruta del theme.  
+
*[http://codex.wordpress.org/Function_Reference/bloginfo Bloginfo]: nos ofrece numerosa información de nuestro blog que luego podremos plasmar en otros apartados (tiene se versión [http://codex.wordpress.org/Function_Reference/get_bloginfo get_bloginfo]):
 +
**bloginfo('name'): muestra por pantalla el nombre del blog.
 +
**bloginfo('description'): muestra por pantalla el nombre del blog.
 +
**bloginfo('url'): muestra por pantalla la dirección del blog.
 +
**bloginfo('stylesheet_url'): muestra por pantalla la ruta del fichero de estilos (style.css).
 +
**bloginfo('template_url'): muestra por pantalla la ruta del theme.
 
**bloginfo('rss2_url'): muestra por pantalla la ruta del RSS.
 
**bloginfo('rss2_url'): muestra por pantalla la ruta del RSS.
 +
En este ejemplo se muestra el nombre del blog enlazado a su dirección:
  
En este ejemplo se muestra el nombre del blog enlazado a su dirección:
 
  
<br>
+
<syntaxhighlight lang="php">
<div style="text-align: left;" class="mw-geshi" dir="ltr"><div class="php source-php"><pre class="de1">&lt;a href="<span class="kw2">&lt;?php</span> bloginfo<span class="br0">(</span><span class="st_h">'url'</span><span class="br0">)</span><span class="sy0">;</span> <span class="sy1">?&gt;</span>" title="<span class="kw2">&lt;?php</span> bloginfo<span class="br0">(</span><span class="st_h">'name'</span><span class="br0">)</span><span class="sy0">;</span> <span class="sy1">?&gt;</span>"&gt;<span class="kw2">&lt;?php</span> bloginfo<span class="br0">(</span><span class="st_h">'name'</span><span class="br0">)</span><span class="sy0">;</span> <span class="sy1">?&gt;</span>&lt;/a&gt;</pre></div></div>
+
<a href="<?php bloginfo('url'); ?>" title="<?php bloginfo('name'); ?>"><?php bloginfo('name'); ?></a>
<br>  
+
</syntaxhighlight>
  
*[http://codex.wordpress.org/Function_Reference/the_author the_author()]: muestra por pantalla el autor que ha escrito ese post. Tiene su versión sin echo: [http://codex.wordpress.org/Template_Tags/get_the_author get_the_author].
 
*[http://codex.wordpress.org/Function_Reference/the_tags the_tags( $before, $separator, $after)]: muestra las etiquetas asociadas a ese post. Por parámetro se le puede pasar el texto que precederá a las etiquetas, los caracteres que queremos que separen las etiquetas y el texto que irá al final. Tiene también su versión [http://codex.wordpress.org/Function_Reference/get_the_tags get_the_tags] que nos devolverá un array con las etiquetas, para que las procesemos nosotros.
 
  
<br>
+
* [http://codex.wordpress.org/Function_Reference/the_author the_author()]: muestra por pantalla el autor que ha escrito ese post. Tiene su versión sin echo: [http://codex.wordpress.org/Template_Tags/get_the_author get_the_author].
<div style="text-align: left;" class="mw-geshi" dir="ltr"><div class="php source-php"><pre class="de1"> <span class="kw2">&lt;?php</span> the_tags<span class="br0">(</span><span class="st_h">'Etiquetas:'</span><span class="sy0">,</span> <span class="st_h">' - '</span><span class="sy0">,</span> <span class="st_h">'&lt;br /&gt;'</span><span class="br0">)</span><span class="sy0">;</span> <span class="sy1">?&gt;</span></pre></div></div>
+
* [http://codex.wordpress.org/Function_Reference/the_tags the_tags( $before, $separator, $after)]: muestra las etiquetas asociadas a ese post. Por parámetro se le puede pasar el texto que precederá a las etiquetas, los caracteres que queremos que separen las etiquetas y el texto que irá al final. Tiene también su versión [http://codex.wordpress.org/Function_Reference/get_the_tags get_the_tags] que nos devolverá un array con las etiquetas, para que las procesemos nosotros.
<br>
+
  
*[http://codex.wordpress.org/Function_Reference/posts_nav_link posts_nav_link]: muestra un enlace con el texto que le pasemos por parámetro a los posts que estén en páginas anteriores. Se usa en el index.php para que se pueda navegar a los contenidos anteriores a los posts que se muestran en la portada.
 
*[http://codex.wordpress.org/Template_Tags/previous_posts_link previous_posts_link]: muestra un enlace con el texto que le pasemos por parámetro a los posts que estén en páginas anteriores. Se usa en el index.php para que se pueda navegar a los contenidos anteriores a los posts que se muestran en la portada.
 
*[http://codex.wordpress.org/Template_Tags/next_posts_link next_posts_link]: muestra un enlace con el texto que le pasemos por parámetro a los posts que estén en páginas posteriores. Se usa en el index.php para que se pueda navegar a los contenidos posteriores a los posts que se muestran en la página desde la que se invoca.
 
  
<br>
+
<syntaxhighlight lang="php">
<div style="text-align: left;" class="mw-geshi" dir="ltr"><div class="php source-php"><pre class="de1">&lt;div class="navigation"&gt;
+
<?php the_tags('Etiquetas:', ' - ', '<br />'); ?>
  &lt;div class="alignleft"&gt;<span class="kw2">&lt;?php</span> previous_posts_link<span class="br0">(</span><span class="st_h">''</span><span class="sy0">,</span><span class="st_h">''</span><span class="sy0">,</span><span class="st_h">'&amp;laquo; Artículos Anteriores'</span><span class="br0">)</span><span class="sy1">?&gt;</span>&lt;/div&gt; &lt;div class="alignright"&gt;<span class="kw2">&lt;?php</span> next_posts_link<span class="br0">(</span><span class="st_h">''</span><span class="sy0">,</span><span class="st_h">'Artículos Siguientes &amp;raquo;'</span><span class="sy0">,</span><span class="st_h">''</span><span class="br0">)</span><span class="sy1">?&gt;</span>&lt;/div&gt; &lt;/div&gt;</pre></div></div>
+
</syntaxhighlight>
<br>  
+
  
*[http://codex.wordpress.org/Function_Reference/in_category in_category($category)]: nos dice si ese post está en la categoría pasada por parámetro. Se puede pasar el ID de la categoría o bien el slug. Con esto también podemos hacer que tenga comportamientos distintos según la categoría y en un único fichero category.php.
 
  
<br>
+
* [http://codex.wordpress.org/Function_Reference/posts_nav_link posts_nav_link]: muestra un enlace con el texto que le pasemos por parámetro a los posts que estén en páginas anteriores. Se usa en el index.php para que se pueda navegar a los contenidos anteriores a los posts que se muestran en la portada.
<div style="text-align: left;" class="mw-geshi" dir="ltr"><div class="php source-php"><pre class="de1"><span class="kw2">&lt;?php</span> <span class="kw1">if</span> <span class="br0">(</span>in_category<span class="br0">(</span><span class="st_h">'3'</span><span class="br0">)</span> <span class="br0">)</span><span class="br0">{</span> <span class="sy1">?&gt;</span> &lt;img src='/images/plant.png' alt='a plant' /&gt; <span class="kw2">&lt;?php</span> <span class="br0">}</span> <span class="kw1">elseif</span> <span class="br0">(</span>in_category<span class="br0">(</span><span class="st_h">'4'</span><span class="br0">)</span> <span class="br0">)</span><span class="br0">{</span> <span class="sy1">?&gt;</span> &lt;img src='/images/flower.png' alt='a pretty flower' /&gt; <span class="kw2">&lt;?php</span> <span class="br0">}</span> <span class="sy1">?&gt;</span></pre></div></div>
+
* [http://codex.wordpress.org/Template_Tags/previous_posts_link previous_posts_link]: muestra un enlace con el texto que le pasemos por parámetro a los posts que estén en páginas anteriores. Se usa en el index.php para que se pueda navegar a los contenidos anteriores a los posts que se muestran en la portada.
== Custom fields - Campos personalizados ==
+
* [http://codex.wordpress.org/Template_Tags/next_posts_link next_posts_link]: muestra un enlace con el texto que le pasemos por parámetro a los posts que estén en páginas posteriores. Se usa en el index.php para que se pueda navegar a los contenidos posteriores a los posts que se muestran en la página desde la que se invoca.
  
Cuando estamos creando un post, justo debajo de la caja del texto podemos introducir [http://codex.wordpress.org/Custom_Fields campos personalizados] introduciendo un nombre y un valor:
 
  
[[Image:Campos-personalizados.jpg]]
+
<syntaxhighlight lang="php">
 +
<div class="navigation">
 +
  <div class="alignleft"><?php previous_posts_link('','','&laquo; Artículos Anteriores')?></div>
 +
  <div class="alignright"><?php next_posts_link('','Artículos Siguientes &raquo;','')?></div>
 +
</div>
 +
</syntaxhighlight>
  
El '''Nombre''' será el identificador de nuestro campo personalizado y el '''Valor''' lo que queremos mostrar. Obtendremos el valor de ese campo dentro del loop con la siguiente llamada [http://codex.wordpress.org/Function_Reference/get_post_custom_values get_post_custom_values]:
 
  
<br>
+
* [http://codex.wordpress.org/Function_Reference/in_category in_category($category)]: nos dice si ese post está en la categoría pasada por parámetro. Se puede pasar el ID de la categoría o bien el slug. Con esto también podemos hacer que tenga comportamientos distintos según la categoría y en un único fichero category.php.
<div style="text-align: left;" class="mw-geshi" dir="ltr"><div class="php source-php"><pre class="de1"><span class="kw2">&lt;?php</span> <span class="re0">$valor_custom_field</span> <span class="sy0">=</span> get_post_custom_values<span class="br0">(</span><span class="st0">"nombre-del-custom-field"</span><span class="br0">)</span><span class="sy0">;</span> <span class="sy1">?&gt;</span></pre></div></div>
+
<br> O también con la función [http://codex.wordpress.org/Function_Reference/get_post_meta get_post_meta]:  
+
  
<br>
 
<div style="text-align: left;" class="mw-geshi" dir="ltr"><div class="php source-php"><pre class="de1"><span class="kw2">&lt;?php</span> <span class="re0">$valor_custom_field</span> <span class="sy0">=</span> get_post_meta<span class="br0">(</span><span class="re0">$post</span><span class="sy0">-&gt;</span><span class="me1">ID</span><span class="sy0">,</span> nombre<span class="sy0">-</span>del<span class="sy0">-</span>custom<span class="sy0">-</span>field<span class="br0">)</span><span class="sy0">;</span> <span class="sy1">?&gt;</span></pre></div></div>
 
<br> Estos custom fields son los metadatos extra de cada post (que se suman a los ya típicos autor, fecha, etiquetas, categorías, etc...). Así podría ser la canción que está escuchando el autor cuando escribió el post o su estado de ánimo, el precio (si usamos el blog como tienda virtual), etc...
 
  
== Panel de administración del theme ==
+
<syntaxhighlight lang="php">
 +
<?php if (in_category('3') ){ ?>
 +
<img src='/images/plant.png' alt='a plant' />
 +
<?php } elseif (in_category('4') ){ ?>
 +
<img src='/images/flower.png' alt='a pretty flower' />
 +
<?php } ?>
 +
</syntaxhighlight>
  
Para crear un apartado de administración de nuestro theme, debemos incluir la siguiente llamada en functions.php (en este ejemplo estamos poniendo un textarea para que se almacene nuestro código de Google Analytics):  
+
==Custom fields - Campos personalizados==
<div style="text-align: left;" class="mw-geshi" dir="ltr"><div class="php source-php"><pre class="de1">/* Meter código de Google Analytics */
+
 
 +
Cuando estamos creando un post, justo debajo de la caja del texto podemos introducir [http://codex.wordpress.org/Custom_Fields campos personalizados] introduciendo un nombre y un valor:
 +
 
 +
[[Archivo:Campos-personalizados.jpg]]
 +
 
 +
El '''Nombre''' será el identificador de nuestro campo personalizado y el '''Valor''' lo que queremos mostrar. Obtendremos el valor de ese campo dentro del loop con la siguiente llamada [http://codex.wordpress.org/Function_Reference/get_post_custom_values get_post_custom_values]:
 +
 
 +
 
 +
<syntaxhighlight lang="php">
 +
<?php $valor_custom_field = get_post_custom_values("nombre-del-custom-field"); ?>
 +
</syntaxhighlight>
 +
 
 +
 
 +
O también con la función [http://codex.wordpress.org/Function_Reference/get_post_meta get_post_meta]:
 +
 
 +
 
 +
<syntaxhighlight lang="php">
 +
<?php $valor_custom_field = get_post_meta($post->ID, nombre-del-custom-field); ?>
 +
</syntaxhighlight>
 +
 
 +
 
 +
Estos custom fields son los metadatos extra de cada post (que se suman a los ya típicos autor, fecha, etiquetas, categorías, etc...). Así podría ser la canción que está escuchando el autor cuando escribió el post o su estado de ánimo, el precio (si usamos el blog como tienda virtual), etc...
 +
 
 +
==Panel de administración ==
 +
 
 +
Incluyendo el siguiente texto en functions.php podemos eliminar secciones del menú de administración.
 +
*Apartados de primer nivel como "''Posts''", "''Media''", "''Appearance''" y "''Tools''":
 +
 
 +
 
 +
<syntaxhighlight lang="php">
 +
function remove_menu_items() {
 +
  global $menu;
 +
  $restricted = array(__('Links'), __('Comments'), __('Media'),
 +
  __('Plugins'), __('Tools'), __('Users'));
 +
  end ($menu);
 +
  while (prev($menu)){
 +
    $value = explode(' ',$menu[key($menu)][0]);
 +
    if(in_array($value[0] != NULL?$value[0]:"" , $restricted)){
 +
      unset($menu[key($menu)]);}
 +
    }
 +
  }
 +
 
 +
add_action('admin_menu', 'remove_menu_items');
 +
</syntaxhighlight>
 +
 
 +
 
 +
*Para submenús de segundo nivel, por ejemplo "''Theme''" que está bajo "''Appearance''":
 +
 
 +
 
 +
<syntaxhighlight lang="php">
 +
function remove_submenus() {
 +
  global $submenu;
 +
  unset($submenu['index.php'][10]); // Removes 'Updates'.
 +
  unset($submenu['themes.php'][5]); // Removes 'Themes'.
 +
  unset($submenu['options-general.php'][15]); // Removes 'Writing'.
 +
  unset($submenu['options-general.php'][25]); // Removes 'Discussion'.
 +
  unset($submenu['edit.php'][16]); // Removes 'Tags'. 
 +
}
 +
 
 +
add_action('admin_menu', 'remove_submenus');
 +
</syntaxhighlight>
 +
 
 +
 
 +
Para saber el nombre de los submenús, podemos ir a ''wp-admin/menu.php'' y buscar el item que queremos deshabilitar.
 +
 
 +
Para crear un apartado de administración de nuestro theme, debemos incluir la siguiente llamada en functions.php (en este ejemplo estamos poniendo un textarea para que se almacene nuestro código de Google Analytics):
 +
 
 +
<syntaxhighlight lang="php">
 +
/* Meter código de Google Analytics */
 
function nombredeltheme_theme() {
 
function nombredeltheme_theme() {
if(isset($_POST['submitted']) and $_POST['submitted'] == 'yes')&nbsp;:
+
if(isset($_POST['submitted']) and $_POST['submitted'] == 'yes') :
 
update_option("google_analytics", stripslashes($_POST['google_analytics']));
 
update_option("google_analytics", stripslashes($_POST['google_analytics']));
 
endif;
 
endif;
?&gt;
+
?>
&lt;form method="post" name="update_form" target="_self"&gt;
+
<form method="post" name="update_form" target="_self">
&lt;h1&gt;Google Analytics&lt;/h1&gt;
+
<h1>Google Analytics</h1>
&lt;table class="form-table"&gt;
+
<table class="form-table">
&lt;tr&gt;
+
<tr>
&lt;th&gt;Google Analytics:&lt;/th&gt;
+
<th>Google Analytics:</th>
&lt;td&gt;&lt;textarea name="google_analytics" style="width: 95%;" rows="10" /&gt;
+
<td><textarea name="google_analytics" style="width: 95%;" rows="10" />
                                 <span class="kw2">&lt;?php</span> <span class="kw1">echo</span> get_option<span class="br0">(</span><span class="st_h">'google_analytics'</span><span class="br0">)</span><span class="sy0">;</span> <span class="sy1">?&gt;</span>&lt;/textarea&gt;&lt;br /&gt;Copia el código Google Analytics aquí.&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;p class="submit" id="jump_submit"&gt; &lt;input name="submitted" type="hidden" value="yes" /&gt; &lt;input type="submit" name="Submit" value="Save Changes" /&gt; &lt;/form&gt; <span class="kw2">&lt;?php</span> <span class="br0">}</span> <span class="kw2">function</span> nombredeltheme_options<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span> add_menu_page<span class="br0">(</span><span class="st_h">'Opciones del Theme'</span><span class="sy0">,</span> __<span class="br0">(</span><span class="st_h">'Opciones del Theme'</span><span class="sy0">,</span> <span class="st_h">'default'</span><span class="br0">)</span><span class="sy0">,</span> <span class="st_h">'edit_themes'</span><span class="sy0">,</span> <span class="kw4">__FILE__</span><span class="sy0">,</span> <span class="st_h">'nombredeltheme_theme'</span><span class="br0">)</span><span class="sy0">;</span> <span class="br0">}</span> add_action<span class="br0">(</span><span class="st_h">'admin_menu'</span><span class="sy0">,</span> <span class="st_h">'nombredeltheme_options'</span><span class="br0">)</span><span class="sy0">;</span></pre></div></div>
+
                                 <?php echo get_option('google_analytics'); ?></textarea><br />Copia el código Google Analytics aquí.</td>
<br> Luego ponemos en el footer.php:
+
</tr>
 +
</table>
 +
<p class="submit" id="jump_submit">
 +
<input name="submitted" type="hidden" value="yes" />
 +
<input type="submit" name="Submit" value="Save Changes" />
 +
</form>
 +
<?php
 +
}
 +
function nombredeltheme_options() {
 +
add_menu_page('Opciones del Theme', __('Opciones del Theme', 'default'), 'edit_themes', __FILE__, 'nombredeltheme_theme');
 +
}
 +
add_action('admin_menu', 'nombredeltheme_options');
 +
</syntaxhighlight>
  
<br>
 
<div style="text-align: left;" class="mw-geshi" dir="ltr"><div class="php source-php"><pre class="de1"><span class="kw2">&lt;?php</span> <span class="kw1">echo</span> get_option<span class="br0">(</span><span class="st_h">'google_analytics'</span><span class="br0">)</span><span class="sy0">;</span> <span class="sy1">?&gt;</span></pre></div></div>
 
<br> De esta forma se cargará en el footer lo que el usuario alimente desde el panel de administración.
 
  
== Enlaces de interés ==
+
Luego ponemos en el footer.php:
 +
 
 +
 
 +
<syntaxhighlight lang="php">
 +
<?php echo get_option('google_analytics'); ?>
 +
</syntaxhighlight>
 +
 
 +
 
 +
De esta forma se cargará en el footer lo que el usuario alimente desde el panel de administración.
 +
 
 +
Para añadir una nueva opción a la barra de administración superior del blog, hay que añadir el código que se muestra a continuación dentro del archivo functions.php (estamos agregando la opción Prueba que es un link a http://core.trac.wordpress.org/diff):
 +
 
 +
<syntaxhighlight lang="php">
 +
    function incluir_enlace_admin_bar() {
 +
    global $wp_admin_bar;
 +
    $wp_admin_bar->add_menu( array(
 +
    ‘id’ => ‘diff’,
 +
    ‘title’ => __(‘Prueba’),
 +
    ‘href’ => ‘http://core.trac.wordpress.org/diff’
 +
    ));
 +
    }
 +
    add_action( ‘admin_bar_menu’, ‘incluir_enlace_admin_bar’ , 30);
 +
</syntaxhighlight>
 +
 
 +
==Enlaces de interés==
  
 
*Nuestra nueva biblia: [http://codex.wordpress.org Codex Wordpress].  
 
*Nuestra nueva biblia: [http://codex.wordpress.org Codex Wordpress].  
 
*El gran [http://wordpress.org/extend/themes/ repositorio] de WordPress de plantillas, para que seleccionemos una como base para la modificación.
 
*El gran [http://wordpress.org/extend/themes/ repositorio] de WordPress de plantillas, para que seleccionemos una como base para la modificación.
 +
 +
 +
[[Category:WordPress]]

Revisión actual del 21:57 8 ene 2013

La estructura de WordPress

Internamente WordPress se compone de los siguientes ficheros y carpetas:

  • wp-config.php: fichero de configuración. Aquí está almacenado el usuario y el nombre de la base de datos, así como otros datos de seguridad. Es importante que este fichero no tenga lectura más que por el owner del mismo. Este fichero no se machaca con las actualizaciones de WP.
  • wp-admin y wp-includes: carpetas que guardan los ficheros php que hacen que funcione el blog. Ambas carpetas se machacan con las actualizaciones
  • wp-content: esta carpeta guarda los datos y configuraciones propias del blog. No se toca nada en la actualizaciones de WP. La estructura interna es la siguiente:
    • uploads: todas las imágenes, vídeos y archivos que se suban a la librería de wordpress. Normalmente se organiza por años y luego por meses. Ejemplo: uploads/2009/12.
    • plugins: todos los plugins que tenemos disponibles para el blog (aunque no estén activos).
    • languages: aquí van los ficheros .mo de los idiomas en los que queremos tener WP (tanto la parte visible como la de administración). Para indicar luego que el blog esté en un idioma u otro, habrá que añadir una línea en wp-config.php como la que sigue: define ('WPLANG', 'es_ES'); donde es_ES es el nombre del fichero .mo (tienen que coincidir en nombre).
    • themes: todas las plantillas que tenemos disponibles para "vestir" al blog. Nosotros nos centraremos en esta carpeta.

Como podemos ver, una instalación de WordPress es muy portable. Si nos queremos cambiar de servidor o hosting, bastará con que nos llevemos estas carpetas y la Base de Datos exportada en un simple .sql. No requiere de otras configuraciones más complejas.

La estructura básica de un theme

Las plantillas o themes son la capa de presentación de los blogs o páginas web que se monten. Se puede cambiar esta capa sin que la información se vea afectada. WordPress reconoce automáticamente los siguientes ficheros y los interpreta:

Cuerpo.jpg
  • header.php: aquí se define la cabecera de la página.
  • footer.php: aquí se define el pie de página.
  • sidebar.php: aquí se definen las diferentes barras laterales.
  • index.php: este es el fichero que carga de inicio el site. Desde aquí se invoca la carga de cabecera (get_header();), barras laterales (get_sidebar();) y footer (get_footer();) y en el cuerpo central, se ejecuta el bucle para cargar la información de los posts.
  • single.php: este es el fichero que se interpreta cuando se carga un post concreto.
  • archive.php: igual que single.php pero para las páginas de categorías y etiquetas.
  • category.php: plantilla para las categorías. Cuando un usuario pincha sobre el enlace de una categoría, WordPress prueba si existe el fichero category.php. Si no lo encuentra, carga archive.php. Y si éste tampoco lo encuentra, se va a por el index.php. Más adelante veremos un gráfico con la interpretación jerárquica que hace WordPress.
  • comments.php: plantilla de los comentarios.
  • searchform.php: formulario de búsqueda.
  • search.php: página donde se muestran los resultados de una búsqueda.
  • functions.php: aquí se recogerán funciones propias del theme. Por ejemplo, si queremos registrar varias barras laterales para que aparezcan en la sección de widgets, indicar a WP dónde están los ficheros de idiomas, quitar filtros, ...
  • style.css: fichero con los estilos.
  • 404.php: si creamos este fichero, cada vez que algo no se encuentre en el blog, se cargará esta página.

Desde el apartado de administración se podrá configurar la apariencia de una forma muy visual mediante widgets (en el apartado Apariencia --> Widgets). Aquí aparecen las barras laterales definidas y múltiples funcionalidades que se pueden colocar: comentarios recientes, posts recientes, buscador, una caja donde introducir nuestro propio código html, ...

También desde el apartado de administración (Ajustes --> Lectura) podemos configurar que la portada que se carga de nuestra web sea una página y no el formato blog de entradas, dándole más carácter de página web.

Sidebars

Podríamos cargar diferentes sidebars con la misma metodología que los headers y los footers (explicada más adelante), pero existe una manera para que generemos un espacio dentro del apartado de los widgets.

Para que aparezcan en la sección de widgets las diferentes sidebars que queramos "alimentar" desde el panel de administración, hay que registrarlas en el fichero functions.php de la siguiente forma:


if ( function_exists('register_sidebars') )
{
    register_sidebar(array(
        'name' => 'Barra Lateral Derecha',
        'before_widget' => 'código html que queremos que se cargue al inicio de la barra',
        'after_widget' => 'código html que queremos que se cargue al final de la barra',
        'before_title' => 'código html que queremos que se cargue al inicio del título de la barra',
        'after_title' => 'código html que queremos que se cargue al final del título de la barra',
    ));
    register_sidebar(array(
        'name' => 'Barra Lateral Izquierda',
        'before_widget' => 'código html que queremos que se cargue al inicio de la barra',
        'after_widget' => 'código html que queremos que se cargue al final de la barra',
        'before_title' => 'código html que queremos que se cargue al inicio del título de la barra',
        'after_title' => 'código html que queremos que se cargue al final del título de la barra',
    ));
}


Para usarlas posteriormente, la llamada será de la siguiente forma:


<?php if ( !function_exists('dynamic_sidebar') || !dynamic_sidebar('Barra Lateral Izquierda') ) : 
          echo "El usuario no ha puesto widgets en esta barra";
      endif; ?>


Cabeceras y Footers personalizados

<?php if (is_category('Cine')) {
	get_footer('Cine');
} else {
	get_footer();
} ?>


De esta forma tan sencilla podemos cargar ficheros php personalizados para mostrar diferentes footers o cabeceras según estemos en una categoría u otra. En el ejemplo, si estamos en la categoría de Cine se cargará footer-cine.php. Si no, se cargará footer.php.

Sería exactamente lo mismo para las cabeceras (header-cine.php vs. header.php):


<?php if (is_category('cine')) {
	get_header('cine');
} else {
	get_header();
} ?>


Es decir, lo que WordPress busca es el fichero header-slug.php (el slug es el permalink. Es decir, la versión url del nombre: una cadena sin mayúsculas, sin tildes, con guiones en vez de espacios).

Categorías y etiquetas personalizadas

Para cargar diferentes presentaciones dependiendo de la categoría o la etiqueta sobre la que se pinche, podemos crear un php igual que lo hacíamos con las cabeceras, es decir category-slug.php o tag-slug.php o bien con el siguiente formato de nombre category-XX.php o tag-XX.php (donde XX es el id que tiene internamente esa categoría o etiqueta). De esta forma, podríamos ponerle una cabecera, un footer y un sidebar personalizados dependiendo de la categoría o la etiqueta en la que estemos.

Aquí vemos el orden en el que WordPress busca los ficheros y los carga:

Template Hierarchy.png

Para cualquiera de las vistas que no tenga un archivo de plantilla separado, WordPress usará index.php de manera predeterminada. Si un visitante solicita un artículo individual, WordPress primero buscará un archivo llamado single.php. Si ese archivo existe, será utilizado para presentar el artículo. Si ese archivo no existe, WordPress utilizará index.php.


Templates

Podemos crear plantillas con comportamientos propios a los que luego asignar a cada página. Desde el editor de páginas estáticas hay una opción para aplicar plantillas. Para que un fichero php sea interpretado por WordPress como una template, hay que incluir al inicio del mismo el siguiente código:


/* 
Template Name: Nombre-plantilla 
*/


The Loop

El bucle es el proceso más importante de WordPress, aquel que nos devuelve y recorre todos los posts que corresponden al fichero desde el que se invoca:

  • Si se le llama desde index.php, nos devuelve los últimos posts que se hayan escrito (tantos como tengamos definidos que deberían formar parte de la portada en el apartado de administración).
  • Si se le llama desde archive.php, nos devuelve los posts de una etiqueta determinada o de una categoría concreta (dependerá de quién haga la llamada a ese fichero).

Por tanto, es en este bucle donde procesaremos la colección de posts.


<?php
get_header();
if (have_posts()) :
   while (have_posts()) : the_post();
      the_content();
   endwhile;
endif;
get_sidebar();
get_footer(); 
?>


  • wp_query->current_post: nos devuelve el número del post en el que estamos dentro del loop. Un ejemplo de uso en el que mostramos el contenido para los tres primeros posts y sólo el título para el resto:


<?php if (have_posts()) : 
       while (have_posts()) : the_post(); 
	  if ($wp_query->current_post < 3) {
                  the_content();
	  } 
          else {
                  the_title();
          }
       endwhile;
      endif; ?>

Sin embargo, nosotros también podemos controlar qué posts nos devolverá ese loop mediante la función query_posts. Esa función regenera la consulta y filtra los posts en base a los parámetros que le pongamos:

  • cat=ID: filtra por esa categoría. Si al id se le pone un guión por delante, muestra los posts de todas las categorías menos de esa.
  • tag=slug: filtra por etiqueta. En esta ocasión se le pasa el slug. Si queremos usar el ID de la etiqueta, pondremos el parámetro tag_id.
  • author=ID: filtra por usuario, usando el ID del mismo.
  • order=ASC u order=DESC: indica la ordenación de los resultados, ascendente o descendente.
  • year=año: filtra por año.
  • monthnum=mes: filtra por mes.
  • day=día: filtra por día.
  • posts_per_page=número: número de posts por página

Ejemplo:


<?php
query_posts('posts_per_page=5&author=3&tag=discos');

//The Loop
if ( have_posts() ) : while ( have_posts() ) : the_post();
 ..
endwhile; else:
 ..
endif;

//Reset Query
wp_reset_query(); ?>

Funciones

  • the_permalink(): nos dará la url del post que estemos tratando dentro del loop. No tiene parámetros. Con get_permalink() tendremos que mostrarlo nosotros por pantalla con un echo, pero nos permite que, si tenemos el ID del post y se lo pasamos por parámetro, lo usemos fuera del loop: get_permalink($post->ID).
  • the_title($before, $after, $echo): muestra el título del post y también es necesario usarlo dentro del loop. Los parámetros $after y $before nos permite introducir cadenas de texto que irán delante y detrás respectivamente. Por ejemplo, si queremos que el título vaya con las etiquetas html <h3>, podemos hacer la siguiente llamada: the_title('<h3>', '</h3>'). El parámetro $echo nos sirve para indicar si queremos que muestre el título por pantalla (si lo ponemos a true) o no para hacer algún tratamiento con ese título (si lo ponemos a false). Con get_the_title(ID) sucede igual que get_permalink pero para el título del post.
  • the_content(): muestra el cuerpo del post.Se usa dentro del loop. Tiene también su versión get_the_content().
  • the_excerpt(): muestra lo que hayamos introducido en el campo Extracto. Se usa dentro del loop. Tiene su versión get_the_excerpt().


<?php if(!empty($post->post_excerpt)) {
	// Si tiene extracto, lo muestra
	the_excerpt();
} else {
	// Si no, muestra el contenido del post
	the_content();
} ?>


  • the_time(): muestra la fecha por cada post. Le podemos pasar por parámetro el formato de esa fecha:
    • l = Nombre completo del día de la semana.
    • F = Nombre completo para el mes.
    • j = Día numérico.
    • m = Mes con dos dígitos.
    • Y = Año con cuatro dígitos.
    • y = Año con dos dígitos.
    • Para escapar letras, usaremos la barra \. Por ejemplo, para poner la palabra "de" le pasaremos "\d\e"


<?php the_time('l, j \d\e F, Y'); //Nos muestra Martes, 14 de Septiembre, 2010 ?>


  • the_date(): igual que the_time pero muestra la fecha solo en el primer post de un grupo que haya sido publicado el mismo día.
  • Bloginfo: nos ofrece numerosa información de nuestro blog que luego podremos plasmar en otros apartados (tiene se versión get_bloginfo):
    • bloginfo('name'): muestra por pantalla el nombre del blog.
    • bloginfo('description'): muestra por pantalla el nombre del blog.
    • bloginfo('url'): muestra por pantalla la dirección del blog.
    • bloginfo('stylesheet_url'): muestra por pantalla la ruta del fichero de estilos (style.css).
    • bloginfo('template_url'): muestra por pantalla la ruta del theme.
    • bloginfo('rss2_url'): muestra por pantalla la ruta del RSS.

En este ejemplo se muestra el nombre del blog enlazado a su dirección:


<a href="<?php bloginfo('url'); ?>" title="<?php bloginfo('name'); ?>"><?php bloginfo('name'); ?></a>


  • the_author(): muestra por pantalla el autor que ha escrito ese post. Tiene su versión sin echo: get_the_author.
  • the_tags( $before, $separator, $after): muestra las etiquetas asociadas a ese post. Por parámetro se le puede pasar el texto que precederá a las etiquetas, los caracteres que queremos que separen las etiquetas y el texto que irá al final. Tiene también su versión get_the_tags que nos devolverá un array con las etiquetas, para que las procesemos nosotros.


 <?php the_tags('Etiquetas:', ' - ', '<br />'); ?>


  • posts_nav_link: muestra un enlace con el texto que le pasemos por parámetro a los posts que estén en páginas anteriores. Se usa en el index.php para que se pueda navegar a los contenidos anteriores a los posts que se muestran en la portada.
  • previous_posts_link: muestra un enlace con el texto que le pasemos por parámetro a los posts que estén en páginas anteriores. Se usa en el index.php para que se pueda navegar a los contenidos anteriores a los posts que se muestran en la portada.
  • next_posts_link: muestra un enlace con el texto que le pasemos por parámetro a los posts que estén en páginas posteriores. Se usa en el index.php para que se pueda navegar a los contenidos posteriores a los posts que se muestran en la página desde la que se invoca.


<div class="navigation">
  <div class="alignleft"><?php previous_posts_link('','','&laquo; Artículos Anteriores')?></div>
  <div class="alignright"><?php next_posts_link('','Artículos Siguientes &raquo;','')?></div>
</div>


  • in_category($category): nos dice si ese post está en la categoría pasada por parámetro. Se puede pasar el ID de la categoría o bien el slug. Con esto también podemos hacer que tenga comportamientos distintos según la categoría y en un único fichero category.php.


<?php if (in_category('3') ){ ?>
 <img src='/images/plant.png' alt='a plant' />
<?php } elseif (in_category('4') ){ ?>
 <img src='/images/flower.png' alt='a pretty flower' />
<?php } ?>

Custom fields - Campos personalizados

Cuando estamos creando un post, justo debajo de la caja del texto podemos introducir campos personalizados introduciendo un nombre y un valor:

Campos-personalizados.jpg

El Nombre será el identificador de nuestro campo personalizado y el Valor lo que queremos mostrar. Obtendremos el valor de ese campo dentro del loop con la siguiente llamada get_post_custom_values:


<?php $valor_custom_field = get_post_custom_values("nombre-del-custom-field"); ?>


O también con la función get_post_meta:


<?php $valor_custom_field = get_post_meta($post->ID, nombre-del-custom-field); ?>


Estos custom fields son los metadatos extra de cada post (que se suman a los ya típicos autor, fecha, etiquetas, categorías, etc...). Así podría ser la canción que está escuchando el autor cuando escribió el post o su estado de ánimo, el precio (si usamos el blog como tienda virtual), etc...

Panel de administración

Incluyendo el siguiente texto en functions.php podemos eliminar secciones del menú de administración.

  • Apartados de primer nivel como "Posts", "Media", "Appearance" y "Tools":


function remove_menu_items() {
  global $menu;
  $restricted = array(__('Links'), __('Comments'), __('Media'),
  __('Plugins'), __('Tools'), __('Users'));
  end ($menu);
  while (prev($menu)){
    $value = explode(' ',$menu[key($menu)][0]);
    if(in_array($value[0] != NULL?$value[0]:"" , $restricted)){
      unset($menu[key($menu)]);}
    }
  }

add_action('admin_menu', 'remove_menu_items');


  • Para submenús de segundo nivel, por ejemplo "Theme" que está bajo "Appearance":


function remove_submenus() {
  global $submenu;
  unset($submenu['index.php'][10]); // Removes 'Updates'.
  unset($submenu['themes.php'][5]); // Removes 'Themes'.
  unset($submenu['options-general.php'][15]); // Removes 'Writing'.
  unset($submenu['options-general.php'][25]); // Removes 'Discussion'.
  unset($submenu['edit.php'][16]); // Removes 'Tags'.  
}

add_action('admin_menu', 'remove_submenus');


Para saber el nombre de los submenús, podemos ir a wp-admin/menu.php y buscar el item que queremos deshabilitar.

Para crear un apartado de administración de nuestro theme, debemos incluir la siguiente llamada en functions.php (en este ejemplo estamos poniendo un textarea para que se almacene nuestro código de Google Analytics):

/* Meter código de Google Analytics */
function nombredeltheme_theme() {
	if(isset($_POST['submitted']) and $_POST['submitted'] == 'yes') :
		update_option("google_analytics", stripslashes($_POST['google_analytics']));
	endif;
	?>
	<form method="post" name="update_form" target="_self">
		<h1>Google Analytics</h1>
		<table class="form-table">
			<tr>
				<th>Google Analytics:</th>
				<td><textarea name="google_analytics" style="width: 95%;" rows="10" />
                                <?php echo get_option('google_analytics'); ?></textarea><br />Copia el código Google Analytics aquí.</td>
			</tr>
		</table>
		<p class="submit" id="jump_submit">
		<input name="submitted" type="hidden" value="yes" />
		<input type="submit" name="Submit" value="Save Changes" />
	</form>
	<?php		
}
function nombredeltheme_options() {
	add_menu_page('Opciones del Theme', __('Opciones del Theme', 'default'), 'edit_themes', __FILE__, 'nombredeltheme_theme');
}
add_action('admin_menu', 'nombredeltheme_options');


Luego ponemos en el footer.php:


<?php echo get_option('google_analytics'); ?>


De esta forma se cargará en el footer lo que el usuario alimente desde el panel de administración.

Para añadir una nueva opción a la barra de administración superior del blog, hay que añadir el código que se muestra a continuación dentro del archivo functions.php (estamos agregando la opción Prueba que es un link a http://core.trac.wordpress.org/diff):

    function incluir_enlace_admin_bar() {
    global $wp_admin_bar;
    $wp_admin_bar->add_menu( array(
    ‘id’ => ‘diff’,
    ‘title’ => __(‘Prueba’),
    ‘href’ => ‘http://core.trac.wordpress.org/diff’
    ));
    }
    add_action( ‘admin_bar_menu’, ‘incluir_enlace_admin_bar’ , 30);

Enlaces de interés

  • Nuestra nueva biblia: Codex Wordpress.
  • El gran repositorio de WordPress de plantillas, para que seleccionemos una como base para la modificación.