为了账号安全,请及时绑定邮箱和手机立即绑定

动态创建的元标记中的 Drupal 转义 url

动态创建的元标记中的 Drupal 转义 url

PHP
牧羊人nacy 2023-04-28 14:02:43
我正在尝试使用 page_attachments 挂钩将开放图元标记动态添加到 drupal 8。元标记生成正确,但图像和网站 url 正在由 drupal 编码,结果是断开的链接。function module_page_attachments(array &$page){  $tags = [    ["name" => "twitter:card", "content" => "summary"],    ["name" => "og:url", "content" => "https://example.net/index.php?param1=1&param2=2&param3=3"],    ["name" => "og:title", "content" => "My title"],    ["name" => "og:description", "content" => "My description"],    ["name" => "og:image", "content" => "https://example.net/images?id=1&size=400"],  ];  foreach ($tags as $tag) {    $headerTag = array(      '#tag' => 'meta',      '#attributes' => array(        'property' => $tag['name'],        'content' => $tag['content'],      ),    );    $page['#attached']['html_head'][] = [$headerTag, $tag['name'] . "Id"];  }}结果如下<html><head>    <meta charset="utf-8" />    <meta property="twitter:card" content="summary" />    <meta property="og:url"        content="https://example.com/index.php?param1=1&amp;param2=2&amp;param3=3" />    <meta property="og:title" content="My title" />    <meta property="og:description"        content="My description" />    <meta property="og:image"        content="https://example.net/images?id=1&amp;size=400" /></head><body></body></html>所有的&字符都被编码并转化为&amp;. 如何防止 Drupal 对字符进行编码?
查看完整描述

2 回答

?
PIPIONE

TA贡献1829条经验 获得超9个赞

DrupalCoreRenderMarkup应该可以解决问题:


<?php

use Drupal\Core\Render\Markup;


function module_page_attachments(array &$page)

{

  $tags = [

    ["name" => "twitter:card", "content" => "summary"],

    ["name" => "og:url", "content" => Markup::create("https://example.net/index.php?param1=1&param2=2&param3=3")],

    ["name" => "og:title", "content" => "My title"],

    ["name" => "og:description", "content" => "My description"],

    ["name" => "og:image", "content" => Markup::create("https://example.net/images?id=1&size=400")],

  ];


  foreach ($tags as $tag) {


    $headerTag = array(

      '#tag' => 'meta',

      '#attributes' => array(

        'property' => $tag['name'],

        'content' => $tag['content'],

      ),

    );

    $page['#attached']['html_head'][] = [$headerTag, $tag['name'] . "Id"];

  }

}


查看完整回答
反对 回复 2023-04-28
?
慕少森

TA贡献2019条经验 获得超9个赞

needs work在 drupal 的网站上有一个关于状态问题的公开票。


解决此问题的一种方法是拦截页面并在模块文件中更改其模板,如下例所示:


文件名:example.module


/**

 * Drupal bug caused the application to escape links. Therefore the og:image and og:url

 * were not working. Drupal kept converting `&` to `&amp;`

 * The solution here below converts the tags into inline templates

 */

function spa_seo_page_attachments_alter(array &$attachments)

{

  if (isset($attachments['#attached']['html_head'])) {

    foreach ($attachments['#attached']['html_head'] as $key => $item) {


      $property = !empty($item[0]['#attributes']['property']) ? $item[0]['#attributes']['property'] : '';


      if ($property == "og:url" || $property == "og:image") {

        $content = $item[0]['#attributes']['content'];

        $property = $item[0]['#attributes']['property'];

        $attachments['#attached']['html_head'][$key][0] = [

          '#type' => 'inline_template',

          '#template' => "{{ meta|raw }}",

          '#context' => [

            'meta' => '<meta property="' . $property . '" content="' . $content . '" />',

          ]

        ];

      }

    }

  }

}

笔记


请注意,这DrupalCoreRenderMarkup并不能解决问题,因为这是一个错误。


查看完整回答
反对 回复 2023-04-28
  • 2 回答
  • 0 关注
  • 114 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信