Subir múltiples archivos de un tirón en tu plugin de Worpress con el cargador de WordPress

Cargador archivos WordPress

Hace apenas un par de días les presentamos una forma de integrar el cargador de WordPress en tu plugin o tema. Esa forma es perfecta para cuando queremos realizar algo tan sencillo como cambiar el logo del tema o sustituir una foto en el plugin. Pero ¿qué pasa si utilizamos esa técnica para subir imágenes a una extensa galería fotográfica?. El cargador de WordPress puede subir todas esas fotos de un tirón, pero el código que vimos no está optimizado para manejar esa cantidad de imágenes. Afortunadamente, después de pensar e investigar un poco he logrado una forma para obtener desde el cargador de WordPress todas las fotos que él sube.

Save attachment

El código que vimos anteriormente se queda igual, sólo tenemos que agregar un par de cosas. Lo primero que tenemos que hacer es agregar al código del plugin el filtro add_attachment, que es invocado cada vez que el cargador de WordPress sube un archivo y lo graba en la base de datos pots de WordPress. Así, cuando subimos múltiples archivos con el cargador de WordPress, cada vez que el plugin graba la información de uno de esos archivos en la base de datos podemos llamar una función que manejará lo que va a hacer con esa imagen.

add_action("add_attachment", "tu_función");

Obtener el ID del attachment

La información de los archivos es guardada en la tabla de posts de WordPress. En dicha tabla, los archivos se distinguen de los posts porque están marcados en el campo post_type como attachment. También se guarda en esta tabla otra información que nos interesa, como la url del archivo, que podemos averiguar con la función de WordPress wp_get_attachment_url. Este es el código de la función “tu_funcion” que llamamos cuando es invocado el filtro add_attachment:

function tu_funcion(){
global $wpdb;
$ultimopost = "SELECT ID FROM " . $wpdb->prefix . "posts ORDER by ID DESC";
$resultado = $wpdb->get_row($ultimopost);
//El id de la imagen guardada actualmente está en $resultado->ID. Podríamos utilizarlo, por ejemplo para guardarlo en una base de datos personalizada
$agregar = "INSERT INTO " . $wpdb->prefix . "tu_tabla (tucampo) VALUES ($query->ID)";
$resultado2 = $wpdb->get_row($agregar);
}

Y de esta forma logramos subir de una sola buena vez una gran cantidad de archivos a nuestro plugin o theme con el cargador de WordPress sin complicaciones.

Cómo utilizar el cargador de archivos de WordPress en tu Plugin o Tema

Wordpress uploader dialog

WordPress posee un excelente cuadro de diálogo cargador de media que es utilizado en las páginas del editor. ¿No sería exitante el poder utilizarlo para manejar las subidas de imágenes en un plugin o tema que estás desarrollando?

Es ridículamente simple implementarlo. Primero pon el siguiente código en la página de administración de tu plugin o tema. Esto de da un texto para la URL de la imagen, y un botón que abrirá el cuadro de diálogo del cargador de media.

<tr valign="top">
<th scope="row">Upload Image</th>
<td><label for="upload_image">
<input id="upload_image" type="text" size="36" name="upload_image" value="" />

<input id="upload_image_button" type="button" value="Upload Image" />
<br />Enter an URL or upload an image for the banner.
</label></td>
</tr>

Ahora necesitamos poner en cola algunos scripts y estilos. Para hacerlo incluimos el siguiente código en nuestro plugin o tema:

function my_admin_scripts() {
wp_enqueue_script('media-upload');
wp_enqueue_script('thickbox');
wp_register_script('my-upload', WP_PLUGIN_URL.'/my-script.js', array('jquery','media-upload','thickbox'));
wp_enqueue_script('my-upload');
}

function my_admin_styles() {
wp_enqueue_style('thickbox');
}

if (isset($_GET['page']) && $_GET['page'] == 'my_plugin_page') {
add_action('admin_print_scripts', 'my_admin_scripts');
add_action('admin_print_styles', 'my_admin_styles');
}

Necesitamos primero los scripts media-upload y thickbox, así también como jQuery, que ya está incluido. Necesitamos registrar nuestro propio archivo JavaScript, my-script.js, el cual manejará la funcionalidad del cargador de media. También necesitamos cargar la hoja de estilos de thickbox en la próxima función.

El bloque if (…) se asegura de que los scripts y estilos sólo serán incluidos si el usuario se encuentra en una página de administración específica. Si te fijas en la página de administración de tu plugin o tema, la URL debe mostrar una cadena ?page=un_nombre al final. Sustituye my_plugin_page por ese nombre.

Ahora para la parte que llama el cargador: el JavaScript. El siguiente código debe ser colocado en el archivo my-script.js que incluimos anteriormente.

jQuery(document).ready(function() {

jQuery('#upload_image_button').click(function() {
 formfield = jQuery('#upload_image').attr('name');
 tb_show('', 'media-upload.php?type=image&amp;TB_iframe=true');
 return false;
});

window.send_to_editor = function(html) {
 imgurl = jQuery('img',html).attr('src');
 jQuery('#upload_image').val(imgurl);
 tb_remove();
}

});

