Contenido

wp_insert_post(), la insercción de posts en WordPress

13 may

+ 6

WordPress está pensado para que uno o varios autores introduzcan entradas en él. Y despues los usuarios puedan comentar estas entradas, pero previamente estas deben estar introducidas sinó, el concepto Blog en sí, no tiene ningún sentido. Pero WordPress va un poco más allá y nos permite hacer que el sistema de insercción de entradas no esté, necesariamente, vinculado al WordPress.

Para ello, tenemos la función wp_insert_post(), una función a la que le pasaremos los parámetros que compondrán una entrada en nuestro Blog.

Los chicos de WPEngineer.com hacen un repaso a estos parámetros y nos muestran un sistema muy sencillo de realizar insercciones ajenas a nuestro Blog. Está claro que este sistema es peligroso, y que requiere que el usuario esté logueado para realizar la insercción.

wp_insert_post()

wp_insert_post($postarr = array())

Vemos que esta función recibe un parámetro, un array que estará compuesto con los parámetros necesarios para formar una entrada.

Los valores de este parámetro pueden ser:

<?php
$post = array(
  'comment_status' => [ 'closed' | 'open' ] // 'closed' no permite comentarios.
  'ID' => [ <post id> ] // únicamente si estamos actualizando un comentario.
  'menu_order' => [ <order> ] //Si es una nueva página, especifica el orden en el que debería aparecer
  'page_template => [ <template file> ] // Indica el template para la página.
  'ping_status' => [ ? ] // Activamos o desactivamos los pingbacks
  'pinged' => [ ? ] //?
  'post_author' => [ <user ID> ] //ID del usuario
  'post_category => [ array(<category id>, <...>) ] // Categorías del post.
  'post_content' => [ <the text of the post> ] // Contenido del post.
  'post_date' => [ Y-m-d H:i:s ] // Fecha de creación del post.
  'post_date_gmt' => [ Y-m-d H:i:s ] // Fecha de creación en GMT.
  'post_excerpt' => [ <an excerpt> ] // El resumen del post.
  'post_parent' => [ <post ID> ] // El post padre.
  'post_password' => [ ? ] // El password del post.
  'post_status' => [ 'draft' | 'publish' | 'pending' ] // Estado de la publicación
  'post_title' => [ <the title> ] // Título del post.
  'post_type' => [ 'post' | 'page' ] // Post o Página.
  'tags_input' => [ '<tag>, <tag>, <...>' ] // Tags asociados al post.
  'to_ping' => [ ? ] //?
);
// Insertamos el post
wp_insert_post( $post );
?>

Conociendo esto, ya podemos usar funcionalidades de WordPress fuera de WordPress.

// Incluimos las funcionalidades de WordPress
require( '../my_wordpress_install_root/wp-load.php' );

// Creamos el array
$my_post = array();
$my_post['post_title']    = 'Mi post';
$my_post['post_content']  = 'This is my post.';
$my_post['post_status']   = 'publish';
$my_post['post_author']   = 1;
$my_post['post_category'] = array(0);

// Insertamos el post en la base de datos
wp_insert_post( $my_post );"

Optimizando el rendimiento de nuestros scritps jQuery

13 may

+ 23

Que soy un fan de jQuery no es una novedad, pero si que es una novedad el que no lo uso de la forma más correcta. Por lo menos así lo ven la gente de ArtzStudio, que nos muestran una serie de indicaciones con el fin de optimizar el uso del CPU el usuario mejorando el rendimiento de nuestros scripts.

1) Siempre desciende desde un #ID

Siempre el selector más rápido y que menos iteraciones produce es la búsqueda por un #id, ya que simplemente lanza un document.getElementById(), lo que al ser nativo nos asegura un tiempo de respuesta mínimo y un mínimo consumo de proceso.

<div id="content">
	<form method="post" action="/">
		<h2>Traffic Light</h2>
		<ul id="traffic_light">
			<li><input type="radio" class="on" name="light" value="red" /> Red</li>
			<li><input type="radio" class="off" name="light" value="yellow" /> Yellow</li>
			<li><input type="radio" class="off" name="light" value="green" /> Green</li>
		</ul>
		<input class="button" id="traffic_button" type="submit" value="Go" />
	</form>
</div>

Con el código anterior, si queremos coger el elemento #traffic_button, siempre nos será más rápido hacerlo directamente que medainte la class del mismo elemento.

