Estas en: Home > Wordpress

Entradas etiquetadas con Wordpress

Tema Mystique para WordPress provoca el error child pid XXXXX exit signal Segmentation fault (11)

0

Estoy seguro que conoceréis este tema para WordPress, el cual fue uno de los más valorados hace ya algunos años, de hecho este blog lo usa actualmente, aunque por desgracia la empresa que lo desarrolló lleva varios años sin mantenerlo, y eso provoca que aparezcan errores que antes no aparecían, por culpa de los avances en otras aplicaciones de las que depende este tema, como en nuestro caso, de PHP.

Bien, voy al grano: Hace varias semanas cambié el blog de servidor y de pronto, al entrar en un post, el blog se quedaba en blanco. No se mostraba contenido. Y en Chrome aparecía el error: ERR_INCOMPLETE_CHUNKED_ENCODING. Estoy seguro, que si te ha pasado, habrás exclamado la misma frase que yo: ¿Pero que coño es eso?.

Mirando los logs del blog, encontré el error: child pid XXXXX exit signal Segmentation fault (11), a lo que exclamé la misma expresión anterior, pero añadiendo un “¡Ostia puta!” al principio.

El segundo error es el importante. Es el que nos dice que algo se ha jodido en PHP. Pero… ¿Por qué? y lo más importante ¿El qué?.

Después de muchas pruebas, vi que el error se estaba generando en el tema Mystique, y más concretamente en la plantilla single.php.

Indagando más sobre el código conseguí llegar a la fuente del problema: cuatro putos ampersand (&) de los cojones que me han jodido un fin de semana entero con la tontería. El error es debido a la versión de PHP. En el servidor anterior era la 5.2, y en el actual es la 5.4.

 

Solución

Os explico la solución que es bastante sencillita:

En los archivos atom-core.php y AtomObjectPost.php busca la función “separate_comments”, te deben aparecer dos resultados en cada archivo. Verás que delante de la función tiene un ampersand (&), elimínalo (con voz de El Padrino: “Que parezca un accidente”). Y con el resto de resultados igual. Guarda y solucionado.

Optimización de WordPress

El widget de pestañas falla en el tema Mystique 3.2.9.3 para WordPress

4

El widget de pestañas permite mostrar en un mismo espacio, lo que habitualmente tendríamos que tener en varios widgets. En este blog se muestra en la columna de la derecha, donde podéis navegar por varios elementos que os ofrecen diversa información y contenidos del blog.

Pues bien, desde hace un tiempo, vengo observando como al pulsar en las pestañas, estas, simplemente, no hacen nada: no carga otro contenido, no hay navegación, etc.

Como no quiero aburriros con el proceso de búsqueda del error, voy al grano: dentro de wp-content/themes/mystique/js hay un archivo llamado jquery.atom.js. En este archivo localizamos las siguientes líneas:

$('.sections', tabs).css('height', $("#" + $('.navi li.active a', tabs).attr('href'), tabs).outerHeight(true));

var current = $("#" + $('.navi li.active', tabs).removeClass('active').find('a').attr('href'), tabs),
next = $("#" + $(this).parent('li').addClass('active').find('a').attr('href'), tabs);

Y las sustituis por las siguientes líneas:

$('.sections', tabs).css('height', $($('.navi li.active a', tabs).attr('href'), tabs).outerHeight(true));

var current = $($('.navi li.active', tabs).removeClass('active').find('a').attr('href'), tabs),
next = $($(this).parent('li').addClass('active').find('a').attr('href'), tabs);

