/** * Generates basic metadata for the head area. * */ function amt_add_basic_metadata_head($post, $attachments, $embedded_media, $options) { $do_description = $options["auto_description"] == "1" ? true : false; $do_keywords = $options["auto_keywords"] == "1" ? true : false; $do_noodp_description = $options["noodp_description"] == "1" ? true : false; // Array to store metadata $metadata_arr = array(); // Robots Meta Tag. $robots_content = ''; if ($do_noodp_description && (is_front_page() || is_singular())) { // Add NOODP on posts and pages $robots_content = 'NOODP,NOYDIR'; // Allow filtering of the robots meta tag content. $robots_content = apply_filters('amt_robots_data', $robots_content); } // Add a robots meta tag if its content is not empty. if (!empty($robots_content)) { $metadata_arr[] = '<meta name="robots" content="' . $robots_content . '" />'; } // Default front page displaying latest posts if (amt_is_default_front_page()) { // Description and Keywords from the Add-Meta-Tags settings override // default behaviour. // Description if ($do_description) { // Use the site description from the Add-Meta-Tags settings. // Fall back to the blog description. $site_description = $options["site_description"]; if (empty($site_description)) { // Alternatively, use the blog description // Here we sanitize the provided description for safety $site_description = sanitize_text_field(amt_sanitize_description(get_bloginfo('description'))); } // If we have a description, use it in the description meta-tag of the front page if (!empty($site_description)) { // Note: Contains multipage information through amt_process_paged() $metadata_arr[] = '<meta name="description" content="' . esc_attr(amt_process_paged($site_description)) . '" />'; } } // Keywords if ($do_keywords) { // Use the site keywords from the Add-Meta-Tags settings. // Fall back to the blog categories. $site_keywords = $options["site_keywords"]; if (empty($site_keywords)) { // Alternatively, use the blog categories // Here we sanitize the provided keywords for safety $site_keywords = sanitize_text_field(amt_sanitize_keywords(amt_get_all_categories())); } // If we have keywords, use them in the keywords meta-tag of the front page if (!empty($site_keywords)) { $metadata_arr[] = '<meta name="keywords" content="' . esc_attr($site_keywords) . '" />'; } } // Attachments } elseif (is_attachment()) { // has to be before is_singular() since is_singular() is true for attachments. // Description if ($do_description) { $description = amt_get_content_description($post, $auto = $do_description); if (!empty($description)) { // Note: Contains multipage information through amt_process_paged() $metadata_arr[] = '<meta name="description" content="' . esc_attr(amt_process_paged($description)) . '" />'; } } // No keywords // Content pages and static pages used as "front page" and "posts page" // This also supports products via is_singular() } elseif (is_singular() || amt_is_static_front_page() || amt_is_static_home()) { // Description if ($do_description) { $description = amt_get_content_description($post, $auto = $do_description); if (!empty($description)) { // Note: Contains multipage information through amt_process_paged() $metadata_arr[] = '<meta name="description" content="' . esc_attr(amt_process_paged($description)) . '" />'; } } // Keywords if ($do_keywords) { $keywords = amt_get_content_keywords($post, $auto = $do_keywords); if (!empty($keywords)) { $metadata_arr[] = '<meta name="keywords" content="' . esc_attr($keywords) . '" />'; // Static Posts Index Page // If no keywords have been set in the metabox and this is the static page, // which displayes the latest posts, use the categories of the posts in the loop. } elseif (amt_is_static_home()) { // Here we sanitize the provided keywords for safety $cats_from_loop = sanitize_text_field(amt_sanitize_keywords(implode(', ', amt_get_categories_from_loop()))); if (!empty($cats_from_loop)) { $metadata_arr[] = '<meta name="keywords" content="' . esc_attr($cats_from_loop) . '" />'; } } } // 'news_keywords' $newskeywords = amt_get_post_meta_newskeywords($post->ID); if (!empty($newskeywords)) { $metadata_arr[] = '<meta name="news_keywords" content="' . esc_attr($newskeywords) . '" />'; } // per post full meta tags $full_metatags_for_content = amt_get_post_meta_full_metatags($post->ID); if (!empty($full_metatags_for_content)) { $metadata_arr[] = html_entity_decode(stripslashes($full_metatags_for_content)); } // Category based archives } elseif (is_category()) { if ($do_description) { // If set, the description of the category is used in the 'description' metatag. // Otherwise, a generic description is used. // Here we sanitize the provided description for safety $description_content = sanitize_text_field(amt_sanitize_description(category_description())); // Note: Contains multipage information through amt_process_paged() if (empty($description_content)) { // Add a filtered generic description. $generic_description = apply_filters('amt_generic_description_category_archive', __('Content filed under the %s category.', 'add-meta-tags')); $generic_description = sprintf($generic_description, single_cat_title($prefix = '', $display = false)); $metadata_arr[] = '<meta name="description" content="' . esc_attr(amt_process_paged($generic_description)) . '" />'; } else { $metadata_arr[] = '<meta name="description" content="' . esc_attr(amt_process_paged($description_content)) . '" />'; } } if ($do_keywords) { // The category name alone is included in the 'keywords' metatag // Here we sanitize the provided keywords for safety $cur_cat_name = sanitize_text_field(amt_sanitize_keywords(single_cat_title($prefix = '', $display = false))); if (!empty($cur_cat_name)) { $metadata_arr[] = '<meta name="keywords" content="' . esc_attr($cur_cat_name) . '" />'; } } } elseif (is_tag()) { if ($do_description) { // If set, the description of the tag is used in the 'description' metatag. // Otherwise, a generic description is used. // Here we sanitize the provided description for safety $description_content = sanitize_text_field(amt_sanitize_description(tag_description())); // Note: Contains multipage information through amt_process_paged() if (empty($description_content)) { // Add a filtered generic description. $generic_description = apply_filters('amt_generic_description_tag_archive', __('Content tagged with %s.', 'add-meta-tags')); $generic_description = sprintf($generic_description, single_tag_title($prefix = '', $display = false)); $metadata_arr[] = '<meta name="description" content="' . esc_attr(amt_process_paged($generic_description)) . '" />'; } else { $metadata_arr[] = '<meta name="description" content="' . esc_attr(amt_process_paged($description_content)) . '" />'; } } if ($do_keywords) { // The tag name alone is included in the 'keywords' metatag // Here we sanitize the provided keywords for safety $cur_tag_name = sanitize_text_field(amt_sanitize_keywords(single_tag_title($prefix = '', $display = false))); if (!empty($cur_tag_name)) { $metadata_arr[] = '<meta name="keywords" content="' . esc_attr($cur_tag_name) . '" />'; } } // Custom taxonomies - Should be after is_category() and is_tag(), as it would catch those taxonomies as well. // This also supports product groups via is_tax(). Only product groups that are WordPress custom taxonomies are supported. } elseif (is_tax()) { // Taxonomy term object. // When viewing taxonomy archives, the $post object is the taxonomy term object. Check with: var_dump($post); $tax_term_object = $post; //var_dump($tax_term_object); if ($do_description) { // If set, the description of the custom taxonomy term is used in the 'description' metatag. // Otherwise, a generic description is used. // Here we sanitize the provided description for safety $description_content = sanitize_text_field(amt_sanitize_description(term_description($tax_term_object->term_id, $tax_term_object->taxonomy))); // Note: Contains multipage information through amt_process_paged() if (empty($description_content)) { // Add a filtered generic description. // Construct the filter name. Template: ``amt_generic_description_TAXONOMYSLUG_archive`` $taxonomy_description_filter_name = sprintf('amt_generic_description_%s_archive', $tax_term_object->taxonomy); // var_dump($taxonomy_description_filter_name); $generic_description = apply_filters($taxonomy_description_filter_name, __('Content filed under the %s taxonomy.', 'add-meta-tags')); $generic_description = sprintf($generic_description, single_term_title($prefix = '', $display = false)); $metadata_arr[] = '<meta name="description" content="' . esc_attr(amt_process_paged($generic_description)) . '" />'; } else { $metadata_arr[] = '<meta name="description" content="' . esc_attr(amt_process_paged($description_content)) . '" />'; } } if ($do_keywords) { // The taxonomy term name alone is included in the 'keywords' metatag. // Here we sanitize the provided keywords for safety. $cur_tax_term_name = sanitize_text_field(amt_sanitize_keywords(single_term_title($prefix = '', $display = false))); if (!empty($cur_tax_term_name)) { $metadata_arr[] = '<meta name="keywords" content="' . esc_attr($cur_tax_term_name) . '" />'; } } } elseif (is_author()) { // Author object // NOTE: Inside the author archives `$post->post_author` does not contain the author object. // In this case the $post (get_queried_object()) contains the author object itself. // We also can get the author object with the following code. Slug is what WP uses to construct urls. // $author = get_user_by( 'slug', get_query_var( 'author_name' ) ); // Also, ``get_the_author_meta('....', $author)`` returns nothing under author archives. // Access user meta with: $author->description, $author->user_email, etc // $author = get_queried_object(); $author = $post; // If a bio has been set in the user profile, use it in the description metatag of the // first page of the author archive *ONLY*. The other pages of the author archive use a generic description. // This happens because the 1st page of the author archive is considered the profile page // by the other metadata modules. // Otherwise use a generic meta tag. if ($do_description) { // Here we sanitize the provided description for safety $author_description = sanitize_text_field(amt_sanitize_description($author->description)); if (empty($author_description) || is_paged()) { // Note: Contains multipage information through amt_process_paged() // Add a filtered generic description. $generic_description = apply_filters('amt_generic_description_author_archive', __('Content published by %s.', 'add-meta-tags')); $generic_description = sprintf($generic_description, $author->display_name); $metadata_arr[] = '<meta name="description" content="' . esc_attr(amt_process_paged($generic_description)) . '" />'; } else { $metadata_arr[] = '<meta name="description" content="' . esc_attr($author_description) . '" />'; } } // For the keywords metatag use the categories of the posts the author has written and are displayed in the current page. if ($do_keywords) { // Here we sanitize the provided keywords for safety $cats_from_loop = sanitize_text_field(amt_sanitize_keywords(implode(', ', amt_get_categories_from_loop()))); if (!empty($cats_from_loop)) { $metadata_arr[] = '<meta name="keywords" content="' . esc_attr($cats_from_loop) . '" />'; } } } // Add site wide meta tags if (!empty($options["site_wide_meta"])) { $metadata_arr[] = html_entity_decode(stripslashes($options["site_wide_meta"])); } // On every page print the copyright head link if (!empty($options["copyright_url"])) { $metadata_arr[] = '<link rel="copyright" type="text/html" title="' . esc_attr(get_bloginfo('name')) . ' Copyright Information" href="' . esc_url_raw($options["copyright_url"]) . '" />'; } // Filtering of the generated basic metadata $metadata_arr = apply_filters('amt_basic_metadata_head', $metadata_arr); return $metadata_arr; }
/** * Return an array of Schema.org metatags suitable for the author object of * the content. Accepts the $post object as argument. */ function amt_get_jsonld_schemaorg_author_array($author_id, $options) { //$author_obj = get_user_by( 'id', $author_id ); $metadata_arr = array(); // Schema.org type $metadata_arr['@type'] = 'Person'; // name $display_name = get_the_author_meta('display_name', $author_id); $metadata_arr['name'] = esc_attr($display_name); // description // Here we sanitize the provided description for safety $author_description = sanitize_text_field(amt_sanitize_description(get_the_author_meta('description', $author_id))); if (!empty($author_description)) { $metadata_arr['description'] = esc_attr($author_description); } // Profile Image // First use the global image override URL $image_data = amt_get_image_data(amt_get_user_meta_image_url($author_id)); if (!empty($image_data)) { $image_size = apply_filters('amt_image_size_index', 'full'); $image_meta_array = amt_get_jsonld_schemaorg_image_array($options, $image_data, $size = $image_size); if (!empty($image_meta_array)) { $metadata_arr['image'] = array(); $metadata_arr['image'][] = $image_meta_array; } } else { $author_email = sanitize_email(get_the_author_meta('user_email', $author_id)); $avatar_size = apply_filters('amt_avatar_size', 128); $avatar_url = ''; // First try to get the avatar link by using get_avatar(). // Important: for this to work the "Show Avatars" option should be enabled in Settings > Discussion. $avatar_img = get_avatar(get_the_author_meta('ID', $author_id), $avatar_size, '', get_the_author_meta('display_name', $author_id)); if (!empty($avatar_img)) { if (preg_match("#src=['\"]([^'\"]+)['\"]#", $avatar_img, $matches)) { $avatar_url = $matches[1]; } } elseif (!empty($author_email)) { // If the user has provided an email, we use it to construct a gravatar link. $avatar_url = "http://www.gravatar.com/avatar/" . md5($author_email) . "?s=" . $avatar_size; } if (!empty($avatar_url)) { //$avatar_url = html_entity_decode($avatar_url, ENT_NOQUOTES, 'UTF-8'); //$metadata_arr['image'] = esc_url_raw( $avatar_url ); $image_data = amt_get_image_data(sprintf('%s,%dx%d', $avatar_url, $avatar_size, $avatar_size)); if (!empty($image_data)) { $image_meta_array = amt_get_jsonld_schemaorg_image_array($options, $image_data); if (!empty($image_meta_array)) { $metadata_arr['image'] = array(); $metadata_arr['image'][] = $image_meta_array; } } } } // url // The URL to the author archive is added as the url. //$metadata_arr['url'] = esc_url_raw( get_author_posts_url( $author_id ) ); $metadata_arr['url'] = esc_url_raw(amt_get_local_author_profile_url($author_id, $options)); // sameAs $metadata_arr['sameAs'] = array(); // Social Profile Links are added as sameAs properties // Those from the WordPress User Profile page are used. // Google+ Author $googleplus_author_url = get_the_author_meta('amt_googleplus_author_profile_url', $author_id); if (!empty($googleplus_author_url)) { $metadata_arr['sameAs'][] = esc_url_raw($googleplus_author_url, array('http', 'https')); } // Facebook $facebook_author_url = get_the_author_meta('amt_facebook_author_profile_url', $author_id); if (!empty($facebook_author_url)) { $metadata_arr['sameAs'][] = esc_url_raw($facebook_author_url, array('http', 'https')); } // Twitter $twitter_author_username = get_the_author_meta('amt_twitter_author_username', $author_id); if (!empty($twitter_author_username)) { $metadata_arr['sameAs'][] = 'https://twitter.com/' . esc_attr($twitter_author_username); } // The User URL as set by the user in the WordPress User Profile page. $user_url = get_the_author_meta('user_url', $author_id); if (!empty($user_url)) { $metadata_arr['sameAs'][] = esc_url_raw($user_url, array('http', 'https')); } // Check if empty if (empty($metadata_arr['sameAs'])) { unset($metadata_arr['sameAs']); } // Allow filtering of the Author meta tags $metadata_arr = apply_filters('amt_jsonld_schemaorg_author_extra', $metadata_arr, $author_id); return $metadata_arr; }
function amt_save_postdata($post_id, $post) { // Verify if this is an auto save routine. // If it is our form has not been submitted, so we dont want to do anything if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) { return; } /* Verify the nonce before proceeding. */ // Verify this came from the our screen and with proper authorization, // because save_post can be triggered at other times if (!isset($_POST['amt_noncename']) || !wp_verify_nonce($_POST['amt_noncename'], plugin_basename(AMT_PLUGIN_FILE))) { return; } // Get the Metadata metabox permissions (filtered) $metabox_permissions = amt_get_metadata_metabox_permissions(); // Global Metadata metabox permission check (can be user customized via filter). if (!current_user_can($metabox_permissions['global_metabox_capability'])) { return; } // Get the Add-Meta-Tags options. $options = get_option("add_meta_tags_opts"); /* Get the post type object. */ $post_type_obj = get_post_type_object($post->post_type); /* Check if the current user has permission to edit the post. */ if (!current_user_can($post_type_obj->cap->edit_post, $post_id)) { return; } // OK, we're authenticated: we need to find and save the data // // Sanitize user input // // // Description if (isset($_POST['amt_custom_description'])) { $description_value = sanitize_text_field(amt_sanitize_description(stripslashes($_POST['amt_custom_description']))); } // Keywords - sanitize_text_field() removes '%ca' part of '%cats%', so we enclose 'sanitize_text_field()' in amt_(convert|revert)_placeholders() if (isset($_POST['amt_custom_keywords'])) { $keywords_value = amt_sanitize_keywords(amt_revert_placeholders(sanitize_text_field(amt_convert_placeholders(stripslashes($_POST['amt_custom_keywords']))))); } // Title if (isset($_POST['amt_custom_title'])) { $title_value = amt_revert_placeholders(sanitize_text_field(amt_convert_placeholders(stripslashes($_POST['amt_custom_title'])))); } // News keywords if (isset($_POST['amt_custom_newskeywords'])) { $newskeywords_value = sanitize_text_field(amt_sanitize_keywords(stripslashes($_POST['amt_custom_newskeywords']))); } // Full metatags - We allow only <meta> elements. if (isset($_POST['amt_custom_full_metatags'])) { $full_metatags_value = esc_textarea(wp_kses(stripslashes($_POST['amt_custom_full_metatags']), amt_get_allowed_html_kses())); } // Image URL if (isset($_POST['amt_custom_image_url'])) { $image_url_value = amt_esc_id_or_url_notation(stripslashes($_POST['amt_custom_image_url'])); } // Content locale if (isset($_POST['amt_custom_content_locale'])) { $content_locale_value = esc_attr(stripslashes($_POST['amt_custom_content_locale'])); } // Express review if (isset($_POST['amt_custom_express_review'])) { $express_review_value = esc_textarea(wp_kses(stripslashes($_POST['amt_custom_express_review']), array())); // // REVIEW_AMPERSAND_NOTE: We replace & to & for (see also REVIEW_AMPERSAND_NOTE in amt-utils.php) // $express_review_value = str_replace('&', '&', $express_review_value); } // List of referenced items - We allow no HTML elements. if (isset($_POST['amt_custom_referenced_list'])) { $referenced_list_value = esc_textarea(wp_kses(stripslashes($_POST['amt_custom_referenced_list']), array())); } // If a value has not been entered we try to delete existing data from the database // If the user has entered data, store it in the database. // Add-Meta-Tags custom field names $amt_description_field_name = '_amt_description'; $amt_keywords_field_name = '_amt_keywords'; $amt_title_field_name = '_amt_title'; $amt_newskeywords_field_name = '_amt_news_keywords'; $amt_full_metatags_field_name = '_amt_full_metatags'; $amt_image_url_field_name = '_amt_image_url'; $amt_content_locale_field_name = '_amt_content_locale'; $amt_express_review_field_name = '_amt_express_review'; $amt_referenced_list_field_name = '_amt_referenced_list'; // As an extra security measure, here we also check the user-defined per box // permissions before we save any data in the database. // Description if ($options['metabox_enable_description'] == '1' && current_user_can($metabox_permissions['description_box_capability'])) { if (empty($description_value)) { delete_post_meta($post_id, $amt_description_field_name); // Also clean up old description field delete_post_meta($post_id, 'description'); } else { update_post_meta($post_id, $amt_description_field_name, $description_value); // Also clean up again old description field - no need to exist any more since the new field is used. delete_post_meta($post_id, 'description'); } } // Keywords if ($options['metabox_enable_keywords'] == '1' && current_user_can($metabox_permissions['keywords_box_capability'])) { if (empty($keywords_value)) { delete_post_meta($post_id, $amt_keywords_field_name); // Also clean up old keywords field delete_post_meta($post_id, 'keywords'); } else { update_post_meta($post_id, $amt_keywords_field_name, $keywords_value); // Also clean up again old keywords field - no need to exist any more since the new field is used. delete_post_meta($post_id, 'keywords'); } } // Title if ($options['metabox_enable_title'] == '1' && current_user_can($metabox_permissions['title_box_capability'])) { if (empty($title_value)) { delete_post_meta($post_id, $amt_title_field_name); } else { update_post_meta($post_id, $amt_title_field_name, $title_value); } } // 'news_keywords' if ($options['metabox_enable_news_keywords'] == '1' && current_user_can($metabox_permissions['news_keywords_box_capability'])) { if (empty($newskeywords_value)) { delete_post_meta($post_id, $amt_newskeywords_field_name); } else { update_post_meta($post_id, $amt_newskeywords_field_name, $newskeywords_value); } } // per post full meta tags if ($options['metabox_enable_full_metatags'] == '1' && current_user_can($metabox_permissions['full_metatags_box_capability'])) { if (empty($full_metatags_value)) { delete_post_meta($post_id, $amt_full_metatags_field_name); } else { update_post_meta($post_id, $amt_full_metatags_field_name, $full_metatags_value); } } // Image URL if ($options['metabox_enable_image_url'] == '1' && current_user_can($metabox_permissions['image_url_box_capability'])) { if (empty($image_url_value)) { delete_post_meta($post_id, $amt_image_url_field_name); } else { update_post_meta($post_id, $amt_image_url_field_name, $image_url_value); } } // Content locale if ($options['metabox_enable_content_locale'] == '1' && current_user_can($metabox_permissions['content_locale_box_capability'])) { if (empty($content_locale_value)) { delete_post_meta($post_id, $amt_content_locale_field_name); } else { update_post_meta($post_id, $amt_content_locale_field_name, $content_locale_value); } } // Express review if ($options['metabox_enable_express_review'] == '1' && current_user_can($metabox_permissions['express_review_box_capability'])) { if (empty($express_review_value)) { delete_post_meta($post_id, $amt_express_review_field_name); } else { update_post_meta($post_id, $amt_express_review_field_name, $express_review_value); } } // Referenced list if ($options['metabox_enable_referenced_list'] == '1' && current_user_can($metabox_permissions['referenced_list_box_capability'])) { if (empty($referenced_list_value)) { delete_post_meta($post_id, $amt_referenced_list_field_name); } else { update_post_meta($post_id, $amt_referenced_list_field_name, $referenced_list_value); } } }
/** * Generates Opengraph metadata. * * Currently for: * - home page * - author archive * - content */ function amt_add_opengraph_metadata_head($post, $attachments, $embedded_media, $options) { if (apply_filters('amt_exclude_opengraph_metadata', false)) { return array(); } $do_auto_opengraph = $options["auto_opengraph"] == "1" ? true : false; if (!$do_auto_opengraph) { return array(); } $metadata_arr = array(); // fb:app_id & fb:admins // We currently let users add the full meta tags for fb:app_id and fb:admins in the site wide meta tags box. // fb:app_id appears everywhere //if ( ! empty($options['social_main_facebook_app_id']) ) { // $metadata_arr[] = '<meta property="fb:app_id" content="' . esc_attr( $options['social_main_facebook_app_id'] ) . '" />'; //} // fb:admins appear everywhere //if ( ! empty($options['social_main_facebook_admins']) ) { // $fb_admins_arr = explode(',', $options['social_main_facebook_admins']); // foreach ( $fb_admins_arr as $fb_admin ) { // $metadata_arr[] = '<meta property="fb:admins" content="' . esc_attr( trim($fb_admin) ) . '" />'; // } //} // no publisher meta tag for facebook, unless it is content // Custom content override if (amt_is_custom($post, $options)) { // Return metadata with: // add_filter( 'amt_custom_metadata_opengraph', 'my_function', 10, 5 ); // Return an array of meta tags. Array item format: ['key_can_be_whatever'] = '<meta name="foo" content="bar" />' $metadata_arr = apply_filters('amt_custom_metadata_opengraph', $metadata_arr, $post, $options, $attachments, $embedded_media); // Default front page displaying the latest posts } elseif (amt_is_default_front_page()) { // Type $metadata_arr[] = '<meta property="og:type" content="website" />'; // Site Name $metadata_arr[] = '<meta property="og:site_name" content="' . esc_attr(get_bloginfo('name')) . '" />'; // Title - Note: Contains multipage information $metadata_arr['og:title'] = '<meta property="og:title" content="' . esc_attr(amt_get_title_for_metadata($options, $post)) . '" />'; // URL - Note: different method to get the permalink on paged archives if (is_paged()) { $metadata_arr[] = '<meta property="og:url" content="' . esc_url_raw(get_pagenum_link(get_query_var('paged'))) . '" />'; } else { $metadata_arr[] = '<meta property="og:url" content="' . esc_url_raw(trailingslashit(get_bloginfo('url'))) . '" />'; } // Site description - Note: Contains multipage information through amt_process_paged() $site_description = amt_get_site_description($options); if (empty($site_description)) { $site_description = get_bloginfo('description'); } if (!empty($site_description)) { $metadata_arr[] = '<meta property="og:description" content="' . esc_attr(amt_process_paged($site_description)) . '" />'; } // Locale $metadata_arr[] = '<meta property="og:locale" content="' . esc_attr(str_replace('-', '_', amt_get_language_site($options))) . '" />'; // Site Image // Use the default image, if one has been set. $image_data = amt_get_default_image_data(); if (!empty($image_data)) { $image_size = apply_filters('amt_image_size_index', 'full'); $image_meta_tags = amt_get_opengraph_image_metatags($options, $image_data, $size = $image_size); if (!empty($image_meta_tags)) { $metadata_arr = array_merge($metadata_arr, $image_meta_tags); } } // Front page using a static page // Note: might also contain a listing of posts which may be paged, so use amt_process_paged() } elseif (amt_is_static_front_page()) { // Type if ($options['author_profile_source'] == 'frontpage') { // The front page is treated as the profile page. $metadata_arr[] = '<meta property="og:type" content="profile" />'; } else { $metadata_arr[] = '<meta property="og:type" content="website" />'; } // Site Name $metadata_arr[] = '<meta property="og:site_name" content="' . esc_attr(get_bloginfo('name')) . '" />'; // Title - Note: Contains multipage information $metadata_arr['og:title'] = '<meta property="og:title" content="' . esc_attr(amt_get_title_for_metadata($options, $post)) . '" />'; // URL - Note: different method to get the permalink on paged archives if (is_paged()) { $metadata_arr[] = '<meta property="og:url" content="' . esc_url_raw(get_pagenum_link(get_query_var('paged'))) . '" />'; } else { $metadata_arr[] = '<meta property="og:url" content="' . esc_url_raw(trailingslashit(get_bloginfo('url'))) . '" />'; } // Site Description - Note: Contains multipage information through amt_process_paged() $content_desc = amt_get_content_description($post); if (!empty($content_desc)) { // Use the pages custom description $metadata_arr[] = '<meta property="og:description" content="' . esc_attr(amt_process_paged($content_desc)) . '" />'; } elseif (get_bloginfo('description')) { // Alternatively use the blog's description $metadata_arr[] = '<meta property="og:description" content="' . esc_attr(amt_process_paged(get_bloginfo('description'))) . '" />'; } // Locale $metadata_arr[] = '<meta property="og:locale" content="' . esc_attr(str_replace('-', '_', amt_get_language_content($options, $post))) . '" />'; // Site Image // First check if a global image override URL has been entered. // If yes, use this image URL and override all other images. $image_data = amt_get_image_attributes_array(amt_get_post_meta_image_url($post->ID)); if (!empty($image_data)) { $image_size = apply_filters('amt_image_size_index', 'full'); $image_meta_tags = amt_get_opengraph_image_metatags($options, $image_data, $size = $image_size); if (!empty($image_meta_tags)) { $metadata_arr = array_merge($metadata_arr, $image_meta_tags); } //$global_image_override_url = amt_get_post_meta_image_url($post->ID); //if ( ! empty( $global_image_override_url ) ) { // $metadata_arr[] = '<meta property="og:image" content="' . esc_url_raw( $global_image_override_url ) . '" />'; // if ( is_ssl() || ( ! is_ssl() && $options["has_https_access"] == "1" ) ) { // $metadata_arr[] = '<meta property="og:image:secure_url" content="' . esc_url_raw( str_replace('http:', 'https:', $global_image_override_url ) ) . '" />'; // } // Then try the featured image, if exists. } elseif (function_exists('has_post_thumbnail') && has_post_thumbnail($post->ID)) { // Allow filtering of the image size. $image_size = apply_filters('amt_image_size_index', 'full'); $metadata_arr = array_merge($metadata_arr, amt_get_opengraph_image_metatags($options, get_post_thumbnail_id($post->ID), $size = $image_size)); } else { // Use the default image, if one has been set. $image_data = amt_get_default_image_data(); if (!empty($image_data)) { $image_size = apply_filters('amt_image_size_index', 'full'); $image_meta_tags = amt_get_opengraph_image_metatags($options, $image_data, $size = $image_size); if (!empty($image_meta_tags)) { $metadata_arr = array_merge($metadata_arr, $image_meta_tags); } } // Alternatively, use default image //$metadata_arr[] = '<meta property="og:image" content="' . esc_url_raw( $options["default_image_url"] ) . '" />'; //if ( is_ssl() || ( ! is_ssl() && $options["has_https_access"] == "1" ) ) { // $metadata_arr[] = '<meta property="og:image:secure_url" content="' . esc_url_raw( str_replace('http:', 'https:', $options["default_image_url"] ) ) . '" />'; //} } // Profile data (only if the front page has been set as the source of profile.) if ($options['author_profile_source'] == 'frontpage') { // Profile first and last name $last_name = get_the_author_meta('last_name', $post->post_author); if (!empty($last_name)) { $metadata_arr[] = '<meta property="profile:last_name" content="' . esc_attr($last_name) . '" />'; } $first_name = get_the_author_meta('first_name', $post->post_author); if (!empty($first_name)) { $metadata_arr[] = '<meta property="profile:first_name" content="' . esc_attr($first_name) . '" />'; } } // The posts index page - a static page displaying the latest posts } elseif (amt_is_static_home()) { // Type $metadata_arr[] = '<meta property="og:type" content="website" />'; // Site Name $metadata_arr[] = '<meta property="og:site_name" content="' . esc_attr(get_bloginfo('name')) . '" />'; // Title - Note: Contains multipage information $metadata_arr['og:title'] = '<meta property="og:title" content="' . esc_attr(amt_get_title_for_metadata($options, $post)) . '" />'; // URL - Note: different method to get the permalink on paged archives if (is_paged()) { $metadata_arr[] = '<meta property="og:url" content="' . esc_url_raw(get_pagenum_link(get_query_var('paged'))) . '" />'; } else { $metadata_arr[] = '<meta property="og:url" content="' . esc_url_raw(get_permalink($post->ID)) . '" />'; } // Site Description - Note: Contains multipage information through amt_process_paged() $content_desc = amt_get_content_description($post); if (!empty($content_desc)) { // Use the pages custom description $metadata_arr[] = '<meta property="og:description" content="' . esc_attr(amt_process_paged($content_desc)) . '" />'; } elseif (get_bloginfo('description')) { // Alternatively use a generic description $metadata_arr[] = '<meta property="og:description" content="' . amt_process_paged("An index of the latest content.") . '" />'; } // Locale $metadata_arr[] = '<meta property="og:locale" content="' . esc_attr(str_replace('-', '_', amt_get_language_content($options, $post))) . '" />'; // Site Image // First check if a global image override URL has been entered. // If yes, use this image URL and override all other images. $image_data = amt_get_image_attributes_array(amt_get_post_meta_image_url($post->ID)); if (!empty($image_data)) { $image_size = apply_filters('amt_image_size_index', 'full'); $image_meta_tags = amt_get_opengraph_image_metatags($options, $image_data, $size = $image_size); if (!empty($image_meta_tags)) { $metadata_arr = array_merge($metadata_arr, $image_meta_tags); } //$global_image_override_url = amt_get_post_meta_image_url($post->ID); //if ( ! empty( $global_image_override_url ) ) { // $metadata_arr[] = '<meta property="og:image" content="' . esc_url_raw( $global_image_override_url ) . '" />'; // if ( is_ssl() || ( ! is_ssl() && $options["has_https_access"] == "1" ) ) { // $metadata_arr[] = '<meta property="og:image:secure_url" content="' . esc_url_raw( str_replace('http:', 'https:', $global_image_override_url ) ) . '" />'; // } // Then try the featured image, if exists. } elseif (function_exists('has_post_thumbnail') && has_post_thumbnail($post->ID)) { // Allow filtering of the image size. $image_size = apply_filters('amt_image_size_index', 'full'); $metadata_arr = array_merge($metadata_arr, amt_get_opengraph_image_metatags($options, get_post_thumbnail_id($post->ID), $size = $image_size)); } else { // Use the default image, if one has been set. $image_data = amt_get_default_image_data(); if (!empty($image_data)) { $image_size = apply_filters('amt_image_size_index', 'full'); $image_meta_tags = amt_get_opengraph_image_metatags($options, $image_data, $size = $image_size); if (!empty($image_meta_tags)) { $metadata_arr = array_merge($metadata_arr, $image_meta_tags); } } // Alternatively, use default image //$metadata_arr[] = '<meta property="og:image" content="' . esc_url_raw( $options["default_image_url"] ) . '" />'; //if ( is_ssl() || ( ! is_ssl() && $options["has_https_access"] == "1" ) ) { // $metadata_arr[] = '<meta property="og:image:secure_url" content="' . esc_url_raw( str_replace('http:', 'https:', $options["default_image_url"] ) ) . '" />'; //} } // Category, Tag, Taxonomy archives // Note: product groups should pass the is_tax() validation, so no need for // amt_is_product_group(). We do not support other product groups. // amt_is_product_group() is used below to set the og:type to product.group. } elseif (is_category() || is_tag() || is_tax()) { // Taxonomy term object. // When viewing taxonomy archives, the $post object is the taxonomy term object. Check with: var_dump($post); $tax_term_object = $post; //var_dump($tax_term_object); // Type // In case of a product group taxonomy, we set the og:type to product.group if (amt_is_product_group()) { $metadata_arr[] = '<meta property="og:type" content="product.group" />'; } else { $metadata_arr[] = '<meta property="og:type" content="website" />'; } // Site Name $metadata_arr[] = '<meta property="og:site_name" content="' . esc_attr(get_bloginfo('name')) . '" />'; // Title - Note: Contains multipage information $metadata_arr['og:title'] = '<meta property="og:title" content="' . esc_attr(amt_get_title_for_metadata($options, $post)) . '" />'; // URL - Note: different method to get the permalink on paged archives $url = get_term_link($tax_term_object); if (is_paged()) { $url = trailingslashit($url) . get_query_var('paged') . '/'; } $metadata_arr[] = '<meta property="og:url" content="' . esc_url_raw($url) . '" />'; // Description // If set, the description of the custom taxonomy term is used in the 'description' metatag. // Otherwise, a generic description is used. // Here we sanitize the provided description for safety $description_content = sanitize_text_field(amt_sanitize_description(term_description($tax_term_object->term_id, $tax_term_object->taxonomy))); // Note: Contains multipage information through amt_process_paged() if (empty($description_content)) { // Add a filtered generic description. // Filter name if (is_category()) { $generic_description = apply_filters('amt_generic_description_category_archive', __('Content filed under the %s category.', 'add-meta-tags')); } elseif (is_tag()) { $generic_description = apply_filters('amt_generic_description_tag_archive', __('Content tagged with %s.', 'add-meta-tags')); } elseif (is_tax()) { // Construct the filter name. Template: ``amt_generic_description_TAXONOMYSLUG_archive`` $taxonomy_description_filter_name = sprintf('amt_generic_description_%s_archive', $tax_term_object->taxonomy); // var_dump($taxonomy_description_filter_name); // Generic description $generic_description = apply_filters($taxonomy_description_filter_name, __('Content filed under the %s taxonomy.', 'add-meta-tags')); } // Final generic description $generic_description = sprintf($generic_description, single_term_title($prefix = '', $display = false)); $metadata_arr[] = '<meta property="og:description" content="' . esc_attr(amt_process_paged($generic_description)) . '" />'; } else { $metadata_arr[] = '<meta property="og:description" content="' . esc_attr(amt_process_paged($description_content)) . '" />'; } // Locale $metadata_arr[] = '<meta property="og:locale" content="' . esc_attr(str_replace('-', '_', amt_get_language_site($options))) . '" />'; // Image // Use an image from the 'Global image override' field. // Otherwise, use a user defined image via filter. // Otherwise use default image. $image_data = amt_get_image_attributes_array(amt_get_term_meta_image_url($tax_term_object->term_id)); if (!empty($image_data)) { $image_size = apply_filters('amt_image_size_index', 'full'); $image_meta_tags = amt_get_opengraph_image_metatags($options, $image_data, $size = $image_size); if (!empty($image_meta_tags)) { $metadata_arr = array_merge($metadata_arr, $image_meta_tags); } } else { // First filter using a term/taxonomy agnostic filter name. $taxonomy_image_url = apply_filters('amt_taxonomy_force_image_url', '', $tax_term_object); if (empty($taxonomy_image_url)) { // Second filter (term/taxonomy dependent). // Construct the filter name. Template: ``amt_taxonomy_image_url_TAXONOMYSLUG_TERMSLUG`` $taxonomy_image_url_filter_name = sprintf('amt_taxonomy_image_url_%s_%s', $tax_term_object->taxonomy, $tax_term_object->slug); //var_dump($taxonomy_image_url_filter_name); // The default image, if set, is used by default. $taxonomy_image_url = apply_filters($taxonomy_image_url_filter_name, $options["default_image_url"]); } if (!empty($taxonomy_image_url)) { $image_data = amt_get_image_attributes_array($taxonomy_image_url); if (!empty($image_data)) { $image_size = apply_filters('amt_image_size_index', 'full'); $image_meta_tags = amt_get_opengraph_image_metatags($options, $image_data, $size = $image_size); if (!empty($image_meta_tags)) { $metadata_arr = array_merge($metadata_arr, $image_meta_tags); } } //$metadata_arr[] = '<meta property="og:image" content="' . esc_url_raw( $taxonomy_image_url ) . '" />'; //if ( is_ssl() || ( ! is_ssl() && $options["has_https_access"] == "1" ) ) { // $metadata_arr[] = '<meta property="og:image:secure_url" content="' . esc_url_raw( str_replace('http:', 'https:', $taxonomy_image_url ) ) . '" />'; //} } } // Author archive. First page is considered a profile page. } elseif (is_author()) { // Author object // NOTE: Inside the author archives `$post->post_author` does not contain the author object. // In this case the $post (get_queried_object()) contains the author object itself. // We also can get the author object with the following code. Slug is what WP uses to construct urls. // $author = get_user_by( 'slug', get_query_var( 'author_name' ) ); // Also, ``get_the_author_meta('....', $author)`` returns nothing under author archives. // Access user meta with: $author->description, $author->user_email, etc // $author = get_queried_object(); $author = $post; // Type if (!is_paged() && $options['author_profile_source'] == 'default') { // We treat the first page of the archive as a profile, only if // the profile source has been set to 'default' $metadata_arr[] = '<meta property="og:type" content="profile" />'; } else { $metadata_arr[] = '<meta property="og:type" content="website" />'; } // Site Name $metadata_arr[] = '<meta property="og:site_name" content="' . esc_attr(get_bloginfo('name')) . '" />'; // Title - Note: Contains multipage information //if ( ! is_paged() ) { // // We treat the first page of the archive as a profile // $metadata_arr[] = '<meta property="og:title" content="' . esc_attr( $author->display_name ) . ' profile page" />'; //} else { // $metadata_arr[] = '<meta property="og:title" content="' . esc_attr( amt_process_paged( "Content published by " . $author->display_name ) ) . '" />'; //} $metadata_arr['og:title'] = '<meta property="og:title" content="' . esc_attr(amt_get_title_for_metadata($options, $post)) . ' profile page" />'; // URL - Note: different method to get the permalink on paged archives // If a Facebook author profile URL has been provided, it has priority, // Otherwise fall back to the WordPress author archive. $fb_author_url = $author->amt_facebook_author_profile_url; if (!empty($fb_author_url)) { $metadata_arr[] = '<meta property="og:url" content="' . esc_url_raw($fb_author_url, array('http', 'https')) . '" />'; } else { if (is_paged()) { $metadata_arr[] = '<meta property="og:url" content="' . esc_url_raw(get_pagenum_link(get_query_var('paged'))) . '" />'; } else { $metadata_arr[] = '<meta property="og:url" content="' . esc_url_raw(get_author_posts_url($author->ID)) . '" />'; // The following makes no sense here. 'get_author_posts_url( $author->ID )' will do in all cases. //$metadata_arr[] = '<meta property="og:url" content="' . esc_url_raw( amt_get_local_author_profile_url( $author->ID, $options ) ) . '" />'; } } // description - Note: Contains multipage information through amt_process_paged() if (is_paged()) { $metadata_arr[] = '<meta property="og:description" content="' . esc_attr(amt_process_paged("Content published by " . $author->display_name)) . '" />'; } else { // Here we sanitize the provided description for safety // We treat the first page of the archive as a profile $author_description = sanitize_text_field(amt_sanitize_description($author->description)); if (empty($author_description)) { $metadata_arr[] = '<meta property="og:description" content="' . esc_attr("Content published by " . $author->display_name) . '" />'; } else { $metadata_arr[] = '<meta property="og:description" content="' . esc_attr($author_description) . '" />'; } } // Locale $metadata_arr[] = '<meta property="og:locale" content="' . esc_attr(str_replace('-', '_', amt_get_language_site($options))) . '" />'; // Profile Image // First use the global image override URL $image_data = amt_get_image_attributes_array(amt_get_user_meta_image_url($author->ID)); if (!empty($image_data)) { $image_size = apply_filters('amt_image_size_index', 'full'); $image_meta_tags = amt_get_opengraph_image_metatags($options, $image_data, $size = $image_size); if (!empty($image_meta_tags)) { $metadata_arr = array_merge($metadata_arr, $image_meta_tags); } } else { $author_email = sanitize_email($author->user_email); $avatar_size = apply_filters('amt_avatar_size', 128); $avatar_url = ''; // First try to get the avatar link by using get_avatar(). // Important: for this to work the "Show Avatars" option should be enabled in Settings > Discussion. $avatar_img = get_avatar(get_the_author_meta('ID', $author->ID), $avatar_size, '', get_the_author_meta('display_name', $author->ID)); if (!empty($avatar_img)) { if (preg_match("#src=['\"]([^'\"]+)['\"]#", $avatar_img, $matches)) { $avatar_url = $matches[1]; } } elseif (!empty($author_email)) { // If the user has provided an email, we use it to construct a gravatar link. $avatar_url = "http://www.gravatar.com/avatar/" . md5($author_email) . "?s=" . $avatar_size; } if (!empty($avatar_url)) { //$avatar_url = html_entity_decode($avatar_url, ENT_NOQUOTES, 'UTF-8'); $metadata_arr[] = '<meta property="og:image" content="' . esc_url_raw($avatar_url) . '" />'; // Add an og:imagesecure_url if the image URL uses HTTPS if (strpos($avatar_url, 'https://') !== false) { $metadata_arr[] = '<meta property="og:imagesecure_url" content="' . esc_url_raw($avatar_url) . '" />'; } if (apply_filters('amt_extended_image_tags', true)) { $metadata_arr[] = '<meta property="og:image:width" content="' . esc_attr($avatar_size) . '" />'; $metadata_arr[] = '<meta property="og:image:height" content="' . esc_attr($avatar_size) . '" />'; // Since we do not have a way to determine the image type, the following meta tag is commented out // TODO: make a function that detects the image type from the file extension (if a file extension is available) //$metadata_arr[] = '<meta property="og:image:type" content="image/jpeg" />'; } } } // Profile data (only on the 1st page of the archive) if (!is_paged() && $options['author_profile_source'] == 'default') { // Profile first and last name $last_name = $author->last_name; if (!empty($last_name)) { $metadata_arr[] = '<meta property="profile:last_name" content="' . esc_attr($last_name) . '" />'; } $first_name = $author->first_name; if (!empty($first_name)) { $metadata_arr[] = '<meta property="profile:first_name" content="' . esc_attr($first_name) . '" />'; } } // Custom Post Type archives } elseif (is_post_type_archive()) { // Custom post type object. // When viewing custom post type archives, the $post object is the custom post type object. Check with: var_dump($post); $post_type_object = $post; //var_dump($post_type_object); // Type $metadata_arr[] = '<meta property="og:type" content="website" />'; // Site Name $metadata_arr[] = '<meta property="og:site_name" content="' . esc_attr(get_bloginfo('name')) . '" />'; // Title - Note: Contains multipage information $metadata_arr['og:title'] = '<meta property="og:title" content="' . esc_attr(amt_get_title_for_metadata($options, $post)) . '" />'; // URL - Note: different method to get the permalink on paged archives $url = get_post_type_archive_link($post_type_object->name); if (is_paged()) { $url = trailingslashit($url) . get_query_var('paged') . '/'; } $metadata_arr[] = '<meta property="og:url" content="' . esc_url_raw($url) . '" />'; // Description // Note: Contains multipage information through amt_process_paged() // Add a filtered generic description. // Construct the filter name. Template: ``amt_generic_description_posttype_POSTTYPESLUG_archive`` $custom_post_type_description_filter_name = sprintf('amt_generic_description_posttype_%s_archive', $post_type_object->name); // var_dump($custom_post_type_description_filter_name); // Generic description $generic_description = apply_filters($custom_post_type_description_filter_name, __('%s archive.', 'add-meta-tags')); // Final generic description $generic_description = sprintf($generic_description, post_type_archive_title($prefix = '', $display = false)); $metadata_arr[] = '<meta property="og:description" content="' . esc_attr(amt_process_paged($generic_description)) . '" />'; // Locale $metadata_arr[] = '<meta property="og:locale" content="' . esc_attr(str_replace('-', '_', amt_get_language_site($options))) . '" />'; // Image // Use a user defined image via filter. Otherwise use default image. // First filter using a term/taxonomy agnostic filter name. $posttype_image_url = apply_filters('amt_posttype_force_image_url', '', $post_type_object); if (empty($posttype_image_url)) { // Second filter (post type dependent). // Construct the filter name. Template: ``amt_posttype_image_url_POSTTYPESLUG`` $posttype_image_url_filter_name = sprintf('amt_posttype_image_url_%s', $post_type_object->name); //var_dump($posttype_image_url_filter_name); // The default image, if set, is used by default. $posttype_image_url = apply_filters($posttype_image_url_filter_name, $options["default_image_url"]); } if (!empty($posttype_image_url)) { $image_data = amt_get_image_attributes_array($posttype_image_url); if (!empty($image_data)) { $image_size = apply_filters('amt_image_size_index', 'full'); $image_meta_tags = amt_get_opengraph_image_metatags($options, $image_data, $size = $image_size); if (!empty($image_meta_tags)) { $metadata_arr = array_merge($metadata_arr, $image_meta_tags); } } //$metadata_arr[] = '<meta property="og:image" content="' . esc_url_raw( $posttype_image_url ) . '" />'; //if ( is_ssl() || ( ! is_ssl() && $options["has_https_access"] == "1" ) ) { // $metadata_arr[] = '<meta property="og:image:secure_url" content="' . esc_url_raw( str_replace('http:', 'https:', $posttype_image_url ) ) . '" />'; //} } // Attachments } elseif (is_attachment()) { $mime_type = get_post_mime_type($post->ID); //$attachment_type = strstr( $mime_type, '/', true ); // See why we do not use strstr(): http://www.codetrax.org/issues/1091 $attachment_type = preg_replace('#\\/[^\\/]*$#', '', $mime_type); // First add metadata common to all attachment types. // Type // Note: there is no specific type for images/audio. We use article amd video // TODO: Check whether we could use another type specific to each attachment type. if ('video' == $attachment_type) { // video.other og:type for video attachment pages $og_type = 'video.other'; } else { $og_type = 'article'; } $og_type = apply_filters('amt_opengraph_og_type_attachment', $og_type); $metadata_arr[] = '<meta property="og:type" content="' . esc_attr($og_type) . '" />'; // Site Name $metadata_arr[] = '<meta property="og:site_name" content="' . esc_attr(get_bloginfo('name')) . '" />'; // Title $metadata_arr['og:title'] = '<meta property="og:title" content="' . esc_attr(amt_get_title_for_metadata($options, $post)) . '" />'; // URL $metadata_arr[] = '<meta property="og:url" content="' . esc_url_raw(get_permalink($post->ID)) . '" />'; // Description - We use the description defined by Add-Meta-Tags $content_desc = amt_get_content_description($post); if (!empty($content_desc)) { $metadata_arr[] = '<meta property="og:description" content="' . esc_attr($content_desc) . '" />'; } // Locale $metadata_arr[] = '<meta property="og:locale" content="' . esc_attr(str_replace('-', '_', amt_get_language_content($options, $post))) . '" />'; // og:updated_time $metadata_arr[] = '<meta property="og:updated_time" content="' . esc_attr(amt_iso8601_date($post->post_modified)) . '" />'; // Metadata specific to each attachment type if ('image' == $attachment_type) { // Allow filtering of the image size. $image_size = apply_filters('amt_image_size_attachment', 'full'); $metadata_arr = array_merge($metadata_arr, amt_get_opengraph_image_metatags($options, $post->ID, $size = $image_size)); } elseif ('video' == $attachment_type) { if ($options["og_omit_video_metadata"] != "1") { // Video tags $metadata_arr[] = '<meta property="og:video" content="' . esc_url_raw(wp_get_attachment_url($post->ID)) . '" />'; if (is_ssl() || !is_ssl() && $options["has_https_access"] == "1") { $metadata_arr[] = '<meta property="og:video:secure_url" content="' . esc_url_raw(str_replace('http:', 'https:', wp_get_attachment_url($post->ID))) . '" />'; } // //$metadata_arr[] = '<meta property="og:video:width" content="' . esc_attr( $main_size_meta[1] ) . '" />'; //$metadata_arr[] = '<meta property="og:video:height" content="' . esc_attr( $main_size_meta[2] ) . '" />'; $metadata_arr[] = '<meta property="og:video:type" content="' . esc_attr($mime_type) . '" />'; } } elseif ('audio' == $attachment_type) { // Audio tags $metadata_arr[] = '<meta property="og:audio" content="' . esc_url_raw(wp_get_attachment_url($post->ID)) . '" />'; if (is_ssl() || !is_ssl() && $options["has_https_access"] == "1") { $metadata_arr[] = '<meta property="og:audio:secure_url" content="' . esc_url_raw(str_replace('http:', 'https:', wp_get_attachment_url($post->ID))) . '" />'; } $metadata_arr[] = '<meta property="og:audio:type" content="' . esc_attr($mime_type) . '" />'; } // Article: meta tags // Dates $metadata_arr[] = '<meta property="article:published_time" content="' . esc_attr(amt_iso8601_date($post->post_date)) . '" />'; $metadata_arr[] = '<meta property="article:modified_time" content="' . esc_attr(amt_iso8601_date($post->post_modified)) . '" />'; // Author // If a Facebook author profile URL has been provided, it has priority, // Otherwise fall back to the WordPress author archive. $fb_author_url = get_the_author_meta('amt_facebook_author_profile_url', $post->post_author); if (!empty($fb_author_url)) { $metadata_arr[] = '<meta property="article:author" content="' . esc_url_raw($fb_author_url, array('http', 'https', 'mailto')) . '" />'; } else { //$metadata_arr[] = '<meta property="article:author" content="' . esc_url_raw( get_author_posts_url( get_the_author_meta( 'ID', $post->post_author ) ) ) . '" />'; $metadata_arr[] = '<meta property="article:author" content="' . esc_url_raw(amt_get_local_author_profile_url(get_the_author_meta('ID', $post->post_author), $options)) . '" />'; } // Publisher // If a Facebook publisher profile URL has been provided, it has priority. // Otherwise fall back to the WordPress blog home url. if (!empty($options['social_main_facebook_publisher_profile_url'])) { $metadata_arr[] = '<meta property="article:publisher" content="' . esc_url_raw($options['social_main_facebook_publisher_profile_url'], array('http', 'https', 'mailto')) . '" />'; } else { $metadata_arr[] = '<meta property="article:publisher" content="' . esc_url_raw(trailingslashit(get_bloginfo('url'))) . '" />'; } // Posts, pages, custom content types (attachments excluded, caught in previous clause) // Note: content might be multipage. Process with amt_process_paged() wherever needed. } elseif (is_singular()) { // Site Name $metadata_arr[] = '<meta property="og:site_name" content="' . esc_attr(get_bloginfo('name')) . '" />'; // Type // og:type set to 'video.other' for posts with post format set to video if (get_post_format($post->ID) == 'video') { $og_type = 'video.other'; // og:type set to 'product' if amt_is_product() validates // See: // * https://developers.facebook.com/docs/reference/opengraph/object-type/product/ // * https://developers.facebook.com/docs/payments/product } elseif (amt_is_product()) { $og_type = 'product'; // In any other case 'article' is used as the og:type } else { $og_type = 'article'; } // Allow filtering of og:type $og_type = apply_filters('amt_opengraph_og_type_content', $og_type); // Set og:type meta tag. $metadata_arr[] = '<meta property="og:type" content="' . esc_attr($og_type) . '" />'; // Title // Note: Contains multipage information $metadata_arr['og:title'] = '<meta property="og:title" content="' . esc_attr(amt_get_title_for_metadata($options, $post)) . '" />'; // URL - Uses amt_get_permalink_for_multipage() $metadata_arr[] = '<meta property="og:url" content="' . esc_url_raw(amt_get_permalink_for_multipage($post)) . '" />'; // Description - We use the description defined by Add-Meta-Tags // Note: Contains multipage information through amt_process_paged() $content_desc = amt_get_content_description($post); if (!empty($content_desc)) { $metadata_arr[] = '<meta property="og:description" content="' . esc_attr(amt_process_paged($content_desc)) . '" />'; } // Locale $metadata_arr[] = '<meta property="og:locale" content="' . esc_attr(str_replace('-', '_', amt_get_language_content($options, $post))) . '" />'; // og:updated_time $metadata_arr[] = '<meta property="og:updated_time" content="' . esc_attr(amt_iso8601_date($post->post_modified)) . '" />'; // Image // First check if a global image override URL has been entered. // If yes, use this image URL and override all other images. $image_data = amt_get_image_attributes_array(amt_get_post_meta_image_url($post->ID)); if (!empty($image_data)) { $image_size = apply_filters('amt_image_size_content', 'full'); $image_meta_tags = amt_get_opengraph_image_metatags($options, $image_data, $size = $image_size); if (!empty($image_meta_tags)) { $metadata_arr = array_merge($metadata_arr, $image_meta_tags); } //$global_image_override_url = amt_get_post_meta_image_url($post->ID); //if ( ! empty( $global_image_override_url ) ) { // $metadata_arr[] = '<meta property="og:image" content="' . esc_url_raw( $global_image_override_url ) . '" />'; // if ( is_ssl() || ( ! is_ssl() && $options["has_https_access"] == "1" ) ) { // $metadata_arr[] = '<meta property="og:image:secure_url" content="' . esc_url_raw( str_replace('http:', 'https:', $global_image_override_url ) ) . '" />'; // } // Further image processing } else { // Media Limits $image_limit = amt_metadata_get_image_limit($options); $video_limit = amt_metadata_get_video_limit($options); $audio_limit = amt_metadata_get_audio_limit($options); // Counters $ic = 0; // image counter $vc = 0; // video counter $ac = 0; // audio counter // We store the featured image ID in this variable so that it can easily be excluded // when all images are parsed from the $attachments array. $featured_image_id = 0; // Set to true if any image attachments are found. Use to finally add the default image // if no image attachments have been found. $has_images = false; if (function_exists('has_post_thumbnail') && has_post_thumbnail($post->ID)) { // Allow filtering of the image size. $image_size = apply_filters('amt_image_size_content', 'full'); $metadata_arr = array_merge($metadata_arr, amt_get_opengraph_image_metatags($options, get_post_thumbnail_id($post->ID), $size = $image_size)); // Finally, set the $featured_image_id $featured_image_id = get_post_thumbnail_id($post->ID); // Images have been found. $has_images = true; // Increase image counter $ic++; } // Process all attachments and add metatags (featured image will be excluded) foreach ($attachments as $attachment) { // Excluded the featured image since if ($attachment->ID != $featured_image_id) { $mime_type = get_post_mime_type($attachment->ID); //$attachment_type = strstr( $mime_type, '/', true ); // See why we do not use strstr(): http://www.codetrax.org/issues/1091 $attachment_type = preg_replace('#\\/[^\\/]*$#', '', $mime_type); if ('image' == $attachment_type && $ic < $image_limit) { // Image tags // Allow filtering of the image size. $image_size = apply_filters('amt_image_size_content', 'full'); $metadata_arr = array_merge($metadata_arr, amt_get_opengraph_image_metatags($options, $attachment->ID, $size = $image_size)); // Images have been found. $has_images = true; // Increase image counter $ic++; } elseif ('video' == $attachment_type && $vc < $video_limit) { if ($options["og_omit_video_metadata"] != "1") { // Video tags $metadata_arr[] = '<meta property="og:video" content="' . esc_url_raw(wp_get_attachment_url($attachment->ID)) . '" />'; if (is_ssl() || !is_ssl() && $options["has_https_access"] == "1") { $metadata_arr[] = '<meta property="og:video:secure_url" content="' . esc_url_raw(str_replace('http:', 'https:', wp_get_attachment_url($attachment->ID))) . '" />'; } //$metadata_arr[] = '<meta property="og:video:width" content="' . esc_attr( $main_size_meta[1] ) . '" />'; //$metadata_arr[] = '<meta property="og:video:height" content="' . esc_attr( $main_size_meta[2] ) . '" />'; $metadata_arr[] = '<meta property="og:video:type" content="' . esc_attr($mime_type) . '" />'; // Increase video counter $vc++; } } elseif ('audio' == $attachment_type && $ac < $audio_limit) { // Audio tags $metadata_arr[] = '<meta property="og:audio" content="' . esc_url_raw(wp_get_attachment_url($attachment->ID)) . '" />'; if (is_ssl() || !is_ssl() && $options["has_https_access"] == "1") { $metadata_arr[] = '<meta property="og:audio:secure_url" content="' . esc_url_raw(str_replace('http:', 'https:', wp_get_attachment_url($attachment->ID))) . '" />'; } $metadata_arr[] = '<meta property="og:audio:type" content="' . esc_attr($mime_type) . '" />'; // Increase audio counter $ac++; } } } // Embedded Media foreach ($embedded_media['images'] as $embedded_item) { if ($ic == $image_limit) { break; } $metadata_arr[] = '<meta property="og:image" content="' . esc_url_raw($embedded_item['image']) . '" />'; $metadata_arr[] = '<meta property="og:image:secure_url" content="' . esc_url_raw(str_replace('http:', 'https:', $embedded_item['image'])) . '" />'; if (apply_filters('amt_extended_image_tags', true)) { $metadata_arr[] = '<meta property="og:image:width" content="' . esc_attr($embedded_item['width']) . '" />'; $metadata_arr[] = '<meta property="og:image:height" content="' . esc_attr($embedded_item['height']) . '" />'; $metadata_arr[] = '<meta property="og:image:type" content="image/jpeg" />'; } // Images have been found. $has_images = true; // Increase image counter $ic++; } foreach ($embedded_media['videos'] as $embedded_item) { if ($options["og_omit_video_metadata"] != "1") { if ($vc == $video_limit) { break; } $metadata_arr[] = '<meta property="og:video" content="' . esc_url_raw($embedded_item['player']) . '" />'; $metadata_arr[] = '<meta property="og:video:secure_url" content="' . esc_url_raw(str_replace('http:', 'https:', $embedded_item['player'])) . '" />'; $metadata_arr[] = '<meta property="og:video:type" content="application/x-shockwave-flash" />'; $metadata_arr[] = '<meta property="og:video:width" content="' . esc_attr($embedded_item['width']) . '" />'; $metadata_arr[] = '<meta property="og:video:height" content="' . esc_attr($embedded_item['height']) . '" />'; // Increase video counter $vc++; } } foreach ($embedded_media['sounds'] as $embedded_item) { if ($ac == $audio_limit) { break; } $metadata_arr[] = '<meta property="og:audio" content="' . esc_url_raw($embedded_item['player']) . '" />'; $metadata_arr[] = '<meta property="og:audio:secure_url" content="' . esc_url_raw(str_replace('http:', 'https:', $embedded_item['player'])) . '" />'; $metadata_arr[] = '<meta property="og:audio:type" content="application/x-shockwave-flash" />'; // Increase audio counter $ac++; } // If no images have been found so far use the default image, if set. if ($has_images === false) { // Use the default image, if one has been set. $image_data = amt_get_default_image_data(); if (!empty($image_data)) { $image_size = apply_filters('amt_image_size_content', 'full'); $image_meta_tags = amt_get_opengraph_image_metatags($options, $image_data, $size = $image_size); if (!empty($image_meta_tags)) { $metadata_arr = array_merge($metadata_arr, $image_meta_tags); } } //$metadata_arr[] = '<meta property="og:image" content="' . esc_url_raw( $options["default_image_url"] ) . '" />'; //if ( is_ssl() || ( ! is_ssl() && $options["has_https_access"] == "1" ) ) { // $metadata_arr[] = '<meta property="og:image:secure_url" content="' . esc_url_raw( str_replace('http:', 'https:', $options["default_image_url"] ) ) . '" />'; //} } } // og:referenced $referenced_url_list = amt_get_referenced_items($post); foreach ($referenced_url_list as $referenced_url) { $referenced_url = trim($referenced_url); if (!empty($referenced_url)) { $metadata_arr[] = '<meta property="og:referenced" content="' . esc_url_raw($referenced_url) . '" />'; } } // Article: meta tags if ($og_type == 'article') { // Dates $metadata_arr[] = '<meta property="article:published_time" content="' . esc_attr(amt_iso8601_date($post->post_date)) . '" />'; $metadata_arr[] = '<meta property="article:modified_time" content="' . esc_attr(amt_iso8601_date($post->post_modified)) . '" />'; // Author // If a Facebook author profile URL has been provided, it has priority, // Otherwise fall back to the WordPress author archive. $fb_author_url = get_the_author_meta('amt_facebook_author_profile_url', $post->post_author); if (!empty($fb_author_url)) { $metadata_arr[] = '<meta property="article:author" content="' . esc_url_raw($fb_author_url, array('http', 'https', 'mailto')) . '" />'; } else { //$metadata_arr[] = '<meta property="article:author" content="' . esc_url_raw( get_author_posts_url( get_the_author_meta( 'ID', $post->post_author ) ) ) . '" />'; $metadata_arr[] = '<meta property="article:author" content="' . esc_url_raw(amt_get_local_author_profile_url(get_the_author_meta('ID', $post->post_author), $options)) . '" />'; } // Publisher // If a Facebook publisher profile URL has been provided, it has priority. // Otherwise fall back to the WordPress blog home url. if (!empty($options['social_main_facebook_publisher_profile_url'])) { $metadata_arr[] = '<meta property="article:publisher" content="' . esc_url_raw($options['social_main_facebook_publisher_profile_url'], array('http', 'https', 'mailto')) . '" />'; } else { $metadata_arr[] = '<meta property="article:publisher" content="' . esc_url_raw(trailingslashit(get_bloginfo('url'))) . '" />'; } /* // article:section: We use the first category as the section. $first_cat = amt_get_first_category($post); if ( ! empty( $first_cat ) ) { $metadata_arr[] = '<meta property="article:section" content="' . esc_attr( $first_cat ) . '" />'; } */ // article:section: We use print an ``article:section`` meta tag for each of the post's categories. $categories = get_the_category($post->ID); $categories = apply_filters('amt_post_categories_for_opengraph', $categories); foreach ($categories as $cat) { $section = trim($cat->cat_name); if (!empty($section) && $cat->slug != 'uncategorized') { $metadata_arr[] = '<meta property="article:section" content="' . esc_attr($section) . '" />'; } } // article:tag: Keywords are listed as post tags $keywords = explode(',', amt_get_content_keywords($post, $auto = true, $exclude_categories = true)); foreach ($keywords as $tag) { $tag = trim($tag); if (!empty($tag)) { $metadata_arr[] = '<meta property="article:tag" content="' . esc_attr($tag) . '" />'; } } } elseif ($og_type == 'video.other') { // Dates $metadata_arr[] = '<meta property="video:release_date" content="' . esc_attr(amt_iso8601_date($post->post_date)) . '" />'; // video:tag: Keywords are listed as post tags $keywords = explode(',', amt_get_content_keywords($post)); foreach ($keywords as $tag) { $tag = trim($tag); if (!empty($tag)) { $metadata_arr[] = '<meta property="video:tag" content="' . esc_attr($tag) . '" />'; } } } elseif ($og_type == 'product') { // Extend the current metadata with properties of the Product object. // See: // * https://developers.facebook.com/docs/reference/opengraph/object-type/product/ // * https://developers.facebook.com/docs/payments/product $metadata_arr = apply_filters('amt_product_data_opengraph', $metadata_arr, $post); } } // Filtering of the generated Opengraph metadata $metadata_arr = apply_filters('amt_opengraph_metadata_head', $metadata_arr); return $metadata_arr; }
/** * Saves the new settings in the database. * Accepts the POST request data. */ function amt_save_settings($post_payload) { // Default Add-Meta-Tags Settings $default_options = amt_get_default_options(); $add_meta_tags_opts = array(); foreach ($default_options as $def_key => $def_value) { // **Always** use the ``settings_version`` from the defaults if ($def_key == 'settings_version') { $add_meta_tags_opts['settings_version'] = $def_value; } elseif (array_key_exists($def_key, $post_payload)) { // Validate and sanitize input before adding to 'add_meta_tags_opts' if ($def_key == 'site_description') { $add_meta_tags_opts[$def_key] = sanitize_text_field(amt_sanitize_description(stripslashes($post_payload[$def_key]))); } elseif ($def_key == 'site_keywords') { // No placeholders here $add_meta_tags_opts[$def_key] = sanitize_text_field(amt_sanitize_keywords(stripslashes($post_payload[$def_key]))); } elseif ($def_key == 'global_keywords') { // placeholder may exist here $add_meta_tags_opts[$def_key] = amt_sanitize_keywords(amt_revert_placeholders(sanitize_text_field(amt_convert_placeholders(stripslashes($post_payload[$def_key]))))); } elseif ($def_key == 'site_wide_meta') { $add_meta_tags_opts[$def_key] = esc_textarea(wp_kses(stripslashes($post_payload[$def_key]), amt_get_allowed_html_kses())); } elseif ($def_key == 'copyright_url') { $add_meta_tags_opts[$def_key] = esc_url_raw(stripslashes($post_payload[$def_key]), array('http', 'https')); } elseif ($def_key == 'default_image_url') { $add_meta_tags_opts[$def_key] = esc_url_raw(stripslashes($post_payload[$def_key]), array('http', 'https')); } elseif ($def_key == 'social_main_facebook_publisher_profile_url') { $add_meta_tags_opts[$def_key] = esc_url_raw(stripslashes($post_payload[$def_key]), array('http', 'https')); } elseif ($def_key == 'social_main_googleplus_publisher_profile_url') { $add_meta_tags_opts[$def_key] = esc_url_raw(stripslashes($post_payload[$def_key]), array('http', 'https')); } elseif ($def_key == 'author_profile_source') { $author_profile_source_value = sanitize_text_field(stripslashes($post_payload[$def_key])); if (!in_array($author_profile_source_value, array('default', 'frontpage', 'buddypress', 'url'))) { $author_profile_source_value = 'default'; } $add_meta_tags_opts[$def_key] = $author_profile_source_value; } elseif ($def_key == 'transient_cache_expiration') { $transient_cache_expiration_value = sanitize_text_field(stripslashes($post_payload[$def_key])); if (!is_numeric($transient_cache_expiration_value) || intval($transient_cache_expiration_value) < 0) { $transient_cache_expiration_value = '0'; } $add_meta_tags_opts[$def_key] = $transient_cache_expiration_value; } else { $add_meta_tags_opts[$def_key] = sanitize_text_field(stripslashes($post_payload[$def_key])); } } else { // The following settings have a default value of 1, so they can never be // deactivated, unless the following check takes place. if ($def_key == 'auto_description' || $def_key == 'auto_keywords' || $def_key == 'noindex_search_results' || $def_key == 'metabox_enable_description' || $def_key == 'metabox_enable_keywords' || $def_key == 'metabox_enable_title') { if (!isset($post_payload[$def_key])) { $add_meta_tags_opts[$def_key] = "0"; } } else { // Else save the default value in the db. $add_meta_tags_opts[$def_key] = $def_value; } } } // Finally update the Add-Meta-Tags options. update_option("add_meta_tags_opts", $add_meta_tags_opts); //var_dump($post_payload); //var_dump($add_meta_tags_opts); amt_show_info_msg(__('Add-Meta-Tags options saved', 'add-meta-tags')); }
/** * Generates basic metadata for the head area. * */ function amt_add_basic_metadata_head($post, $attachments, $embedded_media, $options) { if (apply_filters('amt_exclude_basic_metadata', false)) { return array(); } $do_description = $options["auto_description"] == "1" ? true : false; $do_keywords = $options["auto_keywords"] == "1" ? true : false; $do_noodp_description = $options["noodp_description"] == "1" ? true : false; // Array to store metadata $metadata_arr = array(); // Pre-processing // Store hreflang links in array $hreflang_links_arr = array(); // Store base robots options $robots_options = array(); if ($do_noodp_description && (is_front_page() || is_singular() || is_category() || is_tag() || is_tax() || is_author())) { // Add NOODP on posts and pages $robots_options[] = 'noodp'; $robots_options[] = 'noydir'; } // Store full meta tags (site wide and post specific) // Add site wide meta tags $full_metatags_as_string = ''; if (!empty($options['site_wide_meta'])) { $full_metatags_for_site = html_entity_decode(stripslashes($options['site_wide_meta'])); $full_metatags_as_string .= apply_filters('amt_full_metatags_site', $full_metatags_for_site); $full_metatags_as_string .= PHP_EOL; } // Full meta tags if (is_singular() || amt_is_static_front_page() || amt_is_static_home()) { // per post full meta tags $full_metatags_for_content = amt_get_post_meta_full_metatags($post->ID); $full_metatags_for_content = html_entity_decode(stripslashes($full_metatags_for_content)); $full_metatags_as_string .= apply_filters('amt_full_metatags_post', $full_metatags_for_content); } elseif (is_category() || is_tag() || is_tax()) { // Term specific full meta tags ($post is a term object) $full_metatags_for_term = amt_get_term_meta_full_metatags($post->term_id); $full_metatags_for_term = html_entity_decode(stripslashes($full_metatags_for_term)); $full_metatags_as_string .= apply_filters('amt_full_metatags_term', $full_metatags_for_term); } elseif (is_author()) { // User specific full meta tags ($post is a user object) $full_metatags_for_user = amt_get_user_meta_full_metatags($post->ID); $full_metatags_for_user = html_entity_decode(stripslashes($full_metatags_for_user)); $full_metatags_as_string .= apply_filters('amt_full_metatags_term', $full_metatags_for_user); } // Sanitize //$full_metatags_as_string = esc_textarea( wp_kses( $full_metatags_as_string, amt_get_allowed_html_kses() ) ); $full_metatags_as_string = wp_kses($full_metatags_as_string, amt_get_allowed_html_kses()); // Make array of full meta tags $full_meta_tags = preg_split('#\\R#', $full_metatags_as_string, NULL, PREG_SPLIT_NO_EMPTY); // Process if (apply_filters('amt_full_metatags_processor_enable', true)) { // Store processed meta tags here $processed_full_meta_tags = array(); // Field substitutions currently take place only on content pages. // TODO: See if this can be expanded to terms, authors. // Store the post's custom fields $custom_fields = null; // Store the post object's custom fields. // if (is_singular() || amt_is_static_front_page() || amt_is_static_home()) { // Get an array of all custom fields names of the post object. $custom_fields = get_post_custom_keys($post->ID); } // Iterate over full meta tags foreach ($full_meta_tags as $single_meta_tag) { // Note: Field value substitutions take place first, outside the elseif clauses. // Process substitutions of special notation with data from Custom Fields // Supported special notation: // [field=Field Name] // Notes: // - 'Field Name' is the name of custom field. // - If the custom field with name 'Field Name' does not exist, the meta tag // that contains it is omitted. // - If the value of the field is an empty string, then the substitution // takes place normally. // // The regex pattern fo our special notation. $special_notation_pattern = '#(?:\\[field\\=)([^\\]]+)(?:\\])#'; // The following covers content pages, as $custom_fields is only set on content pages. See above. if (!empty($custom_fields) && isset($post->ID)) { // This also assumes that we have a post object since custom fields // are set only on content pages, otherwise it is null. // Check for special notation if (preg_match($special_notation_pattern, $single_meta_tag, $matches)) { //var_dump($matches); // If the field name of the special notation does not match // any custom field name, omit the meta tag as per the rules above. if (!in_array($matches[1], $custom_fields)) { continue; } // Since there is special notation and the field name from the special // notation exists in the $custom_fields array, iterate over the available // custom fields and perform the substitutions. foreach ($custom_fields as $custom_field) { // Check if it matches the field name of the special notation if ($custom_field == $matches[1]) { // Fetch the custom field's value $field_value = get_post_meta($post->ID, $custom_field, true); // Sanitize value // TODO: this can be a problem depending on the value and the used sanitization function. $field_value = esc_attr(sanitize_text_field($field_value)); // Perform the substitution even if the the value is an empty string as per the rules above $single_meta_tag = str_replace(sprintf('[field=%s]', $custom_field), $field_value, $single_meta_tag); } } } } else { // In any other case, just remove the meta tags which contain the special notation. if (preg_match($special_notation_pattern, $single_meta_tag, $tmp)) { continue; } } // Process the PAGEINFO variable. // If the current page is the 1st page of any archive or of multipage content, // PAGEINFO is just stripped. For subsequent pages of archives or multipage // content, PAGEINFO is replaced with page based path (page/N/ for archives or N/ for multipage content) // // For paginated archives or paginated main page with latest posts. $has_paging_info = false; if (is_paged()) { $paged = get_query_var('paged'); // paged if ($paged && $paged >= 2) { $single_meta_tag = str_replace('PAGEINFO', 'page/' . $paged . '/', $single_meta_tag); $has_paging_info = true; } // For a Post or Page that has been divided into pages using the <!--nextpage--> QuickTag } else { $paged = get_query_var('page'); // page if ($paged && $paged >= 2) { $single_meta_tag = str_replace('PAGEINFO', $paged . '/', $single_meta_tag); $has_paging_info = true; } } // If this is not paged, strip PAGEINFO if ($has_paging_info === false) { $single_meta_tag = str_replace('PAGEINFO', '', $single_meta_tag); } // Process custom canonical link // If a rel="canonical" meta tags exists, we deactivate WordPress' 'rel_canonical' action, // Since it is assumed that a custom canonical link has been added. //if ( preg_match( '# rel="canonical" #', $post_full_meta_tags, $tmp ) ) { if (strpos($single_meta_tag, ' rel="canonical" ') !== false) { // Remove default WordPress action remove_action('wp_head', 'rel_canonical'); } elseif (strpos($single_meta_tag, ' name="robots" ') !== false) { if (preg_match('# content="([^"]+)" #', $single_meta_tag, $matches)) { $tmp_robots_opts = explode(',', $matches[1]); foreach ($tmp_robots_opts as $single_robots_option) { $single_robots_option_cleaned = strtolower(trim($single_robots_option)); if (!empty($single_robots_option_cleaned)) { $robots_options[] = $single_robots_option_cleaned; } } } // We simply collect options. Do not add any robots meta tags to the processed meta tags array. continue; } elseif (strpos($single_meta_tag, ' hreflang="') !== false) { // Simply add to the hreflang links array for later processing $hreflang_links_arr[] = $single_meta_tag; // We simply collect hreflang links for later processing. Do not add them to the processed meta tags array. continue; } // If we have reached here, add the meta tags to the array with processed meta tags. $processed_full_meta_tags[] = $single_meta_tag; } } else { // Full meta tags processor not enabled $processed_full_meta_tags = $full_meta_tags; } //var_dump($full_meta_tags); //var_dump($processed_full_meta_tags); // Add Meta Tags // Add a robots meta tag if robots options exist. // Backwards compatible filter. TODO: This is deprecated. Needs to be deleted after a while. $old_options_as_string = apply_filters('amt_robots_data', ''); if (!empty($old_options_as_string)) { foreach (explode(',', $old_options_as_string) as $single_robots_option) { $single_robots_option_cleaned = strtolower(trim($single_robots_option)); if (!empty($single_robots_option_cleaned)) { $robots_options[] = $single_robots_option_cleaned; } } } // Add robot_options filtering $robots_options = apply_filters('amt_robots_options', $robots_options); if (version_compare(PHP_VERSION, '5.3', '<')) { // The flag is not supported $robots_options = array_unique($robots_options); } else { $robots_options = array_unique($robots_options, SORT_STRING); } if (!empty($robots_options)) { $metadata_arr['basic:robots'] = '<meta name="robots" content="' . esc_attr(implode(',', $robots_options)) . '" />'; } // Add full meta tags // Merge meta tags $processed_full_meta_tags = apply_filters('amt_full_metatags_processed', $processed_full_meta_tags); if (!empty($processed_full_meta_tags)) { $metadata_arr = array_merge($metadata_arr, $processed_full_meta_tags); } // Add copyright link // On every page print the copyright head link $copyright_url = amt_get_site_copyright_url($options); //if ( empty($copyright_url)) { // $copyright_url = trailingslashit( get_bloginfo('url') ); //} if (!empty($copyright_url)) { $metadata_arr['basic:copyright'] = '<link rel="copyright" type="text/html" title="' . esc_attr(get_bloginfo('name')) . ' ' . __('copyright information', 'add-meta-tags') . '" href="' . esc_url($copyright_url) . '" />'; } // hreflang link element // This section also expects an array of extra hreflang links that may have // been collected from the full meta tags boxes. if ($options['generate_hreflang_links'] == '1') { if (is_singular()) { $locale = amt_get_language_content($options, $post); $hreflang = amt_get_the_hreflang($locale, $options); $hreflang_url = amt_get_permalink_for_multipage($post); } else { $locale = amt_get_language_site($options); $hreflang = amt_get_the_hreflang($locale, $options); $hreflang_url = ''; if (amt_is_default_front_page()) { $hreflang_url = trailingslashit(get_bloginfo('url')); } elseif (is_category() || is_tag() || is_tax()) { // $post is a term object $hreflang_url = get_term_link($post); } elseif (is_author()) { // $post is an author object $hreflang_url = get_author_posts_url($post->ID); } elseif (is_year()) { $archive_year = get_the_time('Y'); $hreflang_url = get_year_link($archive_year); } elseif (is_month()) { $archive_year = get_the_time('Y'); $archive_month = get_the_time('m'); $hreflang_url = get_month_link($archive_year, $archive_month); } elseif (is_day()) { $archive_year = get_the_time('Y'); $archive_month = get_the_time('m'); $archive_day = get_the_time('d'); $hreflang_url = get_day_link($archive_year, $archive_month, $archive_day); } // If paged information is available if (is_paged()) { //$hreflang_url = trailingslashit( $hreflang_url ) . get_query_var('paged') . '/'; $hreflang_url = get_pagenum_link(get_query_var('paged')); } } // hreflang links array $hreflang_arr = array(); // Add link element if (!empty($hreflang) && !empty($hreflang_url)) { $hreflang_arr[] = '<link rel="alternate" hreflang="' . esc_attr($hreflang) . '" href="' . esc_url_raw($hreflang_url) . '" />'; } // Add extra hreflang links that have been collected from the full meta tags boxes if (!empty($hreflang_links_arr)) { $hreflang_arr = array_merge($hreflang_arr, $hreflang_links_arr); } // Allow filtering of the hreflang array $hreflang_arr = apply_filters('amt_hreflang_links', $hreflang_arr); // Add to to metadata array foreach ($hreflang_arr as $hreflang_link) { if (preg_match('# hreflang="([^"]+)" #', $hreflang_link, $matches)) { $metadata_arr['basic:hreflang:' . $matches[1]] = $hreflang_link; } } } // Basic Meta Tags // Custom content override if (amt_is_custom($post, $options)) { // Return metadata with: // add_filter( 'amt_custom_metadata_basic', 'my_function', 10, 5 ); // Return an array of meta tags. Array item format: ['key_can_be_whatever'] = '<meta name="foo" content="bar" />' $metadata_arr = apply_filters('amt_custom_metadata_basic', $metadata_arr, $post, $options, $attachments, $embedded_media); // Default front page displaying latest posts } elseif (amt_is_default_front_page()) { // Description and Keywords from the Add-Meta-Tags settings override // default behaviour. // Description if ($do_description) { // Use the site description from the Add-Meta-Tags settings. // Fall back to the blog description. $site_description = amt_get_site_description($options); if (empty($site_description)) { // Alternatively, use the blog description // Here we sanitize the provided description for safety $site_description = sanitize_text_field(amt_sanitize_description(get_bloginfo('description'))); } // If we have a description, use it in the description meta-tag of the front page if (!empty($site_description)) { // Note: Contains multipage information through amt_process_paged() $metadata_arr['basic:description'] = '<meta name="description" content="' . esc_attr(amt_process_paged($site_description)) . '" />'; } } // Keywords if ($do_keywords) { // Use the site keywords from the Add-Meta-Tags settings. // Fall back to the blog categories. $site_keywords = amt_get_site_keywords($options); if (empty($site_keywords)) { // Alternatively, use the blog categories // Here we sanitize the provided keywords for safety $site_keywords = sanitize_text_field(amt_sanitize_keywords(amt_get_all_categories())); } // If we have keywords, use them in the keywords meta-tag of the front page if (!empty($site_keywords)) { $metadata_arr['basic:keywords'] = '<meta name="keywords" content="' . esc_attr($site_keywords) . '" />'; } } // Attachments } elseif (is_attachment()) { // has to be before is_singular() since is_singular() is true for attachments. // Description if ($do_description) { $description = amt_get_content_description($post, $auto = $do_description); if (!empty($description)) { // Note: Contains multipage information through amt_process_paged() $metadata_arr['basic:description'] = '<meta name="description" content="' . esc_attr(amt_process_paged($description)) . '" />'; } } // No keywords // Content pages and static pages used as "front page" and "posts page" // This also supports products via is_singular() } elseif (is_singular() || amt_is_static_front_page() || amt_is_static_home()) { // Description if ($do_description) { $description = amt_get_content_description($post, $auto = $do_description); if (!empty($description)) { // Note: Contains multipage information through amt_process_paged() $metadata_arr['basic:description'] = '<meta name="description" content="' . esc_attr(amt_process_paged($description)) . '" />'; } } // Keywords if ($do_keywords) { $keywords = amt_get_content_keywords($post, $auto = $do_keywords); if (!empty($keywords)) { $metadata_arr['basic:keywords'] = '<meta name="keywords" content="' . esc_attr($keywords) . '" />'; // Static Posts Index Page // If no keywords have been set in the metabox and this is the static page, // which displayes the latest posts, use the categories of the posts in the loop. } elseif (amt_is_static_home()) { // Here we sanitize the provided keywords for safety $cats_from_loop = sanitize_text_field(amt_sanitize_keywords(implode(', ', amt_get_categories_from_loop()))); if (!empty($cats_from_loop)) { $metadata_arr['basic:keywords'] = '<meta name="keywords" content="' . esc_attr($cats_from_loop) . '" />'; } } } // 'news_keywords' $newskeywords = amt_get_post_meta_newskeywords($post->ID); if (!empty($newskeywords)) { $metadata_arr['basic:news_keywords'] = '<meta name="news_keywords" content="' . esc_attr($newskeywords) . '" />'; } // Category based archives } elseif (is_category()) { if ($do_description) { // If set, the description of the category is used in the 'description' metatag. // Otherwise, a generic description is used. // Here we sanitize the provided description for safety $description_content = sanitize_text_field(amt_sanitize_description(category_description())); // Note: Contains multipage information through amt_process_paged() if (empty($description_content)) { // Add a filtered generic description. $generic_description = apply_filters('amt_generic_description_category_archive', __('Content filed under the %s category.', 'add-meta-tags')); $generic_description = sprintf($generic_description, single_cat_title($prefix = '', $display = false)); $metadata_arr['basic:description'] = '<meta name="description" content="' . esc_attr(amt_process_paged($generic_description)) . '" />'; } else { $metadata_arr['basic:description'] = '<meta name="description" content="' . esc_attr(amt_process_paged($description_content)) . '" />'; } } if ($do_keywords) { // The category name alone is included in the 'keywords' metatag // Here we sanitize the provided keywords for safety $cur_cat_name = sanitize_text_field(amt_sanitize_keywords(single_cat_title($prefix = '', $display = false))); if (!empty($cur_cat_name)) { $metadata_arr['basic:keywords'] = '<meta name="keywords" content="' . esc_attr($cur_cat_name) . '" />'; } } } elseif (is_tag()) { if ($do_description) { // If set, the description of the tag is used in the 'description' metatag. // Otherwise, a generic description is used. // Here we sanitize the provided description for safety $description_content = sanitize_text_field(amt_sanitize_description(tag_description())); // Note: Contains multipage information through amt_process_paged() if (empty($description_content)) { // Add a filtered generic description. $generic_description = apply_filters('amt_generic_description_tag_archive', __('Content tagged with %s.', 'add-meta-tags')); $generic_description = sprintf($generic_description, single_tag_title($prefix = '', $display = false)); $metadata_arr['basic:description'] = '<meta name="description" content="' . esc_attr(amt_process_paged($generic_description)) . '" />'; } else { $metadata_arr['basic:description'] = '<meta name="description" content="' . esc_attr(amt_process_paged($description_content)) . '" />'; } } if ($do_keywords) { // The tag name alone is included in the 'keywords' metatag // Here we sanitize the provided keywords for safety $cur_tag_name = sanitize_text_field(amt_sanitize_keywords(single_tag_title($prefix = '', $display = false))); if (!empty($cur_tag_name)) { $metadata_arr['basic:keywords'] = '<meta name="keywords" content="' . esc_attr($cur_tag_name) . '" />'; } } // Custom taxonomies - Should be after is_category() and is_tag(), as it would catch those taxonomies as well. // This also supports product groups via is_tax(). Only product groups that are WordPress custom taxonomies are supported. } elseif (is_tax()) { // Taxonomy term object. // When viewing taxonomy archives, the $post object is the taxonomy term object. Check with: var_dump($post); $tax_term_object = $post; //var_dump($tax_term_object); if ($do_description) { // If set, the description of the custom taxonomy term is used in the 'description' metatag. // Otherwise, a generic description is used. // Here we sanitize the provided description for safety $description_content = sanitize_text_field(amt_sanitize_description(term_description($tax_term_object->term_id, $tax_term_object->taxonomy))); // Note: Contains multipage information through amt_process_paged() if (empty($description_content)) { // Add a filtered generic description. // Construct the filter name. Template: ``amt_generic_description_TAXONOMYSLUG_archive`` $taxonomy_description_filter_name = sprintf('amt_generic_description_%s_archive', $tax_term_object->taxonomy); // var_dump($taxonomy_description_filter_name); $generic_description = apply_filters($taxonomy_description_filter_name, __('Content filed under the %s taxonomy.', 'add-meta-tags')); $generic_description = sprintf($generic_description, single_term_title($prefix = '', $display = false)); $metadata_arr['basic:description'] = '<meta name="description" content="' . esc_attr(amt_process_paged($generic_description)) . '" />'; } else { $metadata_arr['basic:description'] = '<meta name="description" content="' . esc_attr(amt_process_paged($description_content)) . '" />'; } } if ($do_keywords) { // The taxonomy term name alone is included in the 'keywords' metatag. // Here we sanitize the provided keywords for safety. $cur_tax_term_name = sanitize_text_field(amt_sanitize_keywords(single_term_title($prefix = '', $display = false))); if (!empty($cur_tax_term_name)) { $metadata_arr['basic:keywords'] = '<meta name="keywords" content="' . esc_attr($cur_tax_term_name) . '" />'; } } } elseif (is_author()) { // Author object // NOTE: Inside the author archives `$post->post_author` does not contain the author object. // In this case the $post (get_queried_object()) contains the author object itself. // We also can get the author object with the following code. Slug is what WP uses to construct urls. // $author = get_user_by( 'slug', get_query_var( 'author_name' ) ); // Also, ``get_the_author_meta('....', $author)`` returns nothing under author archives. // Access user meta with: $author->description, $author->user_email, etc // $author = get_queried_object(); $author = $post; // If a bio has been set in the user profile, use it in the description metatag of the // first page of the author archive *ONLY*. The other pages of the author archive use a generic description. // This happens because the 1st page of the author archive is considered the profile page // by the other metadata modules. // Otherwise use a generic meta tag. if ($do_description) { // Here we sanitize the provided description for safety $author_description = sanitize_text_field(amt_sanitize_description($author->description)); if (empty($author_description) || is_paged()) { // Note: Contains multipage information through amt_process_paged() // Add a filtered generic description. $generic_description = apply_filters('amt_generic_description_author_archive', __('Content published by %s.', 'add-meta-tags')); $generic_description = sprintf($generic_description, $author->display_name); $metadata_arr['basic:description'] = '<meta name="description" content="' . esc_attr(amt_process_paged($generic_description)) . '" />'; } else { $metadata_arr['basic:description'] = '<meta name="description" content="' . esc_attr($author_description) . '" />'; } } // For the keywords metatag use the categories of the posts the author has written and are displayed in the current page. if ($do_keywords) { // Here we sanitize the provided keywords for safety $cats_from_loop = sanitize_text_field(amt_sanitize_keywords(implode(', ', amt_get_categories_from_loop()))); if (!empty($cats_from_loop)) { $metadata_arr['basic:keywords'] = '<meta name="keywords" content="' . esc_attr($cats_from_loop) . '" />'; } } // Custom Post Type Archive } elseif (is_post_type_archive()) { // Custom post type object. // When viewing custom post type archives, the $post object is the custom post type object. Check with: var_dump($post); $post_type_object = $post; //var_dump($post_type_object); if ($do_description) { // Description // Note: Contains multipage information through amt_process_paged() // Add a filtered generic description. // Construct the filter name. Template: ``amt_generic_description_posttype_POSTTYPESLUG_archive`` $custom_post_type_description_filter_name = sprintf('amt_generic_description_posttype_%s_archive', $post_type_object->name); // var_dump($custom_post_type_description_filter_name); // Generic description $generic_description = apply_filters($custom_post_type_description_filter_name, __('%s archive.', 'add-meta-tags')); // Final generic description $generic_description = sprintf($generic_description, post_type_archive_title($prefix = '', $display = false)); $metadata_arr['basic:description'] = '<meta name="description" content="' . esc_attr(amt_process_paged($generic_description)) . '" />'; } // For the keywords metatag use the categories of the posts that are listed in the current page. if ($do_keywords) { // Here we sanitize the provided keywords for safety $cats_from_loop = sanitize_text_field(amt_sanitize_keywords(implode(', ', amt_get_categories_from_loop()))); if (!empty($cats_from_loop)) { $metadata_arr['basic:keywords'] = '<meta name="keywords" content="' . esc_attr($cats_from_loop) . '" />'; } } } // Filtering of the generated basic metadata $metadata_arr = apply_filters('amt_basic_metadata_head', $metadata_arr); return $metadata_arr; }
/** * Generate Twitter Cards metadata for the content pages. */ function amt_add_twitter_cards_metadata_head($post, $attachments, $embedded_media, $options) { if (apply_filters('amt_exclude_twitter_cards_metadata', false)) { return array(); } $do_auto_twitter = $options["auto_twitter"] == "1" ? true : false; if (!$do_auto_twitter) { return array(); } $metadata_arr = array(); // Custom content override if (amt_is_custom($post, $options)) { // Return metadata with: // add_filter( 'amt_custom_metadata_twitter_cards', 'my_function', 10, 5 ); // Return an array of meta tags. Array item format: ['key_can_be_whatever'] = '<meta name="foo" content="bar" />' $metadata_arr = apply_filters('amt_custom_metadata_twitter_cards', $metadata_arr, $post, $options, $attachments, $embedded_media); return $metadata_arr; } // Front page and archives if (!is_singular() && !amt_is_static_home() && !amt_is_static_front_page() || amt_is_default_front_page() || is_category() || is_tag() || is_tax() || is_post_type_archive()) { // Note1: is_front_page() is used for the case in which a static page is used as the front page. // Note2: product groups should pass the is_tax() validation, so no need for // amt_is_product_group(). We do not support other product groups. // Default front page containing latest posts // Add a basic Twitter Card to the default home page that contains latest posts. // If static pages are used as the front page or the latest-posts page, // then they are treated as content and are processed below. if (amt_is_default_front_page()) { // Generate the card only if a publisher username has been set in the publisher settings if (!empty($options['social_main_twitter_publisher_username'])) { // Type $metadata_arr[] = '<meta name="twitter:card" content="' . amt_get_default_twitter_card_type($options) . '" />'; // Creator $metadata_arr[] = '<meta name="twitter:creator" content="@' . esc_attr($options['social_main_twitter_publisher_username']) . '" />'; // Publisher $metadata_arr[] = '<meta name="twitter:site" content="@' . esc_attr($options['social_main_twitter_publisher_username']) . '" />'; // Title // Note: Contains multipage information $metadata_arr['twitter:title'] = '<meta name="twitter:title" content="' . esc_attr(amt_get_title_for_metadata($options, $post)) . '" />'; // Site description - Note: Contains multipage information through amt_process_paged() $site_description = amt_get_site_description($options); if (empty($site_description)) { $site_description = get_bloginfo('description'); } if (!empty($site_description)) { $metadata_arr[] = '<meta name="twitter:description" content="' . esc_attr(amt_process_paged($site_description)) . '" />'; } // Image. Use the default image (if set). $image_data = amt_get_default_image_data(); if (!empty($image_data)) { $image_size = apply_filters('amt_image_size_index', 'full'); $image_meta_tags = amt_get_twitter_cards_image_metatags($options, $image_data, $size = $image_size); if (!empty($image_meta_tags)) { $metadata_arr = array_merge($metadata_arr, $image_meta_tags); } } //$image_url = apply_filters( 'amt_twitter_cards_image_url_index', $options["default_image_url"] ); //$metadata_arr[] = '<meta name="twitter:image" content="' . esc_url_raw( $image_url ) . '" />'; } // Taxonomy archives // Note: product groups should pass the is_tax() validation, so no need for // amt_is_product_group(). We do not support other product groups. } elseif (is_category() || is_tag() || is_tax()) { // Taxonomy term object. // When viewing taxonomy archives, the $post object is the taxonomy term object. Check with: var_dump($post); $tax_term_object = $post; //var_dump($tax_term_object); // Generate the card only if a publisher username has been set in the publisher settings if (!empty($options['social_main_twitter_publisher_username'])) { // Type $metadata_arr[] = '<meta name="twitter:card" content="' . amt_get_default_twitter_card_type($options) . '" />'; // Creator $metadata_arr[] = '<meta name="twitter:creator" content="@' . esc_attr($options['social_main_twitter_publisher_username']) . '" />'; // Publisher $metadata_arr[] = '<meta name="twitter:site" content="@' . esc_attr($options['social_main_twitter_publisher_username']) . '" />'; // Title // Note: Contains multipage information $metadata_arr['twitter:title'] = '<meta name="twitter:title" content="' . esc_attr(amt_get_title_for_metadata($options, $post)) . '" />'; // Description // If set, the description of the custom taxonomy term is used in the 'description' metatag. // Otherwise, a generic description is used. // Here we sanitize the provided description for safety $description_content = sanitize_text_field(amt_sanitize_description(term_description($tax_term_object->term_id, $tax_term_object->taxonomy))); // Note: Contains multipage information through amt_process_paged() if (empty($description_content)) { // Add a filtered generic description. // Filter name if (is_category()) { $generic_description = apply_filters('amt_generic_description_category_archive', __('Content filed under the %s category.', 'add-meta-tags')); } elseif (is_tag()) { $generic_description = apply_filters('amt_generic_description_tag_archive', __('Content tagged with %s.', 'add-meta-tags')); } elseif (is_tax()) { // Construct the filter name. Template: ``amt_generic_description_TAXONOMYSLUG_archive`` $taxonomy_description_filter_name = sprintf('amt_generic_description_%s_archive', $tax_term_object->taxonomy); // var_dump($taxonomy_description_filter_name); // Generic description $generic_description = apply_filters($taxonomy_description_filter_name, __('Content filed under the %s taxonomy.', 'add-meta-tags')); } // Final generic description $generic_description = sprintf($generic_description, single_term_title($prefix = '', $display = false)); $metadata_arr[] = '<meta name="twitter:description" content="' . esc_attr(amt_process_paged($generic_description)) . '" />'; } else { $metadata_arr[] = '<meta name="twitter:description" content="' . esc_attr(amt_process_paged($description_content)) . '" />'; } // Image // Use an image from the 'Global image override' field. // Otherwise, use a user defined image via filter. // Otherwise use default image. $image_data = amt_get_image_data(amt_get_term_meta_image_url($tax_term_object->term_id)); if (!empty($image_data)) { $image_size = apply_filters('amt_image_size_index', 'full'); $image_meta_tags = amt_get_twitter_cards_image_metatags($options, $image_data, $size = $image_size); if (!empty($image_meta_tags)) { $metadata_arr = array_merge($metadata_arr, $image_meta_tags); } } else { // First filter using a term/taxonomy agnostic filter name. $taxonomy_image_url = apply_filters('amt_taxonomy_force_image_url', '', $tax_term_object); if (empty($taxonomy_image_url)) { // Second filter (term/taxonomy dependent). // Construct the filter name. Template: ``amt_taxonomy_image_url_TAXONOMYSLUG_TERMSLUG`` $taxonomy_image_url_filter_name = sprintf('amt_taxonomy_image_url_%s_%s', $tax_term_object->taxonomy, $tax_term_object->slug); //var_dump($taxonomy_image_url_filter_name); // The default image, if set, is used by default. $taxonomy_image_url = apply_filters($taxonomy_image_url_filter_name, $options["default_image_url"]); } if (!empty($taxonomy_image_url)) { $image_data = amt_get_image_data($taxonomy_image_url); if (!empty($image_data)) { $image_size = apply_filters('amt_image_size_index', 'full'); $image_meta_tags = amt_get_twitter_cards_image_metatags($options, $image_data, $size = $image_size); if (!empty($image_meta_tags)) { $metadata_arr = array_merge($metadata_arr, $image_meta_tags); } } //$metadata_arr[] = '<meta name="twitter:image" content="' . esc_url_raw( $taxonomy_image_url ) . '" />'; } } } // Custom Post type Archives } elseif (is_post_type_archive()) { // Custom post type object. // When viewing custom post type archives, the $post object is the custom post type object. Check with: var_dump($post); $post_type_object = $post; //var_dump($post_type_object); // Generate the card only if a publisher username has been set in the publisher settings if (!empty($options['social_main_twitter_publisher_username'])) { // Type $metadata_arr[] = '<meta name="twitter:card" content="' . amt_get_default_twitter_card_type($options) . '" />'; // Creator $metadata_arr[] = '<meta name="twitter:creator" content="@' . esc_attr($options['social_main_twitter_publisher_username']) . '" />'; // Publisher $metadata_arr[] = '<meta name="twitter:site" content="@' . esc_attr($options['social_main_twitter_publisher_username']) . '" />'; // Title // Note: Contains multipage information $metadata_arr['twitter:title'] = '<meta name="twitter:title" content="' . esc_attr(amt_get_title_for_metadata($options, $post)) . '" />'; // Description // Note: Contains multipage information through amt_process_paged() // Add a filtered generic description. // Construct the filter name. Template: ``amt_generic_description_posttype_POSTTYPESLUG_archive`` $custom_post_type_description_filter_name = sprintf('amt_generic_description_posttype_%s_archive', $post_type_object->name); // var_dump($custom_post_type_description_filter_name); // Generic description $generic_description = apply_filters($custom_post_type_description_filter_name, __('%s archive.', 'add-meta-tags')); // Final generic description $generic_description = sprintf($generic_description, post_type_archive_title($prefix = '', $display = false)); $metadata_arr[] = '<meta name="twitter:description" content="' . esc_attr(amt_process_paged($generic_description)) . '" />'; // Image // Use a user defined image via filter. Otherwise use default image. // First filter using a term/taxonomy agnostic filter name. $posttype_image_url = apply_filters('amt_posttype_force_image_url', '', $post_type_object); if (empty($posttype_image_url)) { // Second filter (post type dependent). // Construct the filter name. Template: ``amt_posttype_image_url_POSTTYPESLUG`` $posttype_image_url_filter_name = sprintf('amt_posttype_image_url_%s', $post_type_object->name); //var_dump($posttype_image_url_filter_name); // The default image, if set, is used by default. $posttype_image_url = apply_filters($posttype_image_url_filter_name, $options["default_image_url"]); } if (!empty($posttype_image_url)) { $image_data = amt_get_image_data($posttype_image_url); if (!empty($image_data)) { $image_size = apply_filters('amt_image_size_index', 'full'); $image_meta_tags = amt_get_twitter_cards_image_metatags($options, $image_data, $size = $image_size); if (!empty($image_meta_tags)) { $metadata_arr = array_merge($metadata_arr, $image_meta_tags); } } //$metadata_arr[] = '<meta name="twitter:image" content="' . esc_url_raw( $posttype_image_url ) . '" />'; } } } return $metadata_arr; } // Further check (required in some reported cases) // Go no further if the content type does not validate is_singular(). if (!is_singular()) { return array(); } // Products // A 'product' Twitter Card is generated. See: https://dev.twitter.com/cards/types/product if (amt_is_product()) { // Type $metadata_arr[] = '<meta name="twitter:card" content="product" />'; // Author and Publisher $metadata_arr = array_merge($metadata_arr, amt_get_twitter_cards_author_publisher_metatags($options, $post)); // Title // Note: Contains multipage information //$metadata_arr[] = '<meta name="twitter:title" content="' . esc_attr( amt_process_paged( strip_tags( get_the_title($post->ID) ) ) ) . '" />'; $metadata_arr['twitter:title'] = '<meta name="twitter:title" content="' . esc_attr(amt_get_title_for_metadata($options, $post)) . '" />'; // Description - We use the description defined by Add-Meta-Tags // Note: Contains multipage information through amt_process_paged() $content_desc = amt_get_content_description($post); if (!empty($content_desc)) { $metadata_arr[] = '<meta name="twitter:description" content="' . esc_attr(amt_process_paged($content_desc)) . '" />'; } // Image // Use the featured image or the default image as a fallback. // Set to true if image meta tags have been added to the card, so that it does not // search for any more images. $image_metatags_added = false; // First check if a global image override URL has been entered. // If yes, use this image URL and override all other images. $image_data = amt_get_image_data(amt_get_post_meta_image_url($post->ID)); if (!empty($image_data)) { $image_size = apply_filters('amt_image_size_product', 'full'); $image_meta_tags = amt_get_twitter_cards_image_metatags($options, $image_data, $size = $image_size); if (!empty($image_meta_tags)) { $metadata_arr = array_merge($metadata_arr, $image_meta_tags); } //$global_image_override_url = amt_get_post_meta_image_url($post->ID); //if ( $image_metatags_added === false && ! empty( $global_image_override_url ) ) { // $metadata_arr[] = '<meta name="twitter:image" content="' . esc_url_raw( $global_image_override_url ) . '" />'; // Images have been found. $image_metatags_added = true; } // Set the image size to use $image_size = apply_filters('amt_image_size_product', 'full'); // If the content has a featured image, then we use it. if ($image_metatags_added === false && function_exists('has_post_thumbnail') && has_post_thumbnail($post->ID)) { $main_size_meta = wp_get_attachment_image_src(get_post_thumbnail_id($post->ID), $image_size); $metadata_arr[] = '<meta name="twitter:image" content="' . esc_url_raw($main_size_meta[0]) . '" />'; if (apply_filters('amt_extended_image_tags', true)) { $metadata_arr[] = '<meta name="twitter:image:width" content="' . esc_attr($main_size_meta[1]) . '" />'; $metadata_arr[] = '<meta name="twitter:image:height" content="' . esc_attr($main_size_meta[2]) . '" />'; } // Images have been found. $image_metatags_added = true; } // If an image is still missing, then use the default image (if set). if ($image_metatags_added === false) { $image_data = amt_get_default_image_data(); if (!empty($image_data)) { //$image_size = apply_filters( 'amt_image_size_index', 'full' ); $image_meta_tags = amt_get_twitter_cards_image_metatags($options, $image_data, $size = $image_size); if (!empty($image_meta_tags)) { $metadata_arr = array_merge($metadata_arr, $image_meta_tags); } } //$metadata_arr[] = '<meta name="twitter:image" content="' . esc_url_raw( $options["default_image_url"] ) . '" />'; } // // The Product Twitter Card needs to be extended with the following required // in order to be valid: label1, data1, label2, data2 // // For instance: //<meta name="twitter:label1" content="Genre"> //<meta name="twitter:data1" content="Classic Rock"> //<meta name="twitter:label2" content="Location"> //<meta name="twitter:data2" content="National"> // // The following filter is provided. // Filtering of the generated Twitter Cards metadata. $post is also passed. $metadata_arr = apply_filters('amt_product_data_twitter_cards', $metadata_arr, $post); // Attachments } elseif (is_attachment()) { $mime_type = get_post_mime_type($post->ID); //$attachment_type = strstr( $mime_type, '/', true ); // See why we do not use strstr(): http://www.codetrax.org/issues/1091 $attachment_type = preg_replace('#\\/[^\\/]*$#', '', $mime_type); // Images if ('image' == $attachment_type) { // $post is an image attachment // Image attachments //$image_meta = wp_get_attachment_metadata( $post->ID ); // contains info about all sizes // We use wp_get_attachment_image_src() since it constructs the URLs // Allow filtering of the image size. $image_size = apply_filters('amt_image_size_attachment', 'full'); $main_size_meta = wp_get_attachment_image_src($post->ID, $image_size); // Type $metadata_arr[] = '<meta name="twitter:card" content="photo" />'; // Author and Publisher $metadata_arr = array_merge($metadata_arr, amt_get_twitter_cards_author_publisher_metatags($options, $post)); // Title $metadata_arr['twitter:title'] = '<meta name="twitter:title" content="' . esc_attr(amt_get_title_for_metadata($options, $post)) . '" />'; // Description - We use the description defined by Add-Meta-Tags $content_desc = amt_get_content_description($post); if (!empty($content_desc)) { $metadata_arr[] = '<meta name="twitter:description" content="' . esc_attr($content_desc) . '" />'; } // Image $metadata_arr[] = '<meta name="twitter:image" content="' . esc_url_raw($main_size_meta[0]) . '" />'; if (apply_filters('amt_extended_image_tags', true)) { $metadata_arr[] = '<meta name="twitter:image:width" content="' . esc_attr($main_size_meta[1]) . '" />'; $metadata_arr[] = '<meta name="twitter:image:height" content="' . esc_attr($main_size_meta[2]) . '" />'; } // Audio & Video } elseif ($options["tc_enable_player_card_local"] == "1" && in_array($attachment_type, array('video', 'audio'))) { // Create player card for local video and audio attachments. // $post is an audio or video attachment // Type $metadata_arr[] = '<meta name="twitter:card" content="player" />'; // Author and Publisher $metadata_arr = array_merge($metadata_arr, amt_get_twitter_cards_author_publisher_metatags($options, $post)); // Title $metadata_arr['twitter:title'] = '<meta name="twitter:title" content="' . esc_attr(amt_get_title_for_metadata($options, $post)) . '" />'; // Description - We use the description defined by Add-Meta-Tags $content_desc = amt_get_content_description($post); if (!empty($content_desc)) { $metadata_arr[] = '<meta name="twitter:description" content="' . esc_attr($content_desc) . '" />'; } // twitter:player $metadata_arr[] = sprintf('<meta name="twitter:player" content="%s" />', esc_url_raw(amt_make_https(amt_embed_get_container_url($post->ID)))); // Player size if ('video' == $attachment_type) { // Player size (this should be considered irrelevant of the video size) $player_size = apply_filters('amt_twitter_cards_video_player_size', array(640, 480)); } elseif ('audio' == $attachment_type) { $player_size = apply_filters('amt_twitter_cards_audio_player_size', array(320, 30)); } // twitter:player:width $metadata_arr[] = sprintf('<meta name="twitter:player:width" content="%d" />', esc_attr($player_size[0])); // twitter:player:height $metadata_arr[] = sprintf('<meta name="twitter:player:height" content="%d" />', esc_attr($player_size[1])); // twitter:image $preview_image_url = amt_embed_get_preview_image($post->ID); if (!empty($preview_image_url)) { $metadata_arr[] = '<meta name="twitter:image" content="' . esc_url_raw(amt_make_https($preview_image_url)) . '" />'; } // twitter:player:stream $metadata_arr[] = '<meta name="twitter:player:stream" content="' . esc_url_raw(amt_make_https(amt_embed_get_stream_url($post->ID))) . '" />'; // twitter:player:stream:content_type $metadata_arr[] = '<meta name="twitter:player:stream:content_type" content="' . esc_attr($mime_type) . '" />'; //$metadata_arr[] = '<meta name="twitter:player:stream:content_type" content="video/mp4; codecs="avc1.42E01E1, mp4a.40.2"">'; } // Content // - standard format (post_format === false), aside, link, quote, status, chat (create summary card or summary_large_image if enforced) // - photo format (creates (summary_large_image card) } elseif (get_post_format($post->ID) === false || in_array(get_post_format($post->ID), array('image', 'aside', 'link', 'quote', 'status', 'chat'))) { // Render a summary card if standard format (or summary_large_image if enforced). // Render a summary_large_image card if image format. // Type if (get_post_format($post->ID) === false || in_array(get_post_format($post->ID), array('aside', 'link', 'quote', 'status', 'chat'))) { $metadata_arr[] = '<meta name="twitter:card" content="' . amt_get_default_twitter_card_type($options) . '" />'; // Set the image size to use $image_size = apply_filters('amt_image_size_content', 'full'); } elseif (get_post_format($post->ID) == 'image') { $metadata_arr[] = '<meta name="twitter:card" content="summary_large_image" />'; // Set the image size to use // Since we need a bigger image, here we filter the image size through 'amt_image_size_attachment', // which typically returns a size bigger than 'amt_image_size_content'. $image_size = apply_filters('amt_image_size_attachment', 'full'); } // Author and Publisher $metadata_arr = array_merge($metadata_arr, amt_get_twitter_cards_author_publisher_metatags($options, $post)); // Title // Note: Contains multipage information $metadata_arr['twitter:title'] = '<meta name="twitter:title" content="' . esc_attr(amt_get_title_for_metadata($options, $post)) . '" />'; // Description - We use the description defined by Add-Meta-Tags // Note: Contains multipage information through amt_process_paged() $content_desc = amt_get_content_description($post); if (!empty($content_desc)) { $metadata_arr[] = '<meta name="twitter:description" content="' . esc_attr(amt_process_paged($content_desc)) . '" />'; } // Image // Use the FIRST image ONLY // Set to true if image meta tags have been added to the card, so that it does not // search for any more images. $image_metatags_added = false; // First check if a global image override URL has been entered. // If yes, use this image URL and override all other images. $image_data = amt_get_image_data(amt_get_post_meta_image_url($post->ID)); if (!empty($image_data)) { $image_size = apply_filters('amt_image_size_content', 'full'); $image_meta_tags = amt_get_twitter_cards_image_metatags($options, $image_data, $size = $image_size); if (!empty($image_meta_tags)) { $metadata_arr = array_merge($metadata_arr, $image_meta_tags); } //$global_image_override_url = amt_get_post_meta_image_url($post->ID); //if ( $image_metatags_added === false && ! empty( $global_image_override_url ) ) { // $metadata_arr[] = '<meta name="twitter:image" content="' . esc_url_raw( $global_image_override_url ) . '" />'; // Images have been found. $image_metatags_added = true; } // If the content has a featured image, then we use it. if ($image_metatags_added === false && function_exists('has_post_thumbnail') && has_post_thumbnail($post->ID)) { $main_size_meta = wp_get_attachment_image_src(get_post_thumbnail_id($post->ID), $image_size); $metadata_arr[] = '<meta name="twitter:image:src" content="' . esc_url_raw($main_size_meta[0]) . '" />'; if (apply_filters('amt_extended_image_tags', true)) { $metadata_arr[] = '<meta name="twitter:image:width" content="' . esc_attr($main_size_meta[1]) . '" />'; $metadata_arr[] = '<meta name="twitter:image:height" content="' . esc_attr($main_size_meta[2]) . '" />'; } // Images have been found. $image_metatags_added = true; } // If a featured image is not set for this content, try to find the first image if ($image_metatags_added === false) { // Process all attachments and add metatags for the first image. foreach ($attachments as $attachment) { $mime_type = get_post_mime_type($attachment->ID); //$attachment_type = strstr( $mime_type, '/', true ); // See why we do not use strstr(): http://www.codetrax.org/issues/1091 $attachment_type = preg_replace('#\\/[^\\/]*$#', '', $mime_type); if ('image' == $attachment_type) { // Image tags $main_size_meta = wp_get_attachment_image_src($attachment->ID, $image_size); $metadata_arr[] = '<meta name="twitter:image:src" content="' . esc_url_raw($main_size_meta[0]) . '" />'; if (apply_filters('amt_extended_image_tags', true)) { $metadata_arr[] = '<meta name="twitter:image:width" content="' . esc_attr($main_size_meta[1]) . '" />'; $metadata_arr[] = '<meta name="twitter:image:height" content="' . esc_attr($main_size_meta[2]) . '" />'; } // Images have been found. $image_metatags_added = true; // If an image is added, break. break; } } } // If a local image-attachment is not set, try to find any embedded images if ($image_metatags_added === false) { // Embedded Media foreach ($embedded_media['images'] as $embedded_item) { if (get_post_format($post->ID) === false || in_array(get_post_format($post->ID), array('aside', 'link', 'quote', 'status', 'chat'))) { $metadata_arr[] = '<meta name="twitter:image:src" content="' . esc_url_raw($embedded_item['thumbnail']) . '" />'; if (apply_filters('amt_extended_image_tags', true)) { $metadata_arr[] = '<meta name="twitter:image:width" content="150" />'; $metadata_arr[] = '<meta name="twitter:image:height" content="150" />'; } } elseif (get_post_format($post->ID) == 'image') { $metadata_arr[] = '<meta name="twitter:image:src" content="' . esc_url_raw($embedded_item['image']) . '" />'; if (apply_filters('amt_extended_image_tags', true)) { $metadata_arr[] = '<meta name="twitter:image:width" content="' . esc_attr($embedded_item['width']) . '" />'; $metadata_arr[] = '<meta name="twitter:image:height" content="' . esc_attr($embedded_item['height']) . '" />'; } } // Images have been found. $image_metatags_added = true; // If an image is added, break. break; } } // If an image is still missing, then use the default image (if set). if ($image_metatags_added === false) { $image_data = amt_get_default_image_data(); if (!empty($image_data)) { // Image size already set //$image_size = apply_filters( 'amt_image_size_index', 'full' ); $image_meta_tags = amt_get_twitter_cards_image_metatags($options, $image_data, $size = $image_size); if (!empty($image_meta_tags)) { $metadata_arr = array_merge($metadata_arr, $image_meta_tags); } } //$metadata_arr[] = '<meta name="twitter:image" content="' . esc_url_raw( $options["default_image_url"] ) . '" />'; } // Content // - gallery format (creates gallery card) } elseif (get_post_format($post->ID) == 'gallery') { // Render a gallery card if gallery format. // Type $metadata_arr[] = '<meta name="twitter:card" content="gallery" />'; // Author and Publisher $metadata_arr = array_merge($metadata_arr, amt_get_twitter_cards_author_publisher_metatags($options, $post)); // Title // Note: Contains multipage information $metadata_arr['twitter:title'] = '<meta name="twitter:title" content="' . esc_attr(amt_get_title_for_metadata($options, $post)) . '" />'; // Description - We use the description defined by Add-Meta-Tags // Note: Contains multipage information through amt_process_paged() $content_desc = amt_get_content_description($post); if (!empty($content_desc)) { $metadata_arr[] = '<meta name="twitter:description" content="' . esc_attr(amt_process_paged($content_desc)) . '" />'; } // Image // Set to true if image meta tags have been added to the card, so that it does not // search for any more images. $image_metatags_added = false; // First check if a global image override URL has been entered. // If yes, use this image URL and override all other images. $image_data = amt_get_image_data(amt_get_post_meta_image_url($post->ID)); if (!empty($image_data)) { $image_size = apply_filters('amt_image_size_content', 'full'); $image_meta_tags = amt_get_twitter_cards_image_metatags($options, $image_data, $size = $image_size); if (!empty($image_meta_tags)) { $metadata_arr = array_merge($metadata_arr, $image_meta_tags); } //$global_image_override_url = amt_get_post_meta_image_url($post->ID); //if ( $image_metatags_added === false && ! empty( $global_image_override_url ) ) { // Note 'image0' // $metadata_arr[] = '<meta name="twitter:image0" content="' . esc_url_raw( $global_image_override_url ) . '" />'; // Images have been found. $image_metatags_added = true; } // Build the gallery if ($image_metatags_added === false) { // Image counter $k = 0; // Process all attachments and add metatags for the first image foreach ($attachments as $attachment) { $mime_type = get_post_mime_type($attachment->ID); //$attachment_type = strstr( $mime_type, '/', true ); // See why we do not use strstr(): http://www.codetrax.org/issues/1091 $attachment_type = preg_replace('#\\/[^\\/]*$#', '', $mime_type); if ('image' == $attachment_type) { // Image tags // Allow filtering of the image size. $image_size = apply_filters('amt_image_size_content', 'full'); $main_size_meta = wp_get_attachment_image_src($attachment->ID, $image_size); $metadata_arr[] = '<meta name="twitter:image' . $k . '" content="' . esc_url_raw($main_size_meta[0]) . '" />'; // Increment the counter $k++; } } // Embedded Media foreach ($embedded_media['images'] as $embedded_item) { $metadata_arr[] = '<meta name="twitter:image' . $k . '" content="' . esc_url_raw($embedded_item['image']) . '" />'; // Increment the counter $k++; } } // Content // - video/audio format (creates player card) // Note: The ``tc_enable_player_card_local`` option is checked after this initial check, // because 'player' twitter cards are always generated for embedded audio and video. } elseif (get_post_format($post->ID) == 'video' || get_post_format($post->ID) == 'audio') { $post_format = get_post_format($post->ID); $audio_video_metatags_complete = false; // Process local media only if it is allowed by the user. if ($audio_video_metatags_complete === false && $options["tc_enable_player_card_local"] == "1") { // Local media - Process all attachments and add metatags for the first video foreach ($attachments as $attachment) { $mime_type = get_post_mime_type($attachment->ID); //$attachment_type = strstr( $mime_type, '/', true ); // See why we do not use strstr(): http://www.codetrax.org/issues/1091 $attachment_type = preg_replace('#\\/[^\\/]*$#', '', $mime_type); // Get attachment metadata from WordPress $attachment_metadata = wp_get_attachment_metadata($attachment->ID); // We create player cards for video and audio attachments. // The post might have attachments of other types. if (!in_array($attachment_type, array('video', 'audio'))) { continue; } elseif ($attachment_type != $post_format) { continue; } // Render a player card for the first attached audio or video. // twitter:card $metadata_arr[] = '<meta name="twitter:card" content="player" />'; // Author and Publisher $metadata_arr = array_merge($metadata_arr, amt_get_twitter_cards_author_publisher_metatags($options, $post)); // twitter:title // Title - Note: Contains multipage information $metadata_arr['twitter:title'] = '<meta name="twitter:title" content="' . esc_attr(amt_get_title_for_metadata($options, $post)) . '" />'; // twitter:description // Description - We use the description defined by Add-Meta-Tags // Note: Contains multipage information through amt_process_paged() $content_desc = amt_get_content_description($post); if (!empty($content_desc)) { $metadata_arr[] = '<meta name="twitter:description" content="' . esc_attr(amt_process_paged($content_desc)) . '" />'; } // twitter:player $metadata_arr[] = sprintf('<meta name="twitter:player" content="%s" />', esc_url_raw(amt_make_https(amt_embed_get_container_url($attachment->ID)))); // Player size if ($post_format == 'video') { // Player size (this should be considered irrelevant of the video size) $player_size = apply_filters('amt_twitter_cards_video_player_size', array(640, 480)); } elseif ($post_format == 'audio') { $player_size = apply_filters('amt_twitter_cards_audio_player_size', array(320, 30)); } // twitter:player:width $metadata_arr[] = sprintf('<meta name="twitter:player:width" content="%d" />', esc_attr($player_size[0])); // twitter:player:height $metadata_arr[] = sprintf('<meta name="twitter:player:height" content="%d" />', esc_attr($player_size[1])); // twitter:player:stream $metadata_arr[] = '<meta name="twitter:player:stream" content="' . esc_url_raw(amt_make_https(amt_embed_get_stream_url($attachment->ID))) . '" />'; // twitter:player:stream:content_type $metadata_arr[] = '<meta name="twitter:player:stream:content_type" content="' . esc_attr($mime_type) . '" />'; //$metadata_arr[] = '<meta name="twitter:player:stream:content_type" content="video/mp4; codecs="avc1.42E01E1, mp4a.40.2"">'; // twitter:image // First check if a global image override URL has been set in the post's metabox. // If yes, use this image URL and override all other images. $image_data = amt_get_image_data(amt_get_post_meta_image_url($post->ID)); if (!empty($image_data)) { $image_size = apply_filters('amt_image_size_content', 'full'); $image_meta_tags = amt_get_twitter_cards_image_metatags($options, $image_data, $size = $image_size); if (!empty($image_meta_tags)) { $metadata_arr = array_merge($metadata_arr, $image_meta_tags); } //$global_image_override_url = amt_get_post_meta_image_url($post->ID); //if ( ! empty( $global_image_override_url ) ) { // $metadata_arr[] = '<meta name="twitter:image" content="' . esc_url_raw( $global_image_override_url ) . '" />'; // Else use the featured image if it exists } elseif (function_exists('has_post_thumbnail') && has_post_thumbnail($post->ID)) { // Set the image size to use $image_size = apply_filters('amt_image_size_content', 'full'); $main_size_meta = wp_get_attachment_image_src(get_post_thumbnail_id($post->ID), $image_size); $metadata_arr[] = '<meta name="twitter:image" content="' . esc_url_raw($main_size_meta[0]) . '" />'; //if ( apply_filters( 'amt_extended_image_tags', true ) ) { // $metadata_arr[] = '<meta name="twitter:image:width" content="' . esc_attr( $main_size_meta[1] ) . '" />'; // $metadata_arr[] = '<meta name="twitter:image:height" content="' . esc_attr( $main_size_meta[2] ) . '" />'; //} // Else use the attachment's featured image, if set. } else { // Else use the attachment's featured image, if set. $image_data = amt_embed_get_preview_image($attachment->ID); if (!empty($image_data)) { $image_size = apply_filters('amt_image_size_content', 'full'); $image_meta_tags = amt_get_twitter_cards_image_metatags($options, $image_data, $size = $image_size); if (!empty($image_meta_tags)) { $metadata_arr = array_merge($metadata_arr, $image_meta_tags); } } //$preview_image_url = amt_embed_get_preview_image( $attachment->ID ); //if ( ! empty( $preview_image_url ) ) { // $metadata_arr[] = '<meta name="twitter:image" content="' . esc_url_raw( amt_make_https( $preview_image_url ) ) . '" />'; //} } $audio_video_metatags_complete = true; break; } } // Process embedded media only if a twitter player card has not been generated. if ($audio_video_metatags_complete === false) { // Determine the relevant array (videos or sounds) if ($post_format == 'video') { $embedded_items = $embedded_media['videos']; } elseif ($post_format == 'audio') { $embedded_items = $embedded_media['sounds']; } // Embedded Media foreach ($embedded_items as $embedded_item) { // Render a player card for the first embedded video. // twitter:card $metadata_arr[] = '<meta name="twitter:card" content="player" />'; // Author and Publisher $metadata_arr = array_merge($metadata_arr, amt_get_twitter_cards_author_publisher_metatags($options, $post)); // twitter:title // Title - Note: Contains multipage information $metadata_arr['twitter:title'] = '<meta name="twitter:title" content="' . esc_attr(amt_get_title_for_metadata($options, $post)) . '" />'; // twitter:description // Description - We use the description defined by Add-Meta-Tags // Note: Contains multipage information through amt_process_paged() $content_desc = amt_get_content_description($post); if (!empty($content_desc)) { $metadata_arr[] = '<meta name="twitter:description" content="' . esc_attr(amt_process_paged($content_desc)) . '" />'; } // twitter:player $metadata_arr[] = '<meta name="twitter:player" content="' . esc_url_raw($embedded_item['player']) . '" />'; // Player size // Alt Method: Size uses $content_width //global $content_width; //$width = $content_width; //$height = absint(absint($content_width)*3/4); //$metadata_arr[] = '<meta name="twitter:width" content="' . esc_attr( $width ) . '" />'; //$metadata_arr[] = '<meta name="twitter:height" content="' . esc_attr( $height ) . '" />'; // twitter:player:width $metadata_arr[] = sprintf('<meta name="twitter:player:width" content="%d" />', esc_attr($embedded_item['width'])); // twitter:player:height $metadata_arr[] = sprintf('<meta name="twitter:player:height" content="%d" />', esc_attr($embedded_item['height'])); // twitter:image // First check if a global image override URL has been set in the post's metabox. // If yes, use this image URL and override all other images. $image_data = amt_get_image_data(amt_get_post_meta_image_url($post->ID)); if (!empty($image_data)) { $image_size = apply_filters('amt_image_size_content', 'full'); $image_meta_tags = amt_get_twitter_cards_image_metatags($options, $image_data, $size = $image_size); if (!empty($image_meta_tags)) { $metadata_arr = array_merge($metadata_arr, $image_meta_tags); } //$global_image_override_url = amt_get_post_meta_image_url($post->ID); //if ( ! empty( $global_image_override_url ) ) { // $metadata_arr[] = '<meta name="twitter:image" content="' . esc_url_raw( $global_image_override_url ) . '" />'; // Else use the featured image if it exists } elseif (function_exists('has_post_thumbnail') && has_post_thumbnail($post->ID)) { // Set the image size to use $image_size = apply_filters('amt_image_size_content', 'full'); $main_size_meta = wp_get_attachment_image_src(get_post_thumbnail_id($post->ID), $image_size); $metadata_arr[] = '<meta name="twitter:image" content="' . esc_url_raw($main_size_meta[0]) . '" />'; //if ( apply_filters( 'amt_extended_image_tags', true ) ) { // $metadata_arr[] = '<meta name="twitter:image:width" content="' . esc_attr( $main_size_meta[1] ) . '" />'; // $metadata_arr[] = '<meta name="twitter:image:height" content="' . esc_attr( $main_size_meta[2] ) . '" />'; //} // Else use the attachment's featured image, if set. } else { $image_data = amt_get_image_data($embedded_item['thumbnail']); if (!empty($image_data)) { $image_size = apply_filters('amt_image_size_content', 'full'); $image_meta_tags = amt_get_twitter_cards_image_metatags($options, $image_data, $size = $image_size); if (!empty($image_meta_tags)) { $metadata_arr = array_merge($metadata_arr, $image_meta_tags); } } } // Else use the discovered preview image, if any. //} elseif ( ! empty( $embedded_item['thumbnail'] ) ) { // $metadata_arr[] = '<meta name="twitter:image" content="' . esc_url_raw( $embedded_item['thumbnail'] ) . '" />'; //} // $audio_video_metatags_complete = true; break; } } } // Filtering of the generated Twitter Card metadata $metadata_arr = apply_filters('amt_twitter_cards_metadata_head', $metadata_arr); return $metadata_arr; }
/** * Returns the post's excerpt. * This function was written in order to get the excerpt *outside* the loop * because the get_the_excerpt() function does not work there any more. * This function makes the retrieval of the excerpt independent from the * WordPress function in order not to break compatibility with older WP versions. * * Also, this is even better as the algorithm tries to get text of average * length 250 characters, which is more SEO friendly. The algorithm is not * perfect, but will do for now. * * MUST return sanitized text. */ function amt_get_the_excerpt($post, $excerpt_max_len = 300, $desc_avg_length = 250, $desc_min_length = 150) { if (empty($post->post_excerpt) || get_post_type($post) == 'attachment') { // In attachments we always use $post->post_content to get a description // Here we generate an excerpt from $post->post_content // Early filter that lets dev define the post. This makes it possible to // exclude specific parts of the post for the rest of the algorithm. $initial_content = apply_filters('amt_get_the_excerpt_initial_content', $post->post_content, $post); // First strip all HTML tags $plain_text = wp_kses($initial_content, array()); // Strip shortcodes $plain_text = strip_shortcodes($plain_text); // Get the initial text. // We use $excerpt_max_len characters of the text for the description. $amt_excerpt = sanitize_text_field(amt_sanitize_description(substr($plain_text, 0, $excerpt_max_len))); // Remove any URLs that may exist exactly at the beginning of the description. // This may happen if for example you put a youtube video url first thing in // the post body. $amt_excerpt = preg_replace('#^https?:[^\\t\\r\\n\\s]+#i', '', $amt_excerpt); $amt_excerpt = ltrim($amt_excerpt); // If this was not enough, try to get some more clean data for the description (nasty hack) if (strlen($amt_excerpt) < $desc_avg_length) { $amt_excerpt = sanitize_text_field(amt_sanitize_description(substr($post->post_content, 0, (int) ($excerpt_max_len * 1.5)))); if (strlen($amt_excerpt) < $desc_avg_length) { $amt_excerpt = sanitize_text_field(amt_sanitize_description(substr($post->post_content, 0, (int) ($excerpt_max_len * 2)))); } } /** ORIGINAL ALGO // Get the initial data for the excerpt $amt_excerpt = strip_tags(substr($post->post_content, 0, $excerpt_max_len)); // If this was not enough, try to get some more clean data for the description (nasty hack) if ( strlen($amt_excerpt) < $desc_avg_length ) { $amt_excerpt = strip_tags(substr($post->post_content, 0, (int) ($excerpt_max_len * 1.5))); if ( strlen($amt_excerpt) < $desc_avg_length ) { $amt_excerpt = strip_tags(substr($post->post_content, 0, (int) ($excerpt_max_len * 2))); } } */ $end_of_excerpt = strrpos($amt_excerpt, "."); if ($end_of_excerpt) { // if there are sentences, end the description at the end of a sentence. $amt_excerpt_test = substr($amt_excerpt, 0, $end_of_excerpt + 1); if (strlen($amt_excerpt_test) < $desc_min_length) { // don't end at the end of the sentence because the description would be too small $amt_excerpt .= "..."; } else { // If after ending at the end of a sentence the description has an acceptable length, use this $amt_excerpt = $amt_excerpt_test; } } else { // otherwise (no end-of-sentence in the excerpt) add this stuff at the end of the description. $amt_excerpt .= "..."; } } else { // When the post excerpt has been set explicitly, then it has priority. $amt_excerpt = sanitize_text_field(amt_sanitize_description($post->post_excerpt)); // NOTE ABOUT ATTACHMENTS: In attachments $post->post_excerpt is the caption. // It is usual that attachments have both the post_excerpt and post_content set. // Attachments should never enter here, but be processed above, so that // post->post_content is always used as the source of the excerpt. } /** * In some cases, the algorithm might not work, depending on the content. * In those cases, $amt_excerpt might only contain ``...``. Here we perform * a check for this and return an empty $amt_excerpt. */ if (trim($amt_excerpt) == "...") { $amt_excerpt = ""; } /** * Allow filtering of the generated excerpt. * * Filter with: * * function customize_amt_excerpt( $post ) { * $amt_excerpt = ... * return $amt_excerpt; * } * add_filter( 'amt_get_the_excerpt', 'customize_amt_excerpt', 10, 1 ); */ $amt_excerpt = apply_filters('amt_get_the_excerpt', $amt_excerpt, $post); return $amt_excerpt; }
function amt_buddypress_jsonld_schemaorg($metadata_arr, $post, $options, $attachments, $embedded_media) { // User Profiles // Determines if a BuddyPress user profile has been requested if (bp_is_user_profile()) { // https://codex.buddypress.org/developer/the-bp-global/ global $bp; // $user_id = $bp->displayed_user->id; $user_id = bp_displayed_user_id(); // $user_domain = $bp->displayed_user->domain; // bp_core_get_user_domain( bp_displayed_user_id() ) $user_domain = bp_displayed_user_domain(); $user_profile_url = trailingslashit(bp_displayed_user_domain() . amt_bp_get_profile_slug()); $user_fullname = $bp->displayed_user->fullname; // $user_fullname = bp_displayed_user_fullname(); // $user_username = $bp->displayed_user->user_login; $user_username = bp_get_displayed_user_username(); //$wp_user_obj = get_user_by( 'id', $user_id ); $wp_user_obj = get_userdata($user_id); //var_dump($wp_user_obj); // Context $metadata_arr['@context'] = 'http://schema.org'; // Schema.org type $metadata_arr['@type'] = 'Person'; // name $metadata_arr['name'] = esc_attr($user_fullname); // URL $metadata_arr['url'] = esc_url($user_profile_url, array('http', 'https')); // mainEntityOfPage $metadata_arr['mainEntityOfPage'] = esc_url($user_profile_url, array('http', 'https')); // Related resources as sameAs $metadata_arr['sameAs'] = array(); // Facebook Profile //$fb_author_url = get_the_author_meta('amt_facebook_author_profile_url', $user_id); $fb_author_url = get_user_meta($user_id, 'amt_facebook_author_profile_url', true); if (!empty($fb_author_url)) { $metadata_arr['sameAs'][] = esc_url($fb_author_url, array('http', 'https')); } // Twitter //$twitter_author_username = get_the_author_meta('amt_twitter_author_username', $user_id); $twitter_author_username = get_user_meta($user_id, 'amt_twitter_author_username', true); if (!empty($twitter_author_username)) { $metadata_arr['sameAs'][] = 'https://twitter.com/' . esc_attr($twitter_author_username); } // Google+ //$googleplus_author_url = get_the_author_meta('amt_googleplus_author_profile_url', $wp_user_obj); $googleplus_author_url = get_user_meta($user_id, 'amt_googleplus_author_profile_url', true); if (!empty($googleplus_author_url)) { $metadata_arr['sameAs'][] = esc_url($googleplus_author_url, array('http', 'https')); } // Determines if Extended Profiles component is active. if (!bp_is_active('xprofile')) { // Website //$website_url = get_user_meta($user_id, 'amt_googleplus_author_profile_url', true); $website_url = get_the_author_meta('user_url', $user_id); if (!empty($website_url)) { $metadata_arr['sameAs'][] = esc_url($website_url, array('http', 'https')); } // Description $author_description = sanitize_text_field(amt_sanitize_description($wp_user_obj->description)); if (empty($author_description)) { $metadata_arr['description'] = esc_attr(__('Profile of', 'add-meta-tags') . ' ' . $wp_user_obj->display_name); } else { $metadata_arr['description'] = esc_attr($author_description); } // Profile Image $author_email = sanitize_email($wp_user_obj->user_email); $avatar_size = apply_filters('amt_bp_avatar_size', array('width' => 50, 'height' => 50)); $avatar_url = ''; // First try to get the avatar link by using get_avatar(). // Important: for this to work the "Show Avatars" option should be enabled in Settings > Discussion. $avatar_img = get_avatar(get_the_author_meta('ID', $wp_user_obj->ID), $avatar_size, '', get_the_author_meta('display_name', $wp_user_obj->ID)); if (!empty($avatar_img)) { if (preg_match("#src=['\"]([^'\"]+)['\"]#", $avatar_img, $matches)) { $avatar_url = $matches[1]; } } elseif (!empty($author_email)) { // If the user has provided an email, we use it to construct a gravatar link. $avatar_url = "http://www.gravatar.com/avatar/" . md5($author_email) . "?s=" . $avatar_size; } if (!empty($avatar_url)) { //$avatar_url = html_entity_decode($avatar_url, ENT_NOQUOTES, 'UTF-8'); $metadata_arr['image'] = esc_url($avatar_url); } // familyName $last_name = $wp_user_obj->last_name; if (!empty($last_name)) { $metadata_arr['familyName'] = esc_attr($last_name); } // givenName $first_name = $wp_user_obj->first_name; if (!empty($first_name)) { $metadata_arr['givenName'] = esc_attr($first_name); } // Extended Profiles } else { // https://codex.buddypress.org/themes/guides/displaying-extended-profile-fields-on-member-profiles/ $xprofile_field_map = amt_buddypress_get_xprofile_field_map(); // Get list of IDs of public fields $xprofile_public_fields = bp_xprofile_get_fields_by_visibility_levels($user_id, array('public')); // Website $field_value = amt_bp_get_profile_field_data('website', $user_id, $xprofile_field_map, $xprofile_public_fields); $field_value = sanitize_text_field($field_value); if (!empty($field_value)) { $metadata_arr['sameAs'][] = esc_url($field_value, array('http', 'https')); } // Description $field_value = amt_bp_get_profile_field_data('description', $user_id, $xprofile_field_map, $xprofile_public_fields); $field_value = sanitize_text_field(amt_sanitize_description($field_value)); if (!empty($field_value)) { $metadata_arr['description'] = esc_attr($field_value); } else { $metadata_arr['description'] = esc_attr(__('Profile of', 'add-meta-tags') . ' ' . $user_fullname); } // Profile Image // Important: for this to work the "Show Avatars" option should be enabled in Settings > Discussion. $avatar_size = apply_filters('amt_bp_avatar_size', array('width' => 50, 'height' => 50)); $avatar_url = ''; $avatar_args = array('item_id' => $user_id, 'width' => $avatar_size['width'], 'height' => $avatar_size['height']); $avatar_img = bp_core_fetch_avatar($avatar_args); if (!empty($avatar_img)) { if (preg_match("#src=['\"]([^'\"]+)['\"]#", $avatar_img, $matches)) { $avatar_url = $matches[1]; } } if (!empty($avatar_url)) { //$avatar_url = html_entity_decode($avatar_url, ENT_NOQUOTES, 'UTF-8'); $metadata_arr['image'] = esc_url($avatar_url); } // familyName $has_last_name = false; $field_value = amt_bp_get_profile_field_data('last_name', $user_id, $xprofile_field_map, $xprofile_public_fields); $field_value = sanitize_text_field($field_value); if (!empty($field_value)) { $metadata_arr['familyName'] = esc_attr($field_value); $has_last_name = true; } // givenName $has_first_name = false; $field_value = amt_bp_get_profile_field_data('first_name', $user_id, $xprofile_field_map, $xprofile_public_fields); $field_value = sanitize_text_field($field_value); if (!empty($field_value)) { $metadata_arr['givenName'] = esc_attr($field_value); $has_first_name = true; } // Generate first and last name from full name if needed. if (!$has_last_name && !$has_first_name && !empty($user_fullname)) { $parts = explode(' ', $user_fullname); $last_name = sanitize_text_field(array_pop($parts)); // Removes and returns the element off the end of array if (!empty($last_name)) { $metadata_arr['familyName'] = esc_attr($last_name); } $first_name = sanitize_text_field(implode(' ', $parts)); if (!empty($first_name)) { $metadata_arr['givenName'] = esc_attr($first_name); } } // alternateName $field_value = amt_bp_get_profile_field_data('nickname', $user_id, $xprofile_field_map, $xprofile_public_fields); $field_value = sanitize_text_field($field_value); if (!empty($field_value)) { $metadata_arr['alternateName'] = esc_attr($field_value); } // additionalName $field_value = amt_bp_get_profile_field_data('additional_name', $user_id, $xprofile_field_map, $xprofile_public_fields); $field_value = sanitize_text_field($field_value); if (!empty($field_value)) { $metadata_arr['additionalName'] = esc_attr($field_value); } // honorificPrefix $field_value = amt_bp_get_profile_field_data('honorific_prefix', $user_id, $xprofile_field_map, $xprofile_public_fields); $field_value = sanitize_text_field($field_value); if (!empty($field_value)) { $metadata_arr['honorificPrefix'] = esc_attr($field_value); } // honorificSuffix $field_value = amt_bp_get_profile_field_data('honorific_suffix', $user_id, $xprofile_field_map, $xprofile_public_fields); $field_value = sanitize_text_field($field_value); if (!empty($field_value)) { $metadata_arr['honorificSuffix'] = esc_attr($field_value); } // gender $field_value = amt_bp_get_profile_field_data('gender', $user_id, $xprofile_field_map, $xprofile_public_fields); $field_value = sanitize_text_field($field_value); if (!empty($field_value)) { $metadata_arr['gender'] = esc_attr($field_value); } // nationality $field_value = amt_bp_get_profile_field_data('nationality', $user_id, $xprofile_field_map, $xprofile_public_fields); $field_value = sanitize_text_field($field_value); if (!empty($field_value)) { $metadata_arr['nationality'] = array(); $metadata_arr['nationality']['@type'] = 'Country'; $metadata_arr['nationality']['name'] = esc_attr($field_value); } // telephone $field_value = amt_bp_get_profile_field_data('telephone', $user_id, $xprofile_field_map, $xprofile_public_fields); $field_value = sanitize_text_field($field_value); if (!empty($field_value)) { $metadata_arr['telephone'] = esc_attr($field_value); } // faxNumber $field_value = amt_bp_get_profile_field_data('fax', $user_id, $xprofile_field_map, $xprofile_public_fields); $field_value = sanitize_text_field($field_value); if (!empty($field_value)) { $metadata_arr['faxNumber'] = esc_attr($field_value); } // email $field_value = amt_bp_get_profile_field_data('email', $user_id, $xprofile_field_map, $xprofile_public_fields); $field_value = sanitize_text_field($field_value); if (!empty($field_value)) { $metadata_arr['email'] = 'mailto:' . esc_attr($field_value); } // jobTitle $field_value = amt_bp_get_profile_field_data('job_title', $user_id, $xprofile_field_map, $xprofile_public_fields); $field_value = sanitize_text_field($field_value); if (!empty($field_value)) { $metadata_arr['jobTitle'] = esc_attr($field_value); } // worksFor $field_value = amt_bp_get_profile_field_data('works_for', $user_id, $xprofile_field_map, $xprofile_public_fields); $field_value = sanitize_text_field($field_value); if (!empty($field_value)) { $metadata_arr['worksFor'] = array(); $metadata_arr['worksFor']['@type'] = 'Organization'; $metadata_arr['worksFor']['name'] = esc_attr($field_value); } // worksFor URL $field_value = amt_bp_get_profile_field_data('works_for_url', $user_id, $xprofile_field_map, $xprofile_public_fields); $field_value = sanitize_text_field($field_value); if (!empty($field_value)) { if (!array_key_exists('worksFor', $metadata_arr) || !is_array($metadata_arr['worksFor'])) { $metadata_arr['worksFor'] = array(); $metadata_arr['worksFor']['@type'] = 'Organization'; } $metadata_arr['worksFor']['url'] = esc_attr($field_value); } // Home Location Geo Coordinates // home latitude $latitude = ''; $field_value = amt_bp_get_profile_field_data('home_latitude', $user_id, $xprofile_field_map, $xprofile_public_fields); $field_value = sanitize_text_field($field_value); if (!empty($field_value)) { $latitude = esc_attr($field_value); } // home longitude $longitude = ''; $field_value = amt_bp_get_profile_field_data('home_longitude', $user_id, $xprofile_field_map, $xprofile_public_fields); $field_value = sanitize_text_field($field_value); if (!empty($field_value)) { $longitude = esc_attr($field_value); } if (!empty($latitude) && !empty($longitude)) { $metadata_arr['homeLocation'] = array(); $metadata_arr['homeLocation']['@type'] = 'Place'; $metadata_arr['homeLocation']['latitude'] = esc_attr($latitude); $metadata_arr['homeLocation']['longitude'] = esc_attr($longitude); } // Work Location Geo Coordinates // work latitude $latitude = ''; $field_value = amt_bp_get_profile_field_data('work_latitude', $user_id, $xprofile_field_map, $xprofile_public_fields); $field_value = sanitize_text_field($field_value); if (!empty($field_value)) { $latitude = esc_attr($field_value); } // work longitude $longitude = ''; $field_value = amt_bp_get_profile_field_data('work_longitude', $user_id, $xprofile_field_map, $xprofile_public_fields); $field_value = sanitize_text_field($field_value); if (!empty($field_value)) { $longitude = esc_attr($field_value); } if (!empty($latitude) && !empty($longitude)) { $metadata_arr['workLocation'] = array(); $metadata_arr['workLocation']['@type'] = 'Place'; $metadata_arr['workLocation']['latitude'] = esc_attr($latitude); $metadata_arr['workLocation']['longitude'] = esc_attr($longitude); } } } // Allow filtering of the generated metadata // Customize with: add_filter('amt_buddypress_jsonld_schemaorg_extra', 'my_function', 10, 5); $metadata_arr = apply_filters('amt_buddypress_jsonld_schemaorg_extra', $metadata_arr, $post, $options, $attachments, $embedded_media); return $metadata_arr; }
/** * Return an array of Schema.org metatags suitable for the author object of * the content. Accepts the $post object as argument. */ function amt_get_schemaorg_author_metatags($author_id) { //$author_obj = get_user_by( 'id', $author_id ); $metadata_arr = array(); // name $display_name = get_the_author_meta('display_name', $author_id); $metadata_arr[] = '<meta itemprop="name" content="' . esc_attr($display_name) . '" />'; // description // Here we sanitize the provided description for safety $author_description = sanitize_text_field(amt_sanitize_description(get_the_author_meta('description', $author_id))); if (!empty($author_description)) { $metadata_arr[] = '<meta itemprop="description" content="' . esc_attr($author_description) . '" />'; } // Profile Image $author_email = sanitize_email(get_the_author_meta('user_email', $author_id)); $avatar_size = apply_filters('amt_avatar_size', 128); $avatar_url = ''; // First try to get the avatar link by using get_avatar(). // Important: for this to work the "Show Avatars" option should be enabled in Settings > Discussion. $avatar_img = get_avatar(get_the_author_meta('ID', $author_id), $avatar_size, '', get_the_author_meta('display_name', $author_id)); if (!empty($avatar_img)) { if (preg_match("#src=['\"]([^'\"]+)['\"]#", $avatar_img, $matches)) { $avatar_url = $matches[1]; } } elseif (!empty($author_email)) { // If the user has provided an email, we use it to construct a gravatar link. $avatar_url = "http://www.gravatar.com/avatar/" . md5($author_email) . "?s=" . $avatar_size; } if (!empty($avatar_url)) { //$avatar_url = html_entity_decode($avatar_url, ENT_NOQUOTES, 'UTF-8'); $metadata_arr[] = '<meta itemprop="image" content="' . esc_url_raw($avatar_url) . '" />'; } // url // The URL to the author archive is added as the url. $metadata_arr[] = '<meta itemprop="url" content="' . esc_url_raw(get_author_posts_url($author_id)) . '" />'; // sameAs // Social Profile Links are added as sameAs properties // Those from the WordPress User Profile page are used. // Google+ Author $googleplus_author_url = get_the_author_meta('amt_googleplus_author_profile_url', $author_id); if (!empty($googleplus_author_url)) { $metadata_arr[] = '<meta itemprop="sameAs" content="' . esc_url_raw($googleplus_author_url, array('http', 'https')) . '" />'; } // Facebook $facebook_author_url = get_the_author_meta('amt_facebook_author_profile_url', $author_id); if (!empty($facebook_author_url)) { $metadata_arr[] = '<meta itemprop="sameAs" content="' . esc_url_raw($facebook_author_url, array('http', 'https')) . '" />'; } // Twitter $twitter_author_username = get_the_author_meta('amt_twitter_author_username', $author_id); if (!empty($twitter_author_username)) { $metadata_arr[] = '<meta itemprop="sameAs" content="https://twitter.com/' . esc_attr($twitter_author_username) . '" />'; } // The User URL as set by the user in the WordPress User Profile page. $user_url = get_the_author_meta('user_url', $author_id); if (!empty($user_url)) { $metadata_arr[] = '<meta itemprop="sameAs" content="' . esc_url_raw($user_url, array('http', 'https')) . '" />'; } // Allow filtering of the Author meta tags $metadata_arr = apply_filters('amt_schemaorg_author_extra', $metadata_arr); return $metadata_arr; }