// Más lento
var traffic_button = $('#content .button');

// Más rápido
var traffic_button = $('#traffic_button');

Seleccionar varios elementos

Si por contra, necesitamos seleccionar una serie de elementos, siempre que podamos debemos hacerlo partiendo de un #id, de esta forma nos aseguramos una iteración más ajustada.

var traffic_lights = $('#traffic_light input');

Aclaración

Hay que destacar que esto afectará positivamente al rendimiento, aunque el uso de selectores más complejos permiten mejorar la flexibilidad de nuestros scripts. Es importante tener en cuenta esta recomendación, pero no se puede aplicar a todos los casos.

2) Usa tags delante de las clases

Al contrario que con el #id, en el que se innecesario indicar el tag asociado a ese #id (div#page), esto no tiene sentido y además penaliza a lo que comentamos en el punto 1. En la selección de clases, es recomendable indicar el tag del elemento solicitado ya que al hacer uso de document.getElementsByTagName() para localizarlos acotamos previamente los elementos en los que buscar las clases solicitadas. Con el mismo código:

<div id="content">
	<form method="post" action="/">
		<h2>Traffic Light</h2>
		<ul id="traffic_light">
			<li><input type="radio" class="on" name="light" value="red" /> Red</li>
			<li><input type="radio" class="off" name="light" value="yellow" /> Yellow</li>
			<li><input type="radio" class="off" name="light" value="green" /> Green</li>
		</ul>
		<input class="button" id="traffic_button" type="submit" value="Go" />
	</form>
</div>

Si queremos seleccionar el elemento radio con class on, la opción rápida sería la siguiente:

var active_light = $('#traffic_light input.on');

3) Usa la caché de objetos

Coger el hábito de guardar una variable con el valor de un objeto jQuery nos evita realizar una serie de comprobaciones innecesarias y que en scripts pesados pueden suponer un aumento de rendimiento preocupante.

// NO
$('#traffic_light input.on).bind('click', function(){...});
$('#traffic_light input.on).css('border', '3px dashed yellow');
$('#traffic_light input.on).css('background-color', 'orange');
$('#traffic_light input.on).fadeIn('slow');

// SI
var $active_light = $('#traffic_light input.on');
$active_light.bind('click', function(){...});
$active_light.css('border', '3px dashed yellow');
$active_light.css('background-color', 'orange');
$active_light.fadeIn('slow');

4) Aprovechate del encadenamiento

El encadenamiento pese a producir un amasijo de código que no contribuye a mejorar la lectura del código hace que nuestro Javascript sea más ligero y puede ayudar a mejorar el rendimiento de nuestros scritps. Veamos el ejemplo anterior:

var $active_light = $('#traffic_light input.on');
$active_light.bind('click', function(){...})
	.css('border', '3px dashed yellow')
	.css('background-color', 'orange')
	.fadeIn('slow');

5) Usa subqueries siempre que puedas.

Si debemos realizar varias búsquedas sobre un elemento es altamente recomendable realizar un uso intensivo del método find() de jQuery para realizar las búsquedas. Mejoraremos el tiempo de respuesta al evitarnos búsquedas previas ya realizadas.

Usando el código HTML anterior podemos hacer lo siguiente:

var $traffic_light = $('#traffic_light'),
	$active_light = $traffic_light.find('input.on'),
	$inactive_lights = $traffic_light.find('input.off');

6) Limita la manipulación de DOM

Ya vimos hace un tiempo que la manipulación directa del arbol DOM es muy costoso y lento. Por eso el limitar el uso de esta técnica nos favorecerá a la hora de procesar nuestros scripts.

// Más lento
var top_100_list = [...], // assume this has 100 unique strings
	$mylist = $('#mylist'); // jQuery selects our <ul> element

for (var i=0, l=top_100_list.length; i<l; i++) {
	$mylist.append('<li>' + top_100_list[i] + '</li>');
}

// Más rápido
var top_100_list = [...], // assume this has 100 unique strings
	$mylist = $('#mylist'), // jQuery selects our <ul> element
	top_100_li = ""; // This will store our list items

for (var i=0, l=top_100_list.length; i<l; i++){
	top_100_li += '<li>' + top_100_list[i] + '</li>';
}
$mylist.html(top_100_li);

7) Aprovechate de la delegación de eventos

