Jak zamawiasz metatagi dodane przez drupal_add_html_head ()?

12

Dodam obsługę Open Graph do strony Drupal i mam kilka wywołań drupal_add_html_head (), takich jak:

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

W sumie mam ich 10. Nie wydają się wyświetlać w tej samej kolejności, w jakiej są wywoływane (wszystkie w jednej funkcji).

Czy istnieje jakiś rodzaj ważenia, którego mogę użyć do ustawienia zamówienia?

Justin
źródło

Odpowiedzi:

15

Użyj właściwości #weight. Ponieważ drupal_get_html_head () używa drupal_render () do renderowania metatagów, podczas renderowania używa się #weight .

Korzystam z następującego kodu, aby wykonać test w mojej lokalnej witrynie; jest to ten sam kod, którego używasz, z tym wyjątkiem, że nie ma żadnego odniesienia do obiektu węzła.

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

Otrzymałem następujące wyjście.

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

Jak widać, ostatni dodany tag jest wyświetlany jako pierwszy.

Następnie uruchamiam następujący kod.

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

Otrzymałem następujące wyjście.

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

Jak widać, kolejność metatagów została zmieniona; metatagi dodane z kodu pojawiają się po domyślnych metatagach dodanych z Drupala.

_drupal_default_html_head () (funkcja zwracająca domyślne metatagi) używa #weight dla metatagu „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
źródło
Wielkie dzieki! To działało. Wygląda na to, że gdzieś przegapiłem coś bardzo oczywistego. Gdzie według mojego wykształcenia znalazłeś to udokumentowane?
Justin
1
Gdy zauważyłem, że metatagi są renderowane drupal_render(), próbowałem sprawdzić, czy użyto #weight, ponieważ jest on używany do elementów formularza renderowanych za pomocą tej samej funkcji. Dokumentacja drupal_render()mówi: „Elementy są sortowane wewnętrznie za pomocą uasort ().”
kiamlaluno