Como você encomenda metatags adicionadas por drupal_add_html_head ()?

12

Estou adicionando suporte ao Open Graph a um site Drupal e tenho várias chamadas 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');

No total, tenho 10 deles. Eles não parecem produzir na mesma ordem em que são chamados (todos em uma única função).

Existe algum tipo de ponderação que posso usar para definir o pedido?

Justin
fonte

Respostas:

15

Use a propriedade #weight. Como drupal_get_html_head () usa drupal_render () para renderizar as metatags, #weight é usado ao renderizá-las.

Eu uso o código a seguir para fazer um teste no meu site local; é o mesmo código que você está usando, exceto que não tem nenhuma referência ao objeto do nó.

  $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());

A saída que obtive é a seguinte.

<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 você vê, a última tag adicionada é a primeira a aparecer.

Em seguida, executo o código a seguir.

  $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());

A saída que obtive é a seguinte.

<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 você vê, a ordem das metatags foi alterada; as metatags adicionadas a partir do código aparecem após as metatags padrão adicionadas no Drupal.

_drupal_default_html_head () (a função que retorna as meta tags padrão) usa #weight para a meta tag "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
fonte
Incrível, obrigado! Isso funcionou. Parece que eu perdi algo muito óbvio em algum lugar. Para minha própria educação, onde você achou isso documentado?
23712 Justin
1
Depois que notei que as metatags são renderizadas drupal_render(), tentei ver se #weight foi usado, pois é usado para elementos de formulário que são renderizados através da mesma função. A documentação para drupal_render()diz: "Os elementos são classificados internamente usando uasort ()."
Kiamlaluno