Come ordini i meta tag aggiunti da drupal_add_html_head ()?


12

Sto aggiungendo il supporto Open Graph a un sito Drupal e ho un sacco di chiamate drupal_add_html_head (), come:

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

In totale, ne ho 10. Sembra che non vengano emessi nello stesso ordine in cui vengono chiamati (tutto in una singola funzione).

Esiste un tipo di ponderazione che posso utilizzare per impostare l'ordine?

Risposte:


15

Usa la proprietà #weight. Poiché drupal_get_html_head () utilizza drupal_render () per eseguire il rendering dei meta tag, #weight viene utilizzato per il rendering.

Uso il seguente codice per effettuare un test sul mio sito locale; è lo stesso codice che stai utilizzando, tranne per il fatto che non ha alcun riferimento all'oggetto 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());

L'output che ho ottenuto è il seguente.

<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" />

Come vedi, l'ultimo tag aggiunto è il primo ad apparire.

Quindi eseguo il seguente codice.

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

L'output che ho ottenuto è il seguente.

<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" />

Come vedi, l'ordine dei meta tag è stato modificato; i meta tag aggiunti dal codice vengono visualizzati dopo i meta tag predefiniti aggiunti da Drupal.

_drupal_default_html_head () (la funzione che restituisce i meta tag predefiniti) utilizza #weight per il 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,
  );

Fantastico, grazie! Questo ha funzionato. Sembra che mi sia perso qualcosa di molto ovvio da qualche parte. Per la mia educazione, dove l'hai trovato documentato?
Giustino,

1
Una volta notato che i meta tag sono resi con drupal_render(), ho provato a vedere se #weight è stato usato, poiché è usato per gli elementi del modulo che sono resi attraverso la stessa funzione. La documentazione per drupal_render()dice: "Gli elementi sono ordinati internamente usando uasort ()."
kiamlaluno
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.