Lessn: script para acortar URLs
Lessn es un script en PHP5 y MySQL que permite realizar un acortador de URLs al estilo micurl o parecidos.
Lessn
Vía / Script & Style
Lessn es un script en PHP5 y MySQL que permite realizar un acortador de URLs al estilo micurl o parecidos.
Lessn
Vía / Script & Style
¿Para que crear un formulario de contacto en un theme si ya existe algún plugin que te lo hace todo y muy bien?. Fácil, porque cuando subes un theme a wordpress.org, no te deja meter plugins, y si lo quieres vender, no puedes meter mil instrucciones para instalarlo, lo lógico es que copie el theme y poco más.
El tutorial explica paso a paso cómo crear la página, hacer que WordPress la entienda, crear el formulario de contacto, validación por jQuery haciendo uso de un plugin y envío del email.
How to create a built-in contact form for your WordPress theme
Vía / DZone
Normalmente no es muy frecuente acceder mediante PHP a SVN, pero nos podemos encontrar con la situación de necesitar obtener archivos de SVN y para ello nada mejor que esta librerÃ.
PHP SVN Client recupera ficheros del SVN sin necesidad de otras aplicaciones. Accede al repositorio SVN mediante el protocolo WebDAV y permite obtener una lista de ficheros en un directorio, recuperar una revisión de un fichero, recuperar los logs de los cambios realizados para un fichero entre dos revisiones y obtener la última versión del repositorio.
$svn = new phpsvnclient;
// Indica el repositorio
$svn->setRespository("http://dominio.com/svn/");
// Obtiene los ficheros de un directorio, la última versión
$files_now = $svn->getDirectoryFiles("/trunk/dir/");
// Obtiene la versión 7 de un directorio
$files_7 = $svn->getDirectoryFiles("/trunk/dir/",7);
// Obtiene la última versión de un fichero
$phpajax_now = $svn->getFile("/trunk/directorio/fichero.php");
// Obtiene la versión 7 de un fichero
$phpajax_7 = $svn->getFile("/trunk/directorio/fichero.php",7);
// Obtiene los logs
$logs = $svn->getRepositoryLogs(2,5);
Vogoo PHP Lib es un motor para filtros de recomendaciones/colaboraciones que puedes integrar en tu sistema. Gracias a esta librerÃa podrás añadir caracterÃsticas del tipo: “la gente a la que le gusta este artÃculo también le gusta…”. Es fácil de usar y con unas simples lÃneas de código se puede realizar el filtrado de artÃculos.
En su versión 2.0, los módulos se han reorganizado para mejorar la consistencia del código, a parte de añadir un módulo de estadÃsticas. Diseñado para que trabaje con varios sistemas de bases de datos aunque solo ha sido probado con MySQL y PostgreSQL.
Entre las caracterÃsticas que ofrece nos encontramos con un motor de predicción de puntuaciones de usuarios, calculo de similitud entre usuarios, múltiples categorÃas, puntuaciones automáticas basadas en páginas vistas y muchas cosas más. Existe una versión PRO que tiene optimizado el motor de filtro.
Vogoo PHP Lib
VÃa / International PHP Magazine
Interesante artículo en el que se nos explica qué es memcached (por si alguien no lo conoce), nos ofrece un ejemplo de clase que utiliza memcached, nos muestra una presentación sobre Facebook y memcached, y nos explica qué usos se le pueden dar a memcached:
También recomiendo leer su post: MySQL Query Cache, WP-Cache, APC, Memcache – What to choose
Memcached and “N” things you can do with it – Part 1
Vía / PHPDeveloper.org
neo4j es una base de datos de grafos que puede ser muy útil para aplicaciones tipo redes sociales. El problema para los que usamos PHP es que neo4j está en Java y para usarlo desde PHP o se una un bridge que conecte con Java o usar la versión REST de neo4j y acceder vía web.
Su uso es muy sencillo:
$graphDb = new GraphDatabaseService('http://localhost:9999/');
$node = $graphDb->createNode();
$node->message = "Hello, ";
$node->blah = "blah blah";
$node->save();
Se le puede añadir todas las propiedades que se quieran, que se transforman en un array de datos que luego se enviarán en json.
El único problema que tiene esta librería es que no genera índices, aunque es muy sencillo modificar, ya que tan solo es necesario añadir una llamada para generar el índice:
HTTPUtil::jsonPostRequest($this->_neo_db->getBaseUri().'index/node/clave/'.$this->_data['clave'], $this->_neo_db->getBaseUri().'node/'.$this->_id);
siendo ‘clave’ lo que queramos añadir como índice. También es necesario modificar HTTPUtil::jsonRequest para que cuando $data no sea un array no se codifique en JSON.
No entiendo por qué no hay un filter o un action cuando se trata de los contenidos de los widgets. A no ser que el autor los haya metido, no hay forma de modificar ni el form del widget ni su contenido.
Me he encontrado en la necesidad de tener que indicar en el footer el tamaño de columnas de Bootstrap para cada uno de los widgets de un sidebar, para lo cual es necesario modificar la salida de cada widget e incluir en el form un campo que indique el ancho y en el html del widget el código de Bootstrap para indicar el ancho de la columna:
En el function.php meteremos el siguiente código:
Primero modificaremos los datos del widget para que añada el nuevo campo que vamos a meter (widget_bootstrap_columns), milagrosamente sí hay un filtro para ello:
// Modificamos los datos enviados al guardar el widget
add_filter( 'widget_update_callback', 'sw_widget_update');
function sw_widget_update($instance, $new_instance, $old_instance, $obj ) {
if (isset($_POST['widget_bootstrap_columns'])) $instance['widget_bootstrap_columns'] = $_POST['widget_bootstrap_columns'];
return $instance;
}
Después vamos a modificar la variable global $wp_registered_widgets que contiene la llamada a la función widget del widget (la que escribe el HTML). Encapsularemos esta llamada dentro de una función anónima para realizar las tareas que sean necesarias, en mi caso dibujar un div con el class col-sm-N:
// Modifico el display del widget para meterle el código de bootstrap
add_action('dynamic_sidebar_before', 'sw_modify_widgets_display', 10, 2);
function sw_modify_widgets_display($index, $bool) {
global $wp_registered_widgets;
$sidebars_widgets = wp_get_sidebars_widgets();
foreach ( (array) $sidebars_widgets[$index] as $id ) {
if ( !isset($wp_registered_widgets[$id]) ) continue;
$wp_registered_widgets[$id]['_callback'] = $wp_registered_widgets[$id]['callback'];
$wp_registered_widgets[$id]['callback'] = function($args, $widget_args) use ($id) {
global $wp_registered_widgets;
// Recuperamos los datos del widget
$instance = get_option($wp_registered_widgets[$id]['_callback'][0]->option_name);
$bootstrap = isset($instance[$wp_registered_widgets[$id]['_callback'][0]->number]['widget_bootstrap_columns'])? $instance[$wp_registered_widgets[$id]['_callback'][0]->number]['widget_bootstrap_columns'] : false;
// Pintamos el tamaño de la columna si así procede
if ($bootstrap) echo '<div class="col-sm-'.$bootstrap.'">';
call_user_func_array($wp_registered_widgets[$id]['_callback'], array($args, $widget_args));
if ($bootstrap) echo '</div>';
};
}
}
Y por último haremos lo mismo para el formulario, modificar la variable global $wp_registered_widget_controls para encapsular la función form del widget y dibujar antes un input donde almacenemos el valor de widget_bootstrap_columns:
// Modifica el form de los widgets
add_action( 'load-widgets.php', 'sw_modificar_widgets_forms' );
function sw_modificar_widgets_forms() {
global $wp_registered_widget_controls;
foreach($wp_registered_widget_controls as $id=>$widget) {
$wp_registered_widget_controls[$id]['_callback'] = $wp_registered_widget_controls[$id]['callback'];
$wp_registered_widget_controls[$id]['callback'] = function($data) use ($id) {
global $wp_registered_widget_controls;
// Recuperamos los datos del widget para incluir el valor de widget_bootstrap_columns
$instance = get_option($wp_registered_widget_controls[$id]['_callback'][0]->option_name);
$widget_bootstrap_columns = isset($instance[$data['number']]) && isset($instance[$data['number']]['widget_bootstrap_columns'])? $instance[$data['number']]['widget_bootstrap_columns']:'';
echo '<div class="widget_added"><p>Número de columnas (col-sm-<input type="number" name="widget_bootstrap_columns" min="1" max="12" value="'.$widget_bootstrap_columns.'" />)</p><hr /></div>';
call_user_func_array($wp_registered_widget_controls[$id]['_callback'], array($data));
};
}
}
Puedes bajarte el código en mi GitHub
Comments are closed.
Voy a parecer la mosca cojonera del blog, pero aún asÃ:
Se ha estado hablando mucho de los acortadores de URLs. No son buenos.
-aportan un nuevo punto de fallo
-ocultan la dirección final (no sé donde me estoy dirigiendo, podrÃa ser un sitio con fama de contener virus y otro software dañino)
en caso de que se den de baja ( http://tr.im ) lo intentó hace poco y armó una buena en la blogosfera obligándoles a rectificar
-resulta innecesario su uso en la mayorÃa de ocasiones y, como se indica en varios sitios, lo correcto es una de las siguientes dos opciones:
1) que cada sitio se gestione sus propias URLs cortas de forma que si el sitio se da de baja también se pierden las URLs cortas, pero al menos ya depende de un punto de fallo (la página en la que se publican).
2) que los sitios más importantes empiecen a ofrecer el servicio de URLs cortas como permalinks a los artÃculos. Si el script publicado aquà tiene esa finalidad, perfecto, ese serÃa el camino a seguir.
Estoy de acuerdo con alsanan, y añado otro argumento: el rendimiento. Una redirección extra significa más tiempo de espera y mayor carga para las conexiones y servidores. De hecho, la existencia de los acortadores sólo tiene sentido por cosas como Twitter –lo cual me parece una estupidez porque bien podÃa Twitter permitir poner enlaces sin ser necesario poner la URL en el texto del mensaje–, y de hecho yo ya he visto ejemplos donde se utilizan acortadores para ocultar el verdadero destino del enlace (publicitario).
No obstante, si se van a usar acortadores de URL, mejor que sean scripts conocidos y libres como el que presenta el post.
Un saludo.