, CodeTRAX.org * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * The NOTICE file contains additional licensing and copyright information. */ /** * Opengraph Protocol Metadata * Opengraph Specification: http://ogp.me * * Module containing functions related to Opengraph Protocol Metadata * * article object: https://developers.facebook.com/docs/reference/opengraph/object-type/article/ * video.other object: https://developers.facebook.com/docs/reference/opengraph/object-type/video.other/ */ // Prevent direct access to this file. if ( ! defined( 'ABSPATH' ) ) { header( 'HTTP/1.0 403 Forbidden' ); echo 'This file should not be accessed directly!'; exit; // Exit if accessed directly } /** * Add contact method for Facebook author and publisher. */ function amt_add_facebook_contactmethod( $contactmethods ) { // Add Facebook Author Profile URL if ( !isset( $contactmethods['amt_facebook_author_profile_url'] ) ) { $contactmethods['amt_facebook_author_profile_url'] = __('Facebook author profile URL', 'add-meta-tags') . ' (AMT)'; } // The publisher profile box in the WordPress user profile page can be deactivated via filtering. if ( apply_filters( 'amt_allow_publisher_settings_in_user_profiles', false ) ) { // Add Facebook Publisher Profile URL if ( !isset( $contactmethods['amt_facebook_publisher_profile_url'] ) ) { $contactmethods['amt_facebook_publisher_profile_url'] = __('Facebook publisher profile URL', 'add-meta-tags') . ' (AMT)'; } } // Remove test // if ( isset( $contactmethods['test'] ) { // unset( $contactmethods['test'] ); // } return $contactmethods; } add_filter( 'user_contactmethods', 'amt_add_facebook_contactmethod', 10, 1 ); /** * 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[] = ''; //} // 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[] = ''; // } //} // 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'] = '' $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['og:type'] = ''; // Site Name $metadata_arr['og:site_name'] = ''; // Title - Note: Contains multipage information $metadata_arr['og:title'] = ''; // URL - Note: different method to get the permalink on paged archives if ( is_paged() ) { $metadata_arr['og:url'] = ''; } else { $metadata_arr['og: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['og:description'] = ''; } // Locale $metadata_arr['og:locale'] = ''; // 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['og:type'] = ''; } else { $metadata_arr['og:type'] = ''; } // Site Name $metadata_arr['og:site_name'] = ''; // Title - Note: Contains multipage information $metadata_arr['og:title'] = ''; // URL - Note: different method to get the permalink on paged archives if ( is_paged() ) { $metadata_arr['og:url'] = ''; } else { $metadata_arr['og: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['og:description'] = ''; } elseif (get_bloginfo('description')) { // Alternatively use the blog's description $metadata_arr['og:description'] = ''; } // Locale $metadata_arr['og:locale'] = ''; // 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_data( 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[] = ''; // if ( is_ssl() || ( ! is_ssl() && $options["has_https_access"] == "1" ) ) { // $metadata_arr[] = ''; // } // 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[] = ''; //if ( is_ssl() || ( ! is_ssl() && $options["has_https_access"] == "1" ) ) { // $metadata_arr[] = ''; //} } // 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[] = ''; } $first_name = get_the_author_meta( 'first_name', $post->post_author ); if ( !empty($first_name) ) { $metadata_arr[] = ''; } } // The posts index page - a static page displaying the latest posts } elseif ( amt_is_static_home() ) { // Type $metadata_arr['og:type'] = ''; // Site Name $metadata_arr['og:site_name'] = ''; // Title - Note: Contains multipage information $metadata_arr['og:title'] = ''; // URL - Note: different method to get the permalink on paged archives if ( is_paged() ) { $metadata_arr['og:url'] = ''; } else { $metadata_arr['og: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['og:description'] = ''; } elseif (get_bloginfo('description')) { // Alternatively use a generic description $metadata_arr['og:description'] = ''; } // Locale $metadata_arr['og:locale'] = ''; // 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_data( 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[] = ''; // if ( is_ssl() || ( ! is_ssl() && $options["has_https_access"] == "1" ) ) { // $metadata_arr[] = ''; // } // 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[] = ''; //if ( is_ssl() || ( ! is_ssl() && $options["has_https_access"] == "1" ) ) { // $metadata_arr[] = ''; //} } // 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['og:type'] = ''; } else { $metadata_arr['og:type'] = ''; } // Site Name $metadata_arr['og:site_name'] = ''; // Title - Note: Contains multipage information $metadata_arr['og:title'] = ''; // 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['og: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['og:description'] = ''; } else { $metadata_arr['og:description'] = ''; } // Locale $metadata_arr['og:locale'] = ''; // 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_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_data( $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[] = ''; //if ( is_ssl() || ( ! is_ssl() && $options["has_https_access"] == "1" ) ) { // $metadata_arr[] = ''; //} } } // 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['og:type'] = ''; } else { $metadata_arr['og:type'] = ''; } // Site Name $metadata_arr['og:site_name'] = ''; // Title - Note: Contains multipage information //if ( ! is_paged() ) { // // We treat the first page of the archive as a profile // $metadata_arr[] = ''; //} else { // $metadata_arr[] = 'display_name ) ) . '" />'; //} $metadata_arr['og:title'] = ''; // 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['og:url'] = ''; } else { if ( is_paged() ) { $metadata_arr['og:url'] = ''; } else { $metadata_arr['og:url'] = ''; // The following makes no sense here. 'get_author_posts_url( $author->ID )' will do in all cases. //$metadata_arr['og:url'] = ''; } } // description - Note: Contains multipage information through amt_process_paged() if ( is_paged() ) { $metadata_arr['og:description'] = '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['og:description'] = 'display_name ) . '" />'; } else { $metadata_arr['og:description'] = ''; } } // Locale $metadata_arr['og:locale'] = ''; // 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_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[] = ''; // Add an og:imagesecure_url if the image URL uses HTTPS if ( strpos($avatar_url, 'https://') !== false ) { $metadata_arr[] = ''; } if ( apply_filters( 'amt_extended_image_tags', true ) ) { $metadata_arr[] = ''; $metadata_arr[] = ''; // 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[] = ''; } } } // 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[] = ''; } $first_name = $author->first_name; if ( !empty($first_name) ) { $metadata_arr[] = ''; } } // 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['og:type'] = ''; // Site Name $metadata_arr['og:site_name'] = ''; // Title - Note: Contains multipage information $metadata_arr['og:title'] = ''; // 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['og: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['og:description'] = ''; // Locale $metadata_arr['og:locale'] = ''; // 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_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[] = ''; //if ( is_ssl() || ( ! is_ssl() && $options["has_https_access"] == "1" ) ) { // $metadata_arr[] = ''; //} } // 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['og:type'] = ''; // Site Name $metadata_arr['og:site_name'] = ''; // Title $metadata_arr['og:title'] = ''; // URL $metadata_arr['og:url'] = ''; // Description - We use the description defined by Add-Meta-Tags $content_desc = amt_get_content_description($post); if ( !empty($content_desc) ) { $metadata_arr['og:description'] = ''; } // Locale $metadata_arr['og:locale'] = ''; // og:updated_time $metadata_arr['og:updated_time'] = ''; // 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[] = ''; if ( is_ssl() || ( ! is_ssl() && $options["has_https_access"] == "1" ) ) { $metadata_arr[] = ''; } // //$metadata_arr[] = ''; //$metadata_arr[] = ''; $metadata_arr[] = ''; } } elseif ( 'audio' == $attachment_type ) { // Audio tags $metadata_arr[] = ''; if ( is_ssl() || ( ! is_ssl() && $options["has_https_access"] == "1" ) ) { $metadata_arr[] = ''; } $metadata_arr[] = ''; } // Article: meta tags // Dates $metadata_arr['article:published_time'] = ''; $metadata_arr['article:modified_time'] = ''; // 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['article:author'] = ''; } else { //$metadata_arr['article:author'] = ''; $metadata_arr['article:author'] = ''; } // 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['article:publisher'] = ''; } else { $metadata_arr['article:publisher'] = ''; } // 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['og:site_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['og:type'] = ''; // Title // Note: Contains multipage information $metadata_arr['og:title'] = ''; // URL - Uses amt_get_permalink_for_multipage() $metadata_arr['og:url'] = ''; // 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['og:description'] = ''; } // Locale $metadata_arr['og:locale'] = ''; // og:updated_time $metadata_arr['og:updated_time'] = ''; // 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_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_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[] = ''; // if ( is_ssl() || ( ! is_ssl() && $options["has_https_access"] == "1" ) ) { // $metadata_arr[] = ''; // } // 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[] = ''; if ( is_ssl() || ( ! is_ssl() && $options["has_https_access"] == "1" ) ) { $metadata_arr[] = ''; } //$metadata_arr[] = ''; //$metadata_arr[] = ''; $metadata_arr[] = ''; // Increase video counter $vc++; } } elseif ( 'audio' == $attachment_type && $ac < $audio_limit ) { // Audio tags $metadata_arr[] = ''; if ( is_ssl() || ( ! is_ssl() && $options["has_https_access"] == "1" ) ) { $metadata_arr[] = ''; } $metadata_arr[] = ''; // Increase audio counter $ac++; } } } // Embedded Media foreach( $embedded_media['images'] as $embedded_item ) { if ( $ic == $image_limit ) { break; } $metadata_arr[] = ''; $metadata_arr[] = ''; if ( apply_filters( 'amt_extended_image_tags', true ) ) { $metadata_arr[] = ''; $metadata_arr[] = ''; $metadata_arr[] = ''; } // 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[] = ''; $metadata_arr[] = ''; $metadata_arr[] = ''; $metadata_arr[] = ''; $metadata_arr[] = ''; // Increase video counter $vc++; } } foreach( $embedded_media['sounds'] as $embedded_item ) { if ( $ac == $audio_limit ) { break; } $metadata_arr[] = ''; $metadata_arr[] = ''; $metadata_arr[] = ''; // 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[] = ''; //if ( is_ssl() || ( ! is_ssl() && $options["has_https_access"] == "1" ) ) { // $metadata_arr[] = ''; //} } } // 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[] = ''; } } // Article: meta tags if ( $og_type == 'article' ) { // Dates $metadata_arr['article:published_time'] = ''; $metadata_arr['article:modified_time'] = ''; // 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['article:author'] = ''; } else { //$metadata_arr['article:author'] = ''; $metadata_arr['article:author'] = ''; } // 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['article:publisher'] = ''; } else { $metadata_arr['article:publisher'] = ''; } /* // article:section: We use the first category as the section. $first_cat = amt_get_first_category($post); if ( ! empty( $first_cat ) ) { $metadata_arr[] = ''; } */ // 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[] = ''; } } // 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[] = ''; } } } // video.other meta tags elseif ( $og_type == 'video.other' ) { // Dates $metadata_arr[] = ''; // 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[] = ''; } } } // product meta tags 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; } // // Return an array of Opengraph metatags for an image attachment with the // provided post ID. // By default, returns metadata for the 'medium' sized version of the image. // function amt_get_opengraph_image_metatags( $options, $image_data, $size='medium' ) { // // $image_data can be: // // 1. An array with the following data: // // 'id' => null, // post ID of attachment // 'url' => null, // 'width' => null, // 'height' => null, // 'type' => null, // // 2. An attachment ID (integer) // $metadata_arr = array(); $image_id = null; if ( is_array($image_data) && ! is_null($image_data['url']) ) { // Here we process the image data as retrieved from the special notation of the image's URL. // No size information is taken into account in this case. // Image tags $metadata_arr[] = ''; if ( is_ssl() || ( ! is_ssl() && $options["has_https_access"] == "1" ) ) { $metadata_arr[] = ''; } if ( apply_filters( 'amt_extended_image_tags', true ) ) { if ( ! is_null($image_data['width']) ) { $metadata_arr[] = ''; } if ( ! is_null($image_data['height']) ) { $metadata_arr[] = ''; } if ( ! is_null($image_data['type']) ) { $metadata_arr[] = ''; } } return $metadata_arr; } elseif ( is_array($image_data) && is_numeric($image_data['id']) ) { // The attachment ID exists in the array's 'id' item. $image_id = absint( $image_data['id'] ); } elseif ( is_numeric($image_data) ) { // Image data is the attachment ID (integer) $image_id = absint( $image_data ); } if ( empty($image_id) ) { return $metadata_arr; } // Process the image attachment and generate meta tags. //$image = get_post( $image_id ); //$image_meta = wp_get_attachment_metadata( $image->ID ); // contains info about all sizes // We use wp_get_attachment_image_src() since it constructs the URLs //$thumbnail_meta = wp_get_attachment_image_src( $image->ID, 'thumbnail' ); $main_size_meta = wp_get_attachment_image_src( $image_id, $size ); // Check if we have image data. $main_size_meta is false on error. if ( $main_size_meta === false ) { return $metadata_arr; } // Image tags $metadata_arr[] = ''; if ( is_ssl() || ( ! is_ssl() && $options["has_https_access"] == "1" ) ) { $metadata_arr[] = ''; } if ( apply_filters( 'amt_extended_image_tags', true ) ) { $metadata_arr[] = ''; $metadata_arr[] = ''; $metadata_arr[] = ''; } return $metadata_arr; }