NODEWORDS_TYPE_NODE, 'id' => $node->nid, 'sid' => '*' ) ); break; case 'insert': case 'update': if (isset($node->nodewords)) { nodewords_save_tags( $node->nodewords['metatags'], array( 'type' => NODEWORDS_TYPE_NODE, 'id' => $node->nid, 'sid' => $node->vid, 'language' => $node->language, ) ); unset($node->nodewords); } break; case 'load': $result = array(); $result['nodewords']['metatags'] = nodewords_load_tags(array( 'type' => NODEWORDS_TYPE_NODE, 'id' => $node->nid, 'sid' => $node->vid, 'language' => $node->language, )); return $result; } } /** * Implements hook_perm(). */ function nodewords_perm() { return array('administer meta tags'); } /** * Implements hook_preprocess_page(). */ function nodewords_preprocess_page(&$variables) { $output_tags = array(); $head_tags = variable_get('nodewords_head', array()); $options = nodewords_detect_type_id(); $bool = ( $options['type'] != NODEWORDS_TYPE_NONE && $options['type'] != NODEWORDS_TYPE_OFFLINE ); if ($bool) { $options['output'] = 'head'; if ($options['type'] == NODEWORDS_TYPE_PAGER) { nodewords_load_all_includes('nodewords.tags.inc'); foreach (nodewords_get_possible_tags() as $name => $info) { if (empty($head_tags[$name])) { continue; } $bool = ( !empty($info['context']['allowed']) && in_array(NODEWORDS_TYPE_PAGER, $info['context']['allowed']) && function_exists($function = $info['callback'] . '_prepare') ); if ($bool) { $options['parameters'] = !empty($info['callback arguments']) ? $info['callback arguments'] : array(); $function($output_tags, array(), $options); } } } elseif ($options['type'] == NODEWORDS_TYPE_NODE) { $node = node_load(array('nid' => $options['id'], 'vid' => $options['sid'])); if ( $node && node_access('view', $node)) { $tags = nodewords_load_tags($options + array('language' => $node->language)); } else { $tags = array(); } } else { $tags = nodewords_load_tags($options); nodewords_load_all_includes('nodewords.tags.inc'); // Prepare the tags. foreach (nodewords_get_possible_tags() as $name => $info) { if (empty($head_tags[$name])) { continue; } if (function_exists($function = $info['callback'] . '_prepare')) { $options['parameters'] = !empty($info['callback arguments']) ? $info['callback arguments'] : array(); $function( $output_tags, _nodewords_tag_value($name, isset($tags[$name]) ? $tags[$name] : array(), $options + array('admin' => FALSE)), $options ); } } } nodewords_load_all_includes('nodewords.hooks.inc'); drupal_alter('metatags', $output_tags, $options); $output = _nodewords_output_tags($output_tags); drupal_alter('metatags_output', $output, $options); $variables['head'] = $output . "\n" . $variables['head']; } } /** * Implements hook_taxonomy(). */ function nodewords_taxonomy($op, $type, $array = NULL) { switch ($type) { case 'term': $id = $array['tid']; $type = NODEWORDS_TYPE_TERM; break; case 'vocabulary': $id = $array['vid']; $type = NODEWORDS_TYPE_VOCABULARY; break; default: return; } switch ($op) { case 'delete': nodewords_delete_tags(array('type' => $type, 'id' => $id)); break; case 'insert': case 'update': if (isset($array['nodewords']['metatags'])) { nodewords_save_tags( $array['nodewords']['metatags'], array('type' => $type,'id' => $id) ); unset($array['nodewords']); } break; } } /** * Implements hook_user(). */ function nodewords_user($op, &$edit, &$account, $category = NULL) { switch ($op) { case 'load': $account->nodewords['metatags'] = nodewords_load_tags( array( 'type' => NODEWORDS_TYPE_USER, 'id' => $account->uid, ) ); break; case 'delete': nodewords_delete_tags( array( 'type' => NODEWORDS_TYPE_USER, 'id' => $account->uid ) ); break; case 'insert': case 'update': if (isset($edit['nodewords']['metatags'])) { nodewords_save_tags( $edit['nodewords']['metatags'], array( 'type' => NODEWORDS_TYPE_USER, 'id' => $account->uid ) ); unset($edit['nodewords']); unset($account->nodewords); } break; } } /** * Add the tokens help to the form. * * Add the tokens help to the form passed as argument. * It is responsability of the calling function to verify that token.module is * enabled. * * @param &$form * The form to which the help text will be added. * @param $type * An array containing information about the object for which the meta tags * are being edited. */ function nodewords_add_tokens_help(&$form, $type) { switch ($type['type']) { case NODEWORDS_TYPE_ERRORPAGE: case NODEWORDS_TYPE_PAGE: $tokens_type[] = 'global'; $tokens_type[] = 'global meta tags'; break; case NODEWORDS_TYPE_DEFAULT: $tokens_type[] = 'global'; $tokens_type[] = 'global meta tags'; $tokens_type[] = 'node'; $tokens_type[] = 'node meta tags'; $tokens_type[] = 'taxonomy'; $tokens_type[] = 'user'; break; case NODEWORDS_TYPE_CONTENT_TYPE: case NODEWORDS_TYPE_NODE: $tokens_type[] = 'global'; $tokens_type[] = 'global meta tags'; $tokens_type[] = 'node'; $tokens_type[] = 'node meta tags'; break; case NODEWORDS_TYPE_TERM: case NODEWORDS_TYPE_VOCABULARY: $tokens_type[] = 'global'; $tokens_type[] = 'global meta tags'; $tokens_type[] = 'taxonomy'; break; case NODEWORDS_TYPE_USER: $tokens_type[] = 'global'; $tokens_type[] = 'global meta tags'; $tokens_type[] = 'user'; break; default: $tokens_type = ''; } if ($tokens_type) { $form['token_help'] = array( '#title' => t('Replacement patterns'), '#type' => 'fieldset', '#collapsible' => TRUE, '#collapsed' => TRUE, '#description' => t('Prefer raw-text replacements for text to avoid problems with HTML entities.'), ); $form['token_help']['help'] = array( '#value' => theme('token_help', $tokens_type), ); } } /** * Verify the version version is one currently supported by Nodewords. * * @param $version * The version string as accepted by version_compare(). * * @return * TRUE, if the version version is currently supported by Nodewords. */ function nodewords_check_version($version) { return ( version_compare($version, NODEWORDS_MINIMUM_VERSION, '>=') && version_compare($version, NODEWORDS_VERSION, '<=') ); } /** * Delete tags from table. */ function nodewords_delete_tags(array $options = array()) { $options += array( 'type' => NODEWORDS_TYPE_DEFAULT, 'id' => '', 'sid' => 0, 'language' => '*', ); $args = array($options['type'], $options['id']); $query = "DELETE FROM {nodewords} WHERE type = %d AND id = %d"; if ($options['sid'] != '*') { $args[] = $options['sid']; $query .= ' AND sid = %d'; } if ($options['language'] != '*') { $args[] = $options['language']; $query .= " AND language = '%s'"; } db_query($query, $args); nodewords_load_all_includes('nodewords.hooks.inc'); module_invoke_all('metatags_delete', $options); } /** * Try to guess the type and the ID associated with the viewed page. * * @param $options * An array of parameters that describe the page to check. If the array is * is not passed, the function will return the type of the currently viewed * page. * * @return * An array containing information about the type of the page. */ function nodewords_detect_type_id(array $options = array()) { $arg = empty($options['q']) ? arg() : array_filter(explode('/', $options['q'])); $page = empty($options['page']) ? (isset($_REQUEST['page']) ? $_REQUEST['page'] : -1) : $options['page']; $headers = empty($options['headers']) ? drupal_get_headers() : $options['headers']; $bool = ( variable_get('site_offline', 0) && !user_access('administer site configuration') ); if ($bool) { return array('type' => NODEWORDS_TYPE_OFFLINE, 'id' => 0); } if (preg_match('@HTTP/1\.[01]\x20+403[^a-zA-Z0-9]@', $headers)) { return array('type' => NODEWORDS_TYPE_ERRORPAGE, 'id' => 403); } if (preg_match('@HTTP/1\.[01]\x20+404[^a-zA-Z0-9]@', $headers)) { return array('type' => NODEWORDS_TYPE_ERRORPAGE, 'id' => 404); } $bool = ( !variable_get('nodewords_list_repeat', FALSE) && intval($page) > 0 ); if ($bool) { return array('type' => NODEWORDS_TYPE_PAGER, 'id' => 0); } if (!isset($arg[0])) { return array('type' => NODEWORDS_TYPE_NONE, 'id' => 0); } _nodewords_load_hook_files(); $result = array('type' => NODEWORDS_TYPE_NONE, 'id' => 0); foreach (module_implements('nodewords_type_id') as $module) { $function = $module . '_nodewords_type_id'; $function($result, $arg); if ($result['type'] != NODEWORDS_TYPE_NONE) { return $result; } } return array('type' => NODEWORDS_TYPE_NONE, 'id' => 0); } /** * Query all the modules implementing meta tags and return the list of meta tags. * * @return * An array containing the list of meta tags definitions. */ function nodewords_get_possible_tags() { static $tags_info = array(); nodewords_load_all_includes('nodewords.hooks.inc'); if (empty($tags_info)) { // Allow third-party modules to alter the meta tags list, or to add new // meta tags. foreach (module_implements('metatags_info') as $module) { $result = module_invoke($module, 'metatags_info'); if (isset($result) && is_array($result)) { $tags_info = array_merge($tags_info, $result); } } } drupal_alter('metatags_info', $tags_info); return $tags_info; } /** * Return the term object matching a term ID. This is a modified version of * taxonomy_get_term() which uses db_rewrite_sql(). * * @param $tid * A term's ID. * @param $uid * The user ID; if not passed, the function will use the global user ID. * * @return * A term object, or FALSE. Results are statically cached. */ function nodewords_get_term($tid, $uid = NULL) { global $user; static $terms = array(); if (!isset($uid)) { $uid = $user->uid; } if (!isset($terms[$uid][$tid])) { $terms[$uid][$tid] = db_fetch_object( db_query( db_rewrite_sql('SELECT * FROM {term_data} t WHERE t.tid = %d', 't', 'tid'), $tid ) ); } return !empty($terms[$uid][$tid]) ? $terms[$uid][$tid] : FALSE; } /** * Load an include file for each of the modules that have support for Nodewords. * * @param $file * The file to load; the name of the module will be preappended to the file * name passed. By default the file name is 'nodewords.inc'. */ function nodewords_load_all_includes($file = 'nodewords.inc') { foreach (module_implements('metatags_api') as $module) { $info = module_invoke($module, 'metatags_api'); if (isset($info['version']) && nodewords_check_version($info['version'])) { if (isset($info['path']) && $info['path'] == '') { // Special case: if the path is an empty string, the directory used will be // the directory include in the module directory. $include_path = drupal_get_path('module', $module) . '/includes/'; } elseif (isset($info['path'])) { $include_path = $info['path'] . '/'; } else { $include_path = drupal_get_path('module', $module) . '/'; } $include_file = $include_path . $module . '.' . $file; if (is_file($include_file)) { require_once $include_file; } elseif ($file != 'nodewords.inc' && is_file($include_file = $include_path . $module . '.' . 'nodewords.inc')) { require_once $include_file; } } } } /** * Load an include file. * * @param $module * The module for which the file is loaded. * * @param $file * The file to load; the name of the module will be preappended to the file * name passed. By default the file name is 'nodewords.inc'. * */ function nodewords_load_include($module, $file = 'nodewords.inc') { $info = module_invoke($module, 'metatags_api'); if (isset($info['path']) && $info['path'] == '') { // Special case: if the path is an empty string, the directory used will be // the directory include in the module directory. $include_path = drupal_get_path('module', $module) . '/includes/'; } elseif (isset($info['path'])) { $include_path = $info['path'] . '/'; } else { $include_path = drupal_get_path('module', $module) . '/'; } $include_file = $include_path . $module . '.' . $file; if (is_file($include_file)) { require_once $include_file; } elseif ($file != 'nodewords.inc' && is_file($include_file = $include_path . $module . '.' . 'nodewords.inc')) { require_once $include_file; } else { return FALSE; } } /** * Load tags from table. * * @param $options * An array of options. * * @return * An array of meta tags data as saved in the database table. */ function nodewords_load_tags(array $options = array()) { global $language; $tags = array(); $options += (array('language' => $language->language) + _nodewords_get_default_metatags_type()); $tags_info = nodewords_get_possible_tags(); $result = _nodewords_get_tags_data_query($options); while ($row = db_fetch_object($result)) { if (isset($tags_info[$row->name])) { $tags[$row->name] = unserialize($row->content); } } if (empty($tags) && $options['type'] == NODEWORDS_TYPE_TERM) { $id = db_result(db_query_range( 'SELECT vid FROM {term_data} WHERE tid = %d', $options['id'], 0, 1 )); if ($id !== FALSE) { $options['type'] = NODEWORDS_TYPE_VOCABULARY; $options['id'] = $id; return nodewords_load_tags($options); } } return $tags; } /** * Create the content of a meta tag from a node teaser. * * @param $text * The string to use. * @param $format * The format set for the node. * @param $options * An array of options; currently, the only used is the maximum allowed * length. * * @return * The string to use to populate the meta tag. */ function nodewords_replace_tokens($content, array $options = array()) { global $user; $token_objects = array(); $options += _nodewords_get_default_metatags_type(); if (empty($content) || !module_exists('token')) { return $content; } switch ($options['type']) { case NODEWORDS_TYPE_ERRORPAGE: case NODEWORDS_TYPE_PAGE: $token_objects['global'] = NULL; $token_objects['global meta tags'] = NULL; break; case NODEWORDS_TYPE_NODE: $token_objects['global'] = NULL; $token_objects['global meta tags'] = NULL; $token_objects['node'] = _nodewords_node_load($options); $token_objects['node meta tags'] = $token_objects['node']; break; case NODEWORDS_TYPE_TERM: case NODEWORDS_TYPE_VOCABULARY: $token_objects['global'] = NULL; $token_objects['global meta tags'] = NULL; $token_objects['taxonomy'] = _nodewords_taxonomy_load($options); break; case NODEWORDS_TYPE_USER: $token_objects['global'] = NULL; $token_objects['global meta tags'] = NULL; $token_objects['user'] = user_load($options['id']); break; default: return $content; } // Remove the not replaced tokens. $content = token_replace_multiple($content, $token_objects); $replacements = array(); token_include(); foreach (module_implements('token_list') as $module) { $function = $module .'_token_list'; $result = $function('all'); if (is_array($result)) { foreach ($result as $category => $tokens) { foreach ($tokens as $token => $title) { $replacements['[' . $token . ']'] = ''; } } } } if (!empty($replacements)) { $content = strtr($content, $replacements); } return $content; } /** * Update or insert tags in the table. */ function nodewords_save_tags($tags, $options = array()) { global $language, $user; $done = FALSE; $options += (array('language' => $language->language, 'log_message' => TRUE) + _nodewords_get_default_metatags_type()); $tags_info = nodewords_get_possible_tags(); $types_str = _nodewords_get_type_strings(); foreach ($tags as $name => $content) { if (isset($tags_info[$name])) { $content = serialize($content); $result = _nodewords_get_tags_data($name, $options); if ($result === FALSE) { $row = _nodewords_init_tags_data($name, $options); } else { $row = $result; } $row->content = $content; $ret = drupal_write_record('nodewords', $row, isset($row->mtid) ? 'mtid' : array()); if (!$done && $options['log_message'] && $ret) { watchdog( 'meta tags', 'User %name changed the meta tags for type %type (%id - %sid).', array( '%name' => $user->name, isset($types_str[$options['type']]) ? $types_str[$options['type']] : t('unknown'), '%id' => $options['id'], '%sid' => $options['sid'] ) ); $done = TRUE; } } } } /** * Return the form used to set the meta tags values. * * @param $type * An array containing the type of the object, and its ID. * * @param $tags * The meta tags array as returned by nodewords_load_tags(). * * @return * An array as requested by the form version. */ function nodewords_tags_edit_fields($object, $tags, array $options = array()) { $form = array(); $tokens_support = FALSE; $tokens_type = array(); $options += array( 'admin' => FALSE, 'collapsed' => TRUE, 'collapsible' => TRUE, 'description' => '', 'fieldset' => FALSE, 'title' => t('Meta tags'), 'weight' => 20, ); $edit_tags = variable_get( !empty($options['admin']) ? 'nodewords_admin_edit' : 'nodewords_ui_edit', array() ); $head_output = variable_get('nodewords_head', array()); $tokens_enabled = module_exists('token') && variable_get('nodewords_enable_tokens', TRUE); $object += _nodewords_get_default_metatags_type(); if (isset($options['tag options']) && is_array($options['tag options'])) { $tag_options = $options['tag options'] + $object; } else { $tag_options = $object; } nodewords_load_all_includes('nodewords.tags.inc'); nodewords_load_all_includes('nodewords.hooks.inc'); $filter_metatags = ($object['type'] != NODEWORDS_TYPE_DEFAULT); foreach (nodewords_get_possible_tags() as $name => $info) { $description = array(); $permission = TRUE; drupal_alter('metatags_permission', $permission, $object, $name, $info); if ($permission) { $bool = ( ( ( !empty($info['context']['allowed']) && is_array($info['context']['allowed']) && !in_array($object['type'], $info['context']['allowed']) ) || ( !empty($info['context']['denied']) && is_array($info['context']['denied']) && in_array($object['type'], $info['context']['denied']) ) ) ); if ($bool || ($filter_metatags && empty($edit_tags[$name]))) { continue; } if (!empty($info['tokens'])) { $description[] = ' ' . t('This meta tag supports tokens.') . ''; $tokens_support = TRUE; } if (empty($head_output[$name]) && user_access('administer meta tags')) { $description[] = ' ' . t('This meta tag has not been selected to be output in HTML.'); } if (function_exists($function = $info['callback'] . '_form')) { if (!empty($description)) { $tag_options['description'] = implode('', $description); } else { $tag_options['description'] = ''; } $tag_options['parameters'] = !empty($info['callback arguments']) ? $info['callback arguments'] : array(); $function($form_metatags, _nodewords_tag_value($name, isset($tags[$name]) ? $tags[$name] : array(), $object + array('admin' => $options['admin'])), $tag_options ); } } } if (!empty($form_metatags) && $options['fieldset']) { $form['#tree'] = TRUE; $form['#type'] = 'fieldset'; $form['#title'] = $options['title']; $form['#description'] = $options['description']; $form['#collapsible'] = $options['collapsible']; $form['#collapsed'] = $options['collapsed']; $form['#weight'] = $options['weight']; $form['#group'] = 'additional_settings'; } if (!empty($options['first fields'])) { $form = $options['first fields'] + $form; } if (!empty($form_metatags)) { $form['metatags'] = $form_metatags; } if ($tokens_enabled && $tokens_support) { nodewords_add_tokens_help($form, $type); } if (!empty($options['last fields'])) { $form += $options['last fields']; } return $form; } /* * Remove the duplicates from a list of items separated from the separator, * preserving the order in which they appear. * @param $text * The string containing the list of items concatenated using $separator. * @param $separator * The string used to split the string into an array. A space will be appended * to the string before it is used to create the string from the array of * unique items found in the string passed as argument. * @param $max_items * The maximum number of items accepted in the returned array; the default * value is -1, which means no limit. * * @return * A string containing only unique items present in the string of concatenated * items. */ function nodewords_unique_values($text, array $options = array()) { $lc_values = array(); $unique_values = array(); $options += array( 'separator' => ',', 'max_items' => -1, ); if (empty($text)) { return ''; } foreach (array_filter(array_map('trim', explode($options['separator'], $text))) as $item) { $lowercase = drupal_strtolower($item); if (!in_array($lowercase, $lc_values)) { $lc_values[] = $lowercase; $unique_values[] = $item; } } if ($options['max_items'] > 0) { $unique_values = array_slice($unique_values, 0, $options['max_items']); } return implode($options['separator'], $unique_values); } /** * Return the absolute URL of a path. * * Return the absolute URL of a path built using the base URL saved in the * Drupal variable nodewords_base_url. * * @param $path * The path for which the absolute must be built. * @param $options * An array of options as used by url(). */ function nodewords_url($path, array $options = array()) { $options += array( 'alias' => TRUE, 'absolute' => TRUE, 'base_url' => rtrim(variable_get('nodewords_base_url', ''), '/'), 'fragment' => '', 'query' => '', 'prefix' => '' ); if (empty($options['base_url'])) { $options['base_url'] = NULL; } return url($path, $options); } /** * Return the default values that identify the object associated with the meta tags. * * @return * An array containing the indexes 'type', 'sid', and 'id'. */ function _nodewords_get_default_metatags_type() { return array('type' => NODEWORDS_TYPE_DEFAULT, 'id' => 0, 'sid' => 0, 'language' => ''); } function _nodewords_get_tags_data($name, array $options) { return db_fetch_object( db_query_range( "SELECT * FROM {nodewords} WHERE type = %d AND id = '%s' AND sid = %d AND name = '%s' AND language = '%s'", $options['type'], $options['id'], $options['sid'], $name, $options['language'], 0, 1 ) ); } function _nodewords_get_tags_data_query(array $options) { $exists = db_result( db_query_range( "SELECT 1 FROM {nodewords} WHERE type = %d AND id = '%s' AND sid = %d AND language = '%s'", $options['type'], $options['id'], $options['sid'], $options['language'], 0, 1 ) ); if (!$exists) { $options['language'] = ''; } $result = db_query( "SELECT * FROM {nodewords} WHERE type = %d AND id = '%s' AND sid = %d AND language = '%s'", $options['type'], $options['id'], $options['sid'], $options['language'] ); return $result; } function _nodewords_get_type_strings() { return array( NODEWORDS_TYPE_DEFAULT => t('default'), NODEWORDS_TYPE_ERRORPAGE => t('HTTP error page'), NODEWORDS_TYPE_NODE => t('node'), NODEWORDS_TYPE_PAGE => t('custom page'), NODEWORDS_TYPE_TERM => t('taxonomy term'), NODEWORDS_TYPE_USER => t('user profile'), NODEWORDS_TYPE_VOCABULARY => t('vocabulary'), ); } function _nodewords_init_tags_data($name, array $options) { $row = new stdClass(); $row->type = $options['type']; $row->id = $options['id']; $row->sid = $options['sid']; $row->name = $name; $row->language = $options['language']; return $row; } /** * Load the files in the directory "includes" basing on the enabled modules. * */ function _nodewords_load_hook_files() { $dir = drupal_get_path('module', 'nodewords') . '/includes'; foreach (file_scan_directory($dir, '.*\.inc', array('.', '..', 'CVS'), 0, FALSE) as $filename => $info) { $bool = ( module_exists($info->name) && !module_hook($info->name, 'metatags_type') ); if ($bool) { module_load_include('inc', 'nodewords', 'includes/' . $info->name); } } nodewords_load_all_includes('nodewords.hooks.inc'); } function _nodewords_node_load($options) { return node_load( array('nid' => $options['id'], 'vid' => $options['sid']) ); } /** * Render the meta tag values as HTML. * * @param $tags * An array of tags. * * @param $output_type * The type of output, 'head' (default), or 'update index'. * * @return * A string containing the HTML output for the META tag. */ function _nodewords_output_tags(array $tags) { $output = array(); $tags_info = nodewords_get_possible_tags(); $weights = array(); foreach ($tags as $name => $content) { if (empty($content)) { continue; } $parts = explode(':', $name); $template = ''; if (!isset($parts[1])) { $parts[1] = $parts[0]; } if (!is_array($content)) { $content = array($content); } foreach ($content as $value) { $bool = ( isset($tags_info[$parts[0]]['templates']['head'][$parts[1]]) && ($meta_name = check_plain(decode_entities(strip_tags($parts[1])))) && ($meta_content = trim(check_plain(decode_entities(strip_tags(preg_replace('/(\s)\s+/', '$1', $value)))))) ); if ($bool) { $replace = array( '%name' => $meta_name, '%content' => $meta_content, '%attributes' => empty($tags_info[$parts[0]]['attributes'][$parts[1]]) ? '' : drupal_attributes($tags_info[$parts[0]]['attributes'][$parts[1]]), ); $template = $tags_info[$parts[0]]['templates']['head'][$parts[1]]; $weight = isset($tags_info[$parts[0]]['weight'][$parts[1]]) ? $tags_info[$parts[0]]['weight'][$parts[1]] : 0; switch ($template) { case NODEWORDS_META: $template = ''; break; case NODEWORDS_HTTP_EQUIV: $template = ''; break; case NODEWORDS_LINK_REL: $template = ''; break; case NODEWORDS_LINK_REV: $template = ''; break; default: if (!is_string($template)) { $template = ''; } break; } } if (!empty($template)) { $output[] = strtr($template, $replace); $weights[] = $weight; } } } if (count($output)) { array_multisort($weights, $output); return implode("\n", $output); } else { return ''; } } function _nodewords_tag_value($tag, $value, $options = array()) { static $default = NULL; $options += _nodewords_get_default_metatags_type(); $id = $options['id']; $sid = $options['sid']; $type = $options['type']; if (!isset($default[$type][$id][$sid])) { $default_values = array(); nodewords_load_all_includes('nodewords.hooks.inc'); drupal_alter( 'metatags_default_values', $default_values, $options + array('phase' => 'pre_load') ); if (!empty($default_values)) { $default[$type][$id][$sid] = $default_values; } else { $default[$type][$id][$sid] = nodewords_load_tags(); drupal_alter( 'metatags_default_values', $default[$type][$id][$sid], $options + array('phase' => 'post_load') ); } } if ($type == NODEWORDS_TYPE_DEFAULT) { $value = isset($default[$type][$id][$sid][$tag]) ? $default[$type][$id][$sid][$tag] : array(); } else { $tags_info = nodewords_get_possible_tags(); $variable = empty($options['admin']) ? 'nodewords_ui_use_default_value_' . $tag : 'nodewords_admin_use_default_value_' . $tag; switch (variable_get($variable, 'empty')) { case 'empty': $bool = ( isset($tags_info[$tag]['callback']) && function_exists($function = $tags_info[$tag]['callback'] . '_is_empty') ); if ($bool && $function($value)) { $value = isset($default[$type][$id][$sid][$tag]) ? $default[$type][$id][$sid][$tag] : array(); } elseif (!$bool && empty($value['value'])) { $value = isset($default[$type][$id][$sid][$tag]) ? $default[$type][$id][$sid][$tag] : array(); } break; case 'always': $value = isset($default[$type][$id][$sid][$tag]) ? $default[$type][$id][$sid][$tag] : array(); break; } } return $value; } function _nodewords_taxonomy_load(array $options) { $value = NULL; if ($options['type'] == NODEWORDS_TYPE_TERM) { $value = taxonomy_get_term($options['id']); } elseif ($options['type'] == NODEWORDS_TYPE_TERM) { $value = taxonomy_vocabulary_load($options['id']); } return $value; }