Como ya habrás observado solo hay que eliminar la almohadilla que hay dentro de los selectores (“#” + ), que es lo que provoca que no funcionen las pestañas.

Tendrás que comprimir el archivo y llamarlo jquery.atom.min.js, para que al activar la opción de Mystique de “Optimizar el sitio web para carga rápida”, no vuelva a reproducirse el fallo. También puedes modificar este archivo a mano, aunque solo te lo recomiendo si sabes lo que estas haciendo.

Cron Job WordPress

Collapsing category list: Oculta y despliega las subcategorías de WordPress

1

Durante un tiempo estuve buscando un plugin para ocultar y desplegar las categorías con subcategorías en WordPress, por desgracia los plugins que probé o no funcionaban o estaban abandonados o solo funcionaban para unos themes concretos. Así que me decidí a crear el mío: Collapsing category list, es un pequeño plugin, en realidad un filtro para las categorías por defecto de WordPress que permite colapsar y desplegar las categorías con subcategorías

Categoría colapsada

Categoría colapsada

 

Categoría desplegada

Categoría desplegada

 

Si deseas descargarlo puedes acceder por esta URL: http://wordpress.org/extend/plugins/collapsing-category-list/

Cron Job WordPress

WordPress 3.x para desarrolladores: Plugins, conceptos básicos

0

Un plugin WordPress es un programa, o un conjunto de una o más funciones, escritas en el lenguaje de scripting PHP, que añade un conjunto específico de características o servicios para el weblog WordPress, los cuales pueden ser integrados sin problemas con el weblog usando puntos de acceso y métodos proporcionados por la API.

 

Nombres, archivos y ubicaciones

La primera tarea a la hora de crear un plugin de WordPress es pensar en qué va a hacer el plugin, y crear un (ojalá único) nombre para él. Compruebe en Plugin y en otros repositorios referidos en el enlace, que el nombre no exista ya; se puede hacer, también, una búsqueda en Google. Muchos desarrolladores eligen nombres que describen, de alguna manera, lo que hace el plugin; por ejemplo, un plugin que haga algo relacionado con el tiempo, podría llevar la palabra “tiempo” en su nombre. El nombre puede tener varias palabras.

 

El siguiente paso es crear un archivo PHP con un nombre, derivado del nombre que usted ha elegido para el plugin. Por ejemplo, si su plugin se llamará “funcionalidad maravillosa”, usted podría nombrar al archivo PHP funcimara.php. De nuevo, intente elegir un nombre único. La gente que utilice su plugin, lo pondrá en el directorio de WordPress, en su instalación wp-content/plugins/, de forma que no puede haber dos plugin distintos con el mismo nombre de archivo PHP.

Otra opción es separar el plugin en varios archivos. Su plugin WordPress debe tener al menos un archivo PHP; además puede contener archivos JavaScript, archivos CSS, archivos de imagen, archivos de localización, etc. Si hay varios archivos, elija un nombre único para una carpeta de archivos y para el archivo PHP principal, tales como funcimara y funcimara.php en este ejemplo, coloque todos los archivos del plugin en la carpeta y diga a los usuarios que copien toda la carpeta en wp-content/plugins/.

En el resto de este artículo, nos referiremos al archivo PHP principal como “el archivo PHP del Plugin”, ya esté en wp-content/plugins/ o en un subdirectorio.

 

Información Estándar del Plugin

Las primeras líneas del archivo PHP principal del plugin deben contener la cabecera estándar de información del plugin. Esta cabecera permite a WordPress reconocer que el plugin existe, y ponerlo en la pantalla de gestión para que pueda ser activado, cargado y ejecutar sus funciones. Sin esta cabecera, su plugin no podrá ser activado ni funcionar. Este es el formato de la cabecera:

<?php
/*
Plugin Name: Nombre del plugin
Plugin URI: http://URI_De_La_Página_Que_Describe_el_Plugin_y_Actualizaciones
Description: Una breve descripción del plugin.
Version: El número de versión del plugin e.j.: 1.0
Author: Nombre del autor del plugin
Author URI: http://URI_del_Autor_del_Plugin
License: Un nombre de licencia "pegadizo" e.j. GPL2
*/
?>

El mínimo de información que WordPress necesita para reconocer su plugin es el nombre del mismo. El resto de la información (si está presente) se utilizará para crear la tabla de plugin en la pantalla de gestión de plugins. El orden de las líneas no es importante.

La línea de licencia debería ser un identificador común, corto, para señalar bajo que licencia se distribuye el código y está destinado a ser una forma sencilla de ser explícito acerca de la licencia del mismo.

 

Sugerencias sobre Desarrollo de Plugin

Esta última sección contiene sugerencias aleatorias sobre el desarrollo de plugin.

  • El código de un plugin WordPress debería seguir los Estándar de WordPress Coding. Por favor, también considere los estándarDocumentación en Línea.
  • Todas las funciones en su plugin necesitan tener nombres únicos que sean diferentes de los de funciones del núcleo de WordPress, otros plugins y plantillas. Por esta razón, es una buena idea utilizar un prefijo de nombre de función en todos sus plugins. Otra posibilidad es definir sus funciones de plufin dentro de una clase (que, a su vez, necesita tener un nombre único).
  • No utilice el prefijo de bases de datos (normalmente “wp_”)de WordPress directamente en sus plugins. Asegúrese de que utiliza la variable $wpdb->prefijo en su lugar.
  • Leer la base de datos es barato, pero escribir es caro. Las bases de datos son excepcionalmente buenas recuperando datos y ofreciéndosela a usted y estas operaciones son (normalmente) veloces como el rayo. El hacer cambios en la base de datos, es un proceso más complejo, y más caro desde el punto de vista computacional. Como resultado, intente minimizar la cantidad deescritura que usted hace en la base de datos. Deje todo preparado en su código primero, de forma que usted hace las operaciones de escritura estrictamente necesarias.
  • SELECT solo lo que se necesita. A pesar de que las bases de dato recuperan información realmente rápido, usted debería intentar de reducir la carga sobre la base de datos, seleccionando solo la información sobre la que quiere trabajar. Si usted necesita únicamente contar el número de líneas de una tabla no haga SELECT * FROM, porque se cargarán todos los datos de cada registro, desaprovechando memoria. Así mismo, si solo necesita el post_id y el post_author en el plugin, simplemente SELECTesos campos específicos, para minimizar la carga de la base de datos. Recuerde: cientos de procesos diferentes pueden estar consultando la base de datos al mismo tiempo. La base de datos y el servidor tienen recursos limitados para atender dichos procesos. Aprender como minimizar el impacto de sus plugins en la base de datos asegurará que el suyo no sea el señalado como culpable de abuso de recursos.
  • Elimine errores de PHP en sus plugin. Añada define('WP_DEBUG', true); a su archivo wp-config.php, compruebe toda la funcionabilidad del plugin, y chequee si hay errores y/o avisos. Arregle cualquier incidencia y continue en modo debug hasta que se hayan eliminado todos los errores.
  • Intente no utilizar directamente las etiquetas <script> y <style> – en su lugar utilice las funciones recomendadaswp_enqueue_style() y wp_enqueue_script(). Estas ayudan a eliminar scripts y estilos duplicados y, además, introducen soporte de dependencias. Consulte post de las siguientes personas para más información: Ozh RichardsonArtem Russakovskii, yVladimir Prelovac.
Cron Job WordPress

PHP Code Sniffer, WordPress y coding standards

0

Llevo varias semanas mirando información sobre integración continua y desde hace varios días estoy dándole caña a todas las herramientas que hay que instalar y configurar.

Entre esas herramientas se encuentra PHP Code Sniffer, que permite revisar el código en busca de violaciones de la codificación estándar que se esté usando.

Los coding standards, para el que no los conozca son como las guías de estilo que tienen los periódicos, en ellos se especifica la tipografía a usar tanto en los titulares como en el contenido, el tamaño del texto, la ubicación, etc. En programación ocurre igual, solo que aquí no se habla de tipografías, sino de espacios en blanco después de la apertura del paréntesis de una función, y antes del cierre de este, número de espacios en blanco para sangrar las líneas, o tabulaciones, ubicación de las llaves de apertura, si en la misma línea o en la inferior, etc. Podéis ver el coding standard de pear aquí: http://pear.php.net/manual/en/standards.php.

En WordPress también existe un coding standard derivado del de PEAR: http://codex.wordpress.org/WordPress_Coding_Standards el cual debería ser utilizado por todos para mantener el código de nuestros temas y plugins lo más estándar posible.

Digo debería  porque si ejecutas el sniffer sobre el código de WordPress, no hay ni un solo archivo que no incumpla el coding standard. Es bastante frustrante después de toda una tarde de configuración, aprendizaje, errores, pruebas, y más configuración, encontrarte que no se sigue el estándar, excepto en el código nuevo. Aquí lo explican: https://groups.google.com/forum/?fromgroups=#!msg/wp-hackers/Exg0i8wZEEQ/K1_TxvSs44cJ.

Así que solo queda buscar la forma de configurar la herramienta para que no procese los archivos de WordPress y que solo se aplique en las plantillas y plugins que yo desarrolle.

 

PD: Miedo me da pasarle el phpcs a los plugins de WordPress.

Cron Job WordPress

WordPress 3.x para desarrolladores: Temas y plantillas, category.php, author.php, archive.php y 404.php

0

Estas son las últimas plantillas que crearemos para nuestro tema.

 

CATEGORY.PHP

Creamos el archivo category.php y añadimos el siguiente código:

  1. <?php
  2. /**
  3.  * The template for displaying Category Archive pages.
  4.  *
  5.  * @package WordPress
  6.  * @subpackage New_Theme
  7.  */
  8.  
  9. get_header(); ?>
  10.  
  11. <section id="primary">
  12. <div id="content" role="main">
  13.  
  14. <?php if ( have_posts() ) : ?>
  15.  
  16. <header class="page-header">
  17. <h1 class="page-title"><?php
  18. printf( __( 'Category Archives: %s', 'newtheme' ), '<span>' . single_cat_title( '', false ) . '</span>' );
  19. ?></h1>
  20.  
  21. <?php
  22. $category_description = category_description();
  23. if ( ! empty( $category_description ) )
  24. echo apply_filters( 'category_archive_meta', '<div class="category-archive-meta">' . $category_description . '</div>' );
  25. ?>
  26. </header>
  27.  
  28. <?php newtheme_content_nav( 'nav-above' ); ?>
  29.  
  30. <?php /* Start the Loop */ ?>
  31. <?php while ( have_posts() ) : the_post(); ?>
  32.  
  33. <?php
  34. /* Include the Post-Format-specific template for the content.
  35. * If you want to overload this in a child theme then include a file
  36. * called content-___.php (where ___ is the Post Format name) and that will be used instead.
  37. */
  38. get_template_part( 'content', get_post_format() );
  39. ?>
  40.  
  41. <?php endwhile; ?>
  42.  
  43. <?php newtheme_content_nav( 'nav-below' ); ?>
  44.  
  45. <?php else : ?>
  46.  
  47. <article id="post-0" class="post no-results not-found">
  48. <header class="entry-header">
  49. <h1 class="entry-title"><?php _e( 'Nothing Found', 'newtheme' ); ?></h1>
  50. </header><!-- .entry-header -->
  51.  
  52. <div class="entry-content">
  53. <p><?php _e( 'Apologies, but no results were found for the requested archive. Perhaps searching will help find a related post.', 'newtheme' ); ?></p>
  54. <?php get_search_form(); ?>
  55. </div><!-- .entry-content -->
  56. </article><!-- #post-0 -->
  57.  
  58. <?php endif; ?>
  59.  
  60. </div><!-- #content -->
  61. </section><!-- #primary -->
  62.  
  63. <?php get_sidebar(); ?>
  64. <?php get_footer(); ?>

Esta plantilla está creada para mostrar los post que están en una misma categoría. La estructura de la página es idéntica al del resto que hemos visto del estilo.

 

AUTHOR.PHP

Creamos el archivo author-php y añadimos el siguiente código:

  1. <?php
  2. /**
  3.  * The template for displaying Author Archive pages.
  4.  *
  5.  * @package WordPress
  6.  * @subpackage New_Theme
  7.  */
  8.  
  9. get_header(); ?>
  10.  
  11. <section id="primary">
  12. <div id="content" role="main">
  13.  
  14. <?php if ( have_posts() ) : ?>
  15.  
  16. <?php
  17. /* Queue the first post, that way we know
  18. * what author we're dealing with (if that is the case).
  19. *
  20. * We reset this later so we can run the loop
  21. * properly with a call to rewind_posts().
  22. */
  23. the_post();
  24. ?>
  25.  
  26. <header class="page-header">
  27. <h1 class="page-title author"><?php printf( __( 'Author Archives: %s', 'newtheme' ), '<span class="vcard"><a class="url fn n" href="' . esc_url( get_author_posts_url( get_the_author_meta( "ID" ) ) ) . '" title="' . esc_attr( get_the_author() ) . '" rel="me">' . get_the_author() . '</a></span>' ); ?></h1>
  28. </header>
  29.  
  30. <?php
  31. /* Since we called the_post() above, we need to
  32. * rewind the loop back to the beginning that way
  33. * we can run the loop properly, in full.
  34. */
  35. rewind_posts();
  36. ?>
  37.  
  38. <?php newtheme_content_nav( 'nav-above' ); ?>
  39.  
  40. <?php
  41. // If a user has filled out their description, show a bio on their entries.
  42. if ( get_the_author_meta( 'description' ) ) : ?>
  43. <div id="author-info">
  44. <div id="author-avatar">
  45. <?php echo get_avatar( get_the_author_meta( 'user_email' ), apply_filters( 'newtheme_author_bio_avatar_size', 60 ) ); ?>
  46. </div><!-- #author-avatar -->
  47. <div id="author-description">
  48. <h2><?php printf( __( 'About %s', 'newtheme' ), get_the_author() ); ?></h2>
  49. <?php the_author_meta( 'description' ); ?>
  50. </div><!-- #author-description -->
  51. </div><!-- #author-info -->
  52. <?php endif; ?>
  53.  
  54. <?php /* Start the Loop */ ?>
  55. <?php while ( have_posts() ) : the_post(); ?>
  56.  
  57. <?php
  58. /* Include the Post-Format-specific template for the content.
  59. * If you want to overload this in a child theme then include a file
  60. * called content-___.php (where ___ is the Post Format name) and that will be used instead.
  61. */
  62. get_template_part( 'content', get_post_format() );
  63. ?>
  64.  
  65. <?php endwhile; ?>
  66.  
  67. <?php newtheme_content_nav( 'nav-below' ); ?>
  68.  
  69. <?php else : ?>
  70.  
  71. <article id="post-0" class="post no-results not-found">
  72. <header class="entry-header">
  73. <h1 class="entry-title"><?php _e( 'Nothing Found', 'newtheme' ); ?></h1>
  74. </header><!-- .entry-header -->
  75.  
  76. <div class="entry-content">
  77. <p><?php _e( 'Apologies, but no results were found for the requested archive. Perhaps searching will help find a related post.', 'newtheme' ); ?></p>
  78. <?php get_search_form(); ?>
  79. </div><!-- .entry-content -->
  80. </article><!-- #post-0 -->
  81.  
  82. <?php endif; ?>
  83.  
  84. </div><!-- #content -->
  85. </section><!-- #primary -->
  86.  
  87. <?php get_sidebar(); ?>
  88. <?php get_footer(); ?>

Esta plantilla muestra los post que un autor haya escrito. Lo más relevante del código es que para obtener los datos del autor se recupera el primer post, se genera la cabecera del contenido y después se reinicia el dataset para mostrar los post desde el primero, utilizando para ello la función rewind_posts().

 

ARCHIVE.PHP

Creamos el archivo archive.php y añadimos el siguiete código:

  1. <?php
  2. /**
  3.  * The template for displaying Archive pages.
  4.  *
  5.  * Used to display archive-type pages if nothing more specific matches a query.
  6.  * For example, puts together date-based pages if no date.php file exists.
  7.  *
  8.  * Learn more: http://codex.wordpress.org/Template_Hierarchy
  9.  *
  10.  * @package WordPress
  11.  * @subpackage Twenty_Eleven
  12.  */
  13.  
  14. get_header(); ?>
  15.  
  16. <section id="primary">
  17. <div id="content" role="main">
  18.  
  19. <?php if ( have_posts() ) : ?>
  20.  
  21. <header class="page-header">
  22. <h1 class="page-title">
  23. <?php if ( is_day() ) : ?>
  24. <?php printf( __( 'Daily Archives: %s', 'newtheme' ), '<span>' . get_the_date() . '</span>' ); ?>
  25. <?php elseif ( is_month() ) : ?>
  26. <?php printf( __( 'Monthly Archives: %s', 'newtheme' ), '<span>' . get_the_date( _x( 'F Y', 'monthly archives date format', 'newtheme' ) ) . '</span>' ); ?>
  27. <?php elseif ( is_year() ) : ?>
  28. <?php printf( __( 'Yearly Archives: %s', 'newtheme' ), '<span>' . get_the_date( _x( 'Y', 'yearly archives date format', 'newtheme' ) ) . '</span>' ); ?>
  29. <?php else : ?>
  30. <?php _e( 'Blog Archives', 'newtheme' ); ?>
  31. <?php endif; ?>
  32. </h1>
  33. </header>
  34.  
  35. <?php newtheme_content_nav( 'nav-above' ); ?>
  36.  
  37. <?php /* Start the Loop */ ?>
  38. <?php while ( have_posts() ) : the_post(); ?>
  39.  
  40. <?php
  41. /* Include the Post-Format-specific template for the content.
  42. * If you want to overload this in a child theme then include a file
  43. * called content-___.php (where ___ is the Post Format name) and that will be used instead.
  44. */
  45. get_template_part( 'content', get_post_format() );
  46. ?>
  47.  
  48. <?php endwhile; ?>
  49.  
  50. <?php newtheme_content_nav( 'nav-below' ); ?>
  51.  
  52. <?php else : ?>
  53.  
  54. <article id="post-0" class="post no-results not-found">
  55. <header class="entry-header">
  56. <h1 class="entry-title"><?php _e( 'Nothing Found', 'newtheme' ); ?></h1>
  57. </header><!-- .entry-header -->
  58.  
  59. <div class="entry-content">
  60. <p><?php _e( 'Apologies, but no results were found for the requested archive. Perhaps searching will help find a related post.', 'newtheme' ); ?></p>
  61. <?php get_search_form(); ?>
  62. </div><!-- .entry-content -->
  63. </article><!-- #post-0 -->
  64.  
  65. <?php endif; ?>
  66.  
  67. </div><!-- #content -->
  68. </section><!-- #primary -->
  69.  
  70. <?php get_sidebar(); ?>
  71. <?php get_footer(); ?>

Esta plantilla muestra los post publicados en una fecha o entre fechas concretas.

Cron Job WordPress

WordPress 3.x para desarrolladores: temas y plantillas, tag.php, search.php, searchform.php e image.php

0

Llegamos a las penúltimas plantillas por comentar.

 

TAG.PHP

Creamos el archivo tag.php y añadimos el siguiente código:

  1. <?php
  2. /**
  3.  * The template used to display Tag Archive pages
  4.  *
  5.  * @package WordPress
  6.  * @subpackage New_Theme
  7.  */
  8.  
  9. get_header(); ?>
  10.  
  11. <section id="primary">
  12. <div id="content" role="main">
  13.  
  14. <?php if ( have_posts() ) : ?>
  15.  
  16. <header class="page-header">
  17. <h1 class="page-title"><?php
  18. printf( __( 'Tag Archives: %s', 'newtheme' ), '<span>' . single_tag_title( '', false ) . '</span>' );
  19. ?></h1>
  20.  
  21. <?php
  22. $tag_description = tag_description();
  23. if ( ! empty( $tag_description ) )
  24. echo apply_filters( 'tag_archive_meta', '<div class="tag-archive-meta">' . $tag_description . '</div>' );
  25. ?>
  26. </header>
  27.  
  28. <?php newtheme_content_nav( 'nav-above' ); ?>
  29.  
  30. <?php /* Start the Loop */ ?>
  31. <?php while ( have_posts() ) : the_post(); ?>
  32.  
  33. <?php
  34. /* Include the Post-Format-specific template for the content.
  35. * If you want to overload this in a child theme then include a file
  36. * called content-___.php (where ___ is the Post Format name) and that will be used instead.
  37. */
  38. get_template_part( 'content', get_post_format() );
  39. ?>
  40.  
  41. <?php endwhile; ?>
  42.  
  43. <?php newtheme_content_nav( 'nav-below' ); ?>
  44.  
  45. <?php else : ?>
  46.  
  47. <article id="post-0" class="post no-results not-found">
  48. <header class="entry-header">
  49. <h1 class="entry-title"><?php _e( 'Nothing Found', 'newtheme' ); ?></h1>
  50. </header><!-- .entry-header -->
  51.  
  52. <div class="entry-content">
  53. <p><?php _e( 'Apologies, but no results were found for the requested archive. Perhaps searching will help find a related post.', 'newtheme' ); ?></p>
  54. <?php get_search_form(); ?>
  55. </div><!-- .entry-content -->
  56. </article><!-- #post-0 -->
  57.  
  58. <?php endif; ?>
  59.  
  60. </div><!-- #content -->
  61. </section><!-- #primary -->
  62.  
  63. <?php get_sidebar(); ?>
  64. <?php get_footer(); ?>

Prácticamente es idéntico al resto de plantillas del estilo que hemos visto. En este caso muestra un listado de post por la etiqueta elegida.

 

SEARCH.PHP

Creamos el archivo search.php y añadimos el siguiente código:

  1. <?php
  2. /**
  3.  * The template for displaying Search Results pages.
  4.  *
  5.  * @package WordPress
  6.  * @subpackage New_Theme
  7.  */
  8.  
  9. get_header(); ?>
  10.  
  11. <section id="primary">
  12. <div id="content" role="main">
  13.  
  14. <?php if ( have_posts() ) : ?>
  15.  
  16. <header class="page-header">
  17. <h1 class="page-title"><?php printf( __( 'Search Results for: %s', 'newtheme' ), '<span>' . get_search_query() . '</span>' ); ?></h1>
  18. </header>
  19.  
  20. <?php newtheme_content_nav( 'nav-above' ); ?>
  21.  
  22. <?php /* Start the Loop */ ?>
  23. <?php while ( have_posts() ) : the_post(); ?>
  24.  
  25. <?php
  26. /* Include the Post-Format-specific template for the content.
  27. * If you want to overload this in a child theme then include a file
  28. * called content-___.php (where ___ is the Post Format name) and that will be used instead.
  29. */
  30. get_template_part( 'content', get_post_format() );
  31. ?>
  32.  
  33. <?php endwhile; ?>
  34.  
  35. <?php newtheme_content_nav( 'nav-below' ); ?>
  36.  
  37. <?php else : ?>
  38.  
  39. <article id="post-0" class="post no-results not-found">
  40. <header class="entry-header">
  41. <h1 class="entry-title"><?php _e( 'Nothing Found', 'newtheme' ); ?></h1>
  42. </header><!-- .entry-header -->
  43.  
  44. <div class="entry-content">
  45. <p><?php _e( 'Sorry, but nothing matched your search criteria. Please try again with some different keywords.', 'newtheme' ); ?></p>
  46. <?php get_search_form(); ?>
  47. </div><!-- .entry-content -->
  48. </article><!-- #post-0 -->
  49.  
  50. <?php endif; ?>
  51.  
  52. </div><!-- #content -->
  53. </section><!-- #primary -->
  54.  
  55. <?php get_sidebar(); ?>
  56. <?php get_footer(); ?>

Esta plantilla es la que muestra el listado de post que coinciden con la búsqueda que realiza el usuario.

 

SEARCHFORM.PHP

Creamos el archivo searchform.php y añadimos el siguiente código:

  1. <?php
  2. /**
  3.  * The template for displaying search forms in Twenty Eleven
  4.  *
  5.  * @package WordPress
  6.  * @subpackage New_Theme
  7.  */
  8. ?>
  9. <form method="get" id="searchform" action="<?php echo esc_url( home_url( '/' ) ); ?>">
  10. <label for="s" class="assistive-text"><?php _e( 'Search', 'newtheme' ); ?></label>
  11. <input type="text" class="field" name="s" id="s" placeholder="<?php esc_attr_e( 'Search', 'newtheme' ); ?>" />
  12. <input type="submit" class="submit" name="submit" id="searchsubmit" value="<?php esc_attr_e( 'Search', 'newtheme' ); ?>" />
  13. </form>

Esta plantilla es la que genera el formulario de búsqueda. Como ves no tiene mucho que explicar.

 

IMAGE.PHP

Creamos el archivo image.php y añadimos el siguiente código:

  1. <?php
  2. /**
  3.  * The template for displaying image attachments.
  4.  *
  5.  * @package WordPress
  6.  * @subpackage New_Theme
  7.  */
  8.  
  9. get_header(); ?>
  10.  
  11. <div id="primary" class="image-attachment">
  12. <div id="content" role="main">
  13.  
  14. <?php while ( have_posts() ) : the_post(); ?>
  15.  
  16. <nav id="nav-single">
  17. <h3 class="assistive-text"><?php _e( 'Image navigation', 'newtheme' ); ?></h3>
  18. <span class="nav-previous"><?php previous_image_link( false, __( '&larr; Previous' , 'newtheme' ) ); ?></span>
  19. <span class="nav-next"><?php next_image_link( false, __( 'Next &rarr;' , 'newtheme' ) ); ?></span>
  20. </nav><!-- #nav-single -->
  21.  
  22. <article id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
  23. <header class="entry-header">
  24. <h1 class="entry-title"><?php the_title(); ?></h1>
  25.  
  26. <div class="entry-meta">
  27. <?php
  28. $metadata = wp_get_attachment_metadata();
  29. printf( __( '<span class="meta-prep meta-prep-entry-date">Published </span> <span class="entry-date"><abbr class="published" title="%1$s">%2$s</abbr></span> at <a href="%3$s" title="Link to full-size image">%4$s &times; %5$s</a> in <a href="%6$s" title="Return to %7$s" rel="gallery">%8$s</a>', 'newtheme' ),
  30. esc_attr( get_the_time() ),
  31. get_the_date(),
  32. esc_url( wp_get_attachment_url() ),
  33. $metadata['width'],
  34. $metadata['height'],
  35. esc_url( get_permalink( $post->post_parent ) ),
  36. esc_attr( strip_tags( get_the_title( $post->post_parent ) ) ),
  37. get_the_title( $post->post_parent )
  38. );
  39. ?>
  40. <?php edit_post_link( __( 'Edit', 'newtheme' ), '<span class="edit-link">', '</span>' ); ?>
  41. </div><!-- .entry-meta -->
  42.  
  43. </header><!-- .entry-header -->
  44.  
  45. <div class="entry-content">
  46.  
  47. <div class="entry-attachment">
  48. <div class="attachment">
  49. <?php
  50. /**
  51. * Grab the IDs of all the image attachments in a gallery so we can get the URL of the next adjacent image in a gallery,
  52. * or the first image (if we're looking at the last image in a gallery), or, in a gallery of one, just the link to that image file
  53. */
  54. $attachments = array_values( get_children( array( 'post_parent' => $post->post_parent, 'post_status' => 'inherit', 'post_type' => 'attachment', 'post_mime_type' => 'image', 'order' => 'ASC', 'orderby' => 'menu_order ID' ) ) );
  55. foreach ( $attachments as $k => $attachment ) {
  56. if ( $attachment->ID == $post->ID )
  57. break;
  58. }
  59. $k++;
  60. // If there is more than 1 attachment in a gallery
  61. if ( count( $attachments ) > 1 ) {
  62. if ( isset( $attachments[ $k ] ) )
  63. // get the URL of the next image attachment
  64. $next_attachment_url = get_attachment_link( $attachments[ $k ]->ID );
  65. else
  66. // or get the URL of the first image attachment
  67. $next_attachment_url = get_attachment_link( $attachments[ 0 ]->ID );
  68. } else {
  69. // or, if there's only 1 image, get the URL of the image
  70. $next_attachment_url = wp_get_attachment_url();
  71. }
  72. ?>
  73. <a href="<?php echo esc_url( $next_attachment_url ); ?>" title="<?php the_title_attribute(); ?>" rel="attachment"><?php
  74. $attachment_size = apply_filters( 'newtheme_attachment_size', 848 );
  75. echo wp_get_attachment_image( $post->ID, array( $attachment_size, 1024 ) ); // filterable image width with 1024px limit for image height.
  76. ?></a>
  77.  
  78. <?php if ( ! empty( $post->post_excerpt ) ) : ?>
  79. <div class="entry-caption">
  80. <?php the_excerpt(); ?>
  81. </div>
  82. <?php endif; ?>
  83. </div><!-- .attachment -->
  84.  
  85. </div><!-- .entry-attachment -->
  86.  
  87. <div class="entry-description">
  88. <?php the_content(); ?>
  89. <?php wp_link_pages( array( 'before' => '<div class="page-link"><span>' . __( 'Pages:', 'newtheme' ) . '</span>', 'after' => '</div>' ) ); ?>
  90. </div><!-- .entry-description -->
  91.  
  92. </div><!-- .entry-content -->
  93.  
  94. </article><!-- #post-<?php the_ID(); ?> -->
  95.  
  96. <?php comments_template(); ?>
  97.  
  98. <?php endwhile; // end of the loop. ?>
  99.  
  100. </div><!-- #content -->
  101. </div><!-- #primary -->
  102.  
  103. <?php get_footer(); ?>

Esta plantilla nos permite crear una galería de imágenes simplemente añadiendo las imágenes desde la administración.

Cron Job WordPress

WordPress 3.x para desarrolladores: Temas y plantillas, showcase.php y content-intro.php

0

Estas dos plantillas permiten crear un nuevo formato de página reestructurando los sidebars y los posts.

 

SHOWCASE.PHP

Creamos el archivo showcase.php y añadimos el siguiente código:

  1. <?php
  2. /**
  3.  * Template Name: Showcase Template
  4.  * Description: A Page Template that showcases Sticky Posts, Asides, and Blog Posts
  5.  *
  6.  * The showcase template in New Theme consists of a featured posts section using sticky posts,
  7.  * another recent posts area (with the latest post shown in full and the rest as a list)
  8.  * and a left sidebar holding aside posts.
  9.  *
  10.  * We are creating two queries to fetch the proper posts and a custom widget for the sidebar.
  11.  *
  12.  * @package WordPress
  13.  * @subpackage New_Theme
  14.  */
  15.  
  16. // Enqueue showcase script for the slider
  17. wp_enqueue_script( 'newtheme-showcase', get_template_directory_uri() . '/js/showcase.js', array( 'jquery' ), '2011-04-28' );
  18.  
  19. get_header(); ?>
  20.  
  21. <div id="primary" class="showcase">
  22. <div id="content" role="main">
  23.  
  24. <?php while ( have_posts() ) : the_post(); ?>
  25.  
  26. <?php
  27. /**
  28. * We are using a heading by rendering the_content
  29. * If we have content for this page, let's display it.
  30. */
  31. if ( '' != get_the_content() )
  32. get_template_part( 'content', 'intro' );
  33. ?>
  34.  
  35. <?php endwhile; ?>
  36.  
  37. <?php
  38. /**
  39. * Begin the featured posts section.
  40. *
  41. * See if we have any sticky posts and use them to create our featured posts.
  42. * We limit the featured posts at ten.
  43. */
  44. $sticky = get_option( 'sticky_posts' );
  45.  
  46. // Proceed only if sticky posts exist.
  47. if ( ! empty( $sticky ) ) :
  48.  
  49. $featured_args = array(
  50. 'post__in' => $sticky,
  51. 'post_status' => 'publish',
  52. 'posts_per_page' => 10,
  53. 'no_found_rows' => true,
  54. );
  55.  
  56. // The Featured Posts query.
  57. $featured = new WP_Query( $featured_args );
  58.  
  59. // Proceed only if published posts exist
  60. if ( $featured->have_posts() ) :
  61.  
  62. /**
  63. * We will need to count featured posts starting from zero
  64. * to create the slider navigation.
  65. */
  66. $counter_slider = 0;
  67.  
  68. // Compatibility with versions of WordPress prior to 3.4.
  69. if ( function_exists( 'get_custom_header' ) )
  70. $header_image_width = get_theme_support( 'custom-header', 'width' );
  71. else
  72. $header_image_width = HEADER_IMAGE_WIDTH;
  73. ?>
  74.  
  75. <div class="featured-posts">
  76. <h1 class="showcase-heading"><?php _e( 'Featured Post', 'newtheme' ); ?></h1>
  77.  
  78. <?php
  79. // Let's roll.
  80. while ( $featured->have_posts() ) : $featured->the_post();
  81.  
  82. // Increase the counter.
  83. $counter_slider++;
  84.  
  85. /**
  86. * We're going to add a class to our featured post for featured images
  87. * by default it'll have the feature-text class.
  88. */
  89. $feature_class = 'feature-text';
  90.  
  91. if ( has_post_thumbnail() ) {
  92. // ... but if it has a featured image let's add some class
  93. $feature_class = 'feature-image small';
  94.  
  95. // Hang on. Let's check this here image out.
  96. $image = wp_get_attachment_image_src( get_post_thumbnail_id( $post->ID ), array( $header_image_width, $header_image_width ) );
  97.  
  98. // Is it bigger than or equal to our header?
  99. if ( $image[1] >= $header_image_width ) {
  100. // If bigger, let's add a BIGGER class. It's EXTRA classy now.
  101. $feature_class = 'feature-image large';
  102. }
  103. }
  104. ?>
  105.  
  106. <section class="featured-post <?php echo $feature_class; ?>" id="featured-post-<?php echo $counter_slider; ?>">
  107.  
  108. <?php
  109. /**
  110. * If the thumbnail is as big as the header image
  111. * make it a large featured post, otherwise render it small
  112. */
  113. if ( has_post_thumbnail() ) {
  114. if ( $image[1] >= $header_image_width )
  115. $thumbnail_size = 'large-feature';
  116. else
  117. $thumbnail_size = 'small-feature';
  118. ?>
  119. <a href="<?php the_permalink(); ?>" title="<?php printf( esc_attr__( 'Permalink to %s', 'newtheme' ), the_title_attribute( 'echo=0' ) ); ?>" rel="bookmark"><?php the_post_thumbnail( $thumbnail_size ); ?></a>
  120. <?php
  121. }
  122. ?>
  123. <?php get_template_part( 'content', 'featured' ); ?>
  124. </section>
  125. <?php endwhile; ?>
  126.  
  127. <?php
  128. // Show slider only if we have more than one featured post.
  129. if ( $featured->post_count > 1 ) :
  130. ?>
  131. <nav class="feature-slider">
  132. <ul>
  133. <?php
  134.  
  135. // Reset the counter so that we end up with matching elements
  136. $counter_slider = 0;
  137.  
  138. // Begin from zero
  139. rewind_posts();
  140.  
  141. // Let's roll again.
  142. while ( $featured->have_posts() ) : $featured->the_post();
  143. $counter_slider++;
  144. if ( 1 == $counter_slider )
  145. $class = 'class="active"';
  146. else
  147. $class = '';
  148. ?>
  149. <li><a href="#featured-post-<?php echo $counter_slider; ?>" title="<?php printf( esc_attr__( 'Featuring: %s', 'newtheme' ), the_title_attribute( 'echo=0' ) ); ?>" <?php echo $class; ?>></a></li>
  150. <?php endwhile; ?>
  151. </ul>
  152. </nav>
  153. <?php endif; // End check for more than one sticky post. ?>
  154. </div><!-- .featured-posts -->
  155. <?php endif; // End check for published posts. ?>
  156. <?php endif; // End check for sticky posts. ?>
  157.  
  158. <section class="recent-posts">
  159. <h1 class="showcase-heading"><?php _e( 'Recent Posts', 'newtheme' ); ?></h1>
  160.  
  161. <?php
  162.  
  163. // Display our recent posts, showing full content for the very latest, ignoring Aside posts.
  164. $recent_args = array(
  165. 'order' => 'DESC',
  166. 'post__not_in' => get_option( 'sticky_posts' ),
  167. 'tax_query' => array(
  168. 'taxonomy' => 'post_format',
  169. 'terms' => array( 'post-format-aside', 'post-format-link', 'post-format-quote', 'post-format-status' ),
  170. 'field' => 'slug',
  171. 'operator' => 'NOT IN',
  172. ),
  173. ),
  174. 'no_found_rows' => true,
  175. );
  176.  
  177. // Our new query for the Recent Posts section.
  178. $recent = new WP_Query( $recent_args );
  179.  
  180. // The first Recent post is displayed normally
  181. if ( $recent->have_posts() ) : $recent->the_post();
  182.  
  183. // Set $more to 0 in order to only get the first part of the post.
  184. global $more;
  185. $more = 0;
  186.  
  187. get_template_part( 'content', get_post_format() );
  188.  
  189. echo '<ol class="other-recent-posts">';
  190.  
  191. endif;
  192.  
  193. // For all other recent posts, just display the title and comment status.
  194. while ( $recent->have_posts() ) : $recent->the_post(); ?>
  195.  
  196. <li class="entry-title">
  197. <a href="<?php the_permalink(); ?>" title="<?php printf( esc_attr__( 'Permalink to %s', 'newtheme' ), the_title_attribute( 'echo=0' ) ); ?>" rel="bookmark"><?php the_title(); ?></a>
  198. <span class="comments-link">
  199. <?php comments_popup_link( '<span class="leave-reply">' . __( 'Leave a reply', 'newtheme' ) . '</span>', __( '<b>1</b> Reply', 'newtheme' ), __( '<b>%</b> Replies', 'newtheme' ) ); ?>
  200. </span>
  201. </li>
  202.  
  203. <?php
  204. endwhile;
  205.  
  206. // If we had some posts, close the <ol>
  207. if ( $recent->post_count > 0 )
  208. echo '</ol>';
  209. ?>
  210. </section><!-- .recent-posts -->
  211.  
  212. <div class="widget-area" role="complementary">
  213. <?php if ( ! dynamic_sidebar( 'sidebar-2' ) ) : ?>
  214.  
  215. <?php
  216. the_widget( 'New_Theme_Ephemera_Widget', '', array( 'before_title' => '<h3 class="widget-title">', 'after_title' => '</h3>' ) );
  217. ?>
  218.  
  219. <?php endif; // end sidebar widget area ?>
  220. </div><!-- .widget-area -->
  221.  
  222. </div><!-- #content -->
  223. </div><!-- #primary -->
  224.  
  225. <?php get_footer(); ?>

