metatags_quick-4.0.x-dev/metatags_quick.feeds.inc
metatags_quick.feeds.inc
<?php
/**
* @file
*/
use Drupal\feeds\Feeds\TargetDefinition;
use Drupal\node\Entity\Node;
/**
* Implements hook_feeds_parser_sources_alter().
*/
function metatags_quick_feeds_parser_sources_alter(array &$sources, $content_type) {
if (!empty($content_type)) {
$fields = \Drupal::service('entity_field.manager')->getFieldDefinitions('node', $content_type);
foreach ($fields as $field_name => $field_definition) {
if ($field_definition->getType() == 'metatags_quick') {
$sources['parent:metatags_quick:' . $field_definition->get('field_meta_name')] = [
'name' => t('Feed node: Metatag: @meta_name', ['@meta_name' => $field_definition->get('field_meta_name')]),
'description' => t('Metatags the parent feed node.'),
'callback' => 'metatags_quick_feeds_get_source',
];
}
}
}
}
/**
* Callback for mapping parent metatags to child metatag values.
*
* @param string $key
* The key as defined in the _feeds_parser_sources_alter() hook defined above.
*
* @return array
* The metatag value.
*/
function metatags_quick_feeds_get_source($source, $result, $key) {
if ($node = Node::load($source->feed_nid)) {
$results = [];
$field = substr($key, 23);
if (!empty($node->{$field})) {
foreach ($node->{$field} as $item) {
$results[] = $item['metatags_quick'];
}
}
return $results;
}
}
/**
* Implements hook_feeds_processor_targets_alter() for metatags_quick fields.
*
* @see \Drupal\feeds\Processor\FeedsNodeProcessor::getMappingTargets()
*/
function metatags_quick_feeds_processor_targets_alter(array &$targets, $entity_type, $bundle_name) {
foreach (\Drupal::entityTypeManager()->getFieldDefinitions($entity_type, $bundle_name) as $name => $field_definition) {
if ($field_definition->getType() == 'metatags_quick') {
$targets[$name] = new TargetDefinition([
'name' => $field_definition->getLabel(),
'callback' => 'metatags_quick_feeds_set_target',
'description' => t('The @label metatag.', ['@label' => $field_definition->getLabel()]),
'real_target' => $name,
]);
}
}
}
/**
* Callback for mapping metatag fields.
*
* Implementation of hook_feeds_set_target().
*
* @param \Drupal\feeds\Feeds\FeedsSourceInterface $source
* A FeedsSource object.
* @param object $entity
* The entity to map to.
* @param string $target
* The target key on $entity to map to.
* @param mixed $value
* The value to map. Can be an array or a string.
*/
function metatags_quick_feeds_set_target($source, $entity, $target, $value) {
if (empty($value)) {
return;
}
if (strpos($target, 'meta') === 0) {
$field = [
'value' => $value,
// Strip off 'field_meta_'.
'meta_name' => substr($target, 11),
];
$entity->{$target}[] = $field;
}
}
