El tema de SEO (Search Engine Optimization) es sumamente importante para el posicionamiento de los sitios web en los resultados de búsqueda. El SEO es un proceso que permite mejorar el volumen y la calidad de las visitas direccionadas, de forma natural, desde un buscador a un sitio web. Tres de las técnicas más recomendadas para mejorar el posicionamiento natural son:
Por defecto, a la versión 1.1.15.5144 de CakePHP, los meta tags no se pueden generar dinámicamente cuando utilizamos una plantilla (layout). Los que hayan trabajado con CakePHP reconocerán el problema que existe para enviar información, que no sea el título del documento, desde un controlador hacia un layout. Si generamos contenido dinámicamente, en este caso, naturalmente querremos definir meta-información sin tener que estar creando múltiples plantillas.
Una solución a este problema es añadir propiedades, con la misma funcionalidad de pageTitle, a las clases base de los controladores y las vistas. De esta forma, cuando asignamos a cualquiera de las propiedades nuevas determinado valor en una acción, el valor podrá ser accedido en la plantilla correspondiente, tan solo con instanciar una variable previamente definida. En pocas palabras, imitamos la forma en como CakePHP permite definir dinámicamente el título de un documento.
En este ejemplo agregaremos dos propiedades: metaDescription y metaKeywords. Para agregar estas dos propiedades debemos de:
1. Declarar dos propiedades públicas, metaDescription y metaKeywords, en el controlador base (/cake/libs/controller/controller.php):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | /** * Web page meta description * * @var boolean * @access public */ var $metaDescription = false; /** * Web page meta keywords * * @var boolean * @access public */ var $metaKeywords = false; |
2. Agregamos al arreglo de lista de variables obtenidas del controlador, los nombres de las anteriores variables:
1 2 3 4 5 6 | var $_passedVars = array( 'viewVars', 'action', 'autoLayout', 'autoRender', 'ext', 'base', 'webroot', 'helpers', 'here', 'layout', 'modelNames', 'name', 'pageTitle', 'viewPath', 'params', 'data', 'webservices', 'plugin', 'metaDescription', 'metaKeywords'); |
3. Redefinimos el método renderLayout.
3.1 Después de la asignación de la variable $pageTitle agregamos:
1 2 3 4 5 6 7 8 9 10 | if ($this->metaDescription !== false) { $metaDescription = $this->metaDescription; } else { $metaDescription = ""; }if ($this->metaKeywords !== false) { $metaKeywords = $this->metaKeywords; } else { $metaKeywords = ""; } |
3.2 Editamos el arreglo $dataForLayout, agregando las llaves meta_description y meta_keywords:
1 2 3 4 5 6 7 8 9 10 11 12 | $dataForLayout = array_merge ( $this->viewVars, array ( 'title_for_layout' => $pageTitle, 'content_for_layout' => $contentForLayout, 'cakeDebug' => $debug, 'meta_description' => $metaDescription, 'meta_keywords' => $metaKeywords ) ); |
Lo único que necesitamos para añadir dinámicamente los meta tags a nuestras páginas es:
1. Asignar valores a las propiedades metaDescription y metaKeywords del controlador. Por ejemplo, para determinada acción:
1 2 3 4 5 | function view() { $this->metaDescription = "Hola Mundo"; $this->metaKeywords = "hola, mundo"; } |
2. Añadir al elemento de la plantilla las variable $meta_description y $meta_keywords:
Admito que la desventaja de esta solución radica en tener que editar directamente el núcleo del framework, sin embargo, permite resolver el problema de forma elegante, con un poco de esfuerzo. Tal vez en versiones posteriores de CakePHP podremos ver soluciones de este tipo integradas de forma natural.
| M | T | W | T | F | S | S |
|---|---|---|---|---|---|---|
| « Feb | ||||||
| 1 | 2 | 3 | 4 | 5 | ||
| 6 | 7 | 8 | 9 | 10 | 11 | 12 |
| 13 | 14 | 15 | 16 | 17 | 18 | 19 |
| 20 | 21 | 22 | 23 | 24 | 25 | 26 |
| 27 | 28 | 29 | 30 | 31 | ||
2 Responses
yo
18|Jul|2007 1No seria mejor usar un helper, digo asi no modifcas el codigo interno del framework
http://rossoft.wordpress.com/2006/03/28/register-head-tags-from-helpers-2/
jose
30|Aug|2007 2Excelente.. Entre usar un helper o de esta forma, algo en el propio framework casi que creo que es mejor de esta forma… Pero vamos, por cuestiones de eficiencia, apenas hay diferencia… así que para gustos, colores
Leave a reply