Lo primero que hace el código es indicar a WordPress que cargue el archivo showcase.js, que nosotros deberemos copiar a nuestra carpeta en la ruta correcta.

  1. <?php while ( have_posts() ) : the_post(); ?>
  2.  
  3. <?php
  4. /**
  5. * We are using a heading by rendering the_content
  6. * If we have content for this page, let's display it.
  7. */
  8. if ( '' != get_the_content() )
  9. get_template_part( 'content', 'intro' );
  10. ?>
  11.  
  12. <?php endwhile; ?>

A continuación se carga el contenido de la página, normalmente una descripción, o una galería de imágenes.

  1. <?php
  2. /**
  3. * Begin the featured posts section.
  4. *
  5. * See if we have any sticky posts and use them to create our featured posts.
  6. * We limit the featured posts at ten.
  7. */
  8. $sticky = get_option( 'sticky_posts' );
  9.  
  10. // Proceed only if sticky posts exist.
  11. if ( ! empty( $sticky ) ) :
  12.  
  13. $featured_args = array(
  14. 'post__in' => $sticky,
  15. 'post_status' => 'publish',
  16. 'posts_per_page' => 10,
  17. 'no_found_rows' => true,
  18. );
  19.  
  20. // The Featured Posts query.
  21. $featured = new WP_Query( $featured_args );
  22.  
  23. // Proceed only if published posts exist
  24. if ( $featured->have_posts() ) :
  25.  
  26. /**
  27. * We will need to count featured posts starting from zero
  28. * to create the slider navigation.
  29. */
  30. $counter_slider = 0;
  31.  
  32. // Compatibility with versions of WordPress prior to 3.4.
  33. if ( function_exists( 'get_custom_header' ) )
  34. $header_image_width = get_theme_support( 'custom-header', 'width' );
  35. else
  36. $header_image_width = HEADER_IMAGE_WIDTH;
  37. ?>
  38.  
  39. <div class="featured-posts">
  40. <h1 class="showcase-heading"><?php _e( 'Featured Post', 'newtheme' ); ?></h1>
  41.  
  42. <?php
  43. // Let's roll.
  44. while ( $featured->have_posts() ) : $featured->the_post();
  45.  
  46. // Increase the counter.
  47. $counter_slider++;
  48.  
  49. /**
  50. * We're going to add a class to our featured post for featured images
  51. * by default it'll have the feature-text class.
  52. */
  53. $feature_class = 'feature-text';
  54.  
  55. if ( has_post_thumbnail() ) {
  56. // ... but if it has a featured image let's add some class
  57. $feature_class = 'feature-image small';
  58.  
  59. // Hang on. Let's check this here image out.
  60. $image = wp_get_attachment_image_src( get_post_thumbnail_id( $post->ID ), array( $header_image_width, $header_image_width ) );
  61.  
  62. // Is it bigger than or equal to our header?
  63. if ( $image[1] >= $header_image_width ) {
  64. // If bigger, let's add a BIGGER class. It's EXTRA classy now.
  65. $feature_class = 'feature-image large';
  66. }
  67. }
  68. ?>
  69.  
  70. <section class="featured-post <?php echo $feature_class; ?>" id="featured-post-<?php echo $counter_slider; ?>">
  71.  
  72. <?php
  73. /**
  74. * If the thumbnail is as big as the header image
  75. * make it a large featured post, otherwise render it small
  76. */
  77. if ( has_post_thumbnail() ) {
  78. if ( $image[1] >= $header_image_width )
  79. $thumbnail_size = 'large-feature';
  80. else
  81. $thumbnail_size = 'small-feature';
  82. ?>
  83. <a href="<?php the_permalink(); ?>" title="<?php printf( esc_attr__( 'Permalink to %s', 'newtheme' ), the_title_attribute( 'echo=0' ) ); ?>" rel="bookmark"><?php the_post_thumbnail( $thumbnail_size ); ?></a>
  84. <?php
  85. }
  86. ?>
  87. <?php get_template_part( 'content', 'featured' ); ?>
  88. </section>
  89. <?php endwhile; ?>
  90.  
  91. <?php
  92. // Show slider only if we have more than one featured post.
  93. if ( $featured->post_count > 1 ) :
  94. ?>
  95. <nav class="feature-slider">
  96. <ul>
  97. <?php
  98.  
  99. // Reset the counter so that we end up with matching elements
  100. $counter_slider = 0;
  101.  
  102. // Begin from zero
  103. rewind_posts();
  104.  
  105. // Let's roll again.
  106. while ( $featured->have_posts() ) : $featured->the_post();
  107. $counter_slider++;
  108. if ( 1 == $counter_slider )
  109. $class = 'class="active"';
  110. else
  111. $class = '';
  112. ?>
  113. <li><a href="#featured-post-<?php echo $counter_slider; ?>" title="<?php printf( esc_attr__( 'Featuring: %s', 'newtheme' ), the_title_attribute( 'echo=0' ) ); ?>" <?php echo $class; ?>></a></li>
  114. <?php endwhile; ?>
  115. </ul>
  116. </nav>
  117. <?php endif; // End check for more than one sticky post. ?>
  118. </div><!-- .featured-posts -->
  119. <?php endif; // End check for published posts. ?>
  120. <?php endif; // End check for sticky posts. ?>

