Як замовити метатеги, додані drupal_add_html_head ()?


12

Я додаю підтримку Open Graph на сайт Drupal, і у мене є купа дзвінків drupal_add_html_head (), наприклад:

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

Загалом у мене є 10 таких. Вони, схоже, не виводять у тому ж порядку, в якому вони викликаються (всі в одній функції).

Чи є якесь зважування, яке я можу використовувати для встановлення порядку?

Відповіді:


15

Використовуйте властивість #weight. Оскільки drupal_get_html_head () використовує drupal_render () для візуалізації метатегів, то при їх візуалізації використовується #weight.

Я використовую такий код, щоб зробити тест на своєму локальному сайті; це той самий код, який ви використовуєте, за винятком того, що він не має посилання на об'єкт вузла.

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

Вихід, який я отримав, наступний.

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

Як бачите, останній доданий тег - перший.

Потім я запускаю наступний код.

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

Вихід, який я отримав, наступний.

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

Як бачите, порядок метатегів змінено; метатеги, додані з коду, з'являються після мета-тегів за замовчуванням, доданих від Drupal.

_drupal_default_html_head () (функція, що повертає метатеги за замовчуванням) використовує #weight для метатега "Тип вмісту".

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

Дивовижне, дякую! Це спрацювало. Здається, я десь пропустив щось дуже очевидне. За моєю власною освітою, де ви це задокументували?
Джастін

1
Як тільки я помітив, що мета-теги відображаються за допомогою drupal_render(), я спробував зрозуміти, чи використовується #weight, оскільки він використовується для елементів форми, які відображаються за допомогою тієї ж функції. Документація для drupal_render(): "Елементи впорядковані внутрішньо за допомогою uasort ()."
kiamlaluno
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.