metatags_quick-4.0.x-dev/modules/metatags_quick_extra/metatags_quick_extra.module
modules/metatags_quick_extra/metatags_quick_extra.module
<?php
/**
* @file
* Import nodewords data to metatags_quick fields.
* @author Valery L. Lourie <http://drupal.org/user/239562>
*/
use Drupal\Core\Site\Settings;
use Drupal\field\Entity\FieldStorageConfig;
use Drupal\taxonomy\Entity\Term;
/**
* Implements hook_menu().
*
* @see http://api.drupal.org/api/drupal/modules--system--system.api.php/function/hook_menu/7
*/
function metatags_quick_extra_menu() {
$items['admin/config/search/metatags_quick/auto'] = [
'page callback' => 'drupal_get_form',
'page arguments' => ['metatags_quick_admin_auto_settings'],
'title' => 'Auto settings',
'access arguments' => ['administer metatags_quick'],
'file' => 'metatags_quick_extra.admin.inc',
'type' => MENU_LOCAL_TASK,
'weight' => 10,
];
return $items;
}
/***
* Implementation of hook_html_head_alter(). The auto tagging ops happen here.
*/
function metatags_quick_extra_html_head_alter(&$head_elements) {
// auto-tag only if the page is node.
$arg0 = \Drupal::routeMatch()->getParameter(0);
$arg1 = \Drupal::routeMatch()->getParameter(1);
$arg2 = \Drupal::routeMatch()->getParameter(2);
if ($arg0 == 'node' && is_numeric($arg1) && !$arg2) {
$auto_settings = Settings::get('metatags_quick_auto_settings', '');
$node = \Drupal::service('entity_type.manager')->getStorage('node')->load($arg1);
$applicable_content_type = FALSE;
if (isset($auto_settings['applicable_content_types'])) {
$applicable_content_type = in_array($node->type, $auto_settings['applicable_content_types'], TRUE);
}
// Apply auto tags if the content type is one of target content types.
if ($applicable_content_type) {
// Generate automatic meta keywords.
$keywords = [];
// Node-specific keywords entered in node add/edit form.
$node_keywords = [];
if (isset($head_elements['metatags_quick_keywords'])) {
$node_keywords = explode(',', $head_elements['metatags_quick_keywords']['#attributes']['content']);
}
// Taxonomy keywords.
$vocabularies = array_values($auto_settings['auto_keywords_vocabularies']);
$taxonomy_keywords = [];
foreach ($vocabularies as $vocabulary) {
if ($vocabulary) {
$vocabulary_keywords = _metatags_quick_get_vocabulary_keywords($vocabulary, $node);
$taxonomy_keywords = array_merge($taxonomy_keywords, $vocabulary_keywords);
}
}
// Default keywords.
$default_keywords = [];
if (isset($auto_settings['default_keywords'][$node->type]) && $auto_settings['default_keywords'][$node->type]) {
$default_keywords = explode(',', $auto_settings['default_keywords'][$node->type]);
// Token support.
foreach ($default_keywords as $index => $keyword) {
$default_keywords[$index] = \Drupal::token()->replace($keyword, ['node' => $node]);
}
}
// Global keywords.
$global_keywords = [];
if ($auto_settings['global_keywords']) {
$global_keywords = explode(',', $auto_settings['global_keywords']);
// Token support.
foreach ($global_keywords as $index => $keyword) {
$global_keywords[$index] = \Drupal::token()->replace($keyword);
}
}
// Add/alter meta keywords.
$keywords = array_merge($node_keywords, $taxonomy_keywords, $default_keywords, $global_keywords);
if (count($keywords)) {
if (isset($head_elements['metatags_quick_keywords'])) {
$head_elements['metatags_quick_keywords']['#attributes']['content'] = implode(',', $keywords);
}
else {
$head_elements['metatags_quick_keywords'] = [
'#tag' => 'meta',
'#type' => 'html_tag',
'#attributes' => [
'name' => 'keywords',
'content' => implode(',', $keywords),
],
];
}
}
// Generate automatic meta description
// If no meta description exists and if autogeneration is required.
$meta_description_exists = FALSE;
if (isset($head_elements['metatags_quick_description'])) {
$head_elements['metatags_quick_description']['#attributes']['content'] = trim($head_elements['metatags_quick_description']['#attributes']['content']);
$meta_description_exists = !empty($head_elements['metatags_quick_description']['#attributes']['content']);
}
if (!empty($node->body) && !$meta_description_exists && isset($auto_settings['meta_description']) && $auto_settings['meta_description']['auto_generate']) {
$language = \Drupal::service('entity.repository')->getTranslationFromContext('node', $node, 'body');
$source = $auto_settings['meta_description']['source'];
if ($source == 'teaser') {
$content = check_markup($node->body[$language][0]['summary'], $node->body[$language][0]['format']);
}
elseif ($source == 'body') {
$content = check_markup($node->body[$language][0]['value'], $node->body[$language][0]['format']);
}
else {
$content = $node->body[$language][0]['summary'] ? check_markup($node->body[$language][0]['summary'], $node->body[$language][0]['format']) : check_markup($node->body[$language][0]['value'], $node->body[$language][0]['format']);
}
// Trim content.
$content = substr(trim(strip_tags($content)), 0, 255);
// Stop on word boundary.
if (strlen($content) == 255) {
$space_position = strrpos($content, ' ');
$content = substr($content, 0, $space_position);
}
// Add meta description.
$head_elements['metatags_quick_description'] = [
'#tag' => 'meta',
'#type' => 'html_tag',
'#attributes' => [
'name' => 'description',
'content' => $content,
],
];
}
}
}
}
/**
* Helper function to return an array of keywords for the given node and vocabulary.
*
* @param string $vocabulary_name
* @param stdObject $node
*/
function _metatags_quick_get_vocabulary_keywords($vocabulary_name, $node) {
// Identify the correct taxonomy field.
$keywords = [];
$field_name = '';
$fields = FieldStorageConfig::loadByName('node', $field_name);
foreach ($fields as $field) {
if ($field['type'] == 'taxonomy_term_reference' && isset($field['bundles']['node']) && in_array($node->type, $field['bundles']['node'])
&& $field['settings']['allowed_values'][0]['vocabulary'] == $vocabulary_name) {
$field_name = $field['field_name'];
break;
}
}
if ($field_name) {
$language = \Drupal::service('entity.repository')->getTranslationFromContext('node', $node, $field_name);
if (!empty($node->{$field_name})) {
$node_terms = $node->{$field_name}[$language];
foreach ($node_terms as $node_term) {
$term = Term::load($node_term['tid']);
if (isset($term->name)) {
$keywords[] = $term->name;
}
}
}
}
return $keywords;
}