Mientras no se diga lo contrario los eventos se propagan hasta el elemento padre. Esto tiene una utilidad realmente interesante y nos puede ayudar a evitar tener que realizar busquedas muy concretas.

// Menos eficiente
$('#entryform input).bind('focus', function(){
	$(this).addClass('selected');
}).bind('blur', function(){
	$(this).removeClass('selected');
});

// Más eficiente
$('#entryform).bind('focus', function(e){
	var cell = $(e.target);  // e.target almacena el nodo que ha lanzado el evento.
	cell.addClass('selected');
}).bind('blur', function(e){
	var cell = $(e.target);
	cell.removeClass('selected');
});

8 ) Elimina consultas innecesarias

Prácticamente todos los puntos anteriores, nos dan soluciones para realizar el mínimo de consultas posibles realizando las mismas funciones. Pero este punto ataca más directamente a llamadas innecesarias como por ejemplo el $(document).ready(); que podemos evitar.

// Menos eficiente
$(document).ready(function(){
	mylib.article.init();
});

// Más eficiente
<script type="text/javascript>
mylib.article.init();
</script>
</body>

Como vemos la clave está en lanzar el <script /> justo antes de cerrar el tag </body> lo que nos asegura que todos los elementos que podemos necesitar están ya cargados en el árbol DOM.

9) Piensa en usar $(window)load()

Aunque $(document).ready() es muy útil y potente, no espera a que se carguen todos los elementos (imagenes, flash,..) para ejecutarse. Lo que puede producir un problema ya que está cargando nuestros scripts y además el navegador está trabajando en mostrar por pantalla otros elementos.

En estos casos, quizas nos sería conveniente usar $(window).load().

$(window).load(function(){
...
});

Esta función, esperará a cargar toda la página (imagenes, flash,…) incluidos, para lanzar nuestros scripts.

10) Comprime tu código

Este punto es discutible ya que al comprimir tu código estás haciendo que el navegador del usuario lo haya de descomprimir, lo que puede incrementar el rendimiento requerido frente a la velocidad de carga del script. Es interesnate tener en cuenta los factores que intervienen para decidir que acción realizar.

11) Aprenderte la librería

A estas alturas seguro que ya la conoces, pero no está de más tener a mano alguna Cheat Sheet(.pdf) para evitar caer en soluciones poco optimizadas.

12) Usa html() con cabeza

Como nos recuenda Joseanpg en los comentarios, el uso de html() nos penaliza sustancialmente el rendimiento de nuestros scripts. jQuery, al contrario de MooTools y Prototype (no he mirado los demás) no injecta el código HTML mediante innerHTML, sinó que construye los elementos DOM y los añade al nodo indicado.

Este proceso es más lento que usar un simple innerHTML aunque nos puede provocar problemas en insercciones en las que necesitemos refrescar el arbol DOM.

En la mayoría de casos, la mejor opción es usar innerHTML en nuestros scripts ya que añaden elementos perfectamente a nuestro arbol DOM y es realmente rápido. Para todo lo demás, html().

jQuery Google Charting, haciendo Google Chart más fácil

13 may

+ 0

Hace ya más de un año vimos como hacer gráficas con Google Chart, un ejemplo muy básico pero muy potente. Si despues de eso has jugado un poco más con Google Chart te habrás dado cuenta de que realmente es mucho más complejo y potente, por eso jQuery Google Charting nos ayuda a hacer las cosas más fáciles.

gchart-jquery-google-chart1
(Ver Imagen)

Despues de añadir el fichero Javascript necesario(jquery.gchart.js) y el núcleo de jQuery, simplemente tendremos que añadir un código similar a este para disponer del gráfico.

$('div selector').gchart({series: [$.gchart.series([20, 50, 30])]});

Indicamos el selector y la serie de parámetros que queremos pintar en el gráfico. Mediante una API bastante completa podremos personalizar nuestros gráficos consiguiendo que se ajusten a las necesidades de nuestras aplicaciones.

Ocultar contenido a los usuarios no registrados

13 may

+ 12

AyudaWordpress nos muestra un tutorial muy interesante para ocultar contenido a los usuario no registrados mediante el uso de ShortCodes.

Y es que con unas pocas líneas en WordPress se pueden hacer cosas realmente útiles y potentes.

