Estas en: Home > archivo

Entradas etiquetadas con archivo

Papercut: Testear el envío de emails sin necesidad de un servidor SMTP

0

Papercut es un servidor SMTP simplificado para recibir emails, no para enviarlos. Esta aplicación nos permite probar el envío de emails desde los sistemas operativos Windows, quitándonos la tediosa tarea de tener que configurar un servidor SMTP.

Papercut dispone de una interfaz muy sencilla y cómodo, que nos permite comprobar todos los detalles del email que queremos testear: desde el contenido, hasta las cabeceras, pasando por los archivos adjuntos.

Muy útil ante la necesidad de probar el envío de emails de uno de nuestros proyectos de una forma rápida, o en un ordenador que no es en el que habitualmente trabajamos.

 

http://papercut.codeplex.com/

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

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.

YUI Compressor, compresor de archivos JavaScript

0

Habitualmente, cuando terminamos nuestros proyectos web, nos encontramos con archivos de javscript que pesan mucho, ya sea por los frameworks que usamos o por que parte de la lógica de la web depende de JavaScript. Para reducir el peso de esos archivos disponemos de YUI Compressor que nos permite comprimir los archivos JavaScript para que ocupen lo mínimo posible.

Características:

  • Renombra variables locales
  • Elimina espacios en blanco y cambios de líneas
  • Elimina comentarios
  • Compacta también CSS
  • Requiere Java 1.4 o superior

Forma de Uso:

  • Descompactamos el paquete descargado
  • A través de línea de comandos nos movemos al directorio “build”
  • Ejecutamos la siguiente línea de comandos, donde “archivo_original” es el camino completo archivo que deseamos comprimir y “archivo_comprimido” es el camino completo del archivo que resultará después de comprimido, si no existe se creará.

java -jar build/yuicompressor-2.4.2.jar archivo_original –o archivo_comprimido

YUI Compressor [Descargar]

Pasar un proyecto symfony de un servidor a otro (a capón xD)

6

Sí, soy un poco bestia para algunas cosas jejeje; en este caso tuve que pasar el proyecto con el que estaba trabajando en el portatil al ordenador de sobremesa. En el portatil tengo instalada una versión de WAMP y en el sobremesa AppServ así que cuando pasé la carpeta del proyecto con un copy&paste y fui a ejecutarlo al navegador, obviamente no funcionaba, exactamente daba este error:

Warning: sfAutoload::require(C:/wamp/www/sf_sandbox/lib/vendor/symfony/lib/plugins/sfDoctrinePlugin/lib/database/sfDoctrineDatabase.class.php) [sfautoload.require]: failed to open stream: No such file or directory in F:\AppServ\www\sf_sandbox\lib\vendor\symfony\lib\autoload\sfAutoload.class.php on line 188

Fatal error: sfAutoload::require() [function.require]: Failed opening required ‘C:/wamp/www/sf_sandbox/lib/vendor/symfony/lib/plugins/sfDoctrinePlugin/lib/database/sfDoctrineDatabase.class.php’ (include_path=’.;F:\AppServ\php5\pear’) in F:\AppServ\www\sf_sandbox\lib\vendor\symfony\lib\autoload\sfAutoload.class.php on line 188

Continue reading “Pasar un proyecto symfony de un servidor a otro (a capón xD)” »

Ir arriba