t('Extra Details'), 'description' => t('Details for specific nodes.'), 'needs-data' => 'node', ]; // 2. Tokens for the new type. $info['tokens']['extra-details']['example-1'] = [ 'name' => t('Example 1'), 'description' => t('First example'), ]; $info['tokens']['extra-details']['example-2'] = [ 'name' => t('Example 2'), 'description' => t('Another example'), ]; // 3. Add the new type to node. $info['tokens']['node']['extra-details'] = [ 'name' => t('Extra Details'), 'description' => t('Details for specific nodes.'), 'type' => 'extra-details', ]; } function mymodule_tokens($type, $tokens, array $data, array $options, BubbleableMetadata $bubbleable_metadata) { $replacements = []; if ($type == 'node') { if ($details = \Drupal::token()->findWithPrefix($tokens, 'location-loans')) { foreach ($details as $name => $original) { switch ($name) { case 'example-1': $replacements[$original] = 'Great example!'; break; case 'example-2': $replacements[$original] = 'Another great example!'; break; } } } } return $replacements; }