您如何订购drupal_add_html_head()添加的元标记?


12

我正在向Drupal网站添加Open Graph支持,并且有很多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个。它们似乎并没有按照被调用的顺序输出(都在单个函数中)。

我可以使用某种权重来设置订单吗?

Answers:


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()(返回默认元标记的函数)对“ Content-Type”元标记使用#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
一旦我发现meta标签是使用呈现的drupal_render(),我就尝试查看是否使用了#weight,因为它用于通过同一函数呈现的表单元素。的文档drupal_render()说:“元素是使用uasort()在内部排序的。”
kiamlaluno
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.