¿Cómo se ordenan las metaetiquetas agregadas por drupal_add_html_head ()?

12

Estoy agregando soporte de Open Graph a un sitio de Drupal y tengo un montón de llamadas a drupal_add_html_head (), como:

  $og_title = array(
    '#tag' => 'meta',
    '#attributes' => array(
      'property' => 'og:title', 
      'content' => $node->title,
    ),
  );
  drupal_add_html_head($og_title, 'zujava_og_title');

 $og_url = array(
    '#tag' => 'meta',
    '#attributes' => array(
      'property' => 'og:url', 
      'content' => url('node/' . $node->nid, array('absolute' => TRUE)),
    ),
  );
  drupal_add_html_head($og_url, 'zujava_og_url');

En total, tengo 10 de estos. No parecen salir en el mismo orden en que se llaman (todo en una sola función).

¿Hay algún tipo de ponderación que pueda usar para establecer el orden?

Justin
fuente

Respuestas:

15

Use la propiedad #weight. Como drupal_get_html_head () usa drupal_render () para representar las metaetiquetas, #weight se usa al representarlas.

Utilizo el siguiente código para hacer una prueba en mi sitio local; es el mismo código que está utilizando, excepto que no tiene ninguna referencia al objeto de nodo.

  $og_title = array(
    '#tag' => 'meta',
    '#attributes' => array(
      'property' => 'og:title', 
      'content' => "This is the title",
    ),
  );
  drupal_add_html_head($og_title, 'zujava_og_title');

 $og_url = array(
    '#tag' => 'meta',
    '#attributes' => array(
      'property' => 'og:url', 
      'content' => url('node/1', array('absolute' => TRUE)),
    ),
  );
  drupal_add_html_head($og_url, 'zujava_og_url');

  dsm(drupal_get_html_head());

La salida que obtuve es la siguiente.

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta property="og:url" content="http://tero.local/dr72/node/1" />
<meta name="Generator" content="Drupal 7 (http://drupal.org)" />
<meta property="og:title" content="This is the title" />

Como puede ver, la última etiqueta agregada es la primera en aparecer.

Luego ejecuto el siguiente código.

  $og_title = array(
    '#tag' => 'meta',
    '#attributes' => array(
      'property' => 'og:title', 
      'content' => "This is the title",
    ),
    '#weight' => 10,
  );
  drupal_add_html_head($og_title, 'zujava_og_title');

 $og_url = array(
    '#tag' => 'meta',
    '#attributes' => array(
      'property' => 'og:url', 
      'content' => url('node/1', array('absolute' => TRUE)),
    ),
    '#weight' => 200,
  );
  drupal_add_html_head($og_url, 'zujava_og_url');

  dsm(drupal_get_html_head());

La salida que obtuve es la siguiente.

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="Generator" content="Drupal 7 (http://drupal.org)" />
<meta property="og:title" content="This is the title" />
<meta property="og:url" content="http://tero.local/dr72/node/1" />

Como puede ver, el orden de las metaetiquetas ha cambiado; las metaetiquetas agregadas desde el código aparecen después de las metaetiquetas predeterminadas agregadas desde Drupal.

_drupal_default_html_head () (la función que devuelve las metaetiquetas predeterminadas) usa #weight para la metaetiqueta "Content-Type".

  $elements['system_meta_content_type'] = array(
    '#type' => 'html_tag', 
    '#tag' => 'meta', 
    '#attributes' => array(
      'http-equiv' => 'Content-Type', 
      'content' => 'text/html; charset=utf-8',
    ),
    // Security: This always has to be output first. 
    '#weight' => -1000,
  );
kiamlaluno
fuente
¡Genial gracias! Esto funcionó. Parece que me perdí algo muy obvio en alguna parte. Para mi propia educación, ¿dónde encontraste esto documentado?
Justin
1
Una vez que noté que las metaetiquetas se procesan drupal_render(), he tratado de ver si se utilizó #weight, ya que se usa para elementos de formulario que se procesan a través de la misma función. La documentación de drupal_render()dice: "Los elementos se ordenan internamente utilizando uasort ()".
kiamlaluno