A continuación comprueba si existen post destacados para mostrar, si es así se inicia el bucle para procesar los datos y mostrar el código html correspondiente.

  1. <section class="recent-posts">
  2. <h1 class="showcase-heading"><?php _e( 'Recent Posts', 'newtheme' ); ?></h1>
  3.  
  4. <?php
  5.  
  6. // Display our recent posts, showing full content for the very latest, ignoring Aside posts.
  7. $recent_args = array(
  8. 'order' => 'DESC',
  9. 'post__not_in' => get_option( 'sticky_posts' ),
  10. 'tax_query' => array(
  11. 'taxonomy' => 'post_format',
  12. 'terms' => array( 'post-format-aside', 'post-format-link', 'post-format-quote', 'post-format-status' ),
  13. 'field' => 'slug',
  14. 'operator' => 'NOT IN',
  15. ),
  16. ),
  17. 'no_found_rows' => true,
  18. );
  19.  
  20. // Our new query for the Recent Posts section.
  21. $recent = new WP_Query( $recent_args );
  22.  
  23. // The first Recent post is displayed normally
  24. if ( $recent->have_posts() ) : $recent->the_post();
  25.  
  26. // Set $more to 0 in order to only get the first part of the post.
  27. global $more;
  28. $more = 0;
  29.  
  30. get_template_part( 'content', get_post_format() );
  31.  
  32. echo '<ol class="other-recent-posts">';
  33.  
  34. endif;
  35.  
  36. // For all other recent posts, just display the title and comment status.
  37. while ( $recent->have_posts() ) : $recent->the_post(); ?>
  38.  
  39. <li class="entry-title">
  40. <a href="<?php the_permalink(); ?>" title="<?php printf( esc_attr__( 'Permalink to %s', 'newtheme' ), the_title_attribute( 'echo=0' ) ); ?>" rel="bookmark"><?php the_title(); ?></a>
  41. <span class="comments-link">
  42. <?php comments_popup_link( '<span class="leave-reply">' . __( 'Leave a reply', 'newtheme' ) . '</span>', __( '<b>1</b> Reply', 'newtheme' ), __( '<b>%</b> Replies', 'newtheme' ) ); ?>
  43. </span>
  44. </li>
  45.  
  46. <?php
  47. endwhile;
  48.  
  49. // If we had some posts, close the <ol>
  50. if ( $recent->post_count > 0 )
  51. echo '</ol>';
  52. ?>
  53. </section><!-- .recent-posts -->

