metatag.tokens.inc 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250
  1. <?php
  2. /**
  3. * @file
  4. * Custom tokens for Metatag.
  5. */
  6. /**
  7. * Implements hook_token_info().
  8. */
  9. function metatag_token_info() {
  10. $info = array();
  11. $info['types']['metatag'] = array(
  12. 'name' => t('Meta tags'),
  13. 'description' => t('Generated by the Metatag module, may not be used to fill in other meta tags.'),
  14. );
  15. $metatag_info = metatag_get_info();
  16. foreach ($metatag_info['tags'] as $value) {
  17. if (isset($value['group'], $metatag_info['groups'][$value['group']], $metatag_info['groups'][$value['group']]['label'])) {
  18. $label = t($metatag_info['groups'][$value['group']]['label']) . ': ' . t($value['label']);
  19. }
  20. else {
  21. $label = t('Basic tags') . ': ' . t($value['label']);
  22. }
  23. $info['tokens']['metatag'][$value['name']] = array(
  24. 'name' => $label,
  25. 'description' => t($value['description']),
  26. );
  27. }
  28. if (module_exists('taxonomy')) {
  29. $info['tokens']['term']['metatag'] = array(
  30. 'name' => t('Meta tags'),
  31. 'description' => t('Meta tags for this taxonomy term.'),
  32. 'type' => 'metatag',
  33. );
  34. }
  35. if (module_exists('node')) {
  36. $info['tokens']['node']['metatag'] = array(
  37. 'name' => t('Meta tags'),
  38. 'description' => t('Meta tags for this node.'),
  39. 'type' => 'metatag',
  40. );
  41. }
  42. if (module_exists('user')) {
  43. $info['tokens']['user']['metatag'] = array(
  44. 'name' => t('Meta tags'),
  45. 'description' => t('Meta tags for this user.'),
  46. 'type' => 'metatag',
  47. );
  48. }
  49. // A custom pager.
  50. $pager = variable_get('metatag_pager_string', 'Page PAGER | ');
  51. $page = str_replace('PAGER', 12, $pager);
  52. $info['tokens']['current-page']['pager'] = array(
  53. 'name' => t('Custom pager'),
  54. 'description' => t('A custom pager (from the Metatag module). Currently set to "@pager" which would be output as e.g. "@page".', array('@pager' => $pager, '@page' => $page)),
  55. );
  56. return $info;
  57. }
  58. /**
  59. * Implements hook_tokens().
  60. */
  61. function metatag_tokens($type, $tokens, array $data = array(), array $options = array()) {
  62. $replacements = array();
  63. $sanitize = !empty($options['sanitize']);
  64. // Metatag tokens.
  65. if ($type == 'metatag' && !empty($data['metatag'])) {
  66. $metatag = $data['metatag'];
  67. foreach ($tokens as $name => $original) {
  68. if(isset($metatag[$name])){
  69. $replacements[$original] = $sanitize ? filter_xss($metatag[$name]) : $metatag[$name];
  70. }
  71. }
  72. }
  73. // Token tokens.
  74. if ($type == 'term' && !empty($data['term'])) {
  75. $term = $data['term'];
  76. if ($metatag_tokens = token_find_with_prefix($tokens, 'metatag')) {
  77. $result = metatag_token_generate_array($term, 'taxonomy_term', $term->vocabulary_machine_name);
  78. $replacements += token_generate('metatag', $metatag_tokens, array('metatag' => $result), $options);
  79. }
  80. }
  81. // Node tokens.
  82. if ($type == 'node' && !empty($data['node'])) {
  83. $node = $data['node'];
  84. if ($metatag_tokens = token_find_with_prefix($tokens, 'metatag')) {
  85. $result = metatag_token_generate_array($node, 'node', $node->type);
  86. $replacements += token_generate('metatag', $metatag_tokens, array('metatag' => $result), $options);
  87. }
  88. }
  89. // User tokens.
  90. if ($type == 'user' && !empty($data['user'])) {
  91. $account = $data['user'];
  92. if ($metatag_tokens = token_find_with_prefix($tokens, 'metatag')) {
  93. $result = metatag_token_generate_array($account, 'user', 'user');
  94. $replacements += token_generate('metatag', $metatag_tokens, array('metatag' => $result), $options);
  95. }
  96. }
  97. // Custom pager.
  98. if ($type == 'current-page') {
  99. foreach ($tokens as $name => $original) {
  100. switch ($name) {
  101. case 'pager':
  102. $pager = metatag_get_current_pager();
  103. if (!empty($pager)) {
  104. $replacements[$original] = $pager;
  105. }
  106. break;
  107. }
  108. }
  109. }
  110. return $replacements;
  111. }
  112. /**
  113. * Generate an array of meta tags for a given entity.
  114. */
  115. function metatag_token_generate_array($entity, $entity_type, $bundle) {
  116. if (metatag_entity_supports_metatags($entity_type, $bundle)) {
  117. $token_type = token_get_entity_mapping('entity', $entity_type);
  118. $instance = metatag_get_entity_metatags_instance($entity, $entity_type, $bundle);
  119. $options = array();
  120. $options['token data'][$token_type] = $entity;
  121. $options['entity'] = $entity;
  122. $metatags = array();
  123. if (!empty($entity->metatags)) {
  124. $language = metatag_entity_get_language($entity_type, $entity);
  125. if (!empty($entity->metatags[$language])) {
  126. $metatags = $entity->metatags[$language];
  127. }
  128. }
  129. $metatags += metatag_config_load_with_defaults($instance);
  130. // Process it for entity metatag replacement to avoid infinite recursion.
  131. $metatags = _metatag_token_process_metatag($metatags, $token_type);
  132. $result = array();
  133. foreach ($metatags as $metatag => $data) {
  134. if ($metatag_instance = metatag_get_instance($metatag, $data)) {
  135. $result[$metatag] = $metatag_instance->getValue($options);
  136. }
  137. }
  138. return $result;
  139. }
  140. return NULL;
  141. }
  142. /**
  143. * Loop through metatags to avoid recursion on entity tokens. It will replace
  144. * entity metatag token to its actual entity metatag field value.
  145. *
  146. * @param array $metatags
  147. * An array of entity metatag tokens.
  148. * @param string $token_type
  149. * The entity token type, such as 'node' or 'term'.
  150. *
  151. * @return array
  152. * Return metatags array with entity metatag tokens replaced.
  153. */
  154. function _metatag_token_process_metatag($metatags, $token_type) {
  155. foreach ($metatags as $metatag => $data) {
  156. // Skip values that are not strings.
  157. if (!is_string($data['value'])) {
  158. continue;
  159. }
  160. // Explode all metatag token in field.
  161. $data_tokens = token_scan($data['value']);
  162. if (isset($data_tokens[$token_type])) {
  163. foreach ($data_tokens[$token_type] as $key => $value) {
  164. $metatag_parts = explode(':', $key);
  165. // Check entity metatag token. Like [<entity_token_type>:metatag:<xyz>].
  166. if ($metatag_parts[0] == 'metatag') {
  167. $entity_field = implode(':', array_slice($metatag_parts, 1));
  168. // If a value is not set here it will trigger an infinite loop.
  169. $metatags[$metatag]['value'] = '';
  170. // If the meta tag was defined then try parsing it.
  171. if (!empty($metatags[$entity_field]['value'])) {
  172. // Entity metatag field may contain other entity metatag token
  173. // that need to be replaced too.
  174. $replaced_value = metatag_token_entitymetatagtoken_replace($metatags, $metatags[$entity_field]['value'], $token_type);
  175. $metatags[$metatag]['value'] = str_replace($value, $replaced_value, $metatags[$metatag]['value']);
  176. }
  177. }
  178. }
  179. }
  180. }
  181. return $metatags;
  182. }
  183. /**
  184. * Replace entity metatag token with actual entity metatag field value.
  185. *
  186. * @param array $metatags
  187. * An array entity metatag tokens.
  188. * @param string $token
  189. * A token to be replaced.
  190. * @param string $token_type
  191. * The entity token type, such as 'node' or 'term'.
  192. * @param array $search_tokens
  193. * An array of tokens to search for.
  194. * @param array $replace_tokens
  195. * An array of tokens to be replaced.
  196. *
  197. * @return string
  198. * The replaced value of $token.
  199. */
  200. function metatag_token_entitymetatagtoken_replace($metatags, $token, $token_type, $search_tokens = array(), $replace_tokens = array()) {
  201. $data_tokens = token_scan($token);
  202. // Check field has tokens.
  203. if (isset($data_tokens[$token_type])) {
  204. // Go through each token in field and find entity metatag tokens.
  205. foreach ($data_tokens[$token_type] as $key => $value) {
  206. $metatag_parts = explode(':', $key);
  207. if ($metatag_parts[0] == 'metatag' && !in_array($value, $search_tokens)) {
  208. // Entity metatag field value.
  209. $entity_field = implode(':', array_slice($metatag_parts, 1));
  210. $replaced_value = metatag_token_entitymetatagtoken_replace($metatags, $metatags[$entity_field]['value'], $token_type, $replace_tokens, $search_tokens);
  211. $replace_tokens[] = $replaced_value;
  212. $search_tokens[] = $value;
  213. }
  214. }
  215. return str_replace($search_tokens, $replace_tokens, $token);
  216. }
  217. else {
  218. return $token;
  219. }
  220. }