Ir directamente al contenido de esta página

Añadir <meta name="description"/> individual a las entradas de WordPress

Con la publicación del nuevo rediseño de nuestra página hemos aprovechado para mejoras aquellos detalles que en la anterior versión quedaron pendientes. Uno de ellos era encontrar la manera de poder asignar un <meta name="description"/> individual a cada página y entrada del blog, pero sin emplear un plugin.

¿Por qué sin un plugin? Bueno, en general prefiero emplear extensiones cuando se trata de funcionalidades que quiero activar temporalmente y luego desactivar, como por ejemplo el WP Maintenance Mode de Frank Bültge; si lo que voy a hacer es instalar un complemento para que permanezca activo indefinidamente, creo que tiene más sentido añadir la funcionalidad como código a mi tema y así no sobrecargar mi página de administración. Aunque si alguien quiere emplear un plugin, hay decenas.

Dicho esto, veamos el código.

La descripción de las entradas del blog

Viendo que la descripción del meta debe ser un resumen no demasiado extenso de la entrada, ¿qué mejor contenido que el resumen que WordPress permite añadir a cada entrada? Este resumen se incluye en el campo Extracto bajo el formulario de edición; si no aparece, hay que activarlo en Opciones de pantalla → Extracto.

Para que el mismo se convierta en la descripción del documento, en un primer momento simplemente incluí este código en el header.php:


<meta name="description" content="<?php echo get_the_excerpt(); ?>" />'
 

No obstante, surgía un problema, y es que el campo del extracto sólo está disponible para las entradas del blog…

La descripción de las demás páginas

Primero, hay que asignar un resumen a las páginas, algo que es posible gracias a la opción de añadir campos personalizados a una publicación. De nuevo, en Opciones de pantalla podemos activar los Campos personalizados. Una vez hecho esto, al pie del editor de la página tenemos esta interfaz:

La interfaz de campos personalizados [Firefox 9]

Lo que hago es crear un campo desc y añadir la descripción. Tras especificar un campo personalizado, todas las páginas contarán con éste en el desplegable.

Sólo queda extraer su contenido pra incluirlo en el documento, lo que se hace por medio de la función get_post_meta(). Y con esto y un par de detalle adicionales, el código final es el siguiente:


<?php 
  if((is_single())&&(has_excerpt())){
    $d = get_the_excerpt(); 
  } elseif(is_page()){
    $d = get_post_meta(get_the_ID(),'desc',true);
  } 
  if($d){ 
    $d = preg_replace("/<.*?>/", "", $d);
    echo '<meta name="description" content="'.$d.'" />'; 
  }
?>
 

El script comprueba si el documento es una entrada con un extracto o una página, $d almacena esta información, y si no es nula se crea el meta. El preg_replace() limpia las posibles etiquetas de la descripción.

Como se ve, no es complicado. Y nos libra de añadir el enésimo plugin a nuestra instalación.

Esta entrada se publicó el 13 de febrero de 2012, se archivó en , y fue etiquetada como . Autor: Saúl González Fernández. Hay 18 comentarios ›.