Después tenemos los post más recientes, que se obtienen de la misma manera que los destacados.

  1. <div class="widget-area" role="complementary">
  2. <?php if ( ! dynamic_sidebar( 'sidebar-2' ) ) : ?>
  3.  
  4. <?php
  5. the_widget( 'New_Theme_Ephemera_Widget', '', array( 'before_title' => '<h3 class="widget-title">', 'after_title' => '</h3>' ) );
  6. ?>
  7.  
  8. <?php endif; // end sidebar widget area ?>
  9. </div><!-- .widget-area -->

Por último cargamos el widget que mostrará un listado de links a diferentes post.

 

CONTENT-INTRO.PHP

Creamos el archivo content-intro.php y añadimos el siguiente código:

  1. <?php
  2. /**
  3.  * The template for displaying page content in the showcase.php page template
  4.  *
  5.  * @package WordPress
  6.  * @subpackage New_Theme
  7.  */
  8. ?>
  9.  
  10. <article id="post-<?php the_ID(); ?>" <?php post_class( 'intro' ); ?>>
  11. <header class="entry-header">
  12. <h2 class="entry-title"><?php the_title(); ?></h2>
  13. </header><!-- .entry-header -->
  14.  
  15. <div class="entry-content">
  16. <?php the_content(); ?>
  17. <?php wp_link_pages( array( 'before' => '<div class="page-link"><span>' . __( 'Pages:', 'newtheme' ) . '</span>', 'after' => '</div>' ) ); ?>
  18. <?php edit_post_link( __( 'Edit', 'newtheme' ), '<span class="edit-link">', '</span>' ); ?>
  19. </div><!-- .entry-content -->
  20. </article><!-- #post-<?php the_ID(); ?> -->

