metatag-8.x-1.x-dev/metatag_open_graph/metatag_open_graph.install
metatag_open_graph/metatag_open_graph.install
<?php
/**
* @file
* Update scripts for the Metatag Open Graph module.
*/
use Drupal\Component\Serialization\Json;
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 Drupal\metatag\Entity\MetatagDefaults $configs */
$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->accessCheck(FALSE);
$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 Drupal\Core\Entity\ContentEntityType $def */
$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->accessCheck(FALSE);
$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 \Drupal\Core\Entity\ContentEntityBase $entity */
if ($entity instanceof ContentEntityBase) {
if ($entity->hasField($field_name)) {
/** @var \Drupal\Core\Language\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, ['allowed_classes' => FALSE]);
if (array_key_exists("article_tags", $tags)) {
$tags['article_tag'] = $tags['article_tags'];
unset($tags['article_tags']);
$trans->set($field_name, Json::encode($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'];
}
}
}
}