Comentarios

  1. Excelente aporte, justamente esto estaba buscando para evitar usar plugins que haya que instalar cada que realice un nuevo blog. Ya que estoy desarrollando mis propios themes para WordPress puedo integrar dentro de los mismos este trozo de codigo que ayudara al posicionamiento SEO en buscadores. Grácias…

  2. Saúl González Fernández dice:

    @Ángel: Sí, la verdad es que a nosotros cargar una instalación de WordPress con plugins tampoco nos seduce… Además, el mes pasado leímos 6 Questions To Ask Before You Install A WordPress Plugin, que nos acabó de convencer que cuantos menos, mejor.

    Si estás preparando temas para WordPress, igual te interesa esta entrada que publicamos en marzo; hacemos lo mismo que aquí, crear una función con la nos evitamos instalar un plugin, y lo que hace es incluir al pie de una entrada el vínculo de compartir en Twitter, con la ventaja de que ya reduce la dirección que se muestra en el tweet gracias a la API de Tinyurl.

  3. David Luengo dice:

    Muy bueno el tutorial era justo lo que estaba buscando.

    Te hago una pregunta: ¿el último código que has puesto, también se pone en header.php?

    Muchas gracias.

  4. Saúl González Fernández dice:

    @ David Luego: Sí, lo incluyes dentro de <head></head>. La idea que teníamos en mente era además no sobrecargar el archivo functions.php.

  5. Borja G. dice:

    ¿Y como se hace en caso de que la página de categorías solo muestre el título y el seguir leyendo y quieras que muestre una breve descripción del artículo? Gracias de antemano.

  6. Saúl González Fernández dice:

    @Borja G.: Si te refieres a algo como lo que hacemos en http://digitalicon.es/blog/category/accesibilidad/, en el bucle de category.php (o en el archivo que esté listando los resultados de la categoría), puedes emplear un código como éste:

    
    <?php while(have_posts()):the_post(); ?>
      <h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2>
      <?php the_excerpt(); ?> 
      <p><a href="<?php the_permalink(); ?>">Seguir leyendo</a></p>
    <?php endwhile; ?>
     
  7. Gustavo dice:

    Hola Saúl, gracias por el artículo. El código funciona, pero sólo veo su resultado en las páginas, no así en las entradas… ¿por qué?

  8. Saúl González Fernández dice:

    @Gustavo: Prueba rellenar el campo «Extracto» de la entrada con un breve resumen. Si no lo encuentras en la interfaz de edición de las entradas mira si lo tienes desactivado en el menú «Opciones de pantalla».

  9. Gustavo dice:

    ¡Gracias Saúl!

  10. Gustavo dice:

    Hola, he notado que si relleno el campo extracto, el meta description aparece en el código, pero incluye un “Seguir leyendo →” al final…

    ¿Alguna manera de evitarlo?

  11. Saúl González Fernández dice:

    @Gustavo: Según la especificación de la función get_the_excerpt() no debería aparecerte. ¿Puede ser que tengas alguna función en tu tema que esté añadiendo un vínculo de «leer más» el final de los resúmenes?

  12. Gustavo dice:

    Hola Saúl, ¿cómo podría saber si hay una función que provoca esto? El tema es Simple Catch…

    Gracias.

  13. Saúl González Fernández dice:

    @Gustavo: Prueba buscar en functions.php este código: add_filter('excerpt_more'.

  14. Gustavo dice:

    Hola Saúl,

    En functions.php no está ese código…

  15. Saúl González Fernández dice:

    @Gustavo: Por lo que hemos visto, el tema que indicas tiene en la configuración de opciones una que se refiere a la extensión de los extractos:

    Opciones del tema Simple Catch: Extracto

    Y en /functions/simplecatch_functions.php aparece el filtro que te comentábamos, en la función simplecatch_custom_excerpt.

    El problema es que modificar las opciones del menú o la propia función afectará al resto de páginas en las que se empleen los resúmenes, como las de archivos o categorías.

  16. Gustavo dice:

    Bien, entonces buscaré otra alternativa para dar solución al tema del description…

    ¡¡Gracias por la dedicación!!

  17. Jorge dice:

    Hola.

    Me asalta una duda Saul:

    El código se pondrá, supongo, en el <head> para mostrar ahí la etiqueta que genera, pero entonces no funcionará la función the_excerpt(); puesto tiene que estar dentro del loop de WordPress.

    ¿Dónde y cómo se ordena entonces el código?

  18. Saúl González Fernández dice:

    @Jorge: A pesar de lo que dice la documentación del Codex sobre get_the_excerpt(), el código funciona situado en la cabecera de la página.

    La función se encuentra en /wp-includes/post-template.php, y en ella puedes ver esta línea (la 270 en la versión 3.5.1):

    
    return apply_filters( 'get_the_excerpt', $post->post_excerpt );
     

    Lo que indica es que el extracto se extrae del objeto $post que funciona como una variable global, por lo que está disponible fuera del bucle.

¿Algún comentario?

* Los campos con un asterisco son necesarios

Últimos proyectos

© Digital Icon, S.L., 2007 – 2017