Рейтинг:1

How can I set "advanced" metatags programmatically?

флаг cn

The Metatag documentation gives an example of setting meta tags like this:

$node->set('field_meta_tags', serialize([
  'title' => 'Some title',
  'description' => 'Some description.',
  'keywords' => 'Some,Keywords',
]));

However, I want to set the "advanced" fields, such as Canonical URL. (Use case: I am trying to import several hundred pages with the Feeds module, some of which are very similar, so I want to automatically set the canonical URL for the similar pages.)

I tried to get the name of the key to serialize by setting the canonical URL for a node in the UI, saving the node, and then dumping the result of field_metatags, but this was the result:

www.example.com a:4:{s:5:"@type";s:6:"Person";s:3:"@id";s:39:"https://www.example.com/bio";s:4:"name";s:12:"Person's name";s:3:"url";s:39:"https://www.example.com/my-bio";}

Here, the first www.example.com is the value I set for canonical URL, but this does not give me a hint of what to use to set the canonical URL.

How can I set the values of the "advanced" metatags programmatically?

Similar questions

This question asks about setting the canonical URL but it is for Drupal 7 and concerns pre-processing the canonical URL before display, whereas I want to set the metatag canonical URL when saving the node in Drupal 9.

флаг ru
Части с `letter:number` обычно представляют собой сериализованные структуры данных PHP (сложные структуры данных, сериализованные в одну строку), например. `a:4` означает `массив длиной `4`, `s:5` - это `строка длины `5` и т. д. Вы должны уметь декодировать и получать read-/var_dump- возможные имена ключей и значения, используя сначала [PHP unserialize()](https://www.php.net/manual/en/function.unserialize.php).
Рейтинг:0
флаг cn

Благодаря @Hudri я смог понять это с помощью десериализовать().

Как установить расширенные метатеги по ключу

Расширенные метатеги устанавливаются так же, как и стандартные метатеги, но вам нужно знать ключ для установки.

В случае канонического URL ключ canonical_url, поэтому его можно установить так:

  $this->set('field_metatags', сериализовать([
    'canonical_url' => $canonical_link,
  ]));

Как получить значение ключа расширенных метатегов?

Во-первых, в пользовательском интерфейсе установите значение для определенного объекта (например, в /узел/1/изменить). Мне нужно было установить его для отдельного объекта, потому что значения, которые устанавливаются глобально для объектов в пользовательском интерфейсе администратора (в /admin/config/search/метатег) не отображаются, когда вы получаете значение field_metatags поле для вашего объекта (поскольку модуль метатегов сохраняет переопределения только для этого конкретного объекта в поле).

Затем в своем коде вы можете использовать Xdebug или что-то вроде этого:

hook_entity_presave () {
  $metatags = $this->get('field_metatags')->значение;
  $unserialized = unserialize($metatags);
  print_r ($ несериализованный);
  умереть();
}

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.