El primer evento click() abre un diálogo ThickBox cuando el botón “Upload Image” es cluiqueado, y carga la página del cargador dentro de él. También almacena el nombre del campo de entrada URL en una variable, para su posterior uso.

La segunda función sustituye la función send_to_editor() del media-upload. Cuando el botón “Insert into Post” es cliqueado en el diálogo del cargador, se llama esta función. Colecta la URL de la imagen que fue subida, la pasa al campo del formulario que la está esperando, y cierra el diálogo ThickBox.

Vía

Findicons.com – Buscador de más de 300.000 iconos gratuitos

Find Icons

Qué tan dificil puede ser buscar iconos gratuitos de calidad para utilizarlos en tus softwares y/o diseños web. Findicons.com es un buscador de iconos gratuitos con más de 300.000 iconos en su base de datos. Posee filtros para ayudar a encontrar exactamente lo que necesitas.

Find Icons

Puedes contribuir con su crecimiento enviando tus creaciones o simplemente utilizalo para navegar y buscar entre los más de 2000 packs.

Enlace: Find icons

Código Rewrite optimizado para mejorar la velocidad de carga de tu blog de WordPress

Un blog de WordPress acabado de instalar utiliza una estructura de urls no entendible por humanos y no amigable a los motores de búsqueda. Esta estructura necesita ser cambiada por una entendible por los visitantes y favorecida por los motores de búsqueda. Por ejemplo, es posible utilizar las direcciones URL que muestren la categoría y el título de la página como la URL, mezclar fechas, valores numéricos o información personalizada.

La regla más importante en Optimización para Motores de Búsqueda es utilizar el título de la página en la url. Todo lo demás es opcional y bajo el gusto del usuario.

WordPress genera un archivo .htaccess que contiene las directivas rewrite cuando se cambian vínculos permanentes (permalinks). A veces sucede que el archivo no puede ser creado o escrito, por lo que el usuario tiene que crear y editar el archivo htaccess de forma manual.

El código de WordPress que se utiliza no está optimizado. No impide, por ejemplo, verifiaciones de archivos y directorios innecesarias. JP Morgan en el foro mundial de Webmasters ha creado una mejor directiva rewrite que “arregla varios problemas que afectan el desempeño”.

Según JP el código modificado acelera el código .htaccess por lo menos un factor de dos “evitando las verificaciones de existencia de segundo paso en el index.php mismo, y evitando la prueba de existencia de recursos tales como archivos de imagen que, evidentemente, no necesitan ser manipulados por  WP. ”

Comenta el antiguo código de WordPress entre las etiquetas “Begin WordPress” y “End WordPress” y pega el siguiente código en tu archivo .htaccess con el nuevo código siguiente. Puede que sea necesario modificar los tipos de archivo (gif | jpg | php | ico | css | js). Estos deben contener la mayor cantidad de archivos requeridos. Podría tener sentido para incluir png, por ejemplo, en la lista.

# BEGIN WordPress
#
RewriteEngine on
#
# Unless you have set a different RewriteBase preceding this point,
# you may delete or comment-out the following RewriteBase directive
# RewriteBase /
#
# if this request is for "/" or has already been rewritten to WP
RewriteCond $1 ^(index\.php)?$ [OR]
# or if request is for image, css, or js file
RewriteCond $1 \.(gif|jpg|php|ico|css|js)$ [NC,OR]
# or if URL resolves to existing file
RewriteCond %{REQUEST_FILENAME} -f [OR]
# or if URL resolves to existing directory
RewriteCond %{REQUEST_FILENAME} -d
# then skip the rewrite to WP
RewriteRule ^(.*)$ - [S=1]
# else rewrite the request to WP
RewriteRule . /index.php [L]
#
# END wordpres 

Lo implementé en este blog y noté una mejora en la carga. Cuéntanos tu experiencia.

Vía

Rsslounge: crea tu versión Google Reader

RSS Lounge

Como te habrás imaginado por el título, Rsslounge consiste en un lector RSS gratuito y código abierto escrito en PHP y MySQL que puedes descargar e instalar en tu servidor web.

Su interfaz está realizada en Ajax y mediante ella puedes administrar todo tipo de RSS, agregar y eliminar canales, organizar por categorías, listar noticias por fechas y muchas cosas más. También permite suscribirte a canales de fotografías y foto blogs.

Requiere PHP 5.2.4 o superior, MySQL y Apache.

Enlace: Rsslounge
Descarga: Rsslounge

Vía

Evitar el hotlinking de imágenes y archivos y sacarle provecho

stopDicen que el hotlinking es el dolor de cabeza de los webmasters, pero con el código que les mostraré a continuación ya no lo será. En seguida les muestro un código para .htaccess que hará lo siguiente:

  • Bloqueará el hotlinking de imágenes y mostrará una imagen alternativa, que puede ser una propaganda de tu sitio Web.
  • Permitirá el hotlinking desde feedburner y Google Reader, para que tus suscriptores no se molesten.
  • Bloqueará el hotlinking de tus archivos descargables, redirigiendo al usuario a tu página web.
  • Bloqueará las descargas de tus archivos descargables pegando la url en el navegador, de manera que el usuario tiene que desacrgarlo obligatoriamente desde donde se publicó originalmente la descarga.