Código sencillo, simplemente da formato al contenido.

Cron Job WordPress

WordPress 3.x para desarrolladores: Temas y plantillas, content-image.php, content-link.php, content-quote.php y content-status.php

0

CONTENT-IMAGE.PHP

Creamos el archivo content-image.php y añadimos el siguiente código:

  1. <?php
  2. /**
  3.  * The template for displaying posts in the Image Post Format on index and archive pages
  4.  *
  5.  * Learn more: http://codex.wordpress.org/Post_Formats
  6.  *
  7.  * @package WordPress
  8.  * @subpackage New_Theme
  9.  */
  10. ?>
  11. <article id="post-<?php the_ID(); ?>" <?php post_class( 'indexed' ); ?>>
  12. <header class="entry-header">
  13. <hgroup>
  14. <h2 class="entry-title"><a href="<?php the_permalink(); ?>" title="<?php printf( esc_attr__( 'Permalink to %s', 'newtheme' ), the_title_attribute( 'echo=0' ) ); ?>" rel="bookmark"><?php the_title(); ?></a></h2>
  15. <h3 class="entry-format"><?php _e( 'Image', 'newtheme' ); ?></h3>
  16. </hgroup>
  17.  
  18. <?php if ( comments_open() && ! post_password_required() ) : ?>
  19. <div class="comments-link">
  20. <?php comments_popup_link( '<span class="leave-reply">' . __( "Reply", 'newtheme' ) . '</span>', _x( '1', 'comments number', 'newtheme' ), _x( '%', 'comments number', 'newtheme' ) ); ?>
  21. </div>
  22. <?php endif; ?>
  23. </header><!-- .entry-header -->
  24.  
  25. <div class="entry-content">
  26. <?php the_content( __( 'Continue reading <span class="meta-nav">&rarr;</span>', 'newtheme' ) ); ?>
  27. <?php wp_link_pages( array( 'before' => '<div class="page-link"><span>' . __( 'Pages:', 'newtheme' ) . '</span>', 'after' => '</div>' ) ); ?>
  28. </div><!-- .entry-content -->
  29.  
  30. <footer class="entry-meta">
  31. <div class="entry-meta">
  32. <?php
  33. printf( __( '<a href="%1$s" rel="bookmark"><time class="entry-date" datetime="%2$s" pubdate>%3$s</time></a><span class="by-author"> <span class="sep"> by </span> <span class="author vcard"><a class="url fn n" href="%4$s" title="%5$s" rel="author">%6$s</a></span></span>', 'newtheme' ),
  34. esc_url( get_permalink() ),
  35. get_the_date( 'c' ),
  36. get_the_date(),
  37. esc_url( get_author_posts_url( get_the_author_meta( 'ID' ) ) ),
  38. esc_attr( sprintf( __( 'View all posts by %s', 'newtheme' ), get_the_author() ) ),
  39. get_the_author()
  40. );
  41. ?>
  42. </div><!-- .entry-meta -->
  43. <div class="entry-meta">
  44. <?php
  45. /* translators: used between list items, there is a space after the comma */
  46. $categories_list = get_the_category_list( __( ', ', 'newtheme' ) );
  47. if ( $categories_list ):
  48. ?>
  49. <span class="cat-links">
  50. <?php printf( __( '<span class="%1$s">Posted in</span> %2$s', 'newtheme' ), 'entry-utility-prep entry-utility-prep-cat-links', $categories_list ); ?>
  51. </span>
  52. <?php endif; // End if categories ?>
  53. <?php
  54. /* translators: used between list items, there is a space after the comma */
  55. $tags_list = get_the_tag_list( '', __( ', ', 'newtheme' ) );
  56. if ( $tags_list ): ?>
  57. <span class="tag-links">
  58. <?php printf( __( '<span class="%1$s">Tagged</span> %2$s', 'newtheme' ), 'entry-utility-prep entry-utility-prep-tag-links', $tags_list ); ?>
  59. </span>
  60. <?php endif; // End if $tags_list ?>
  61.  
  62. <?php if ( comments_open() ) : ?>
  63. <span class="comments-link"><?php comments_popup_link( '<span class="leave-reply">' . __( 'Leave a reply', 'newtheme' ) . '</span>', __( '<b>1</b> Reply', 'newtheme' ), __( '<b>%</b> Replies', 'newtheme' ) ); ?></span>
  64. <?php endif; // End if comments_open() ?>
  65. </div><!-- .entry-meta -->
  66.  
  67. <?php edit_post_link( __( 'Edit', 'newtheme' ), '<span class="edit-link">', '</span>' ); ?>
  68. </footer><!-- #entry-meta -->
  69. </article><!-- #post-<?php the_ID(); ?> -->

Este tipo de contenido simplemente muestra una imagen y su respectivo título.

 

CONTENT-LINK.PHP

Creamos el archivo content-link.php y añadimos el siguiente código:

  1. <?php
  2. /**
  3.  * The template for displaying posts in the Link Post Format on index and archive pages
  4.  *
  5.  * Learn more: http://codex.wordpress.org/Post_Formats
  6.  *
  7.  * @package WordPress
  8.  * @subpackage New_Theme
  9.  */
  10. ?>
  11.  
  12. <article id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
  13. <header class="entry-header">
  14. <hgroup>
  15. <h2 class="entry-title"><a href="<?php the_permalink(); ?>" title="<?php printf( esc_attr__( 'Permalink to %s', 'newtheme' ), the_title_attribute( 'echo=0' ) ); ?>" rel="bookmark"><?php the_title(); ?></a></h2>
  16. <h3 class="entry-format"><?php _e( 'Link', 'newtheme' ); ?></h3>
  17. </hgroup>
  18.  
  19. <?php if ( comments_open() && ! post_password_required() ) : ?>
  20. <div class="comments-link">
  21. <?php comments_popup_link( '<span class="leave-reply">' . __( 'Reply', 'newtheme' ) . '</span>', _x( '1', 'comments number', 'newtheme' ), _x( '%', 'comments number', 'newtheme' ) ); ?>
  22. </div>
  23. <?php endif; ?>
  24. </header><!-- .entry-header -->
  25.  
  26. <?php if ( is_search() ) : // Only display Excerpts for Search ?>
  27. <div class="entry-summary">
  28. <?php the_excerpt(); ?>
  29. </div><!-- .entry-summary -->
  30. <?php else : ?>
  31. <div class="entry-content">
  32. <?php the_content( __( 'Continue reading <span class="meta-nav">&rarr;</span>', 'newtheme' ) ); ?>
  33. <?php wp_link_pages( array( 'before' => '<div class="page-link"><span>' . __( 'Pages:', 'newtheme' ) . '</span>', 'after' => '</div>' ) ); ?>
  34. </div><!-- .entry-content -->
  35. <?php endif; ?>
  36.  
  37. <footer class="entry-meta">
  38. <?php newtheme_posted_on(); ?>
  39. <?php if ( comments_open() ) : ?>
  40. <span class="sep"> | </span>
  41. <span class="comments-link"><?php comments_popup_link( '<span class="leave-reply">' . __( 'Leave a reply', 'newtheme' ) . '</span>', __( '<b>1</b> Reply', 'newtheme' ), __( '<b>%</b> Replies', 'newtheme' ) ); ?></span>
  42. <?php endif; ?>
  43. <?php edit_post_link( __( 'Edit', 'newtheme' ), '<span class="edit-link">', '</span>' ); ?>
  44. </footer><!-- #entry-meta -->
  45. </article><!-- #post-<?php the_ID(); ?> -->

Este contenido es más sencillo aún. Simplemente mostramos un link o un conjunto de estos.

 

CONTENT-QUOTE.PHP

