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 = <<<EOT
<a class="aleatorio" title="$titulo_" href="$enlace_" rel="bookmark"><img alt="$titulo_" src="$imagen_" /><strong>$titulo_</strong></a>
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' );
	}
Tagged with:  

Para empezar, WordPress es una plataforma desarrollada en PHP que puede ser utilizada como un CMS (Gestor de Contenidos), y principalmente como una plataforma de blogs. Esta entrada esta orientada a la optimización de WordPress debido a que siendo un sistema poderoso y con mucho tiempo de desarrollo, este consume mucha memoria RAM, peticiones SQL a la base de datos, y tiene una latencia algo elevada (tiempo de respuesta).

Primero que nada explicare porque es necesario optimizar WordPress antes de utilizar plugins de Cacheo como W3 Total Cache y WP-Super-Cache.

El motivo es que lo que hacen estos plugins es guardar una pagina generada por WordPress (En este caso una entrada o articulo) en un archivo estático *.html, por lo cual cuando el cliente (usuario) accede a dicho articulo, el plugin de Cache automáticamente le muestra una pagina estática generada anteriormente en la primera petición; Y cuando se trata de un sitio web o blog con muchas visitas y un alto uso de plugins es necesario esto, pero a lo que voy es que primero debemos optimizar WordPress para que al momento de generar una pagina estática con los plugins, este no consuma tantos recursos al realizar pagina estática sin antes existir una y también para que se pueda aplicar en cualquier sitio para no tener que recurrir al uso de estos plugins de manera temprana.

Por lo cual tener muchos artículos significa que si tenemos muchas visitas y cada visita entra en un articulo diferente entonces WordPress consumiría muchos recursos provocando errores y cuelgues. Por esta razón es necesario optimizar WordPress incluso si se utilizan plugins para generar paginas estáticas (Cache), ya que he leído casos en los que al momento de borrar la cache y al generarse de nuevo el sistema colapsa y esto es porque erróneamente se cree que todo se arregla con un plugin de Cache.

Es hora de empezar.
Hay muchas formas de reducir los recursos utilizados por WordPress, y aquí esta una lista corta de lo que podemos hacer:

  1. Ajustes sencillos generales para optimizar WordPress.
  2. Reducir peticiones a la base de datos MySQL (queries).
  3. Reducir el uso de plugins innecesarios y si es posible programar cosas mas sencillas que realicen lo mismo pero con menos código.
  4. Alojar imágenes y contenido estático en otro servidor.
  5. Controlar los comentarios para evitar el uso de muchos recursos.
  6. Añadir plugins obviamente necesarios para la optimización programada.

De momento no están terminadas las secciones, solo es cuestión de esperar :D y espero que a mas de uno le sea útil.

Tagged with:  
Pagina 1 de 1 1