El código es el siguiente:

#Previene el Hotlinking de imágenes
RewriteEngine on
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http(s)?://(www.)?tusitio.com [NC]
RewriteCond %{HTTP_REFERER} !^http://www.google.com/reader/view/.*$ [NC]
RewriteCond %{HTTP_REFERER} !^http://www.google.com/reader/m/view/.*$ [NC]
RewriteCond %{HTTP_REFERER} !^http://(www.)?feedburner.com [NC]
RewriteRule .(jpg|jpeg|png|gif)$ /nohotlink.jpe [R,NC,L]

#Previene el Hotlinkng de archivos
Options +FollowSymLinks
RewriteEngine on
RewriteCond %{HTTP_REFERER} !^http://(www.)?tusitio.com [NC]
RewriteRule .(exe|zip|rar)$ http://tusitio.com [R]

Notas:

  • En la octava línea de comentario se especifica la imagen que se va a mostrar en el sitio donde están haciendo hotlinking a tus imágenes. Nota que le puse intencionalmente la extensión jpe. Esto es debido a que si le pones extensión jpg, esa imagen también será bloqueada. De manera, que la imagen alternativa que vas a subir tendrá extensión jpe para que pueda ser mostrada.
  • Debes reemplazar la cadena de texto “tusitio” por el nombre de tu sitio.
  • La última línea es la redirección del hotlinking de archivos. Yo la puse para el homepage. Tú la puedes cambiar a tu gusto, por ejemplo, puede ser una página de error con algunas instrucciones.

De esta forma podemos dirigir tráfico a nuestro sitio gracias al hotlinking. Este código lo he probado y funciona a la perfección, por eso lo publico. Feliz resto del día.

Deshabilitar reporte de errores en Magento

magento_logoSi ya tienes un sitio web listo para correr con Magento y el sistema te da unas advertencias a cada rato con la página infernal que ya sabemos y simplemente quieres que esa advertencia no aparezca, conseguí una solución no muy elegante, ya que tienes que editar un archivo del sistema. Consiste en ir al archivo:

app/code/core/Mage/Core/functions.php

Allí localizas la línea de código:

throw new Exception($errorMessage);

Y lo reemplazas con:

//throw new Exception($errorMessage);

Si alguien conoce una solución más elegante, por favor, me deja saber.

Problema instalación de magento: /app/code/core/Mage/Core/sql/core_setup/mysql4-upgrade-0.8.9-0.8.10.php” – SQLSTATE[42S01]: Base table or view already exists: 1050 Table ‘core_flag’ already exists

magento_logo

Error in file: /app/code/core/Mage/Core/sql/core_setup/mysql4-upgrade-0.8.9-0.8.10.php” – SQLSTATE[42S01]: Base table or view already exists: 1050 Table ‘core_flag’ already exists
Trace:
#0 /app/code/core/Mage/Core/Model/Resource/Setup.php(292): Mage::exception(’Mage_Core’, ‘Error in file: …’)
#1 /app/code/core/Mage/Core/Model/Resource/Setup.php(179): Mage_Core_Model_Resource_Setup->_modifyResourceDb(’upgrade’, ‘0.8.9′, ‘0.8.12′)
#2 /app/code/core/Mage/Core/Model/Resource/Setup.php(146): Mage_Core_Model_Resource_Setup->_upgradeResourceDb(’0.8.9′, ‘0.8.12′)
#3 /app/code/core/Mage/Core/Model/Resource/Setup.php(121): Mage_Core_Model_Resource_Setup->applyUpdates()
#4 /app/code/core/Mage/Core/Model/Config.php(214): Mage_Core_Model_Resource_Setup::applyAllUpdates()
#5 /app/code/core/Mage/Core/Model/App.php(242): Mage_Core_Model_Config->init(Array)
#6 /app/Mage.php(432): Mage_Core_Model_App->init(”, ’store’, Array)
#7 /app/Mage.php(453): Mage::app(”, ’store’, Array)
#8 /index.php(46): Mage::run()
#9 {main}

Parece ser otro error de Magento dificil de resolver, pero ¿sabes qué?. Para resolverlo simplemente renombra la tabla core_flag y refresca la página. Eso es todo.

Vía

Más resolución de problemas en Magento: simplexml_load_file() [function.simplexml-load-file]: (null)

magento_logoSi vez este mensaje de error: simplexml_load_file() [function.simplexml-load-file]: (null) más un sinnúmero de líneas con advertencias luego de intentar iniciar sesión como administrador, quizás la cabeza te explote pensando que la solución debe ser compleja. Déjame contarte que es bien facil. Basta con ir a tu archivo php.ini y asegurarse de que el valor para memory_limit es mayor a 64 MB.

Que pasen feliz resto del día.