// Functions.php
add_shortcode( 'visitante', 'shortcode_para_visitantes' );
function shortcode_para_visitantes( $atts, $content = null ) {
if ( ( is_user_logged_in() && !is_null( $content ) ) || is_feed() )
return $content;
return 'Para ver este contenido, <a href="' . site_url('wp-login.php?action=register', 'login') . '">debes estár registrado</a>';
}

Una vez añadido a nuestro functions.php podremos usar [visitante][/visitante] para ocultar el contenido que queramos a los visitantes no registrados.

[visitante]
Aquí pones lo que te apetezca que quieras que vean solo los no registrados
[/visitante]

Más opciones en AyudaWordpress.

De Photoshop a XHTML/CSS paso a paso

13 may

+ 5

Una de las tareas que los maquetadores hacemos más a menudo es convertir un diseño en Photoshop a una página xHTML con su CSS. Esta tarea aunque parece simplemente hacer 4 cortes tiene su miga y este tutorial es la muestra de ello.

Mozilla Prism, 1.0 disponible

12 may

+ 15

Hace ya más de un año hablamos de Mozilla Prism, una herramienta del grupo Mozilla que nos permite crear aplicaciones de escritorio apartir de aplicaciones web. Para ello genera un navegador sin barra de navegación, ni botones de desplazamiento con el fin de anclar al usuario a dicha aplicación.

logo_prism
(Ver Imagen)

Este sistema, puede ser útil para esos lugar en los que sea necesario hacer que el usuario solo tenga acceso a una aplicación y no puedes permitirte el lujo de meter un navegador web.

Para usarlo, tenemos 2 opciones:

  1. Descargar el plugin para Firefox
  2. Descargar Prism.

Una vez descargado, podemos crear nuestra aplicación en un solo paso, sencillo y completo.

prism_anieto2k
(Ver Imagen)

El resultado, como veremos es una aplicación embebida en una ventana de navegador muy escueta que nos permite interactuar con ella.

prism_anieto2k_result2
(Ver Imagen)

Características

Entre las carácterísticas a destacar de esta herramienta, nos encontramos con:

  • Posibilidad de añadir nuestra aplicación web a nuestro Dock o Status Bar.
  • Hacer que se arranquen al iniciar sesión en el ordenador.
  • Minimizar en el “System tray”.
  • Alerta de modificaciones en el icono.
  • Nueva API de interacción desde nuestras aplicaciones web.
  • Posibilidad de seleccionar fuentes, configuración de fuentes y otras configuraciones específicas.
  • Posibilidad de borrar los datos privados “on demand”.
  • Prism se actualiza automáticamente.
  • Soporte completo con OSX 10.4.
  • Soporte para SSL.

El futuro de Firefox será multiproceso

11 may

+ 5

El título no tiene nada de especial ya que se trata de una funcionalidad que lógicamente debería incorporarse en una nueva versión de Firefox. La noticia está en que ya ha empezado este desarrollo y mediante un nuevo proyecto abierto por la gente de Mozilla (Content Processes) esto podría ser una realidad en breve.

La idea, similar a la usada por Google Chrome e Internet Explorer 8, es la de usar un proceso para cargar el interface gráfico y despues separar por pestañas los procesos individualmente, haciendo posible cerrar un proceso que se haya quedado colgado sin afectar a los demás (siempre que no sea el proceso gráfico el que se cuelgue).

Aún queda bastante para verlo en nuestro escritorio, ya que estiman una primera beta sin conexiones seguras, ni soporte para sesiones para mediados de Julio y una versión capaz de interactuar entre 2 o más procesos para Noviembre de este mismo año.

La seguridad y el API para plugins que permitan manipular esta capacidad del navegador están previstos para realizarse despues. Así que puede que tengamos que esperar 1 año o más en poder verlo funcionar en nuestras manos.

10 gestores de complejidad de contraseñas en Javascript

10 may

+ 7

Hace un tiempo vimos como controlar la seguridad de nuestras contraseñas con Javascript y es que las contraseñas, actualmente, son una pieza indispensable en Internet. Con ellas accedes a todos los servicios web que existen, de ahí que se preste tanta atención a ellas.

Nuestras aplicaciones no deben ser menos, y una forma de ofrecer al usuario un valor añadido que les ayudará a crear contraseñas más complejas y por lo tanto más seguras, es usar sistemas basados en Javascript que muestren el grado de complejidad de la contraseña introducida. De esta forma el usuario puede ir viendo en tiempo real como de compleja es su contraseña, y cambiarla si cree conveniente antes de añadirla a nuestro sistema.