Creamos el archivo content-quote.php y añadimos el siguiente código:

  1. <?php
  2.  
  3. <?php
  4. /**
  5.  * The default template for displaying content
  6.  *
  7.  * @package WordPress
  8.  * @subpackage New_Theme
  9.  */
  10. ?>
  11.  
  12. <article id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
  13. <header class="entry-header">
  14. <hgroup>
  15. <h2 class="entry-title"><a href="<?php the_permalink(); ?>" title="<?php printf( esc_attr__( 'Permalink to %s', 'newtheme' ), the_title_attribute( 'echo=0' ) ); ?>" rel="bookmark"><?php the_title(); ?></a></h2>
  16. <h3 class="entry-format"><?php _e( 'Quote', 'newtheme' ); ?></h3>
  17. </hgroup>
  18.  
  19. <div class="entry-meta">
  20. <?php newtheme_posted_on(); ?>
  21. </div><!-- .entry-meta -->
  22.  
  23. <?php if ( comments_open() && ! post_password_required() ) : ?>
  24. <div class="comments-link">
  25. <?php comments_popup_link( '<span class="leave-reply">' . __( 'Reply', 'newtheme' ) . '</span>', _x( '1', 'comments number', 'newtheme' ), _x( '%', 'comments number', 'newtheme' ) ); ?>
  26. </div>
  27. <?php endif; ?>
  28. </header><!-- .entry-header -->
  29.  
  30. <?php if ( is_search() ) : // Only display Excerpts for Search ?>
  31. <div class="entry-summary">
  32. <?php the_excerpt(); ?>
  33. </div><!-- .entry-summary -->
  34. <?php else : ?>
  35. <div class="entry-content">
  36. <?php the_content( __( 'Continue reading <span class="meta-nav">&rarr;</span>', 'newtheme' ) ); ?>
  37. <?php wp_link_pages( array( 'before' => '<div class="page-link"><span>' . __( 'Pages:', 'newtheme' ) . '</span>', 'after' => '</div>' ) ); ?>
  38. </div><!-- .entry-content -->
  39. <?php endif; ?>
  40.  
  41. <footer class="entry-meta">
  42. <?php $show_sep = false; ?>
  43. <?php
  44. /* translators: used between list items, there is a space after the comma */
  45. $categories_list = get_the_category_list( __( ', ', 'newtheme' ) );
  46. if ( $categories_list ):
  47. ?>
  48. <span class="cat-links">
  49. <?php printf( __( '<span class="%1$s">Posted in</span> %2$s', 'newtheme' ), 'entry-utility-prep entry-utility-prep-cat-links', $categories_list );
  50. $show_sep = true; ?>
  51. </span>
  52. <?php endif; // End if categories ?>
  53. <?php
  54. /* translators: used between list items, there is a space after the comma */
  55. $tags_list = get_the_tag_list( '', __( ', ', 'newtheme' ) );
  56. if ( $tags_list ):
  57. if ( $show_sep ) : ?>
  58. <span class="sep"> | </span>
  59. <?php endif; // End if $show_sep ?>
  60. <span class="tag-links">
  61. <?php printf( __( '<span class="%1$s">Tagged</span> %2$s', 'newtheme' ), 'entry-utility-prep entry-utility-prep-tag-links', $tags_list );
  62. $show_sep = true; ?>
  63. </span>
  64. <?php endif; // End if $tags_list ?>
  65.  
  66. <?php if ( comments_open() ) : ?>
  67. <?php if ( $show_sep ) : ?>
  68. <span class="sep"> | </span>
  69. <?php endif; // End if $show_sep ?>
  70. <span class="comments-link"><?php comments_popup_link( '<span class="leave-reply">' . __( 'Leave a reply', 'newtheme' ) . '</span>', __( '<b>1</b> Reply', 'newtheme' ), __( '<b>%</b> Replies', 'newtheme' ) ); ?></span>
  71. <?php endif; // End if comments_open() ?>
  72.  
  73. <?php edit_post_link( __( 'Edit', 'newtheme' ), '<span class="edit-link">', '</span>' ); ?>
  74. </footer><!-- #entry-meta -->
  75. </article><!-- #post-<?php the_ID(); ?> -->

Más de lo mismo, lo único que cambia es que aparece un subtítulo indicando que es una cita.

 

CONTENT-STATUS.PHP

Creamos el archivo content-status.php y añadimos el siguiente código:

  1. <?php
  2. /**
  3.  * The template for displaying posts in the Status Post Format on index and archive pages
  4.  *
  5.  * Learn more: http://codex.wordpress.org/Post_Formats
  6.  *
  7.  * @package WordPress
  8.  * @subpackage New_Theme
  9.  */
  10. ?>
  11.  
  12. <article id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
  13. <header class="entry-header">
  14. <hgroup>
  15. <h2 class="entry-title"><a href="<?php the_permalink(); ?>" title="<?php printf( esc_attr__( 'Permalink to %s', 'newtheme' ), the_title_attribute( 'echo=0' ) ); ?>" rel="bookmark"><?php the_title(); ?></a></h2>
  16. <h3 class="entry-format"><?php _e( 'Status', 'newtheme' ); ?></h3>
  17. </hgroup>
  18.  
  19. <?php if ( comments_open() && ! post_password_required() ) : ?>
  20. <div class="comments-link">
  21. <?php comments_popup_link( '<span class="leave-reply">' . __( 'Reply', 'newtheme' ) . '</span>', _x( '1', 'comments number', 'newtheme' ), _x( '%', 'comments number', 'newtheme' ) ); ?>
  22. </div>
  23. <?php endif; ?>
  24. </header><!-- .entry-header -->
  25.  
  26. <?php if ( is_search() ) : // Only display Excerpts for Search ?>
  27. <div class="entry-summary">
  28. <?php the_excerpt(); ?>
  29. </div><!-- .entry-summary -->
  30. <?php else : ?>
  31. <div class="entry-content">
  32. <div class="avatar"><?php echo get_avatar( get_the_author_meta( 'ID' ), apply_filters( 'newtheme_status_avatar', '65' ) ); ?></div>
  33.  
  34. <?php the_content( __( 'Continue reading <span class="meta-nav">&rarr;</span>', 'newtheme' ) ); ?>
  35. <?php wp_link_pages( array( 'before' => '<div class="page-link"><span>' . __( 'Pages:', 'newtheme' ) . '</span>', 'after' => '</div>' ) ); ?>
  36. </div><!-- .entry-content -->
  37. <?php endif; ?>
  38.  
  39. <footer class="entry-meta">
  40. <?php newtheme_posted_on(); ?>
  41. <?php if ( comments_open() ) : ?>
  42. <span class="sep"> | </span>
  43. <span class="comments-link"><?php comments_popup_link( '<span class="leave-reply">' . __( 'Leave a reply', 'newtheme' ) . '</span>', __( '<b>1</b> Reply', 'newtheme' ), __( '<b>%</b> Replies', 'newtheme' ) ); ?></span>
  44. <?php endif; ?>
  45. <?php edit_post_link( __( 'Edit', 'newtheme' ), '<span class="edit-link">', '</span>' ); ?>
  46. </footer><!-- #entry-meta -->
  47. </article><!-- #post-<?php the_ID(); ?> -->

En este caso se añade la imagen del perfil del autor o avatar para acompañar al contenido.

Cron Job WordPress

WordPress 3.x para desarrolladores: Temas y plantillas, content-aside.php, content-featured.php y content-gallery.php

0

Durante los próximos post, incluido este, explicaré las últimas plantillas que quedan por crear de nuestro tema, después continuaré el tutorial con los plugins.

 

CONTENT-ASIDE.PHP

WordPress dispone de varios formatos de post que pueden ser personalizados (ver: http://codex.wordpress.org/Post_Formats), entre ellos se encuentra aside, que es parecido a una actualización de Facebook, es decir, no tiene título.

Creamos el archivo content-aside.php y añadimos el siguiente código:

  1. <?php
  2. /**
  3.  * The template for displaying posts in the Aside Post Format on index and archive pages
  4.  *
  5.  * Learn more: http://codex.wordpress.org/Post_Formats
  6.  *
  7.  * @package WordPress
  8.  * @subpackage New_Theme
  9.  */
  10. ?>
  11.  
  12. <article id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
  13. <header class="entry-header">
  14. <hgroup>
  15. <h2 class="entry-title"><a href="<?php the_permalink(); ?>" title="<?php printf( esc_attr__( 'Permalink to %s', 'newtheme' ), the_title_attribute( 'echo=0' ) ); ?>" rel="bookmark"><?php the_title(); ?></a></h2>
  16. <h3 class="entry-format"><?php _e( 'Aside', 'newtheme' ); ?></h3>
  17. </hgroup>
  18.  
  19. <?php if ( comments_open() && ! post_password_required() ) : ?>
  20. <div class="comments-link">
  21. <?php comments_popup_link( '<span class="leave-reply">' . __( 'Reply', 'newtheme' ) . '</span>', _x( '1', 'comments number', 'newtheme' ), _x( '%', 'comments number', 'newtheme' ) ); ?>
  22. </div>
  23. <?php endif; ?>
  24. </header><!-- .entry-header -->
  25.  
  26. <?php if ( is_search() ) : // Only display Excerpts for Search ?>
  27. <div class="entry-summary">
  28. <?php the_excerpt(); ?>
  29. </div><!-- .entry-summary -->
  30. <?php else : ?>
  31. <div class="entry-content">
  32. <?php the_content( __( 'Continue reading <span class="meta-nav">&rarr;</span>', 'newtheme' ) ); ?>
  33. <?php wp_link_pages( array( 'before' => '<div class="page-link"><span>' . __( 'Pages:', 'newtheme' ) . '</span>', 'after' => '</div>' ) ); ?>
  34. </div><!-- .entry-content -->
  35. <?php endif; ?>
  36.  
  37. <footer class="entry-meta">
  38. <?php newtheme_posted_on(); ?>
  39. <?php if ( comments_open() ) : ?>
  40. <span class="sep"> | </span>
  41. <span class="comments-link"><?php comments_popup_link( '<span class="leave-reply">' . __( 'Leave a reply', 'newtheme' ) . '</span>', __( '<b>1</b> Reply', 'newtheme' ), __( '<b>%</b> Replies', 'newtheme' ) ); ?></span>
  42. <?php endif; ?>
  43. <?php edit_post_link( __( 'Edit', 'newtheme' ), '<span class="edit-link">', '</span>' ); ?>
  44. </footer><!-- #entry-meta -->
  45. </article><!-- #post-<?php the_ID(); ?> -->

Como veis, lo primero que se crea es la cabecera del post, pero en este caso, en vez de mostrar el título del post se mostrará el texto “Aside“. El resto del código es prácticamente igual al de un post normal: se muestra el contenido del post y se crea el pie de este con los metadatos y los correspondientes links, entre ellos el de editar.

 

CONTENT-FEATURED.PHP

Los post featured son los post destacados de los que ya hemos hablado con anterioridad. Aunque este tipo de post no aparece en la lista de formatos de post, si es una características de los post normales que se puede personalizar con su propia plantilla.

Por tanto crearemos el archivo content-featured.php y añadiremos el siguiente código:

  1. <?php
  2. /**
  3.  * The template for displaying content featured in the showcase.php page template
  4.  *
  5.  * @package WordPress
  6.  * @subpackage New_Theme
  7.  */
  8.  
  9. global $feature_class;
  10. ?>
  11. <article id="post-<?php the_ID(); ?>" <?php post_class( $feature_class ); ?>>
  12. <header class="entry-header">
  13. <h2 class="entry-title"><a href="<?php the_permalink(); ?>" title="<?php printf( esc_attr__( 'Permalink to %s', 'newtheme' ), the_title_attribute( 'echo=0' ) ); ?>" rel="bookmark"><?php the_title(); ?></a></h2>
  14.  
  15. <div class="entry-meta">
  16. <?php newtheme_posted_on(); ?>
  17. </div><!-- .entry-meta -->
  18. </header><!-- .entry-header -->
  19.  
  20. <div class="entry-summary">
  21. <?php the_excerpt(); ?>
  22. <?php wp_link_pages( array( 'before' => '<div class="page-link"><span>' . __( 'Pages:', 'newtheme' ) . '</span>', 'after' => '</div>' ) ); ?>
  23. </div><!-- .entry-content -->
  24.  
  25. <footer class="entry-meta">
  26. <?php
  27. /* translators: used between list items, there is a space after the comma */
  28. $tag_list = get_the_tag_list( '', __( ', ', 'newtheme' ) );
  29. if ( '' != $tag_list ) {
  30. $utility_text = __( 'This entry was posted in %1$s and tagged %2$s. Bookmark the <a href="%3$s" title="Permalink to %4$s" rel="bookmark">permalink</a>.', 'newtheme' );
  31. } else {
  32. $utility_text = __( 'This entry was posted in %1$s. Bookmark the <a href="%3$s" title="Permalink to %4$s" rel="bookmark">permalink</a>.', 'newtheme' );
  33. }
  34. $utility_text,
  35. /* translators: used between list items, there is a space after the comma */
  36. get_the_category_list( __( ', ', 'newtheme' ) ),
  37. $tag_list,
  38. esc_url( get_permalink() ),
  39. the_title_attribute( 'echo=0' )
  40. );
  41. ?>
  42.  
  43. <?php edit_post_link( __( 'Edit', 'newtheme' ), '<span class="edit-link">', '</span>' ); ?>
  44. </footer><!-- .entry-meta -->
  45. </article><!-- #post-<?php the_ID(); ?> -->

