metatag_open_graph.install in Metatag 8
Update scripts for the Metatag Open Graph module.
File
metatag_open_graph/metatag_open_graph.installView source
<?php
/**
* @file
* Update scripts for the Metatag Open Graph module.
*/
use Drupal\Core\Entity\ContentEntityBase;
use Drupal\metatag\Entity\MetatagDefaults;
/**
* Implementations of hook_update_N().
*/
/**
* The "article:tags" meta tag was renamed to the correct "article:tag".
*/
function metatag_open_graph_update_8101() {
/* @var $configs Drupal\metatag\Entity\MetatagDefaults */
$configs = MetatagDefaults::loadMultiple();
foreach ($configs as $config) {
$tags = $config
->get('tags');
if (array_key_exists("article_tags", $tags)) {
$tags['article_tag'] = $tags['article_tags'];
unset($tags['article_tags']);
$config
->set("tags", $tags);
$config
->save();
}
}
}
/**
* The "article_tags" tag config was renamed "article_tag" on content entities.
*/
function metatag_open_graph_update_8102(&$sandbox) {
// Update existing content with reference to old article_tags.
$etm = Drupal::entityTypeManager();
if (empty($sandbox)) {
$field_map = Drupal::getContainer()
->get('entity_field.manager')
->getFieldMap();
$sandbox['todo'] = [];
$sandbox['done'] = 0;
$sandbox['max'] = 0;
$sandbox['#finished'] = 0;
foreach ($field_map as $entity_type => $fields) {
foreach ($fields as $field_name => $field_def) {
if ($field_def['type'] == "metatag") {
// We found a metatag field, so query for all the entities of this
// type that have "article_tags" in the serialized array.
$q = \Drupal::entityQuery($entity_type);
$q
->condition($field_name, "article_tags", "CONTAINS");
$count = $q
->count()
->execute();
if ($count > 0) {
$sandbox['todo'][$entity_type][$field_name] = 0;
$sandbox['max'] += $count;
}
}
}
}
if ($sandbox['max'] == 0) {
// Nothing to do.
$sandbox['#finished'] = 1;
return;
}
}
foreach ($sandbox['todo'] as $entity_type => $fields) {
/* @var $def Drupal\Core\Entity\ContentEntityType */
$def = Drupal::entityTypeManager()
->getDefinition($entity_type);
// Grab the primary key field for this entity type
// so we can filter and order by it.
$id_col = $def
->getKey("id");
foreach ($fields as $field_name => $last) {
$q = \Drupal::entityQuery($entity_type);
$q
->condition($field_name, "article_tags", "CONTAINS");
$q
->condition($id_col, $last, ">");
$q
->sort($id_col);
$q
->pager(20);
$res = $q
->execute();
if (empty($res)) {
unset($sandbox['todo'][$entity_type][$field_name]);
continue;
}
$entities = $etm
->getStorage($entity_type)
->loadMultiple($res);
foreach ($entities as $entity) {
/* @var $entity ContentEntityBase */
if ($entity instanceof ContentEntityBase) {
if ($entity
->hasField($field_name)) {
/* @var LanguageInterface $langcode */
foreach ($entity
->getTranslationLanguages() as $langcode) {
// For each translation of this entity (including the source)...
$trans = $entity
->getTranslation($langcode
->getId());
$tags_serialized = $trans
->get($field_name)->value;
if ($tags_serialized) {
// Change key from article_tags to article_tag.
$tags = unserialize($tags_serialized);
if (array_key_exists("article_tags", $tags)) {
$tags['article_tag'] = $tags['article_tags'];
unset($tags['article_tags']);
$trans
->set($field_name, serialize($tags));
$trans
->save();
}
}
}
}
}
// Store the last pk per entity type and field name.
$sandbox['todo'][$entity_type][$field_name] = $entity
->id();
$sandbox['done']++;
$sandbox['#finished'] = $sandbox['done'] / $sandbox['max'];
}
}
}
}
Functions
Name | Description |
---|---|
metatag_open_graph_update_8101 | The "article:tags" meta tag was renamed to the correct "article:tag". |
metatag_open_graph_update_8102 | The "article_tags" tag config was renamed "article_tag" on content entities. |