Esta entrada forma parte del conjunto Optimizar WordPress reduciendo consumo de memoria, peticiones y consultas a MySQL.
Para llevar a cabo esto primero debemos saber que es lo que necesitamos y que es lo que no necesitamos.
Si es posible, en lugar de utilizar muchos Campos personalizados (Post Meta) hay que utilizar solo uno pero con muchos datos.
Nivel: Avanzado.
WordPress tiene la capacidad de guardar arrays (matrices o conjuntos de datos) de datos en un solo campo personalizado:
Para generar los datos (functions.php o en donde tengamos nuestro Meta Box):
// Es importante el uso de true en le ultimo parámetro.
// Este código se podría colocar en el lugar donde necesitamos mostrar los datos.
$primer_dato = 'Contenido del primer dato personalizado dentro de un array.';
$imagen = 'http://www.example.com/wp-content/images/imagen.png';
$meta_value = array(
'primer_dato' => $primer_dato,
'imagen' => $imagen
);
update_post_meta($post_id, 'datos_array', $meta_value);
// Esto nos devolverá un solo dato.
echo $meta_values['primer_dato'];
Para obtener los datos:
// Es importante el uso de true en le ultimo parámetro. // Este codigo se podria colocar en el lugar donde necesitamos mostrar los datos. $meta_values = get_post_meta($post_id, 'datos_array', true); // Esto nos devolverá un solo dato. echo $meta_values['primer_dato'];
Nivel: Avanzado, Experimental.
Otra forma de reducir una petición es colocar el siguiente código en nuestro functions.php:
function my_posts_request_filter( $input = false ) {
return $input;
}
add_filter( 'posts_request', 'my_posts_request_filter' );
Nota: Es importante realizarlo con precaución y teniendo en cuenta que no se puede utilizar el filtrado de posts por medio de la función query_posts(), de lo contrario no funcionara y solo obtendrán un error SQL, y en su lugar usar la clase WP_Query.
Nivel: Medio.
Algo que también es muy importante realizar, es cuando tenemos peticiones MySQL personalizadas.
Esto funciona guardando el contenido de una petición dentro de una variable, de tal forma que al mostrar le contenido de la misma variable varias veces, no se ejecutaran peticiones innecesarias como se realizarían si llamáramos directamente a la función cada vez que queremos obtener el mismo dato.
// El codigo no importa. Es solo un ejemplo.
$id = 350;
function funcion($id) {
$sql = 'SELECT * FROM wp_posts WHERE ID = $id';
return conectar($sql);
}
echo funcion($id);
// Si se hace de esta forma, cada que obtengamos el dato se realizara una petición nueva a la base de datos.
Optimizado con variables:
// El codigo no importa. Es solo un ejemplo.
$id = 350;
function funcion($id) {
$sql = 'SELECT * FROM wp_posts WHERE ID = $id';
return conectar($sql);
}
$post = funcion($id);
echo $post;
// Si se hace de esta forma, cada que obtengamos el dato se mostrara el contenido de la variable $post que previamente se estableció.
Nivel: Avanzado.
Otra forma distinta y muy util es utilizando los Transients de WordPress.
Los Transients son datos que se guardan en la tabla de WordPress donde se genera una petición para cargar todas las opciones de WordPress, y lo que se puede cachear en ese lugar son por ejemplo los widgets y elementos que solo se muestran en la pagina principal y no lo recomiendo en los posts individuales porque al momento de tener muchos posts: WordPress cada que inicia revisa todos los datos de esta tabla y estaría consumiendo mucha memoria y consultando datos que no se necesitan.
El código necesario para mostrar un post aleatorio mas el sistema de Cache propio de WordPress mediante Transients:
if ( false === ( $post_aleatorio = get_transient( 'post_aleatorio' ) ) ) {
$query_post_aleatorio = new WP_Query(array('orderby' => 'rand', 'posts_per_page' => 1));
while ($query_post_aleatorio->have_posts()) : $query_post_aleatorio->the_post();
$post_id_post_aleatorio = $post->ID;
$titulo_ = get_the_title();
$enlace_ = get_permalink();
$imagen_ = data( 'servidor_imagenes', $post_id_post_aleatorio, true ); // Esta funcion es propia (No utilizarla).
$post_aleatorio = <<
$titulo_
EOT;
endwhile;
set_transient( 'post_aleatorio', $post_aleatorio );
}
echo $post_aleatorio;
unset($post_aleatorio);
Nota: Cuando se borra un Transient con las siguientes funciones, el Transient se vuelve a generar en la primer petición recibida.
Para borrar los Transients cada que se publica un nuevo post o cada que se actualiza uno existente:
function delete_publish_post_transients() {
delete_transient( 'post_aleatorio' );
}
add_action( 'publish_post', 'delete_publish_post_transients' );
Nota: set_transient() acepta tres parámetros, de los cuales el tercero es para especificar una caducidad establecida en segundos, la cual no recomiendo utilizar porque el simple hecho de utilizarla le quita la opción para que cargue automáticamente junto con las demas opciones de WordPress y se crearía una petición extra a la base de datos y esto no es lo que estamos buscando aunque nos podría ser útil en otros casos.
Para borrar el Transient cada cierto tiempo (En el ejemplo cada hora):
add_action('hourly_delete_transients', 'delete_post_aleatorio');
function tarea_eliminar_post_aleatorio() {
if ( !wp_next_scheduled( 'hourly_delete_transients' ) ) {
wp_schedule_event(time(), 'hourly', 'hourly_delete_transients');
}
}
add_action('wp', 'tarea_eliminar_post_aleatorio');
function delete_post_aleatorio() {
delete_transient( 'post_aleatorio' );
}
WordPress cuenta con un gran núcleo que nos permite adaptarlo a nuestras necesidades sin necesidad de editarlo y cada día va en camino a convertirse en un verdadero CMS (Gestor de Contenidos). La mayoría de los Themes de WordPress vienen con un pequeño extracto de cada articulo en la pagina principal, pero en ningún lado nos muestra como cambiar el numero de palabras que se muestra, en cambio WordPress si cuenta con esa capacidad y solo es cuestión de explotarla a nuestro antojo.
WordPress 3.3 Release Candidate 1 esta disponible apenas hace unas horas después de 4 versiones beta. WordPress, la plataforma mas usada en Internet para la gestión de contenido y para la creación de sitios web ha cumplido con lo que prometió, como por ejemplo: muchos se quejaban por el cargador de medios y hasta este punto parece que esta versión RC ya lo soluciono así como los usuarios lo esperaban. Otro punto importante es que WordPress al utilizar la estructura example.com/%post%/ utilizaba muchas redirecciones de manera que entorpecía un poco el rendimiento y el consumo de recursos y lo que yo verdaderamente estuve esperando se cumplió,: esta vez se enfocaron un poco en el rendimiento y lo han optimizado bastante, hace unos dias realice unas pruebas en localhost y de 450ms se restaban unos 180ms, por lo que la diferencia de velocidad era notable y además de que el panel cambio un poco y ahora tiene un mensaje de bienvenida y el panel también es compatible con mas dispositivos, siendo que se adapta según el cliente.
Comentarios recientes