/**
  * Converts a JLSuggest database string into a URL.
  * 
  * @since 6.0
  * 
  * @param string $value The JLSuggest database string to convert.
  * @param bool $get_src_if_media Whether to get the URL to the actual media item rather than the URL to its WP-powered singular page, if the item is an attachment.
  * @return string The URL of the referenced destination
  */
 function jlsuggest_value_to_url($value, $get_src_if_media = false)
 {
     list($to_genus, $to_type, $to_id) = $this->jlsuggest_value_explode($value);
     switch ($to_genus) {
         case 'url':
             return $to_id;
             break;
         case 'posttype':
             $to_id = (int) $to_id;
             switch (get_post_status($to_id)) {
                 case 'publish':
                     if ($get_src_if_media && 'attachment' == get_post_type($to_id)) {
                         return wp_get_attachment_url($to_id);
                     }
                     return get_permalink($to_id);
                 case false:
                     //Post doesn't exist
                 //Post doesn't exist
                 default:
                     //Post exists but isn't published
                     return false;
             }
             break;
         case 'taxonomy':
             $to_id = (int) $to_id;
             $term_link = get_term_link($to_id, $to_type);
             if ($term_link && !is_wp_error($term_link)) {
                 return $term_link;
             }
             return false;
             break;
         case 'home':
             return suwp::get_blog_home_url();
             break;
         case 'author':
             $to_id = (int) $to_id;
             if (is_user_member_of_blog($to_id)) {
                 return get_author_posts_url($to_id);
             }
             return false;
             break;
         case 'internal-link-alias':
             if ($this->plugin->module_exists('internal-link-aliases')) {
                 $alias_dir = $this->get_setting('alias_dir', 'go', 'internal-link-aliases');
                 $aliases = $this->get_setting('aliases', array(), 'internal-link-aliases');
                 if (isset($aliases[$to_id]['to'])) {
                     $u_alias_to = urlencode($aliases[$to_id]['to']);
                     return get_bloginfo('url') . "/{$alias_dir}/{$u_alias_to}/";
                 }
             }
             return false;
             break;
     }
     return false;
 }
 function head_tag_output()
 {
     global $wp_query;
     $tags = $twitter_tags = array();
     if (is_home()) {
         //Type
         $tags['og:type'] = 'blog';
         //Twitter Type
         $twitter_tags['twitter:card'] = 'summary';
         //Title
         if (!($tags['og:title'] = $this->get_setting('home_og_title'))) {
             $tags['og:title'] = get_bloginfo('name');
         }
         //Description
         if (!($tags['og:description'] = $this->get_setting('home_og_description'))) {
             $tags['og:description'] = get_bloginfo('description');
         }
         //URL
         $tags['og:url'] = suwp::get_blog_home_url();
         //Image
         $tags['og:image'] = $this->get_setting('home_og_image');
     } elseif (is_singular()) {
         $post = $wp_query->get_queried_object();
         if (is_object($post)) {
             //Type
             if (!($tags['og:type'] = $this->get_postmeta('og_type'))) {
                 $tags['og:type'] = $this->get_setting("default_{$post->post_type}_og_type");
             }
             //Twitter Type
             if (!($twitter_tags['twitter:card'] = $this->get_postmeta('twitter_card'))) {
                 $twitter_tags['twitter:card'] = $this->get_setting("default_{$post->post_type}_twitter_card");
             }
             //Title
             if (!($tags['og:title'] = $this->get_postmeta('og_title'))) {
                 $tags['og:title'] = strip_tags(apply_filters('single_post_title', $post->post_title));
             }
             //Description
             if (!($tags['og:description'] = $this->get_postmeta('og_description'))) {
                 if ($this->plugin->call_module_func('meta-descriptions', 'get_meta_desc', $meta_desc, false) && $meta_desc) {
                     $tags['og:description'] = $meta_desc;
                 }
             }
             //URL
             $tags['og:url'] = get_permalink($post->ID);
             //Image
             $tags['og:image'] = $this->jlsuggest_value_to_url($this->get_postmeta('og_image'), true);
             if (!$tags['og:image']) {
                 if ('attachment' == $post->post_type) {
                     $tags['og:image'] = wp_get_attachment_url();
                 } elseif (current_theme_supports('post-thumbnails') && ($thumbnail_id = get_post_thumbnail_id($post->ID))) {
                     $tags['og:image'] = wp_get_attachment_url($thumbnail_id);
                 }
             }
             //Additional fields
             switch ($tags['og:type']) {
                 case 'article':
                     $tags['article:published_time'] = get_the_date('Y-m-d');
                     $tags['article:modified_time'] = get_the_modified_date('Y-m-d');
                     //Authorship generally doesn't apply to pages
                     if (!is_page() && $this->get_setting('enable_og_article_author', true)) {
                         $tags['article:author'] = get_author_posts_url($post->post_author);
                     }
                     $single_category = count(get_the_category()) == 1;
                     $taxonomy_names = suwp::get_taxonomy_names();
                     foreach ($taxonomy_names as $taxonomy_name) {
                         if ($terms = get_the_terms(get_the_ID(), $taxonomy_name)) {
                             if ($single_category && 'category' == $taxonomy_name) {
                                 $meta_property = 'article:section';
                             } else {
                                 $meta_property = 'article:tag';
                             }
                             foreach ($terms as $term) {
                                 $tags[$meta_property][] = $term->name;
                             }
                         }
                     }
                     break;
             }
             //Author's Twitter Handle
             $handle = get_user_meta($post->post_author, 'twitter', true);
             $handle = $this->sanitize_twitter_handle($handle);
             $twitter_tags['twitter:creator'] = $handle;
         }
     } elseif (is_author()) {
         $author = $wp_query->get_queried_object();
         if (is_object($author)) {
             //Type
             $tags['og:type'] = 'profile';
             //Title
             $tags['og:title'] = $author->display_name;
             //Description
             $tags['og:title'] = get_the_author_meta('description', $author->ID);
             //Image
             $tags['og:image'] = false;
             //URL
             $tags['og:url'] = get_author_posts_url($author->ID, $author->user_nicename);
             //First Name
             $tags['profile:first_name'] = get_the_author_meta('first_name', $author->ID);
             //Last Name
             $tags['profile:last_name'] = get_the_author_meta('last_name', $author->ID);
             //Username
             $tags['profile:username'] = $author->user_login;
             //Twitter Handle
             $handle = get_user_meta($author->ID, 'twitter', true);
             $handle = $this->sanitize_twitter_handle($handle);
             $twitter_tags['twitter:creator'] = $handle;
         }
     } else {
         return;
     }
     if ($tags['og:type'] == 'none') {
         $tags['og:type'] = '';
     }
     if ((!isset($tags['og:image']) || !$tags['og:image']) && $tags['og:image'] !== false) {
         $tags['og:image'] = $this->jlsuggest_value_to_url($this->get_setting('default_og_image'), true);
     }
     //Site Name
     if (!($tags['og:site_name'] = $this->get_setting('og_site_name'))) {
         $tags['og:site_name'] = get_bloginfo('name');
     }
     //FB App ID
     $tags['fb:app_id'] = $this->get_setting('default_fb_app_id');
     //Twitter Site Handle
     $twitter_tags['twitter:site'] = $this->get_setting('twitter_site_handle');
     $twitter_tags['twitter:site:id'] = $this->get_setting('twitter_site_id_handle');
     $twitter_tags['twitter:creator'] = $this->get_setting('twitter_creator_handle');
     $twitter_tags['twitter:creator:id'] = $this->get_setting('twitter_creator_id_handle');
     $twitter_tags['twitter:description'] = $this->get_setting('twitter_description_handle');
     $twitter_tags['twitter:title'] = $this->get_setting('twitter_title_handle');
     $twitter_tags['twitter:image:src'] = $this->get_setting('twitter_image_src_handle');
     $twitter_tags['twitter:image:width'] = $this->get_setting('twitter_image_width_handle');
     $twitter_tags['twitter:image:height'] = $this->get_setting('twitter_image_height_handle');
     $twitter_tags['twitter:data1'] = $this->get_setting('twitter_data1_handle');
     $twitter_tags['twitter:label1'] = $this->get_setting('twitter_label1_handle');
     $twitter_tags['twitter:data2'] = $this->get_setting('twitter_data2_handle');
     $twitter_tags['twitter:label2'] = $this->get_setting('twitter_label2_handle');
     $twitter_tags['twitter:image0:src'] = $this->get_setting('twitter_image0_src_handle');
     $twitter_tags['twitter:image1:src'] = $this->get_setting('twitter_image1_src_handle');
     $twitter_tags['twitter:image2:src'] = $this->get_setting('twitter_image2_src_handle');
     $twitter_tags['twitter:image3:src'] = $this->get_setting('twitter_image3_src_handle');
     $twitter_tags['twitter:player'] = $this->get_setting('twitter_player_handle');
     $twitter_tags['twitter:player:width'] = $this->get_setting('twitter_player_width_handle');
     $twitter_tags['twitter:player:height'] = $this->get_setting('twitter_player_height_handle');
     $twitter_tags['twitter:player:stream'] = $this->get_setting('twitter_player_stream_handle');
     $twitter_tags['twitter:app:name:iphone'] = $this->get_setting('twitter_app_name_iphone_handle');
     $twitter_tags['twitter:app:id:iphone'] = $this->get_setting('twitter_app_id_iphone_handle');
     $twitter_tags['twitter:app:url:iphone'] = $this->get_setting('twitter_app_url_iphone_handle');
     $twitter_tags['twitter:app:name:iphone'] = $this->get_setting('twitter_app_name_ipad_handle');
     $twitter_tags['twitter:app:id:iphone'] = $this->get_setting('twitter_app_id_ipad_handle');
     $twitter_tags['twitter:app:url:iphone'] = $this->get_setting('twitter_app_url_ipad_handle');
     $twitter_tags['twitter:app:name:googleplay'] = $this->get_setting('twitter_app_name_googleplay_handle');
     $twitter_tags['twitter:app:id:googleplay'] = $this->get_setting('twitter_app_id_googleplay_handle');
     $twitter_tags['twitter:app:url:googleplay'] = $this->get_setting('twitter_app_url_googleplay_handle');
     //Output meta tags
     $namespace_urls = $this->namespaces_declared ? array() : $this->get_namespace_urls();
     $doctype = $this->get_setting('doctype', '');
     switch ($doctype) {
         case 'xhtml':
             $output_formats = array('<meta%3$s name="%1$s" content="%2$s" />' => array_merge($tags, $twitter_tags));
             break;
         case 'html5':
             $output_formats = array('<meta%3$s property="%1$s" content="%2$s">' => array_merge($tags, $twitter_tags));
             break;
         default:
             $output_formats = array('<meta%3$s property="%1$s" content="%2$s" />' => $tags, '<meta%3$s name="%1$s" content="%2$s" />' => $twitter_tags);
             break;
     }
     foreach ($output_formats as $html_format => $format_tags) {
         foreach ($format_tags as $property => $values) {
             foreach ((array) $values as $value) {
                 $property = su_esc_attr($property);
                 $value = su_esc_attr($value);
                 if (strlen(trim($property)) && strlen(trim($value))) {
                     $namespace_attr = '';
                     $namespace = sustr::upto($property, ':');
                     if (!empty($namespace_urls[$namespace])) {
                         $a_namespace = su_esc_attr($namespace);
                         $a_namespace_url = su_esc_attr($namespace_urls[$namespace]);
                         switch ($doctype) {
                             case 'xhtml':
                                 $namespace_attr = " xmlns:{$a_namespace}=\"{$a_namespace_url}\"";
                                 break;
                             case 'html5':
                             default:
                                 $namespace_attr = " prefix=\"{$a_namespace}: {$a_namespace_url}\"";
                                 break;
                         }
                     }
                     echo "\t";
                     printf($html_format, $property, $value, $namespace_attr);
                     echo "\n";
                 }
             }
         }
     }
 }