EditThisPagePHP es una herramienta que nos permite modificar el contenido de una página de forma colaborativa uniendo el concepto de wiki, blog y CMS.
Cuando se quiere modificar contenido de forma colaborativa y llevar el control de los cambios se usa un wiki, en los blogs se permiten comentarios y feeds, y un CMS el tratamiento de roles y usuarios. Esta aplicación combina los tres conceptos para la modificación de páginas.
Inicialmente se realizó para una única página, pero actualizaciones posteriores permiten hacerlo en diversas páginas. Permite editar páginas, comparar diferencias entre versiones, comentarios, feeds, integración con otros sistemas, filtros en los comentarios para evitar el spam, instalación web, notificación mediante pings y muchas otras opciones. EditThisPagePHP
VÃa / Linux.com
SecureImage es un CAPTCHA realizado en PHP (necesario GD) que nos permite evitar el abuso del spam protegiéndonos de sus ataques.
Es muy fácil de usar, ya que en solo 3 líneas de código te muestra la imagen o valida la entrada en 6 líneas de código. Permite seleccionar el juego de caracteres, la fuente TTF o fuentes GD, permite añadir imagenes de fondo, modificar el color, el ángulo y la transparencia del código, añadir líneas que tachen la imagen o generar ficheros wav con el CAPTCHA audible. SecureImage PHPDeveloper.org
Un completísimo tutorial de la gente de IBM que nos muestra paso a paso cómo integrar en nuestras aplicaciones PHP los calendarios de eventos de Google Calendar.
Se nos va a indicar cómo realizar las siguientes funcionalidades, explicándonos también el API de Google Calendar:
Recuperar eventos de una lista pública
Añadir más eventos
Modificar o borrar eventos
Buscar eventos por palabra clave o rango de fechas
Google ha recomendado una serie de consejos para optimizar nuestro código PHP, y no se ha hecho esperar la respuestade la comunidad, diciendo que son consejos erróneos.
Los consejos que suelo leer sobre optimizar PHP no se basan en micro-optimizaciones (usar switch o if, comillas dobles o simples, …) sino en optimizaciones más generales: buen código, caché, …
Vía / PHPDeveloper.org
Para mí, uno de los mayores fracasos de Twitter es su API, una limitación de su uso increíble para algo que le podría dar mucho juego a la aplicación. Ahora mismo no sé en cuánto está el límite, pero la posibilidad de realizar una aplicación basada en Twitter es una pesadilla.
Para aquellos que no quieran sufrir lo que hemos sufrido con TwitterPoster (los espacios en blanco es porque la gente actualiza su imagen y no podemos recuperar la de todos los usuarios por el límite en el API de Twitter), les recomiendo usar Twitter mediante CURL.
Os paso un script sencillito que he realizado:
<?php
// Primer hacemos login
$url ="https://twitter.com/sessions";
$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
// Por si tienen limitación por navegador
curl_setopt($ch, curlOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.4) Gecko/20030624 Netscape/7.1 (ax)");
// Poned una ruta para las cookies
curl_setopt ($ch, CURLOPT_COOKIEJAR, '/temp/');
curl_setopt ($ch, CURLOPT_COOKIEFILE, '/temp/');
curl_setopt ($ch, CURLOPT_POSTFIELDS, "username_or_email=[usuario]&password=[contraseña]");
// Para que funcione el https
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, curlOPT_SSL_VERIFYHOST, 2);
curl_exec ($ch);
// Cargamos el home, porque Twitter añade dos campos ocultos para poder publicar por web
$url ="http://twitter.com/home";
curl_setopt($ch, CURLOPT_URL, $url);
$result = curl_exec ($ch);
// Recuperamos los campos ocultos
preg_match('//', $result, $match);
$authenticity_token = $match[1];
preg_match('//', $result, $match);
$siv = $match[1];
// Insertamos el texto
$res = $url ="http://twitter.com/status/update";
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt ($ch, CURLOPT_POSTFIELDS, 'siv='.$siv.'&authenticity_token='.$auth.'&status=[texto]');
curl_exec ($ch);
curl_close ($ch);
unset($ch);
?>
¿Qué fallo tiene este script? pues que si cambian el HTML (campos de formulario, …) o las URLs deja de funcionar, pero al menos no tenemos limitaciones. Eso sí, es más costoso para sus servidores y para los nuestros, porque en vez de hacer una llamada, hacemos 3, y en nuestro caso, a parte parseamos una página para obtener dos campos ocultos.
Creo que para ciertos blogs es muy útil ofrecer la opción de añadir OpenSearch para que la gente puede realizar búsquedas en nuestro blog. Algo también bastante útil es que nos ofrezca sugerencias de búsquedas (tal y como hace Google). Para ello tan sólo hay que añadir una opción al XML de OpenSearch y modificar nuestro functions.php.
En el fichero XML deberemos añadir la siguiente etiqueta:
Y añadir xmlns:suggestions="http://www.opensearch.org/specifications/opensearch/extensions/suggestions/1.1" a la etiqueta inicial OpenSearchDescription
Yo en este caso he preferido usar una URL amigable, sobre todo para practicar con el wp_rewrite, pero se podría hacer perfectamente con una variable con parámetros.
Una vez cambiado el opensearch.xml deberemos modificar el functions.php, para lo cual tendremos que coger el término que se quiere sugerir y buscar entre las categorías y tags y entre los títulos de los posts para así mostrar una unión de ambos. Las categorías se ordenarán por el número de veces que aparece y los posts por fecha descendente.
add_filter('init','suggestion_init');
add_filter('query_vars','suggestion_insertMyRewriteQueryVars');
add_filter('rewrite_rules_array','suggestion_rewrite');
// Acciones iniciales
function suggestion_init(){
// Reescribe las reglas
global $wp_rewrite;
$wp_rewrite->rewrite_rules();
// Obtiene el termino a buscar
$req = explode('/', substr($_SERVER['REQUEST_URI'], 1), 2);
if ($req[0] == 'suggestion') {
$result = wp_cache_get( 'suggestion_'.$req[1] );
if ( false == $result ) {
global $wpdb;
$list = array();
// Recupera las 4 categorias/tags que coincidan
$res = $wpdb->get_results("select name from $wpdb->terms t, $wpdb->term_taxonomy tx where name like '%".$req[1]."%' and t.term_id = tx.term_id group by name order by count desc limit 4");
foreach ($res as $item) $list[] = $item->name;
// Recupera las 4 anotaciones que coincidan
$res = $wpdb->get_results("select post_title from $wpdb->posts where post_title like '%".$req[1]."%' order by ID desc limit 4");
foreach ($res as $item) $list[] = $item->post_title;
// Devuelve en formato JSON
$result = json_encode(array($req[1], $list));
wp_cache_set( 'suggestion_'.$req[1], $result );
}
echo $result;
exit();
}
}
// Permite que WP acepte un nueva parametro en la query de la URL
function suggestion_insertMyRewriteQueryVars($vars) {
array_push($vars, 'suggestion');
return $vars;
}
// Reescribe la regla
function suggestion_rewrite($rules)
{
$newrules = array();
$newrules['suggestion/([^/]+)/(.*)$'] = 'index.php?suggestion=$matches[1]';
return $newrules + $rules;
}
En el código he añadido caché, porque es altamente recomendable, puediendo usar el plugin WP File Cache. También debo decir que me encontré con el problema del timeout que tiene Firefox para esperar la respuesta para la sugerencia, muy pequeño para mi servidor, por lo que si quieres modificarlo, busca el fichero nsSearchSuggestions.js y modifica el valor de _suggestionTimeout.
Para aquellos que quieren hacer uso de Foursquare mediante su API, les puede interesar este artículo que hace uso de la librería OAuth, en el que se explica paso a paso como dar de alta la aplicación dentro de Foursquare y todo lo necesario para acceder a la API.