, 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.
*/
/**
* Twitter Cards
* Twitter Cards specification: https://dev.twitter.com/cards/overview
*
* Module containing functions related to Twitter Cards
*/
// 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 Twitter username of author and publisher.
*/
function amt_add_twitter_contactmethod( $contactmethods ) {
// Add Twitter author username
if ( !isset( $contactmethods['amt_twitter_author_username'] ) ) {
$contactmethods['amt_twitter_author_username'] = __('Twitter author username', '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 Twitter publisher username
if ( !isset( $contactmethods['amt_twitter_publisher_username'] ) ) {
$contactmethods['amt_twitter_publisher_username'] = __('Twitter publisher username', 'add-meta-tags') . ' (AMT)';
}
}
return $contactmethods;
}
add_filter( 'user_contactmethods', 'amt_add_twitter_contactmethod', 10, 1 );
/**
* 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'] = ''
$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[] = '';
// Creator
$metadata_arr[] = '';
// Publisher
$metadata_arr[] = '';
// Title
// Note: Contains multipage information
$metadata_arr['twitter:title'] = '';
// 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[] = '';
}
// 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[] = '';
}
// 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[] = '';
// Creator
$metadata_arr[] = '';
// Publisher
$metadata_arr[] = '';
// Title
// Note: Contains multipage information
$metadata_arr['twitter:title'] = '';
// 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[] = '';
} else {
$metadata_arr[] = '';
}
// 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[] = '';
}
}
}
// 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[] = '';
// Creator
$metadata_arr[] = '';
// Publisher
$metadata_arr[] = '';
// Title
// Note: Contains multipage information
$metadata_arr['twitter:title'] = '';
// 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[] = '';
// 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[] = '';
}
}
}
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[] = '';
// 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[] = '';
$metadata_arr['twitter:title'] = '';
// 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[] = '';
}
// 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[] = '';
// 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[] = '';
if ( apply_filters( 'amt_extended_image_tags', true ) ) {
$metadata_arr[] = '';
$metadata_arr[] = '';
}
// 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[] = '';
}
//
// The Product Twitter Card needs to be extended with the following required
// in order to be valid: label1, data1, label2, data2
//
// For instance:
//
//
//
//
//
// 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[] = '';
// Author and Publisher
$metadata_arr = array_merge( $metadata_arr, amt_get_twitter_cards_author_publisher_metatags( $options, $post ) );
// Title
$metadata_arr['twitter:title'] = '';
// Description - We use the description defined by Add-Meta-Tags
$content_desc = amt_get_content_description( $post );
if ( ! empty( $content_desc ) ) {
$metadata_arr[] = '';
}
// Image
$metadata_arr[] = '';
if ( apply_filters( 'amt_extended_image_tags', true ) ) {
$metadata_arr[] = '';
$metadata_arr[] = '';
}
// 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[] = '';
// Author and Publisher
$metadata_arr = array_merge( $metadata_arr, amt_get_twitter_cards_author_publisher_metatags( $options, $post ) );
// Title
$metadata_arr['twitter:title'] = '';
// Description - We use the description defined by Add-Meta-Tags
$content_desc = amt_get_content_description($post);
if ( !empty($content_desc) ) {
$metadata_arr[] = '';
}
// twitter:player
$metadata_arr[] = sprintf( '', 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( '', esc_attr( $player_size[0] ) );
// twitter:player:height
$metadata_arr[] = sprintf( '', esc_attr( $player_size[1] ) );
// twitter:image
$preview_image_url = amt_embed_get_preview_image( $post->ID );
if ( ! empty( $preview_image_url ) ) {
$metadata_arr[] = '';
}
// twitter:player:stream
$metadata_arr[] = '';
// twitter:player:stream:content_type
$metadata_arr[] = '';
//$metadata_arr[] = '';
}
// 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[] = '';
// Set the image size to use
$image_size = apply_filters( 'amt_image_size_content', 'full' );
} elseif ( get_post_format($post->ID) == 'image' ) {
$metadata_arr[] = '';
// 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'] = '';
// 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[] = '';
}
// 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[] = '';
// 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[] = '';
if ( apply_filters( 'amt_extended_image_tags', true ) ) {
$metadata_arr[] = '';
$metadata_arr[] = '';
}
// 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[] = '';
if ( apply_filters( 'amt_extended_image_tags', true ) ) {
$metadata_arr[] = '';
$metadata_arr[] = '';
}
// 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[] = '';
if ( apply_filters( 'amt_extended_image_tags', true ) ) {
$metadata_arr[] = '';
$metadata_arr[] = '';
}
} elseif ( get_post_format($post->ID) == 'image' ) {
$metadata_arr[] = '';
if ( apply_filters( 'amt_extended_image_tags', true ) ) {
$metadata_arr[] = '';
$metadata_arr[] = '';
}
}
// 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[] = '';
}
// Content
// - gallery format (creates gallery card)
} elseif ( get_post_format($post->ID) == 'gallery' ) {
// Render a gallery card if gallery format.
// Type
$metadata_arr[] = '';
// 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'] = '';
// 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[] = '';
}
// 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[] = '';
// 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[] = '';
// Increment the counter
$k++;
}
}
// Embedded Media
foreach( $embedded_media['images'] as $embedded_item ) {
$metadata_arr[] = '';
// 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[] = '';
// 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'] = '';
// 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[] = '';
}
// twitter:player
$metadata_arr[] = sprintf( '', 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( '', esc_attr( $player_size[0] ) );
// twitter:player:height
$metadata_arr[] = sprintf( '', esc_attr( $player_size[1] ) );
// twitter:player:stream
$metadata_arr[] = '';
// twitter:player:stream:content_type
$metadata_arr[] = '';
//$metadata_arr[] = '';
// 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[] = '';
// 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[] = '';
//if ( apply_filters( 'amt_extended_image_tags', true ) ) {
// $metadata_arr[] = '';
// $metadata_arr[] = '';
//}
// 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[] = '';
//}
}
$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[] = '';
// 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'] = '';
// 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[] = '';
}
// twitter:player
$metadata_arr[] = '';
// Player size
// Alt Method: Size uses $content_width
//global $content_width;
//$width = $content_width;
//$height = absint(absint($content_width)*3/4);
//$metadata_arr[] = '';
//$metadata_arr[] = '';
// twitter:player:width
$metadata_arr[] = sprintf( '', esc_attr( $embedded_item['width'] ) );
// twitter:player:height
$metadata_arr[] = sprintf( '', 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[] = '';
// 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[] = '';
//if ( apply_filters( 'amt_extended_image_tags', true ) ) {
// $metadata_arr[] = '';
// $metadata_arr[] = '';
//}
// 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[] = '';
//}
//
$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 author and publisher metatags for Twitter Cards
*/
function amt_get_twitter_cards_author_publisher_metatags( $options, $post ) {
$metadata_arr = array();
// Author and Publisher
$twitter_author_username = get_the_author_meta('amt_twitter_author_username', $post->post_author);
if ( !empty($twitter_author_username) ) {
$metadata_arr[] = '';
}
if ( ! empty($options['social_main_twitter_publisher_username']) ) {
$metadata_arr[] = '';
}
return $metadata_arr;
}
//
// Return an array of Twitter Cards meta tags for an image attachment with the
// provided post ID.
// By default, returns metadata for the 'medium' sized version of the image.
//
function amt_get_twitter_cards_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 ( apply_filters( 'amt_extended_image_tags', true ) ) {
if ( ! is_null($image_data['width']) ) {
$metadata_arr[] = '';
}
if ( ! is_null($image_data['height']) ) {
$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;
}