Estos 10 ejemplos que ha recopilado WebResourceDepot nos permitirá hacerlo muy fácilmente, dependiendo del framework o las necesidades del proyecto.

  1. PasswordMeter (No framework)
  2. Ultimate Password Strength Meter (Prototype & Script.aculo.us)
  3. Yet Another Password Meter (No Framework)
  4. jQuery Password Strength Meter(jQuery)
  5. Javascript Password Strength Meter (No Framework)
  6. How to Make a Password Strength Meter Like Google (No Framework, tutorial)
  7. jQuery Password Strength Meter Plugin (jQuery)
  8. Password Strength Field (A jQuery Plugin) (jQuery)
  9. PHP Password Strength Meter (No framework, basado en PHP)
  10. Password Strength Meter With Ext JS (Ext JS)

6 plugins para el mantenimiento de tu WordPress

10 may

+ 8

Muchas veces no tenemos tiempo para dedicarle al blog el mantenimiento que se merece, por ello debemos delegar ciertas tareas a plugins que las realicen por nosotros. Estos 6 plugins se encargan de realizar las más básicas tareas que nuestro WordPress puede necesitar períodicamente.

  1. Broken link checker: Se encarga de revisar los enlaces salientes de nuestro blog y comprobar que estos están activos aún o no. Muy útil para artículos antiguos.
  2. WP AntiVirus: Un completo set que revisa periódicamente los posibles fallos de seguridad de WordPress.
  3. Akismet: El archiconocido sistema anti spam de WordPress.
  4. www Redirect: Evitando www de la ruta del blog, evitamos que Google pueda pensar que tenemos contenido duplicado.
  5. WP Database Backup: Crea una copia de seguridad de nuestros datos. Dispone de la capacidad de enviar una copia por email. Áltamente recomendable
  6. WP Security Scan: Otro plugin encargado de buscar posible fallos de seguridad en el sistema.

Cubos 3D usando CSS Transformations

8 may

+ 15

Hace ya más de un año hablamos de una serie de propuestas para CSS3 que el equipo de WebKit estaba haciendo sobre las CSS Transformations. A lo largo del año, hemos visto algunas aplicaciones de estas propiedades que ya podemos encontrar en algunos navegadores. La última viene de manos de Paul Hayes, y via Ajaxian, descubro que está montando cubos 3D con CSS transformations.

multiple-cubes-css
(Ver Imagen)

¿Como están hechos?

Para comprender la importancia de esas nuevas funcionalidades del CSS3, veamos como están montados estos cubos que hasta el momento únicamente funcionan sobre Safari, Chrome y Firefox 3.5. Y para los demás navegadores requieren una buena dosis de Javascript.

HTML

El HTML, osea la estructura del cubo es muy sencilla y cada uno de ellos tiene algo similar a esto.

<div class="cube">
        <div class="topFace">
                <div>
                        Content
                </div>
        </div>
        <div class="leftFace">
                Content
        </div>
        <div class="rightFace">
                Content
        </div>
</div>

CSS (Aplicamos la mágia)

El CSS  además de definir el tamaño de las caras del cubo nos define el efecto de 3D que hemos de aplicar a cada una de ellas.

.cube {
	position: relative;
	top: 200px;
}

.rightFace,
.leftFace,
.topFace div {
	padding: 10px;
	width: 180px;
	height: 180px;
}

.rightFace,
.leftFace,
.topFace {
	position: absolute;
}

.leftFace {
	-webkit-transform: skewY(30deg);
	-moz-transform: skewY(30deg);
	background-color: #ccc;
}

.rightFace {
	-webkit-transform: skewY(-30deg);
	-moz-transform: skewY(-30deg);
	background-color: #ddd;
	left: 200px;
}

.topFace div {
	-webkit-transform: skewY(-30deg) scaleY(1.16);
	-moz-transform: skewY(-30deg) scaleY(1.16);
	background-color: #eee;
	font-size: 0.862em;
}

.topFace {
	-webkit-transform: rotate(60deg);
	-moz-transform: rotate(60deg);
	top: -158px;
	left: 100px;
}

Yo no veo nada de Javascript, lo que hace que el navegador se encargue de generar estos efectos de una forma más rápida y eficiente. Un avance hacia una nueva Internet, sin duda.