Como insertar marcas de agua en WordPress

Posted: mayo 26th, 2011 | Author: | Filed under: Recursos Web, Wordpress | Tags: | 1 Comment »

Una forma simple de agregar marcas de agua a las imagenes de nuestro sitio en wordpress no consiste en usar plugins, podemos hacerlo con un archivo .htaccess, un archivo php y la imagen a incrustar.

Lo que tenemos que hacer es crear el archivo watermark.php en la raiz del ftp (junto al archivo wp-config.php), con el siguiente contenido:

<?php
$src = $_GET['src'];

header(‘Content-type: image/jpeg’);

//this will prevent the watermark from showing up in the thumbnail images
if (eregi(“150×150″, $src)) {
$watermark = imagecreatefrompng(‘empty.png’);
} else {
$watermark = imagecreatefrompng(‘watermark.png’);
}

$watermark_width = imagesx($watermark);
$watermark_height = imagesy($watermark);
$image = imagecreatetruecolor($watermark_width, $watermark_height);
if(eregi(‘.gif’,$src)) {
$image = imagecreatefromgif($src);
}
elseif(eregi(‘.jpeg’,$src)||eregi(‘.jpg’,$src)) {
$image = imagecreatefromjpeg($src);
}
elseif(eregi(‘.png’,$src)) {
$image = imagecreatefrompng($src);
}
else {
exit(“Your image is not a gif, jpeg or png image. Sorry.”);
}

$size = getimagesize($src);
$dest_x = $size[0] – $watermark_width – 0;
$dest_y = $size[1] – $watermark_height – 0;
imagecolortransparent($watermark,imagecolorat($watermark,0,0));
imagecopyresampled($image, $watermark, $dest_x, $dest_y, 0, 0, $watermark_width, $watermark_height, $watermark_width, $watermark_height);

imagejpeg($image, “”, 95);
imagedestroy($image);
imagedestroy($watermark);
?>

Luego agregamos un archivo watermark.jpg en la raiz, junto al archivo php.

Por ultimo modificamos el arcvhio .htaccess con la siguiente línea, de forma que cada pedido de una imagen en tamaño completo tenga la marca de agua incrustada.

RewriteRule ^(.*)wp-content/uploads/(.*) $1watermark.php?src=wp-content/uploads/$2


Proteger admin de wordpress con .htaccess

Posted: marzo 9th, 2011 | Author: | Filed under: Internet, Recursos Web | Tags: , | 1 Comment »

En el artículo anterior Como proteger un directorio en un sitio web con contraseña vimos como agregar un password a un directorio. Una aplicación útil de esto es proteger el directorio admin de nuestro wordpress con usuario y contraseña para agregar un nivel extra de seguridad.

Los pasos a seguir son los mismos que en el caso anterior, creamos el archivo .htpasswd, lo colocamos en un directorio no accesible desde la web y luego el archivo .htaccess en el directorio wp-admin de forma que el sitio público no quede bloqueado pero si el admin.

El problema que puede surgir en muchos casos con esta solución es que no podemos acceder al archivo admin-ajax.php, que es utilizado por ejemplo por algunos plugins para cargar contenidos.

Una solución es agregar en nuestro archivo .htaccess una directiva para que este archivo sea accesible para todo el público sin pedido de contraseña, esto lo logramos con un archivo como el que sigue:

AuthName “Restricted Area”
AuthType Basic
AuthUserFile /var/www/misitioweb.com/.htpasswd
AuthGroupFile /dev/null
require valid-user

<Files “admin-ajax.php”>
Allow from all
Satisfy Any
</Files>

La primera parte es la de pedido de contraseña, luego colocamos el acceso público para el archivo admin-ajax.php.

De esta forma nuestros plugins deberían funcionar sin problemas aunque coloquemos la protección de contraseña en el directorio wp-admin.


Traducción en tiempo real mediante Google Translate con PHP

Posted: febrero 19th, 2011 | Author: | Filed under: PHP, Recursos Web | Tags: , | No Comments »

La traducción de textos en tiempo real es posible utilizando PHP y la API de Google Translate. En forma rápida y sencilla podemos realizar traducciones en los idiomas soportados por el servicio de Google.

En dos líneas podemos realizar el pedido de traducción y procesar la información de respuesta que llega en JSON:

