Sigueme por RSS! RSS

Drupal 7: agregar rel="next" y rel="prev“ a la paginación

A nivel de SEO, se suele recomendar que se indique la relación entre las direcciones URL de los componentes de una serie paginada, por ejemplo, un blog. De esa manera, se le dice a los rastreadores tanto la sucesión como la profundidad de páginas  y le facilitamos el trabajo.

Implementar etiquetas rel="next" y rel="prev"

En Drupal puede ser un dolor de cabeza hacer una modificación como esta, que parece ser muy sencilla, pero si no conoces la estructura del CMS, puede llevarte mucho tiempo.

La solución es hacer le un hook a la función del sistema theme_pager_link
https://api.drupal.org/api/drupal/includes!pager.inc/function/theme_pager_link/7.x



Copiamos la función completa y la pegamos en el template.php de nuestro theme (sites/all/themes/nuestro_theme/template.php)

function theme_pager_link($variables) {
  $text = $variables['text'];
  $page_new = $variables['page_new'];
  $element = $variables['element'];
  $parameters = $variables['parameters'];
  $attributes = $variables['attributes'];

  $page = isset($_GET['page']) ? $_GET['page'] : '';
  if ($new_page = implode(',', pager_load_array($page_new[$element], $element, explode(',', $page)))) {
    $parameters['page'] = $new_page;
  }

  $query = array();
  if (count($parameters)) {
    $query = drupal_get_query_parameters($parameters, array());
  }
  if ($query_pager = pager_get_query_parameters()) {
    $query = array_merge($query, $query_pager);
  }

  // Set each pager link title
  if (!isset($attributes['title'])) {
    static $titles = NULL;
    if (!isset($titles)) {
      $titles = array(
        t('« first') => t('Go to first page'),
        t('‹ previous') => t('Go to previous page'),
        t('next ›') => t('Go to next page'),
        t('last »') => t('Go to last page'),
      );
    }
    if (isset($titles[$text])) {
      $attributes['title'] = $titles[$text];
    }
    elseif (is_numeric($text)) {
      $attributes['title'] = t('Go to page @number', array('@number' => $text));
    }
  }

  // @todo l() cannot be used here, since it adds an 'active' class based on the
  //   path only (which is always the current path for pager links). Apparently,
  //   none of the pager links is active at any time - but it should still be
  //   possible to use l() here.
  // @see http://drupal.org/node/1410574
  $attributes['href'] = url($_GET['q'], array('query' => $query));
  return '<a' . drupal_attributes($attributes) . '>' . check_plain($text) . '</a>';
}

lo hacemos y cambiamos el nombre de la función, donde pone theme indicamos el nombre de nuestro THEME, por ejemplo: nuestro_theme_pager_link

Lo siguiente será indicar que, cuando se esté armando el título de cada enlace del paginador, incluya los atributos que necesitamos según que enlace sea:

// Set each pager link title.
if (!isset($attributes['title'])) {
   static $titles = NULL;
   if (!isset($titles)) {
      $titles = array(
         t('« first') => t('Go to first page'),
  t('‹ previous') => t('Go to previous page'),
  t('next ›') => t('Go to next page'),
  t('last »') => t('Go to last page'),
      );
   }
   if (isset($titles[$text])) {
      $attributes['title'] = $titles[$text];
   }
   elseif (is_numeric($text)) {
      $attributes['title'] = t('Go to page @number', array('@number' => $text));
   }
   // aqui agregamos los nuevos atributos
   if ($text == t('‹ previous')) {
      $attributes['rel'] = 'prev';
   }elseif ($text == t('next ›')) {
      $attributes['rel'] = 'next';
   }
}

Hemos agregado dos condiciones que comprueban con el texto, si es el enlace de Nex (siguiente) o Prev (anterior)
if ($text == t('‹ previous')) {
    $attributes['rel'] = 'prev';
 }elseif ($text == t('next ›')) {
    $attributes['rel'] = 'next';
}


el código final nos quedaría así (recuerda que va en sites/all/themes/nuestro_theme/template.php):
function nuestro_theme_pager_link($variables) {
 $text = $variables['text'];
 $page_new = $variables['page_new'];
 $element = $variables['element'];
 $parameters = $variables['parameters'];
 $attributes = $variables['attributes'];

 $page = isset($_GET['page']) ? $_GET['page'] : '';
 if ($new_page = implode(',', pager_load_array($page_new[$element], $element, explode(',', $page)))) {
  $parameters['page'] = $new_page;
 }

 $query = array();
 if (count($parameters)) {
  $query = drupal_get_query_parameters($parameters, array());
 }
 if ($query_pager = pager_get_query_parameters()) {
  $query = array_merge($query, $query_pager);
 }

 // Set each pager link title.
 if (!isset($attributes['title'])) {
  static $titles = NULL;
  if (!isset($titles)) {
   $titles = array(
    t('« first') => t('Go to first page'),
    t('‹ previous') => t('Go to previous page'),
    t('next ›') => t('Go to next page'),
    t('last »') => t('Go to last page'),
   );
  }
  if (isset($titles[$text])) {
   $attributes['title'] = $titles[$text];
  }
  elseif (is_numeric($text)) {
   $attributes['title'] = t('Go to page @number', array('@number' => $text));
  }
  // aqui agregamos los nuevos atributos
  if ($text == t('‹ previous')) {
   $attributes['rel'] = 'prev';
  }
  elseif ($text == t('next ›')) {
   $attributes['rel'] = 'next';
  }
 }

 $attributes['href'] = url($_GET['q'], array('query' => $query));
 return '' . check_plain($text) . '';
}

0 comentarios: Suscribete a los comentarios por RSS

Publicar un comentario

- Los comentarios están siendo moderados y serán publicados en la brevedad posible.