Lo mismo de antes, se muestra el título, se muestra el contenido y se muestra el pie del post, la única diferencia sería que, en este caso también mostramos el texto “FEATURED” o “DESTACADO” en la página principal.

 

CONTENT-GALLERY.PHP

Este tipo de contenido nos permite mostrar galerías de imágenes, adjuntando las imágenes al post.

Creamos el archivo content-gallery.php y añadimos el siguiente código:

  1. <?php
  2. /**
  3.  * The template for displaying posts in the Gallery Post Format on index and archive pages
  4.  *
  5.  * Learn more: http://codex.wordpress.org/Post_Formats
  6.  *
  7.  * @package WordPress
  8.  * @subpackage New_Theme
  9.  */
  10. ?>
  11.  
  12. <article id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
  13. <header class="entry-header">
  14. <hgroup>
  15. <h2 class="entry-title"><a href="<?php the_permalink(); ?>" title="<?php printf( esc_attr__( 'Permalink to %s', 'newtheme' ), the_title_attribute( 'echo=0' ) ); ?>" rel="bookmark"><?php the_title(); ?></a></h2>
  16. <h3 class="entry-format"><?php _e( 'Gallery', 'newtheme' ); ?></h3>
  17. </hgroup>
  18.  
  19. <div class="entry-meta">
  20. <?php newtheme_posted_on(); ?>
  21. </div><!-- .entry-meta -->
  22. </header><!-- .entry-header -->
  23.  
  24. <?php if ( is_search() ) : // Only display Excerpts for search pages ?>
  25. <div class="entry-summary">
  26. <?php the_excerpt(); ?>
  27. </div><!-- .entry-summary -->
  28. <?php else : ?>
  29. <div class="entry-content">
  30. <?php if ( post_password_required() ) : ?>
  31. <?php the_content( __( 'Continue reading <span class="meta-nav">&rarr;</span>', 'newtheme' ) ); ?>
  32.  
  33. <?php else : ?>
  34. <?php
  35. $images = get_children( array( 'post_parent' => $post->ID, 'post_type' => 'attachment', 'post_mime_type' => 'image', 'orderby' => 'menu_order', 'order' => 'ASC', 'numberposts' => 999 ) );
  36. if ( $images ) :
  37. $total_images = count( $images );
  38. $image = array_shift( $images );
  39. $image_img_tag = wp_get_attachment_image( $image->ID, 'thumbnail' );
  40. ?>
  41.  
  42. <figure class="gallery-thumb">
  43. <a href="<?php the_permalink(); ?>"><?php echo $image_img_tag; ?></a>
  44. </figure><!-- .gallery-thumb -->
  45.  
  46. <p><em><?php printf( _n( 'This gallery contains <a %1$s>%2$s photo</a>.', 'This gallery contains <a %1$s>%2$s photos</a>.', $total_images, 'newtheme' ),
  47. 'href="' . esc_url( get_permalink() ) . '" title="' . sprintf( esc_attr__( 'Permalink to %s', 'newtheme' ), the_title_attribute( 'echo=0' ) ) . '" rel="bookmark"',
  48. number_format_i18n( $total_images )
  49. ); ?></em></p>
  50. <?php endif; ?>
  51. <?php the_excerpt(); ?>
  52. <?php endif; ?>
  53. <?php wp_link_pages( array( 'before' => '<div class="page-link"><span>' . __( 'Pages:', 'newtheme' ) . '</span>', 'after' => '</div>' ) ); ?>
  54. </div><!-- .entry-content -->
  55. <?php endif; ?>
  56.  
  57. <footer class="entry-meta">
  58. <?php $show_sep = false; ?>
  59. <?php
  60. /* translators: used between list items, there is a space after the comma */
  61. $categories_list = get_the_category_list( __( ', ', 'newtheme' ) );
  62. if ( $categories_list ):
  63. ?>
  64. <span class="cat-links">
  65. <?php printf( __( '<span class="%1$s">Posted in</span> %2$s', 'newtheme' ), 'entry-utility-prep entry-utility-prep-cat-links', $categories_list );
  66. $show_sep = true; ?>
  67. </span>
  68. <?php endif; // End if categories ?>
  69. <?php
  70. /* translators: used between list items, there is a space after the comma */
  71. $tags_list = get_the_tag_list( '', __( ', ', 'newtheme' ) );
  72. if ( $tags_list ):
  73. if ( $show_sep ) : ?>
  74. <span class="sep"> | </span>
  75. <?php endif; // End if $show_sep ?>
  76. <span class="tag-links">
  77. <?php printf( __( '<span class="%1$s">Tagged</span> %2$s', 'newtheme' ), 'entry-utility-prep entry-utility-prep-tag-links', $tags_list );
  78. $show_sep = true; ?>
  79. </span>
  80. <?php endif; // End if $tags_list ?>
  81.  
  82. <?php if ( comments_open() ) : ?>
  83. <?php if ( $show_sep ) : ?>
  84. <span class="sep"> | </span>
  85. <?php endif; // End if $show_sep ?>
  86. <span class="comments-link"><?php comments_popup_link( '<span class="leave-reply">' . __( 'Leave a reply', 'newtheme' ) . '</span>', __( '<b>1</b> Reply', 'newtheme' ), __( '<b>%</b> Replies', 'newtheme' ) ); ?></span>
  87. <?php endif; // End if comments_open() ?>
  88.  
  89. <?php edit_post_link( __( 'Edit', 'newtheme' ), '<span class="edit-link">', '</span>' ); ?>
  90. </footer><!-- #entry-meta -->
  91. </article><!-- #post-<?php the_ID(); ?> -->

La parte más importante de este código es el siguiente extracto:

  1. <?php if ( post_password_required() ) : ?>
  2. <?php the_content( __( 'Continue reading <span class="meta-nav">&rarr;</span>', 'newtheme' ) ); ?>
  3.  
  4. <?php else : ?>
  5. <?php
  6. $images = get_children( array( 'post_parent' => $post->ID, 'post_type' => 'attachment', 'post_mime_type' => 'image', 'orderby' => 'menu_order', 'order' => 'ASC', 'numberposts' => 999 ) );
  7. if ( $images ) :
  8. $total_images = count( $images );
  9. $image = array_shift( $images );
  10. $image_img_tag = wp_get_attachment_image( $image->ID, 'thumbnail' );
  11. ?>
  12.  
  13. <figure class="gallery-thumb">
  14. <a href="<?php the_permalink(); ?>"><?php echo $image_img_tag; ?></a>
  15. </figure><!-- .gallery-thumb -->
  16.  
  17. <p><em><?php printf( _n( 'This gallery contains <a %1$s>%2$s photo</a>.', 'This gallery contains <a %1$s>%2$s photos</a>.', $total_images, 'newtheme' ),
  18. 'href="' . esc_url( get_permalink() ) . '" title="' . sprintf( esc_attr__( 'Permalink to %s', 'newtheme' ), the_title_attribute( 'echo=0' ) ) . '" rel="bookmark"',
  19. number_format_i18n( $total_images )
  20. ); ?></em></p>
  21. <?php endif; ?>

Esta parte es la que calcula el número de imágenes en el post y las convierte en una galería.

Ir arriba