$trans = @file_get_contents( “http://ajax.googleapis.com/ajax/services/language/translate?v=1.0&q=Texto&langpair=es|en” );
$json = json_decode( $trans, true );

Los parámetros a utilizar son tres. El primero indica la versión de API que estamos utilizando, en la actualidad la 2.0 está en desarrollo por lo que haremos uso de la 1.0.

El parámetro q indica el texto a traducir. Luego indicamos los idiomas de origen y destino. En este caso es que indica español y en que indica english. Debemos hacer uso de las siglas utilizadas por Google Translate para indicar los idiomas.

Al procesar el JSON con json_decode obtenemos un array con un campo “responseStatus” que indica si la traducción se realizó con éxito. En dicho caso devuelve el valor “200″.

El texto está contenido en ["responseData"]["translatedText"], por lo cual podemos responder en un AJAX para realizar traducciones instantáneas y en forma sencilla.

echo $json['responseData']['translatedText'];


Envío de mails desde PHP con smtp, autenticacion, ssl y otros.

Posted: julio 28th, 2008 | Author: | Filed under: PHP, Recursos Web | Tags: , , , , , | 30 Comments »

Enviar mails con PHP suele ser sencillo, utilizando la funcion mail() podemos hacerlo aunque no tenemos prácticamente fleixbilidad ni opciones. Casos típicos son cuando queremos enviar mails por smtp, utilizando una cuenta en particular, o nuestro servidor no tiene configurado un servidor local para PHP, o necesitamos una conexion SSL, etc.

Para estos casos podemos usar la clase phpmailer, que nos da todas estas opciones y más. La clase la pueden descargar de: phpmailer.codeworxtech.com

Lo único que necesitamos hacer luego de tener la clase descargada y colocada nuestro sitio, es incluir el archivo de la misma e instancia la clase:

require(“phpmailer/class.phpmailer.php”);
$mail = new PHPMailer();

Hecho esto pasamos a definir mail de origen, destino, nombre, etc.:

$mail->From     = $mailfrom; // Mail de origen
$mail->FromName = $name; // Nombre del que envia
$mail->AddAddress($para); // Mail destino, podemos agregar muchas direcciones
$mail->AddReplyTo($mailfrom); // Mail de respuesta

Luego definimos el contenido del mail:

$mail->WordWrap = 50; // Largo de las lineas
$mail->IsHTML(true); // Podemos incluir tags html
$mail->Subject  =  “Consulta formulario Web: $name”;
$mail->Body     =  “Nombre: $name \n<br />”.
“Email: $mailfrom \n<br />”.
“Tel: $tel \n<br />”.
“Mensaje: $info \n<br />”;
$mail->AltBody  =  strip_tags($mail->Body); // Este es el contenido alternativo sin html

Podemos adjuntar archivos simplemente agregando los mismos de la siguiente forma:

$mail->AddAttachment(“nombredearchivo.txt”); // Ingresamos la ruta del archivo

Y ahora viene la parte divertida (no solo me pica el…errr), definimos el servidor que enviara el mail, podemos definir tipo de servidor, autenticacion, usuario, contraseña, etc. Vemos ejemplo de las posibilidades que tenemos.

Si vamos a enviar mail desde el servidor local sin configuración especial podemos usar:

$mail->Host     = ‘localhost’;

Si necesitamos utilizar una casilla de correo smtp, con user y pass:

$mail->IsSMTP(); // vamos a conectarnos a un servidor SMTP
$mail->Host = “mail.servidor.com”; // direccion del servidor
$mail->SMTPAuth = true; // usaremos autenticacion
$mail->Username = “info@servidor.com”; // usuario
$mail->Password = “pass”; // contraseña

Si necesitamos una conexion con SSL, por ejemplo para enviar un mail desde PHP con gmail:

$mail->Mailer = “smtp”;
$mail->Host = “ssl://smtp.gmail.com”;
$mail->Port = 465;
$mail->SMTPAuth = true;
$mail->Username = “burmauy@gmail.com”; // SMTP username
$mail->Password = “burmaUY123456″; // SMTP password

Como ven esta clase es muy flexible y nos olvidamos de tener que manejar nosotros mismos conexiones complejas o con cabeceras especiales. Podemos simplificarnos mucho la vida utilizando phpmailer para enviar mails.

Ya para enviar el correo, simplemente utilizamos la siguiente linea:

$mail->Send();

Podemos poner esa llinea dentro de un if para saber si quedo todo bien configurado y se pudo enviar el email, de la siguiente forma:

if ($mail->Send())
echo “Enviado”;
else
echo “Error en el envio de mail”;


En busca del uploader perfecto (Parte I)

Posted: junio 4th, 2008 | Author: | Filed under: AJAX, PHP | Tags: , , , , | 2 Comments »

Uno de los grandes problemas de usabilidad en Internet es la interacción con el usuario cuando enviamos archivos. Por lo general al hacer descargas tenemos la barra de progreso del navegador que nos indica el estado/velocidad de la transferencia, pero qué sucede cuando enviamos un archivo? Especialmente en el caso de archivos grandes y cuando tenemos conexiones relativamente lentas, tenemos el problema de no saber qué pasa con el envío… Si se detuvo, si sigue funcionando, solo nos queda esperar a ver que pasa.

Aunque hay muchas soluciones parciales a este problema, por ejemplo con animaciones flash o javascript que muestran una barra de progreso simulado, queremos una solución real, que muestre si realmente hay transferencia.

Las soluciones más básicas de envío de archivo suelen funcionar con un formulario html que envía el o los archivos a un script para procesar, un código como este es algo típico:

<form action=”" method=”post” name=”form1″ enctype=”multipart/form-data”>
<input type=”file” name=”file1″ />
</form>

Claro que este tipo de transferencia no nos da ninguna interacción avanzada que indique al usuario el progreso de la transferencia. Para esto vamos a necesitar un script del lado del servidor que se encargue de recibir el archivo. A pesar de que con PHP se pueden hacer unas cuntas cosas, no tenemos la capacidad de acceder directamente al sistema de archivos y ver el progreso del mismo, por lo cual queda descartado el uso del mismo por lo menos para monitorear el progreso de la carga. Sí podemos utilizar PHP para el resto del proceso, como sea insertar en una base de datos, enviar mensajes etc.

El intermediario para esta solución será un script en Perl, llamado Uber-Uploader. Este script requiere de que el servidor soporte scripts Perl, trabajando con también con PHP y Javascript. El sitio de origen de este script lo pueden encontrar aquí: http://uber-uploader.sourceforge.net/. De todas formas ya que al día de hoy no está actualizado a la última versión disponible adjunto un zip con los archivos necesarios.

Una gran ventaja de este script es que no necesitamos modificar mas que la configuración del mismo, sin tener que meternos con el código en Perl.

Volviendo al script, tenemos los siguiente archivos dentro del zip en cgi-bin:

  • uu_default_config.pm
  • uu_ini_status.pl
  • uu_lib.pm
  • uu_upload.pl

Estos son los archivos de Perl que deben incluirse en el directorio cgi-bin o donde nuestro servidor ejecute los archivos cgi (si este directorio no existe se puede probar con la raíz del sitio). Es muy importante que los permisos de ejecución esten correctamente configurados para que Apache pueda ejecutar el script. Seteando los permisos en 755 para todos los archivos de cgi-bin no deberíamos tener problema.

El archivo que más nos interesa en este caso es uu_default_config.pm que contiene la configuración general de directorios y filtros. Las opciones más importantes son:

  • config_file_name
    Nombre del archivo de configuración, en la segunda parte veremos que podemos tener varias configuraciones.
  • temp_dir
    Archivo temporal de carga para el script.
  • upload_dir
    Donde quedarán guardados los archivos al ser cargados.
  • max_upload
    Tamaño máximo de los archivos.
  • redirect_url
    Dirección a donde nos llevará el script al terminar de cargar, donde podremos realizar tareas post carga como interacción con bases de datos etc.
  • disallow_extensions
    Extensiones no permitidas de archivo.

Con esto tenemos la configuración del script Perl, ahora veamos la otra parte, PHP y Javascript. En este caso tenemos los siguientes archivos (los que aparecen fuera de cgu-bin en el zip):

  • upload.php
  • uu_conlib.php
  • uu_file_upload.js
  • uu_finished.php
  • uu_finished_lib.php
  • uu_get_status.php

Empecemos por uu_conlib.php, el cual es el archivo de configuración del lado de PHP. Las variables que más nos interesan son:

  • $path_to_upload_script
    Define la ruta donde está el script Perl, noten que si el mismo no esta dentro de cgi-bin deberemos modificar la ruta.
  • $path_to_ini_status_script
    Lo mismo que para la variable anterior.
  • $default_config_file
    Archivo de configuración que utilizará este PHP, útil en caso de usar varias configuraciones.
  • $max_upload_slots
    Cantidad máxima de slots de carga, sí, podemos cargar muchos archivos en cola =).
  • $progress_bar_width
    Largo de la barra de progreso, más que nada un tema de diseño.

Pasemos al archivo upload.php, archivo que contiene el formulario html y archivo donde se “muestra” el uploader. Aquí podemos agregar variables al formulario las cuales recibiremos al finalizar la carga de los archivos, por ejemplo id de usuarios, campos con descripciones, etc.

Por último tenemos el archivo uu_finished.php, archivo a donde llegamos al terminar la carga. El script procesa la información de los archivos, datos como nombre, tamaño, etc de cada archivo cargado es accesible en este archivo. Por ejemplo para obtener el nombre del primer archivo cargado podemos hacerlo de la siguiente forma:

$_FILE_DATA[0]->getFileInfo(‘name’)

Y en caso de tener varios archivos cargados podemos hacer lo siguiente:

for ($i = 0; $i < count($_FILE_DATA); $i++) {
$filename = $_FILE_DATA[$i]->getFileInfo(‘name’);
$filesize = $_FILE_DATA[$i]->getFileInfo(‘size’);

}

Ahora tenemos un panorama general del uso de este script, en la segunda parte veremos como tener varios archivos de configuración, como personalizar el formulario de contacto y los errores más comunes que debemos verificar.

Descargar archivo zip con script Uber Uploader.