function amt_inner_metadata_box($post)
{
    /* For future implementation. Basic code for tabs. */
    /*
    print('<br /><br />
        <div id="amt-metabox-tabs">
            <ul id="amt-metabox-tabs-list" class="category-tabs">
                <li><a href="#metadata-basic">Basic</a></li>
                <li><a href="#metadata-advanced">Advanced</a></li>
                <li><a href="#metadata-extra">Extra</a></li>
            </ul>
    
            <br class="clear" />
            <div id="metadata-basic">
                <p>#1 - basic</p>
            </div>
            <div class="hidden" id="metadata-advanced">
                <p>#2 - advanced</p>
            </div>
            <div class="hidden" id="metadata-extra">
                <p>#3 - extra</p>
            </div>
        </div>
        <br /><br />
    ');
    */
    // Use a nonce field for verification
    wp_nonce_field(plugin_basename(AMT_PLUGIN_FILE), 'amt_noncename');
    // Get the Metadata metabox permissions (filtered)
    $metabox_permissions = amt_get_metadata_metabox_permissions();
    // Get the post type. Will be used to customize the displayed notes.
    $post_type = get_post_type($post->ID);
    // Get the Add-Meta-Tags options.
    $options = get_option("add_meta_tags_opts");
    // Display the meta box HTML code.
    $metabox_has_features = false;
    print '
    <!-- #add-meta-tags-settings is required by the media selector -->
    <span id="add-meta-tags-settings">
    ';
    // Custom description
    // Description box permission check (can be user customized via filter).
    if ($options['metabox_enable_description'] == '1' && current_user_can($metabox_permissions['description_box_capability'])) {
        $metabox_has_features = true;
        // Retrieve the field data from the database.
        $custom_description_value = amt_get_post_meta_description($post->ID);
        print '
            <p>
                <label for="amt_custom_description"><strong>' . __('Description', 'add-meta-tags') . '</strong>:</label>
                <textarea class="code" style="width: 99%" id="amt_custom_description" name="amt_custom_description" cols="30" rows="2" >' . esc_attr(stripslashes($custom_description_value)) . '</textarea>
                <br>
                ' . __('Enter a custom description of 30-50 words (based on an average word length of 5 characters).', 'add-meta-tags') . '
            </p>
        ';
        // Different notes based on post type
        if ($post_type == 'post') {
            print '
                <p>
                    ' . __('If the <em>description</em> field is left blank, a <em>description</em> meta tag will be <strong>automatically</strong> generated from the excerpt or, if an excerpt has not been set, directly from the first paragraph of the content.', 'add-meta-tags') . '
                </p>
            ';
        } elseif ($post_type == 'page') {
            print '
                <p>
                    ' . __('If the <em>description</em> field is left blank, a <em>description</em> meta tag will be <strong>automatically</strong> generated from the first paragraph of the content.', 'add-meta-tags') . '
                </p>
            ';
        } else {
            // Custom post types
            print '
                <p>
                    ' . __('If the <em>description</em> field is left blank, a <em>description</em> meta tag will be <strong>automatically</strong> generated from the first paragraph of the content.', 'add-meta-tags') . '
                </p>
            ';
        }
        // Add warning about the automatic descriptions being turned off.
        if (!apply_filters('amt_generate_description_if_no_manual_data', true)) {
            print '
                <p>
                    <em>' . __('Warning: the automatic generation of descriptions has been turned off.', 'add-meta-tags') . '</em>
                </p>
            ';
        }
    }
    // Custom keywords
    // Keywords box permission check (can be user customized via filter).
    if ($options['metabox_enable_keywords'] == '1' && current_user_can($metabox_permissions['keywords_box_capability'])) {
        $metabox_has_features = true;
        // Retrieve the field data from the database.
        $custom_keywords_value = amt_get_post_meta_keywords($post->ID);
        // Alt input:  <input type="text" class="code" style="width: 99%" id="amt_custom_keywords" name="amt_custom_keywords" value="'.$custom_keywords_value.'" />
        print '
            <p>
                <label for="amt_custom_keywords"><strong>' . __('Keywords', 'add-meta-tags') . '</strong>:</label>
                <textarea class="code" style="width: 99%" id="amt_custom_keywords" name="amt_custom_keywords" cols="30" rows="2" >' . esc_attr(stripslashes($custom_keywords_value)) . '</textarea>
                <br>
                ' . __('Enter keywords separated with commas.', 'add-meta-tags') . '
            </p>
        ';
        // Different notes based on post type
        if ($post_type == 'post') {
            print '
                <p>
                    ' . __('If the <em>keywords</em> field is left blank, a <em>keywords</em> meta tag will be <strong>automatically</strong> generated from the post\'s categories, tags, custom taxonomy terms and from the global keywords, if any such global keywords have been set in the plugin settings. In case you decide to set a custom list of keywords for this post, it is possible to easily include the post\'s categories, tags and custom taxonomy terms in that list by using the special placeholders <code>%cats%</code>, <code>%tags%</code> and <code>%terms%</code> respectively.', 'add-meta-tags') . '
                    <br />
                    ' . __('Example', 'add-meta-tags') . ': <code>keyword1, keyword2, %cats%, keyword3, %tags%, keyword4</code>
                </p>
            ';
        } elseif ($post_type == 'page') {
            print '
                <p>
                    ' . __('If the <em>keywords</em> field is left blank, a <em>keywords</em> meta tag will only be automatically generated from global keywords, if any such global keywords have been set in the plugin settings.', 'add-meta-tags') . '
                </p>
            ';
        } else {
            // Custom post types
            print '
                <p>
                    ' . __('If the <em>keywords</em> field is left blank, a <em>keywords</em> meta tag will only be automatically generated from global keywords, if any such global keywords have been set in the plugin settings.', 'add-meta-tags') . '
                </p>
            ';
        }
        // Add warning about the automatic keywords being turned off.
        if (!apply_filters('amt_generate_keywords_if_no_manual_data', true)) {
            print '
                <p>
                    <em>' . __('Warning: the automatic generation of keywords has been turned off.', 'add-meta-tags') . '</em>
                </p>
            ';
        }
    }
    // Advanced options
    // Custom title tag
    // Custom title box permission check (can be user customized via filter).
    if ($options['metabox_enable_title'] == '1' && current_user_can($metabox_permissions['title_box_capability'])) {
        $metabox_has_features = true;
        // Retrieve the field data from the database.
        $custom_title_value = amt_get_post_meta_title($post->ID);
        print '
            <p>
                <label for="amt_custom_title"><strong>' . __('Title', 'add-meta-tags') . '</strong>:</label>
                <input type="text" class="code" style="width: 99%" id="amt_custom_title" name="amt_custom_title" value="' . esc_attr(stripslashes($custom_title_value)) . '" />
                <br>
                ' . __('Enter a custom title to be used in the <em>title</em> HTML element of the page.', 'add-meta-tags') . '
            </p>
            <p>
                ' . __('The <code>%title%</code> placeholder is automatically expanded to the current title of the content.', 'add-meta-tags') . '
            </p>
        ';
    }
    // 'news_keywords' meta tag
    // 'news_keywords' box permission check (can be user customized via filter).
    if ($options['metabox_enable_news_keywords'] == '1' && current_user_can($metabox_permissions['news_keywords_box_capability'])) {
        $metabox_has_features = true;
        // Retrieve the field data from the database.
        $custom_newskeywords_value = amt_get_post_meta_newskeywords($post->ID);
        print '
            <p>
                <label for="amt_custom_newskeywords"><strong>' . __('News Keywords', 'add-meta-tags') . '</strong>:</label>
                <input type="text" class="code" style="width: 99%" id="amt_custom_newskeywords" name="amt_custom_newskeywords" value="' . esc_attr(stripslashes($custom_newskeywords_value)) . '" />
                <br>
                ' . __('Enter a comma-delimited list of <strong>news keywords</strong>. For more info about this meta tag, please see this <a target="_blank" href="http://support.google.com/news/publisher/bin/answer.py?hl=en&answer=68297">Google help page</a>.', 'add-meta-tags') . '
            </p>
        ';
    }
    // per post full meta tags
    // Full meta tags box permission check (can be user customized via filter).
    if ($options['metabox_enable_full_metatags'] == '1' && current_user_can($metabox_permissions['full_metatags_box_capability'])) {
        $metabox_has_features = true;
        // Retrieve the field data from the database.
        $custom_full_metatags_value = amt_get_post_meta_full_metatags($post->ID);
        print '
            <p>
                <label for="amt_custom_full_metatags"><strong>' . __('Full meta tags', 'add-meta-tags') . '</strong>:</label>
                ' . amt_get_full_meta_tag_sets($custom_full_metatags_value) . '
                <textarea class="code" style="width: 99%" id="amt_custom_full_metatags" name="amt_custom_full_metatags" cols="30" rows="6" >' . stripslashes($custom_full_metatags_value) . '</textarea>
                <br />
                ' . __('Provide the full XHTML code of extra <a target="_blank" href="http://en.wikipedia.org/wiki/Meta_element" target="_blank"><code>meta</code></a> and <code>link</code> <a target="_blank" href="https://en.wikipedia.org/wiki/HTML_element">HTML elements</a> you would like to add to this content.', 'add-meta-tags') . '
                ' . __('For example, to prevent a cached copy of this content from being available in search engine results, you can add the following metatag:', 'add-meta-tags') . '
                <br /><br />
                <code>&lt;meta name="robots" content="noarchive" /&gt;</code>
            </p>

            <p>' . __('Moreover, the full meta tags box accepts the special notation <code>[field=Field Name]</code> which lets you use data from a Custom Field with name <em>Field Name</em>. This special notation may exist anywhere inside the meta tag. To automatically add paging information to URLs, append the <code>PAGEINFO</code> placeholder.', 'add-meta-tags') . '</p>

        ';
    }
    // Image URL (global override)
    // 'image_url' box permission check (can be user customized via filter).
    if ($options['metabox_enable_image_url'] == '1' && current_user_can($metabox_permissions['image_url_box_capability'])) {
        $metabox_has_features = true;
        // Retrieve the field data from the database.
        $custom_image_url_value = amt_get_post_meta_image_url($post->ID);
        print '
            <p>
                <label for="amt_custom_image_url"><strong>' . __('Image URL', 'add-meta-tags') . '</strong>:</label>
                <input type="text" class="code" style="width: 99%" id="amt_custom_image_url" name="amt_custom_image_url" value="' . amt_esc_id_or_url_notation(stripslashes($custom_image_url_value)) . '" />

                <span id="amt-image-selector-button" class="amt-image-selector-button wp-media-buttons-icon loadmediawindow button updatemeta button-small">' . __('Select image', 'add-meta-tags') . '</span>
                <br />

                ' . __('Enter an absolute image URL in order to enforce the use of this image in the metadata. To specify the image dimensions you can use the special notation <code>URL,WIDTHxHEIGHT</code>.', 'add-meta-tags') . '
                ' . __('Alternatively, you can select an image by pressing the <em>Select image</em> button.', 'add-meta-tags') . '
                ' . __('If this image is set, the plugin will not generate metadata for other media.', 'add-meta-tags') . '
            </p>

        ';
        // Image preview
        $image_data = amt_get_image_data(amt_esc_id_or_url_notation(stripslashes($custom_image_url_value)));
        $img_html = '';
        if (is_numeric($image_data['id'])) {
            $main_size_meta = wp_get_attachment_image_src($image_data['id'], 'medium');
            $img_html = '<img src="' . esc_url($main_size_meta[0]) . '" width="' . esc_attr($main_size_meta[1]) . '" height="' . esc_attr($main_size_meta[2]) . '" />';
        } elseif (!is_null($image_data['url'])) {
            $img_html = '<img src="' . esc_url($image_data['url']) . '" width="' . esc_attr($image_data['width']) . '" height="' . esc_attr($image_data['height']) . '" />';
        }
        if (!empty($img_html)) {
            print '
                <p>' . __('Image preview', 'add-meta-tags') . ':</p>
                <br />
                <div id="amt-image-preview" class="amt-image-preview">' . $img_html . '</div>
                ';
        }
    }
    // Content locale override
    // 'content_locale' box permission check (can be user customized via filter).
    if ($options['metabox_enable_content_locale'] == '1' && current_user_can($metabox_permissions['content_locale_box_capability'])) {
        $metabox_has_features = true;
        // Retrieve the field data from the database.
        $custom_content_locale_value = amt_get_post_meta_content_locale($post->ID);
        print '
            <p>
                <label for="amt_custom_content_locale"><strong>' . __('Content locale', 'add-meta-tags') . '</strong>:</label>
                <input type="text" class="code" style="width: 99%" id="amt_custom_content_locale" name="amt_custom_content_locale" value="' . esc_attr(stripslashes($custom_content_locale_value)) . '" />
                <br>
                ' . __('Override the default locale setting by entering a custom locale for this content in the form <code>language_TERRITORY</code>, for example: <code>en_US</code>.', 'add-meta-tags') . '
            </p>
        ';
    }
    // Express review
    // Express review box permission check (can be user customized via filter).
    if ($options['metabox_enable_express_review'] == '1' && current_user_can($metabox_permissions['express_review_box_capability'])) {
        $metabox_has_features = true;
        // Retrieve the field data from the database.
        $custom_express_review_value = amt_get_post_meta_express_review($post->ID);
        print '
            <p>
                <label for="amt_custom_express_review"><strong>' . __('Express review', 'add-meta-tags') . '</strong>:</label>
                ' . amt_get_sample_review_sets() . '
                <textarea class="code" style="width: 99%" id="amt_custom_express_review" name="amt_custom_express_review" cols="30" rows="12" >' . stripslashes($custom_express_review_value) . '</textarea>
                <br />
                ' . __('This field accepts review related information using INI file syntax. If this info is provided in the correct form, then Add-Meta-Tags treats your content as being a review of an item and generates proper Schema.org metadata. <a href="http://www.codetrax.org/projects/wp-add-meta-tags/wiki/Metadata_Generators_Key_Notes#Metadata-for-reviews" target="_blank">Read more</a> about the correct syntax of the review information.', 'add-meta-tags') . '
                <br />
            </p>
        ';
        // Add javascipt to fill textarea with sample review data.
        // CURRENTLY NOT USED
        print '
<script>
// To click on a link like:
// <a id="amt_fill_sample_review" href="#">Click here</a>
// and replace the textarea data.
jQuery(document).ready(function() {
    jQuery("#amt_fill_sample_review").click(function(event) {
        event.preventDefault();
        //jQuery("#amt_fill_sample_review").live(\'click\',function(e){
        var samplereview = "; Review rating (required)\\n\\
ratingValue = 4.2\\n\\
; Mandatory reviewed item properties (required)\\n\\
object = Book\\n\\
name = On the Origin of Species\\n\\
sameAs = http://en.wikipedia.org/wiki/On_the_Origin_of_Species\\n\\
; Extra reviewed item properties (optional)\\n\\
;isbn = 123456\\n\\
;[author]\\n\\
;object = Person\\n\\
;name = Charles Darwin\\n\\
;sameAs = https://en.wikipedia.org/wiki/Charles_Darwin";
        jQuery("#amt_custom_express_review").val(samplereview);
    });
});
</script>
        ';
    }
    // List of URLs of items referenced in the post.
    // Referenced items box permission check (can be user customized via filter).
    if ($options['metabox_enable_referenced_list'] == '1' && current_user_can($metabox_permissions['referenced_list_box_capability'])) {
        $metabox_has_features = true;
        // Retrieve the field data from the database.
        $custom_referenced_list_value = amt_get_post_meta_referenced_list($post->ID);
        print '
            <p>
                <label for="amt_custom_referenced_list"><strong>' . __('URLs of referenced items', 'add-meta-tags') . '</strong>:</label>
                <textarea class="code" style="width: 99%" id="amt_custom_referenced_list" name="amt_custom_referenced_list" cols="30" rows="4" >' . stripslashes($custom_referenced_list_value) . '</textarea>
                <br>
                ' . __('Enter a list of canonical URLs (one per line) of items referenced in the content. The page referenced need not be on the same domain as the content. For example, you might reference a page where a product can be purchased or a page that further describes a place. If such references are provided and if OpenGraph/Schema.org metadata is enabled, then the relevant <code>og:referenced</code> and <code>referencedItem</code> meta tags will be generated.', 'add-meta-tags') . ' (<span style="color:red;">' . __('Experimental feature', 'add-meta-tags') . '</span>)
            </p>
        ';
    }
    // If no features have been enabled, print an informative message
    if ($metabox_has_features === false) {
        print '
            <p>' . __(sprintf('No features have been enabled for this metabox in the Add-Meta-Tags <a href="%s">settings</a> or you do not have enough permissions to access the available features.', admin_url('options-general.php?page=add-meta-tags-options')), 'add-meta-tags') . '</p>
        ';
    } else {
        print '
            <p style="font-size: 85%; text-align: right; margin-top: 10px;">' . __(sprintf('Note: more features for this metabox might be available in the Add-Meta-Tags <a href="%s">settings</a>.', admin_url('options-general.php?page=add-meta-tags-options')), 'add-meta-tags') . '</p>
        ';
    }
    print '
    </span> <!-- #add-meta-tags-settings -->
    ';
}
示例#2
0
/**
 * Add Schema.org Microdata in the footer.
 *
 * Mainly used to embed microdata to front page, posts index page and archives.
 */
function amt_add_jsonld_schemaorg_metadata_head($post, $attachments, $embedded_media, $options)
{
    if (apply_filters('amt_exclude_schemaorg_metadata', false)) {
        return array();
    }
    $do_auto_schemaorg = $options["auto_schemaorg"] == "1" ? true : false;
    if (!$do_auto_schemaorg) {
        return array();
    }
    // Check if the microdata or the JSON-LD schema.org generator should be used.
    if ($options["schemaorg_force_jsonld"] == "0") {
        // Here we check for AMP page https://www.ampproject.org/
        // For AMP pages, if the Schema.org microdata generator has been enabled,
        // we enforce the JSON+LD form instead of microdata.
        if ($do_auto_schemaorg && function_exists('is_amp_endpoint') && is_amp_endpoint()) {
            // Do nothing and let it proceed with forced generation of JSON+LD Schema.org metadata.
        } else {
            return array();
        }
    }
    $metadata_arr = array();
    // Context
    $metadata_arr['@context'] = 'http://schema.org';
    // TODO: Check if this is_paged() check is needed. If removed, make sure that titles and descriptions are passed through multipage function.
    if (is_paged()) {
        //
        // Currently we do not support adding Schema.org metadata on
        // paged archives, if page number is >=2
        //
        // NOTE: This refers to an archive or the main page being split up over
        // several pages, this does not refer to a Post or Page whose content
        // has been divided into pages using the <!--nextpage--> QuickTag.
        //
        // Multipage content IS processed below.
        //
        return array();
    }
    // Custom content override
    if (amt_is_custom($post, $options)) {
        // Return metadata with:
        // add_filter( 'amt_custom_metadata_jsonld_schemaorg', '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_jsonld_schemaorg', $metadata_arr, $post, $options, $attachments, $embedded_media);
        // Default fron tpage displaying the latest posts.
    } elseif (amt_is_default_front_page()) {
        // On the front page we are adding two top level entities, so we remove
        // the existing context, as the entities need to be in an array and each
        // array item needs its own context.
        unset($metadata_arr['@context']);
        // Organization
        //
        // NOTICE:
        // Even if the front page has been set as the source of profile, this
        // this does not work with the default front page with the latest posts.
        // This is becuase this page does not have an author, which is essential
        // for the generated metadata on a page that is supposed to be a profile.
        // Therefore, an Organization object is always generated on the default
        // front page and it is never treated as a profile page by Add-Meta-Tags.
        //
        $organization_arr = array();
        // Context
        $organization_arr['@context'] = 'http://schema.org';
        // ID
        $organization_arr['@id'] = amt_get_schemaorg_entity_id('organization');
        $organization_arr = array_merge($organization_arr, amt_get_jsonld_schemaorg_publisher_array($options));
        // mainEntityOfPage
        $organization_arr['mainEntityOfPage'] = esc_url(trailingslashit(get_bloginfo('url')));
        // Get publisher/mainEntity metatags
        //        $metadata_arr = array_merge( $metadata_arr, amt_get_schemaorg_publisher_metatags( $options ) );
        // WebSite
        $website_arr = array();
        // Context
        $website_arr['@context'] = 'http://schema.org';
        // ID
        $website_arr['@id'] = amt_get_schemaorg_entity_id('website');
        // Type
        $website_arr['@type'] = 'WebSite';
        // name
        $website_arr['name'] = esc_attr(get_bloginfo('name'));
        // headline - contains title information
        $website_arr['headline'] = esc_attr(amt_get_title_for_metadata($options, $post));
        // alternateName (The WordPress tag line is used.)
        // TODO: use tag line. Needs feedback!
        // url
        $website_arr['url'] = esc_url_raw(trailingslashit(get_bloginfo('url')));
        // publisher
        //        $website_arr['publisher'] = array( '@id' => esc_attr(amt_get_schemaorg_entity_id('organization') ) );
        // SearchAction
        // Scope BEGIN: SearchAction: http://schema.org/SearchAction
        //        $metadata_arr[] = '<!-- Scope BEGIN: SearchAction -->';
        //        $metadata_arr[] = '<span itemprop="potentialAction" itemscope itemtype="http://schema.org/SearchAction">';
        $website_arr['potentialAction'] = array();
        $website_arr['potentialAction']['@type'] = 'SearchAction';
        // target
        // Scope BEGIN: EntryPoint: http://schema.org/EntryPoint
        $website_arr['potentialAction']['target'] = array();
        $website_arr['potentialAction']['target']['@type'] = 'EntryPoint';
        // urlTemplate
        $website_arr['potentialAction']['target']['urlTemplate'] = esc_url_raw(trailingslashit(get_bloginfo('url'))) . '?s={search_term}';
        // Scope END: EntryPoint
        //        $metadata_arr[] = '</span> <!-- Scope END: EntryPoint -->';
        // query-input
        // Scope BEGIN: PropertyValueSpecification: http://schema.org/PropertyValueSpecification
        //$metadata_arr[] = '<span itemprop="query-input" itemscope itemtype="http://schema.org/PropertyValueSpecification">';
        $website_arr['potentialAction']['query-input'] = array();
        $website_arr['potentialAction']['query-input']['@type'] = 'PropertyValueSpecification';
        // valueRequired
        $website_arr['potentialAction']['query-input']['valueRequired'] = 'True';
        // valueName
        $website_arr['potentialAction']['query-input']['valueName'] = 'search_term';
        // Scope END: PropertyValueSpecification
        //        $metadata_arr[] = '</span> <!-- Scope END: PropertyValueSpecification -->';
        // Scope END: SearchAction
        //        $metadata_arr[] = '</span> <!-- Scope END: SearchAction -->';
        // Scope END: WebSite
        //        $metadata_arr[] = '</span> <!-- Scope END: WebSite -->';
        $metadata_arr = array($organization_arr, $website_arr);
        // Front page using a static page
    } elseif (amt_is_static_front_page()) {
        // On the front page we are adding two top level entities, so we remove
        // the existing context, as the entities need to be in an array and each
        // array item needs its own context.
        unset($metadata_arr['@context']);
        $main_entity_arr = array();
        // Context
        $main_entity_arr['@context'] = 'http://schema.org';
        if ($options['author_profile_source'] == 'frontpage') {
            // ID
            $main_entity_arr['@id'] = amt_get_schemaorg_entity_id('person');
            // Author
            // Scope BEGIN: Person: http://schema.org/Person
            //        $metadata_arr[] = '<!-- Scope BEGIN: Person -->';
            //        $metadata_arr[] = '<span itemprop="author" itemscope itemtype="http://schema.org/Person"' . amt_get_schemaorg_itemref('person_author') . '>';
            // Get author metatags
            $main_entity_arr = array_merge($main_entity_arr, amt_get_jsonld_schemaorg_author_array($post->post_author, $options));
            // mainEntityOfPage
            $main_entity_arr['mainEntityOfPage'] = esc_url(trailingslashit(get_bloginfo('url')));
            // Scope END: Person
            //        $metadata_arr[] = '</span> <!-- Scope END: Person -->';
        } else {
            // ID
            $main_entity_arr['@id'] = amt_get_schemaorg_entity_id('organization');
            // Organization
            $main_entity_arr = array_merge($main_entity_arr, amt_get_jsonld_schemaorg_publisher_array($options));
            // mainEntityOfPage
            $main_entity_arr['mainEntityOfPage'] = esc_url(trailingslashit(get_bloginfo('url')));
            // Get publisher/mainEntity metatags
            //            $metadata_arr = array_merge( $metadata_arr, amt_get_schemaorg_publisher_metatags( $options ) );
        }
        // WebSite
        $website_arr = array();
        // Context
        $website_arr['@context'] = 'http://schema.org';
        // ID
        $website_arr['@id'] = amt_get_schemaorg_entity_id('website');
        // Type
        $website_arr['@type'] = 'WebSite';
        // name
        $website_arr['name'] = esc_attr(get_bloginfo('name'));
        // headline - contains title information
        $website_arr['headline'] = esc_attr(amt_get_title_for_metadata($options, $post));
        // alternateName (The WordPress tag line is used.)
        // TODO: use tag line. Needs feedback!
        // url
        $website_arr['url'] = esc_url_raw(trailingslashit(get_bloginfo('url')));
        //        if ( $options['author_profile_source'] == 'frontpage' ) {
        // author
        //$website_arr['author'] = array( '@id' => esc_attr(amt_get_schemaorg_entity_id('person') ) );
        //        } else {
        // publisher
        //$website_arr['publisher'] = array( '@id' => esc_attr(amt_get_schemaorg_entity_id('organization') ) );
        //        }
        // SearchAction
        // Scope BEGIN: SearchAction: http://schema.org/SearchAction
        //        $metadata_arr[] = '<!-- Scope BEGIN: SearchAction -->';
        //        $metadata_arr[] = '<span itemprop="potentialAction" itemscope itemtype="http://schema.org/SearchAction">';
        $website_arr['potentialAction'] = array();
        $website_arr['potentialAction']['@type'] = 'SearchAction';
        // target
        // Scope BEGIN: EntryPoint: http://schema.org/EntryPoint
        $website_arr['potentialAction']['target'] = array();
        $website_arr['potentialAction']['target']['@type'] = 'EntryPoint';
        // urlTemplate
        $website_arr['potentialAction']['target']['urlTemplate'] = esc_url_raw(trailingslashit(get_bloginfo('url'))) . '?s={search_term}';
        // Scope END: EntryPoint
        //        $metadata_arr[] = '</span> <!-- Scope END: EntryPoint -->';
        // query-input
        // Scope BEGIN: PropertyValueSpecification: http://schema.org/PropertyValueSpecification
        //$metadata_arr[] = '<span itemprop="query-input" itemscope itemtype="http://schema.org/PropertyValueSpecification">';
        $website_arr['potentialAction']['query-input'] = array();
        $website_arr['potentialAction']['query-input']['@type'] = 'PropertyValueSpecification';
        // valueRequired
        $website_arr['potentialAction']['query-input']['valueRequired'] = 'True';
        // valueName
        $website_arr['potentialAction']['query-input']['valueName'] = 'search_term';
        // Scope END: PropertyValueSpecification
        //        $metadata_arr[] = '</span> <!-- Scope END: PropertyValueSpecification -->';
        // Scope END: SearchAction
        //        $metadata_arr[] = '</span> <!-- Scope END: SearchAction -->';
        // Scope END: WebSite
        //        $metadata_arr[] = '</span> <!-- Scope END: WebSite -->';
        $metadata_arr = array($main_entity_arr, $website_arr);
        // Author archive
    } 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;
        // Person
        // Scope BEGIN: Person: http://schema.org/Person
        //        $metadata_arr[] = '<!-- Scope BEGIN: Person -->';
        //        $metadata_arr[] = '<span itemscope itemtype="http://schema.org/Person"' . amt_get_schemaorg_itemref('person_author') . '>';
        $metadata_arr['@type'] = 'Person';
        // headline - contains title information
        // NOTE: Not supported for person
        //$metadata_arr['headline'] = esc_attr( amt_get_title_for_metadata($options, $author) );
        // Get author metatags
        //        $metadata_arr = array_merge( $metadata_arr, amt_get_schemaorg_author_metatags( $author->ID, $options ) );
        $metadata_arr = array_merge($metadata_arr, amt_get_jsonld_schemaorg_author_array($author->ID, $options));
        // mainEntityOfPage
        $metadata_arr['mainEntityOfPage'] = esc_url(get_author_posts_url($author->ID));
        // Scope END: Person
        //        $metadata_arr[] = '</span> <!-- Scope END: Person -->';
    } elseif (amt_is_product()) {
        // Scope BEGIN: Product: http://schema.org/Product
        //        $metadata_arr[] = '<!-- Scope BEGIN: Product -->';
        //        $metadata_arr[] = '<div itemscope itemtype="http://schema.org/Product"' . amt_get_schemaorg_itemref('product') . '>';
        // Schema.org type
        $metadata_arr['@type'] = 'Product';
        // ID
        $metadata_arr['@id'] = amt_get_schemaorg_entity_id('product');
        // URL - Uses amt_get_permalink_for_multipage()
        $metadata_arr['url'] = esc_url_raw(amt_get_permalink_for_multipage($post));
        // mainEntityOfPage
        $metadata_arr['mainEntityOfPage'] = esc_url(amt_get_permalink_for_multipage($post));
        // name
        // Note: Contains multipage information through amt_process_paged()
        $metadata_arr['name'] = esc_attr(amt_process_paged(strip_tags(get_the_title($post->ID))));
        // headline - contains title information
        //$metadata_arr['headline'] = 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) ) {
        //    // Use the post body as the description. Product objects do not support body text.
        //    // TODO: ERROR here $post_body var does not exist
        //    $content_desc = sanitize_text_field( amt_sanitize_description( $post_body ) );
        //}
        if (!empty($content_desc)) {
            $metadata_arr['description'] = esc_attr(amt_process_paged($content_desc));
        }
        // Dates
        $metadata_arr['releaseDate'] = esc_attr(amt_iso8601_date($post->post_date));
        // Images
        $metadata_arr['image'] = array();
        // 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_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;
            }
            //$global_image_override_url = amt_get_post_meta_image_url($post->ID);
            //if ( ! empty( $global_image_override_url ) ) {
            //            $metadata_arr[] = '<!-- Scope BEGIN: ImageObject -->';
            //            $metadata_arr[] = '<span itemprop="image" itemscope itemtype="http://schema.org/ImageObject">';
            //   $current_image_obj = array();
            //   $current_image_obj['@type'] = 'ImageObject';
            //   $current_image_obj['url'] = esc_url_raw( $global_image_override_url );
            //   $current_image_obj['contentUrl'] = esc_url_raw( $global_image_override_url );
            //   $metadata_arr['image'][] = $current_image_obj;
            //            $metadata_arr[] = '</span> <!-- Scope END: ImageObject -->';
            // Further image processing
        } else {
            // 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;
            // Scope BEGIN: ImageObject: http://schema.org/ImageObject
            // Image - Featured image is checked first, so that it can be the first associated image.
            if (function_exists('has_post_thumbnail') && has_post_thumbnail($post->ID)) {
                // Get the image attachment object
                $image = get_post(get_post_thumbnail_id($post->ID));
                // metadata BEGIN
                //                $metadata_arr[] = '<!-- Scope BEGIN: ImageObject -->';
                //                $metadata_arr[] = '<span itemprop="image" itemscope itemtype="http://schema.org/ImageObject">';
                // Allow filtering of the image size.
                $image_size = apply_filters('amt_image_size_product', 'full');
                // Get image metatags.
                $metadata_arr['image'][] = amt_get_jsonld_schemaorg_image_array($options, $image, $size = $image_size);
                // metadata END
                //                $metadata_arr[] = '</span> <!-- Scope END: ImageObject -->';
                // Images have been found.
                $has_images = true;
            }
            // Scope END: ImageObject
            // If no images have been found so far use the default image, if set.
            // Scope BEGIN: ImageObject: http://schema.org/ImageObject
            if ($has_images === false) {
                $image_data = amt_get_default_image_data();
                if (!empty($image_data)) {
                    $image_size = apply_filters('amt_image_size_product', '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;
                    }
                }
                //                $metadata_arr[] = '<!-- Scope BEGIN: ImageObject -->';
                //                $metadata_arr[] = '<span itemprop="image" itemscope itemtype="http://schema.org/ImageObject">';
                //$current_image_obj = array();
                //$current_image_obj['@type'] = 'ImageObject';
                //$current_image_obj['url'] = esc_url_raw( $options["default_image_url"] );
                //$current_image_obj['contentUrl'] = esc_url_raw( $options["default_image_url"] );
                //$metadata_arr['image'][] = $current_image_obj;
                //                $metadata_arr[] = '</span> <!-- Scope END: ImageObject -->';
            }
            // Scope END: ImageObject
        }
        // Extend the current metadata with properties of the Product object.
        // See: http://schema.org/Product
        $metadata_arr = apply_filters('amt_product_data_jsonld_schemaorg', $metadata_arr, $post);
        // Scope END: Product
        //        $metadata_arr[] = '</div> <!-- Scope END: Product -->';
        // Filtering of the generated Schema.org metadata
        $metadata_arr = apply_filters('amt_jsonld_schemaorg_metadata_product', $metadata_arr);
        // Add post body
        // Remove last closing '</div>' tag, add post body and re-add the closing div afterwards.
        //        $closing_product_tag = array_pop($metadata_arr);
        // Product objects do not support a 'text' itemprop. We just add a div for now
        // for consistency with Article objects.
        // TODO: it should allow filtering '<div>'
        //        $metadata_arr[] = '<div> <!-- Product text body: BEGIN -->';
        //        $metadata_arr[] = $post_body;
        //        $metadata_arr[] = '</div> <!-- Product text body: END -->';
        // Now add closing tag for Article
        //        $metadata_arr[] = $closing_product_tag;
        // Attachemnts
    } 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);
        // Early metatags - Scope starts
        if ('image' == $attachment_type) {
            // Scope BEGIN: ImageObject: http://schema.org/ImageObject
            //            $metadata_arr[] = '<!-- Scope BEGIN: ImageObject -->';
            //            $metadata_arr[] = '<div itemscope itemtype="http://schema.org/ImageObject"' . amt_get_schemaorg_itemref('attachment_image') . '>';
        } elseif ('video' == $attachment_type) {
            // Scope BEGIN: VideoObject: http://schema.org/VideoObject
            //            $metadata_arr[] = '<!-- Scope BEGIN: VideoObject -->';
            //            $metadata_arr[] = '<div itemscope itemtype="http://schema.org/VideoObject"' . amt_get_schemaorg_itemref('attachment_video') . '>';
            // Schema.org type
            $metadata_arr['@type'] = 'VideoObject';
        } elseif ('audio' == $attachment_type) {
            // Scope BEGIN: AudioObject: http://schema.org/AudioObject
            //            $metadata_arr[] = '<!-- Scope BEGIN: AudioObject -->';
            //            $metadata_arr[] = '<div itemscope itemtype="http://schema.org/AudioObject"' . amt_get_schemaorg_itemref('attachment_audio') . '>';
            // Schema.org type
            $metadata_arr['@type'] = 'AudioObject';
        } else {
            // we do not currently support other attachment types, so we stop processing here
            return array();
        }
        // Metadata common to all attachments
        // Do not add a publisher on personal websites (static front page is source of author profile).
        if ($options['author_profile_source'] != 'frontpage' || !amt_has_page_on_front()) {
            // Publisher
            // Scope BEGIN: Organization: http://schema.org/Organization
            //        $metadata_arr[] = '<!-- Scope BEGIN: Organization -->';
            //        $metadata_arr[] = '<span itemprop="publisher" itemscope itemtype="http://schema.org/Organization"' . amt_get_schemaorg_itemref('organization') . '>';
            // Get publisher metatags
            //        $metadata_arr = array_merge( $metadata_arr, amt_get_schemaorg_publisher_metatags( $options, $post->post_author ) );
            $metadata_arr['publisher'] = amt_get_jsonld_schemaorg_publisher_array($options, $post->post_author);
            // Scope END: Organization
            //        $metadata_arr[] = '</span> <!-- Scope END: Organization -->';
        }
        // Author
        // Scope BEGIN: Person: http://schema.org/Person
        //        $metadata_arr[] = '<!-- Scope BEGIN: Person -->';
        //        $metadata_arr[] = '<span itemprop="author" itemscope itemtype="http://schema.org/Person"' . amt_get_schemaorg_itemref('person_author') . '>';
        // Get author metatags
        $metadata_arr['author'] = amt_get_jsonld_schemaorg_author_array($post->post_author, $options);
        // Scope END: Person
        //        $metadata_arr[] = '</span> <!-- Scope END: Person -->';
        // name
        $metadata_arr['name'] = esc_attr(strip_tags(get_the_title($post->ID)));
        // headline - contains title information
        $metadata_arr['headline'] = 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['description'] = esc_attr($content_desc);
        }
        // Dates
        $metadata_arr['datePublished'] = esc_attr(amt_iso8601_date($post->post_date));
        $metadata_arr['dateModified'] = esc_attr(amt_iso8601_date($post->post_modified));
        $metadata_arr['copyrightYear'] = esc_attr(mysql2date('Y', $post->post_date));
        // Language
        $metadata_arr['inLanguage'] = esc_attr(str_replace('-', '_', amt_get_language_content($options, $post)));
        // Thumbnail
        // A featured image is supported by video and audio attachments.
        // If one is set, then it is set as the thumbnail of the video/audio object.
        if ('video' == $attachment_type || 'audio' == $attachment_type) {
            if (function_exists('has_post_thumbnail') && has_post_thumbnail($post->ID)) {
                // Thumbnail URL of the featured image
                $image_size = apply_filters('amt_image_size_attachment', 'full');
                $thumbnail_info = wp_get_attachment_image_src(get_post_thumbnail_id($post->ID), $image_size);
                $metadata_arr['thumbnailUrl'] = esc_url_raw($thumbnail_info[0]);
                // Currently we do not add a full ImageObject for the attachment's featured image.
                // TODO: future
            }
        }
        // mainEntityOfPage
        $metadata_arr['mainEntityOfPage'] = esc_url(get_permalink($post->ID));
        // 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');
            // Get image metatags. $post is an image object.
            $metadata_arr = array_merge($metadata_arr, amt_get_jsonld_schemaorg_image_array($options, $post, $size = $image_size, $is_representative = true));
            // Add the post body here
            //            $metadata_arr[] = $post_body;
            // Scope END: ImageObject
            //            $metadata_arr[] = '</div> <!-- Scope END: ImageObject -->';
        } elseif ('video' == $attachment_type) {
            // Video specific metatags
            // URL (links to image file)
            //$metadata_arr['url'] = esc_url_raw( get_permalink( $post->ID ) );
            $metadata_arr['url'] = esc_url_raw(wp_get_attachment_url($post->ID));
            // sameAs (links to attachment page)
            $metadata_arr['sameAs'] = esc_url_raw(get_permalink($post->ID));
            $metadata_arr['contentUrl'] = esc_url_raw(wp_get_attachment_url($post->ID));
            $metadata_arr['encodingFormat'] = esc_attr($mime_type);
            // Required by Google
            $metadata_arr['uploadDate'] = esc_attr(amt_iso8601_date($post->post_date));
            // Add the post body here
            //            $metadata_arr[] = $post_body;
            // Scope END: VideoObject
            //            $metadata_arr[] = '</div> <!-- Scope END: VideoObject -->';
        } elseif ('audio' == $attachment_type) {
            // Audio specific metatags
            // URL (links to image file)
            //$metadata_arr['url'] = esc_url_raw( get_permalink( $post->ID ) );
            $metadata_arr['url'] = esc_url_raw(wp_get_attachment_url($post->ID));
            // sameAs (links to attachment page)
            $metadata_arr['sameAs'] = esc_url_raw(get_permalink($post->ID));
            $metadata_arr['contentUrl'] = esc_url_raw(wp_get_attachment_url($post->ID));
            $metadata_arr['encodingFormat'] = esc_attr($mime_type);
            // Add the post body here
            //            $metadata_arr[] = $post_body;
            // Scope END: AudioObject
            //            $metadata_arr[] = '</div> <!-- Scope END: AudioObject -->';
        }
        // Filtering of the generated Schema.org metadata
        $metadata_arr = apply_filters('amt_jsonld_schemaorg_metadata_attachment', $metadata_arr);
        // Content
        // 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()) {
        // Set main metadata entity. By default this set to Article.
        $main_content_object = 'Article';
        // Check for Page
        // Main entity is set to WebPage on pages
        // DEV NOTE: Since many themes already set the WebPage itemscope on the
        // body element of the web page, set it to WebPage automatically would
        // result in duplicate entities. So this has to be done manually via
        // a filtering function.
        //        if  ( is_page() ) {
        //            $main_content_object = 'WebPage';
        //        }
        // Check for Review
        $review_data = amt_get_review_data($post);
        if (!empty($review_data)) {
            $main_content_object = 'Review';
        }
        // Allow filtering the main metadata object for content.
        $main_content_object = apply_filters('amt_schemaorg_object_main', $main_content_object);
        // Scope BEGIN: Article: http://schema.org/Article
        //        $metadata_arr[] = '<!-- Scope BEGIN: ' . esc_attr($main_content_object) . ' -->';
        //        $metadata_arr[] = '<div itemscope itemtype="http://schema.org/' . esc_attr($main_content_object) . '"' . amt_get_schemaorg_itemref('content') . '>';
        // Schema.org type
        $metadata_arr['@type'] = esc_attr($main_content_object);
        // Do not add a publisher on personal websites (static front page is source of author profile).
        if ($options['author_profile_source'] != 'frontpage' || !amt_has_page_on_front()) {
            // Publisher
            // Scope BEGIN: Organization: http://schema.org/Organization
            //        $metadata_arr[] = '<!-- Scope BEGIN: Organization -->';
            //        $metadata_arr[] = '<span itemprop="publisher" itemscope itemtype="http://schema.org/Organization"' . amt_get_schemaorg_itemref('organization') . '>';
            // Get publisher metatags
            //        $metadata_arr = array_merge( $metadata_arr, amt_get_schemaorg_publisher_metatags( $options, $post->post_author ) );
            $metadata_arr['publisher'] = amt_get_jsonld_schemaorg_publisher_array($options, $post->post_author);
            // Scope END: Organization
            //        $metadata_arr[] = '</span> <!-- Scope END: Organization -->';
        }
        // Author
        // Scope BEGIN: Person: http://schema.org/Person
        //        $metadata_arr[] = '<!-- Scope BEGIN: Person -->';
        //        $metadata_arr[] = '<span itemprop="author" itemscope itemtype="http://schema.org/Person"' . amt_get_schemaorg_itemref('person_author') . '>';
        // Get author metatags
        //        $metadata_arr = array_merge( $metadata_arr, amt_get_schemaorg_author_metatags( $post->post_author, $options ) );
        $metadata_arr['author'] = amt_get_jsonld_schemaorg_author_array($post->post_author, $options);
        // Scope END: Person
        //        $metadata_arr[] = '</span> <!-- Scope END: Person -->';
        // URL - Uses amt_get_permalink_for_multipage()
        $metadata_arr['url'] = esc_url_raw(amt_get_permalink_for_multipage($post));
        // mainEntityOfPage
        $metadata_arr['mainEntityOfPage'] = esc_url(amt_get_permalink_for_multipage($post));
        // Dates
        $metadata_arr['datePublished'] = esc_attr(amt_iso8601_date($post->post_date));
        $metadata_arr['dateModified'] = esc_attr(amt_iso8601_date($post->post_modified));
        $metadata_arr['copyrightYear'] = esc_attr(mysql2date('Y', $post->post_date));
        // Language
        $metadata_arr['inLanguage'] = esc_attr(str_replace('-', '_', amt_get_language_content($options, $post)));
        // name
        // Note: Contains multipage information through amt_process_paged()
        $metadata_arr['name'] = esc_attr(amt_process_paged(strip_tags(get_the_title($post->ID))));
        // headline - contains title information
        $metadata_arr['headline'] = 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['description'] = esc_attr(amt_process_paged($content_desc));
        }
        /*
        // Section: We use the first category as the section
        $first_cat = sanitize_text_field( amt_sanitize_keywords( amt_get_first_category($post) ) );
        if (!empty($first_cat)) {
            $metadata_arr[] = '<meta itemprop="articleSection" content="' . esc_attr( $first_cat ) . '" />';
        }
        */
        // Add articleSection in Article object only.
        if ($main_content_object == 'Article') {
            $categories = get_the_category($post->ID);
            $categories = apply_filters('amt_post_categories_for_schemaorg', $categories);
            foreach ($categories as $cat) {
                $section = trim($cat->cat_name);
                if (!empty($section) && $cat->slug != 'uncategorized') {
                    $metadata_arr['articleSection'] = esc_attr($section);
                }
            }
        }
        // Add review properties if Review
        if ($main_content_object == 'Review') {
            //            $metadata_arr[] = '<!-- Review Information BEGIN -->';
            //            $metadata_arr[] = amt_get_review_info_box( $review_data );
            //            $metadata_arr[] = '<!-- Review Information END -->';
            // Reviewed Item
            $metadata_arr['itemReviewed'] = array();
            $metadata_arr['itemReviewed']['@type'] = esc_attr($review_data['object']);
            $metadata_arr['itemReviewed']['name'] = esc_attr($review_data['name']);
            $metadata_arr['itemReviewed']['sameAs'] = esc_url_raw($review_data['sameAs']);
            // Extra properties of reviewed item
            foreach ($review_data['extra'] as $key => $value) {
                if (is_array($value)) {
                    // Add sub entity
                    // If it is an array, the 'object' property is mandatory
                    if (!array_key_exists('object', $value)) {
                        continue;
                    }
                    $metadata_arr['itemReviewed'][esc_attr($key)] = array();
                    $metadata_arr['itemReviewed'][esc_attr($key)]['@type'] = esc_attr($value['object']);
                    foreach ($value as $subkey => $subvalue) {
                        if ($subkey != 'object') {
                            if (in_array($subkey, array('url', 'sameAs'))) {
                                $metadata_arr['itemReviewed'][esc_attr($key)][esc_attr($subkey)] = esc_url_raw($subvalue);
                            } else {
                                $metadata_arr['itemReviewed'][esc_attr($key)][esc_attr($subkey)] = esc_attr($subvalue);
                            }
                        }
                    }
                } else {
                    // Add simple meta element
                    $metadata_arr['itemReviewed'][esc_attr($key)] = esc_attr($value);
                }
            }
            // Rating
            $metadata_arr['reviewRating'] = array();
            $metadata_arr['reviewRating']['@type'] = 'Rating';
            $metadata_arr['reviewRating']['ratingValue'] = esc_attr($review_data['ratingValue']);
            $bestrating = apply_filters('amt_schemaorg_review_bestrating', '5');
            $metadata_arr['reviewRating']['bestRating'] = esc_attr($bestrating);
        }
        // Keywords - We use the keywords defined by Add-Meta-Tags
        $keywords = amt_get_content_keywords($post);
        if (!empty($keywords)) {
            $metadata_arr['keywords'] = esc_attr($keywords);
        }
        // Referenced Items
        $referenced_url_list = amt_get_referenced_items($post);
        if (!empty($referenced_url_list)) {
            $metadata_arr['referencedItem'] = array();
            foreach ($referenced_url_list as $referenced_url) {
                $referenced_url = trim($referenced_url);
                if (!empty($referenced_url)) {
                    $metadata_arr['referencedItem'][] = esc_url_raw($referenced_url);
                }
            }
        }
        // Images
        $metadata_arr['image'] = array();
        // 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_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;
            }
            //$global_image_override_url = amt_get_post_meta_image_url($post->ID);
            //if ( ! empty( $global_image_override_url ) ) {
            //            $metadata_arr[] = '<!-- Scope BEGIN: ImageObject -->';
            //            $metadata_arr[] = '<span itemprop="image" itemscope itemtype="http://schema.org/ImageObject">';
            //    $current_image_obj = array();
            //    $current_image_obj['@type'] = 'ImageObject';
            //    $current_image_obj['url'] = esc_url_raw( $global_image_override_url );
            //    $current_image_obj['contentUrl'] = esc_url_raw( $global_image_override_url );
            //    $metadata_arr['image'][] = $current_image_obj;
            //            $metadata_arr[] = '<meta itemprop="contentUrl" content="' . esc_url_raw( $global_image_override_url ) . '" />';
            //            $metadata_arr[] = '</span> <!-- Scope END: ImageObject -->';
            // 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;
            // Scope BEGIN: ImageObject: http://schema.org/ImageObject
            // Image - Featured image is checked first, so that it can be the first associated image.
            if (function_exists('has_post_thumbnail') && has_post_thumbnail($post->ID)) {
                // Thumbnail URL
                // First add the thumbnail URL of the featured image
                $thumbnail_info = wp_get_attachment_image_src(get_post_thumbnail_id($post->ID), 'thumbnail');
                $metadata_arr['thumbnailUrl'] = esc_url_raw($thumbnail_info[0]);
                // Add full image object for featured image.
                // Get the image attachment object
                $image = get_post(get_post_thumbnail_id($post->ID));
                // metadata BEGIN
                //                $metadata_arr[] = '<!-- Scope BEGIN: ImageObject -->';
                //                $metadata_arr[] = '<span itemprop="image" itemscope itemtype="http://schema.org/ImageObject">';
                // Allow filtering of the image size.
                $image_size = apply_filters('amt_image_size_content', 'full');
                // Get image metatags.
                //                $metadata_arr = array_merge( $metadata_arr, amt_get_schemaorg_image_metatags( $options, $image, $size=$image_size ) );
                $metadata_arr['image'][] = amt_get_jsonld_schemaorg_image_array($options, $image, $size = $image_size);
                // metadata END
                //                $metadata_arr[] = '</span> <!-- Scope END: ImageObject -->';
                // 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++;
            }
            // Scope END: ImageObject
            // 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) {
                        // metadata BEGIN
                        //                        $metadata_arr[] = '<!-- Scope BEGIN: ImageObject -->';
                        //                        $metadata_arr[] = '<span itemprop="image" itemscope itemtype="http://schema.org/ImageObject">';
                        // Allow filtering of the image size.
                        $image_size = apply_filters('amt_image_size_content', 'full');
                        // Get image metatags.
                        //                        $metadata_arr = array_merge( $metadata_arr, amt_get_schemaorg_image_metatags( $options, $attachment, $size=$image_size ) );
                        $metadata_arr['image'][] = amt_get_jsonld_schemaorg_image_array($options, $attachment, $size = $image_size);
                        // metadata END
                        //                        $metadata_arr[] = '</span> <!-- Scope END: ImageObject -->';
                        // Images have been found.
                        $has_images = true;
                        // Increase image counter
                        $ic++;
                    } elseif ('video' == $attachment_type && $vc < $video_limit) {
                        // Scope BEGIN: VideoObject: http://schema.org/VideoObject
                        //                        $metadata_arr[] = '<!-- Scope BEGIN: VideoObject -->';
                        //                        $metadata_arr[] = '<span itemprop="video" itemscope itemtype="http://schema.org/VideoObject">';
                        // Video specific metatags
                        // URL (for attachments: links to attachment page)
                        $current_video_obj = array();
                        $current_video_obj['@type'] = 'VideoObject';
                        // URL (links to image file)
                        //$current_video_obj['url'] = esc_url_raw( get_permalink( $attachment->ID ) );
                        $current_video_obj['url'] = esc_url_raw(wp_get_attachment_url($attachment->ID));
                        // sameAs (links to attachment page)
                        $current_video_obj['sameAs'] = esc_url_raw(get_permalink($attachment->ID));
                        $current_video_obj['contentUrl'] = esc_url_raw(wp_get_attachment_url($attachment->ID));
                        $current_video_obj['encodingFormat'] = esc_attr($mime_type);
                        // name
                        $current_video_obj['name'] = esc_attr(strip_tags(get_the_title($attachment->ID)));
                        // Description - We use the description defined by Add-Meta-Tags
                        $content_desc = amt_get_content_description($attachment);
                        if (!empty($content_desc)) {
                            $current_video_obj['description'] = esc_attr($content_desc);
                        }
                        // Thumbnail
                        // A featured image is supported by video and audio attachments.
                        // If one is set, then it is set as the thumbnail of the video/audio object.
                        if (function_exists('has_post_thumbnail') && has_post_thumbnail($attachment->ID)) {
                            // Thumbnail URL of the featured image
                            $image_size = apply_filters('amt_image_size_content', 'full');
                            $thumbnail_info = wp_get_attachment_image_src(get_post_thumbnail_id($attachment->ID), $image_size);
                            $current_video_obj['thumbnailUrl'] = esc_url_raw($thumbnail_info[0]);
                            // Currently we do not add a full ImageObject for the attachment's featured image.
                            // TODO: future
                        }
                        // uploadDate
                        $current_video_obj['uploadDate'] = esc_attr(amt_iso8601_date($attachment->post_date));
                        $metadata_arr['video'][] = $current_video_obj;
                        // Scope END: VideoObject
                        //                        $metadata_arr[] = '</span> <!-- Scope END: VideoObject -->';
                        // Increase video counter
                        $vc++;
                    } elseif ('audio' == $attachment_type && $ac < $audio_limit) {
                        // Scope BEGIN: AudioObject: http://schema.org/AudioObject
                        //                        $metadata_arr[] = '<!-- Scope BEGIN: AudioObject -->';
                        //                        $metadata_arr[] = '<span itemprop="audio" itemscope itemtype="http://schema.org/AudioObject">';
                        // Audio specific metatags
                        // URL (for attachments: links to attachment page)
                        $current_audio_obj = array();
                        $current_audio_obj['@type'] = 'AudioObject';
                        // URL (links to image file)
                        //$current_audio_obj['url'] = esc_url_raw( get_permalink( $attachment->ID ) );
                        $current_audio_obj['url'] = esc_url_raw(wp_get_attachment_url($attachment->ID));
                        // sameAs (links to attachment page)
                        $current_audio_obj['sameAs'] = esc_url_raw(get_permalink($attachment->ID));
                        $current_audio_obj['contentUrl'] = esc_url_raw(wp_get_attachment_url($attachment->ID));
                        $current_audio_obj['encodingFormat'] = esc_attr($mime_type);
                        // name
                        $current_audio_obj['name'] = esc_attr(strip_tags(get_the_title($attachment->ID)));
                        // Description - We use the description defined by Add-Meta-Tags
                        $content_desc = amt_get_content_description($attachment);
                        if (!empty($content_desc)) {
                            $current_audio_obj['description'] = esc_attr($content_desc);
                        }
                        // Thumbnail
                        // A featured image is supported by video and audio attachments.
                        // If one is set, then it is set as the thumbnail of the video/audio object.
                        if (function_exists('has_post_thumbnail') && has_post_thumbnail($attachment->ID)) {
                            // Thumbnail URL of the featured image
                            $image_size = apply_filters('amt_image_size_content', 'full');
                            $thumbnail_info = wp_get_attachment_image_src(get_post_thumbnail_id($attachment->ID), $image_size);
                            $current_audio_obj['thumbnailUrl'] = esc_url_raw($thumbnail_info[0]);
                            // Currently we do not add a full ImageObject for the attachment's featured image.
                            // TODO: future
                        }
                        // uploadDate
                        $current_audio_obj['uploadDate'] = esc_attr(amt_iso8601_date($attachment->post_date));
                        $metadata_arr['audio'][] = $current_audio_obj;
                        // Scope END: AudioObject
                        //                        $metadata_arr[] = '</span> <!-- Scope END: AudioObject -->';
                        // Increase audio counter
                        $ac++;
                    }
                }
            }
            // Embedded Media
            foreach ($embedded_media['images'] as $embedded_item) {
                if ($ic == $image_limit) {
                    break;
                }
                // Scope BEGIN: ImageObject: http://schema.org/ImageObject
                //                $metadata_arr[] = '<!-- Scope BEGIN: ImageObject -->';
                //                $metadata_arr[] = '<span itemprop="image" itemscope itemtype="http://schema.org/ImageObject">';
                $current_image_obj = array();
                $current_image_obj['@type'] = 'ImageObject';
                // name (title)
                $current_image_obj['name'] = esc_attr($embedded_item['alt']);
                // caption
                $current_image_obj['caption'] = esc_attr($embedded_item['alt']);
                // alt
                $current_image_obj['text'] = esc_attr($embedded_item['alt']);
                // URL (links to image file)
                //$current_image_obj['url'] = esc_url_raw( $embedded_item['page'] );
                $current_image_obj['url'] = esc_url_raw($embedded_item['image']);
                // sameAs (links to attachment page)
                $current_image_obj['sameAs'] = esc_url_raw($embedded_item['page']);
                // thumbnail url
                $current_image_obj['thumbnailUrl'] = esc_url_raw($embedded_item['thumbnail']);
                // main image
                $current_image_obj['contentUrl'] = esc_url_raw($embedded_item['image']);
                if (apply_filters('amt_extended_image_tags', true)) {
                    $current_image_obj['width'] = esc_attr($embedded_item['width']);
                    $current_image_obj['height'] = esc_attr($embedded_item['height']);
                    $current_image_obj['encodingFormat'] = 'image/jpeg';
                }
                // embedURL
                $current_image_obj['embedURL'] = esc_url_raw($embedded_item['player']);
                $metadata_arr['image'][] = $current_image_obj;
                // Scope END: ImageObject
                //                $metadata_arr[] = '</span> <!-- Scope END: ImageObject -->';
                // Images have been found.
                $has_images = true;
                // Increase image counter
                $ic++;
            }
            foreach ($embedded_media['videos'] as $embedded_item) {
                if ($vc == $video_limit) {
                    break;
                }
                // Scope BEGIN: VideoObject: http://schema.org/VideoObject
                // See: http://googlewebmastercentral.blogspot.gr/2012/02/using-schemaorg-markup-for-videos.html
                // See: https://support.google.com/webmasters/answer/2413309?hl=en
                //                $metadata_arr[] = '<!-- Scope BEGIN: VideoObject -->';
                //                $metadata_arr[] = '<span itemprop="video" itemscope itemtype="http://schema.org/VideoObject">';
                $current_video_obj = array();
                // Video Embed URL
                $current_video_obj['embedURL'] = esc_url_raw($embedded_item['player']);
                // playerType
                $current_video_obj['playerType'] = 'application/x-shockwave-flash';
                // size
                $current_video_obj['width'] = esc_attr($embedded_item['width']);
                $current_video_obj['height'] = esc_attr($embedded_item['height']);
                $metadata_arr['video'][] = $current_video_obj;
                // Scope END: VideoObject
                //                $metadata_arr[] = '</span> <!-- Scope END: VideoObject -->';
                // Increase video counter
                $vc++;
            }
            foreach ($embedded_media['sounds'] as $embedded_item) {
                if ($ac == $audio_limit) {
                    break;
                }
                // Scope BEGIN: AudioObject: http://schema.org/AudioObject
                //                $metadata_arr[] = '<!-- Scope BEGIN: AudioObject -->';
                //                $metadata_arr[] = '<span itemprop="audio" itemscope itemtype="http://schema.org/AudioObject">';
                $current_audio_obj = array();
                // Audio Embed URL
                $current_audio_obj['embedURL'] = esc_url_raw($embedded_item['player']);
                // playerType
                $current_audio_obj['playerType'] = 'application/x-shockwave-flash';
                $metadata_arr['audio'][] = $current_audio_obj;
                // Scope END: AudioObject
                //                $metadata_arr[] = '</span> <!-- Scope END: AudioObject -->';
                // Increase audio counter
                $ac++;
            }
            // If no images have been found so far use the default image, if set.
            // Scope BEGIN: ImageObject: http://schema.org/ImageObject
            if ($has_images === false) {
                $image_data = amt_get_default_image_data();
                if (!empty($image_data)) {
                    $image_size = apply_filters('amt_image_size_content', '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;
                    }
                }
                //                $metadata_arr[] = '<!-- Scope BEGIN: ImageObject -->';
                //                $metadata_arr[] = '<span itemprop="image" itemscope itemtype="http://schema.org/ImageObject">';
                $current_image_obj = array();
                $current_image_obj['@type'] = 'ImageObject';
                $current_image_obj['url'] = esc_url_raw($options["default_image_url"]);
                $current_image_obj['contentUrl'] = esc_url_raw($options["default_image_url"]);
                $metadata_arr['image'][] = $current_image_obj;
                //                $metadata_arr[] = '<meta itemprop="contentUrl" content="' . esc_url_raw( $options["default_image_url"] ) . '" />';
                //                $metadata_arr[] = '</span> <!-- Scope END: ImageObject -->';
            }
            // Scope END: ImageObject
        }
        // Article Body
        // The article body is added after filtering the generated microdata below.
        // TODO: also check: comments, contributor, copyrightHolder, , creator, dateCreated, discussionUrl, editor, version (use post revision if possible)
        // Scope END: Article
        //        $metadata_arr[] = '</div> <!-- Scope END: ' . esc_attr($main_content_object) . ' -->';
        // Filtering of the generated Schema.org metadata
        $metadata_arr = apply_filters('amt_jsonld_schemaorg_metadata_content', $metadata_arr);
        // Add articleBody to Artice
        // Now add the article. Remove last closing '</span>' tag, add articleBody and re-add the closing span afterwards.
        //        $closing_article_tag = array_pop($metadata_arr);
        // Use the 'text' itemprop by default for the main text body of the CreativeWork,
        // so it can be used by more subtypes than Article.
        // But set it explicitly to 'articleBody if the main entiry is 'Article'
        // or 'reviewBody' if the main entity is a 'Review'.
        $main_text_property = 'text';
        if ($main_content_object == 'Article') {
            $main_text_property = 'articleBody';
        } elseif ($main_content_object == 'Review') {
            $main_text_property = 'reviewBody';
        }
        // Allow filtering of the main text property.
        $main_text_property = apply_filters('amt_schemaorg_property_main_text', $main_text_property);
        //        $metadata_arr[] = '<div itemprop="' . esc_attr($main_text_property) . '">';
        // Add main content
        //$metadata_arr[ esc_attr($main_text_property) ] = $post->post_content;
        //        $metadata_arr[] = $post_body;
        //        $metadata_arr[] = '</div> <!-- Itemprop END: ' . esc_attr($main_text_property) . ' -->';
        // Now add closing tag for Article
        //        $metadata_arr[] = $closing_article_tag;
    }
    // Add our comment
    //    if ( count( $metadata_arr ) > 0 ) {
    //        array_unshift( $metadata_arr, "<!-- BEGIN Schema.org microdata added by Add-Meta-Tags WordPress plugin -->" );
    //        array_unshift( $metadata_arr, "" );   // Intentionaly left empty
    //        array_push( $metadata_arr, "<!-- END Schema.org microdata added by Add-Meta-Tags WordPress plugin -->" );
    //        array_push( $metadata_arr, "" );   // Intentionaly left empty
    //    }
    //return $post_body;
    //    return implode( PHP_EOL, $metadata_arr );
    // Filtering of the generated microdata for footer
    $metadata_arr = apply_filters('amt_jsonld_schemaorg_metadata_head', $metadata_arr);
    //    if ( count( $metadata_arr ) > 0 ) {
    //        array_unshift( $metadata_arr, '<script type="application/ld+json">' );
    //        array_unshift( $metadata_arr, "" );   // Intentionaly left empty
    //        array_push( $metadata_arr, '</script>' );
    //        array_push( $metadata_arr, "" );   // Intentionaly left empty
    //    }
    //    return $metadata_arr;
    if (count($metadata_arr) > 1) {
        // contains @context by default
        return array('<script type="application/ld+json">', 'json+ld_data' => json_encode($metadata_arr), '</script>');
    } else {
        return array();
    }
}
示例#3
0
function amt_inner_metadata_box($post)
{
    /* For future implementation. Basic code for tabs. */
    /*
    print('<br /><br />
        <div id="amt-metabox-tabs">
            <ul id="amt-metabox-tabs-list" class="category-tabs">
                <li><a href="#metadata-basic">Basic</a></li>
                <li><a href="#metadata-advanced">Advanced</a></li>
                <li><a href="#metadata-extra">Extra</a></li>
            </ul>
    
            <br class="clear" />
            <div id="metadata-basic">
                <p>#1 - basic</p>
            </div>
            <div class="hidden" id="metadata-advanced">
                <p>#2 - advanced</p>
            </div>
            <div class="hidden" id="metadata-extra">
                <p>#3 - extra</p>
            </div>
        </div>
        <br /><br />
    ');
    */
    // Use a nonce field for verification
    wp_nonce_field(plugin_basename(AMT_PLUGIN_FILE), 'amt_noncename');
    // Get the Metadata metabox permissions (filtered)
    $metabox_permissions = amt_get_metadata_metabox_permissions();
    // Get the post type. Will be used to customize the displayed notes.
    $post_type = get_post_type($post->ID);
    // Get the Add-Meta-Tags options.
    $options = get_option("add_meta_tags_opts");
    // Display the meta box HTML code.
    $metabox_has_features = false;
    // Custom description
    // Description box permission check (can be user customized via filter).
    if ($options['metabox_enable_description'] == '1' && current_user_can($metabox_permissions['description_box_capability'])) {
        $metabox_has_features = true;
        // Retrieve the field data from the database.
        $custom_description_value = amt_get_post_meta_description($post->ID);
        print '
            <p>
                <label for="amt_custom_description"><strong>' . __('Description', 'add-meta-tags') . '</strong>:</label>
                <textarea class="code" style="width: 99%" id="amt_custom_description" name="amt_custom_description" cols="30" rows="2" >' . esc_attr(stripslashes($custom_description_value)) . '</textarea>
                <br>
                ' . __('Enter a custom description of 30-50 words (based on an average word length of 5 characters).', 'add-meta-tags') . '
            </p>
        ';
        // Different notes based on post type
        if ($post_type == 'post') {
            print '
                <p>
                    ' . __('If the <em>description</em> field is left blank, a <em>description</em> meta tag will be <strong>automatically</strong> generated from the excerpt or, if an excerpt has not been set, directly from the first paragraph of the content.', 'add-meta-tags') . '
                </p>
            ';
        } elseif ($post_type == 'page') {
            print '
                <p>
                    ' . __('If the <em>description</em> field is left blank, a <em>description</em> meta tag will be <strong>automatically</strong> generated from the first paragraph of the content.', 'add-meta-tags') . '
                </p>
            ';
        } else {
            // Custom post types
            print '
                <p>
                    ' . __('If the <em>description</em> field is left blank, a <em>description</em> meta tag will be <strong>automatically</strong> generated from the first paragraph of the content.', 'add-meta-tags') . '
                </p>
            ';
        }
    }
    // Custom keywords
    // Keywords box permission check (can be user customized via filter).
    if ($options['metabox_enable_keywords'] == '1' && current_user_can($metabox_permissions['keywords_box_capability'])) {
        $metabox_has_features = true;
        // Retrieve the field data from the database.
        $custom_keywords_value = amt_get_post_meta_keywords($post->ID);
        // Alt input:  <input type="text" class="code" style="width: 99%" id="amt_custom_keywords" name="amt_custom_keywords" value="'.$custom_keywords_value.'" />
        print '
            <p>
                <label for="amt_custom_keywords"><strong>' . __('Keywords', 'add-meta-tags') . '</strong>:</label>
                <textarea class="code" style="width: 99%" id="amt_custom_keywords" name="amt_custom_keywords" cols="30" rows="2" >' . esc_attr(stripslashes($custom_keywords_value)) . '</textarea>
                <br>
                ' . __('Enter keywords separated with commas.', 'add-meta-tags') . '
            </p>
        ';
        // Different notes based on post type
        if ($post_type == 'post') {
            print '
                <p>
                    ' . __('If the <em>keywords</em> field is left blank, a <em>keywords</em> meta tag will be <strong>automatically</strong> generated from the post\'s categories, tags, custom taxonomy terms and from the global keywords, if any such global keywords have been set in the plugin settings. In case you decide to set a custom list of keywords for this post, it is possible to easily include the post\'s categories, tags and custom taxonomy terms in that list by using the special placeholders <code>%cats%</code>, <code>%tags%</code> and <code>%terms%</code> respectively.', 'add-meta-tags') . '
                    <br />
                    ' . __('Example', 'add-meta-tags') . ': <code>keyword1, keyword2, %cats%, keyword3, %tags%, keyword4</code>
                </p>
            ';
        } elseif ($post_type == 'page') {
            print '
                <p>
                    ' . __('If the <em>keywords</em> field is left blank, a <em>keywords</em> meta tag will only be automatically generated from global keywords, if any such global keywords have been set in the plugin settings.', 'add-meta-tags') . '
                </p>
            ';
        } else {
            // Custom post types
            print '
                <p>
                    ' . __('If the <em>keywords</em> field is left blank, a <em>keywords</em> meta tag will only be automatically generated from global keywords, if any such global keywords have been set in the plugin settings.', 'add-meta-tags') . '
                </p>
            ';
        }
    }
    // Advanced options
    // Custom title tag
    // Custom title box permission check (can be user customized via filter).
    if ($options['metabox_enable_title'] == '1' && current_user_can($metabox_permissions['title_box_capability'])) {
        $metabox_has_features = true;
        // Retrieve the field data from the database.
        $custom_title_value = amt_get_post_meta_title($post->ID);
        print '
            <p>
                <label for="amt_custom_title"><strong>' . __('Title', 'add-meta-tags') . '</strong>:</label>
                <input type="text" class="code" style="width: 99%" id="amt_custom_title" name="amt_custom_title" value="' . esc_attr(stripslashes($custom_title_value)) . '" />
                <br>
                ' . __('Enter a custom title to be used in the <em>title</em> HTML element of the page.', 'add-meta-tags') . '
            </p>
        ';
    }
    // 'news_keywords' meta tag
    // 'news_keywords' box permission check (can be user customized via filter).
    if ($options['metabox_enable_news_keywords'] == '1' && current_user_can($metabox_permissions['news_keywords_box_capability'])) {
        $metabox_has_features = true;
        // Retrieve the field data from the database.
        $custom_newskeywords_value = amt_get_post_meta_newskeywords($post->ID);
        print '
            <p>
                <label for="amt_custom_newskeywords"><strong>' . __('News Keywords', 'add-meta-tags') . '</strong>:</label>
                <input type="text" class="code" style="width: 99%" id="amt_custom_newskeywords" name="amt_custom_newskeywords" value="' . esc_attr(stripslashes($custom_newskeywords_value)) . '" />
                <br>
                ' . __('Enter a comma-delimited list of <strong>news keywords</strong>. For more info about this meta tag, please see this <a target="_blank" href="http://support.google.com/news/publisher/bin/answer.py?hl=en&answer=68297">Google help page</a>.', 'add-meta-tags') . '
            </p>
        ';
    }
    // per post full meta tags
    // Full meta tags box permission check (can be user customized via filter).
    if ($options['metabox_enable_full_metatags'] == '1' && current_user_can($metabox_permissions['full_metatags_box_capability'])) {
        $metabox_has_features = true;
        // Retrieve the field data from the database.
        $custom_full_metatags_value = amt_get_post_meta_full_metatags($post->ID);
        print '
            <p>
                <label for="amt_custom_full_metatags"><strong>' . __('Full meta tags', 'add-meta-tags') . '</strong>:</label>
                <textarea class="code" style="width: 99%" id="amt_custom_full_metatags" name="amt_custom_full_metatags" cols="30" rows="4" >' . stripslashes($custom_full_metatags_value) . '</textarea>
                <br>
                ' . __('Provide the full XHTML code of extra META elements you would like to add to this content (read more about the <a href="http://en.wikipedia.org/wiki/Meta_element" target="_blank">META HTML element</a> on Wikipedia).', 'add-meta-tags') . '
            </p>
            <p>
                ' . __('For example, to prevent a cached copy of this content from being available in search engine results, you can add the following metatag:', 'add-meta-tags') . '
                <br /><code>&lt;meta name="robots" content="noarchive" /&gt;</code>
            </p>

            <p>
                ' . __('Important note: for security reasons only <code>meta</code> elements are allowed in this box. All other HTML elements are automatically removed.', 'add-meta-tags') . '
            </p>
        ';
    }
    // Image URL (global override)
    // 'image_url' box permission check (can be user customized via filter).
    if ($options['metabox_enable_image_url'] == '1' && current_user_can($metabox_permissions['image_url_box_capability'])) {
        $metabox_has_features = true;
        // Retrieve the field data from the database.
        $custom_image_url_value = amt_get_post_meta_image_url($post->ID);
        print '
            <p>
                <label for="amt_custom_image_url"><strong>' . __('Image URL', 'add-meta-tags') . '</strong>:</label>
                <input type="text" class="code" style="width: 99%" id="amt_custom_image_url" name="amt_custom_image_url" value="' . esc_url_raw(stripslashes($custom_image_url_value)) . '" />
                <br>
                ' . __('Enter an image URL to override all media related meta tags.', 'add-meta-tags') . '
            </p>
        ';
    }
    // Content locale override
    // 'content_locale' box permission check (can be user customized via filter).
    if ($options['metabox_enable_content_locale'] == '1' && current_user_can($metabox_permissions['content_locale_box_capability'])) {
        $metabox_has_features = true;
        // Retrieve the field data from the database.
        $custom_content_locale_value = amt_get_post_meta_content_locale($post->ID);
        print '
            <p>
                <label for="amt_custom_content_locale"><strong>' . __('Content locale', 'add-meta-tags') . '</strong>:</label>
                <input type="text" class="code" style="width: 99%" id="amt_custom_content_locale" name="amt_custom_content_locale" value="' . esc_attr(stripslashes($custom_content_locale_value)) . '" />
                <br>
                ' . __('Override the default locale setting by entering a custom locale for this content in the form <code>language_TERRITORY</code>, for example: <code>en_US</code>.', 'add-meta-tags') . '
            </p>
        ';
    }
    // Express review
    // Express review box permission check (can be user customized via filter).
    if ($options['metabox_enable_express_review'] == '1' && current_user_can($metabox_permissions['express_review_box_capability'])) {
        $metabox_has_features = true;
        // Retrieve the field data from the database.
        $custom_express_review_value = amt_get_post_meta_express_review($post->ID);
        print '
            <p>
                <label for="amt_custom_express_review"><strong>' . __('Express review', 'add-meta-tags') . '</strong>:</label>
                <textarea class="code" style="width: 99%" id="amt_custom_express_review" name="amt_custom_express_review" cols="30" rows="2" >' . stripslashes($custom_express_review_value) . '</textarea>
                <br />
                ' . __('This field accepts special notation of review related information. If this info is provided in the correct form, then Add-Meta-Tags treats your content as being a review of an item and generates proper Schema.org metadata. This field must contain a <code>__</code> (double underscore) delimited list of the following information (all in one line): a rating, the name of a valid schema.org <a href="http://schema.org/Thing">Thing</a> derivative object, a title, and a URL. For instance:', 'add-meta-tags') . '
                <br />
                <code>4.2__Book__On the Origin of Species__http://en.wikipedia.org/wiki/On_the_Origin_of_Species</code>
            </p>
        ';
    }
    // List of URLs of items referenced in the post.
    // Referenced items box permission check (can be user customized via filter).
    if ($options['metabox_enable_referenced_list'] == '1' && current_user_can($metabox_permissions['referenced_list_box_capability'])) {
        $metabox_has_features = true;
        // Retrieve the field data from the database.
        $custom_referenced_list_value = amt_get_post_meta_referenced_list($post->ID);
        print '
            <p>
                <label for="amt_custom_referenced_list"><strong>' . __('URLs of referenced items', 'add-meta-tags') . '</strong>:</label>
                <textarea class="code" style="width: 99%" id="amt_custom_referenced_list" name="amt_custom_referenced_list" cols="30" rows="4" >' . stripslashes($custom_referenced_list_value) . '</textarea>
                <br>
                ' . __('Enter a list of canonical URLs (one per line) of items referenced in the content. The page referenced need not be on the same domain as the content. For example, you might reference a page where a product can be purchased or a page that further describes a place. If such references are provided and if OpenGraph/Schema.org metadata is enabled, then the relevant <code>og:referenced</code> and <code>referencedItem</code> meta tags will be generated.', 'add-meta-tags') . ' (<span style="color:red;">EXPERIMENTAL</span>)
            </p>
        ';
    }
    // If no features have been enabled, print an informative message
    if ($metabox_has_features === false) {
        print '
            <p>' . __(sprintf('No features have been enabled for this metabox in the Add-Meta-Tags <a href="%s">settings</a> or you do not have enough permissions to access the available features.', admin_url('options-general.php?page=add-meta-tags-options')), 'add-meta-tags') . '</p>
        ';
    } else {
        print '
            <p style="font-size: 85%; text-align: right; margin-top: 10px;">' . __(sprintf('Note: more features for this metabox might be available in the Add-Meta-Tags <a href="%s">settings</a>.', admin_url('options-general.php?page=add-meta-tags-options')), 'add-meta-tags') . '</p>
        ';
    }
}
示例#4
0
/**
 * 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;
}
/**
 * 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=&quot;avc1.42E01E1, mp4a.40.2&quot;">';
        }
        // 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=&quot;avc1.42E01E1, mp4a.40.2&quot;">';
                // 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;
}
/**
 * Filter function that generates and embeds Schema.org metadata in the content.
 */
function amt_add_schemaorg_metadata_content_filter($post_body)
{
    if (is_feed()) {
        return $post_body;
    }
    if (!is_singular() || is_front_page()) {
        // is_front_page() is used for the case in which a static page is used as the front page.
        // In this filter function we only deal with content and attachments.
        return $post_body;
    }
    // Get the options the DB
    $options = get_option("add_meta_tags_opts");
    $do_auto_schemaorg = $options["auto_schemaorg"] == "1" ? true : false;
    if (!$do_auto_schemaorg) {
        return $post_body;
    }
    // Get current post object
    $post = get_queried_object();
    $metadata_arr = array();
    // Since this is a function that is hooked to the 'the_content' filter
    // of WordPress, the post type check has not run, so this happens here.
    // Check if metadata is supported on this content type.
    $post_type = get_post_type($post);
    if (!in_array($post_type, amt_get_supported_post_types())) {
        return $post_body;
    }
    // Get an array containing the attachments
    $attachments = amt_get_ordered_attachments($post);
    //var_dump($attachments);
    // Get an array containing the URLs of the embedded media
    $embedded_media = amt_get_embedded_media($post);
    //var_dump($embedded_media);
    // Products
    if (amt_is_product()) {
        // Scope BEGIN: Product: http://schema.org/Product
        $metadata_arr[] = '<!-- Scope BEGIN: Product -->';
        // Construct itemref attribute. Should contain a comma delimited list of IDs.
        $itemref = apply_filters('amt_schemaorg_itemref_product', '');
        if (!empty($itemref)) {
            $itemref_attrib = ' itemref="' . $itemref . '"';
        } else {
            $itemref_attrib = '';
        }
        $metadata_arr[] = '<div itemscope itemtype="http://schema.org/Product"' . $itemref_attrib . '>';
        // URL - Uses amt_get_permalink_for_multipage()
        $metadata_arr[] = '<meta itemprop="url" content="' . esc_url_raw(amt_get_permalink_for_multipage($post)) . '" />';
        // name
        // Note: Contains multipage information through amt_process_paged()
        $metadata_arr[] = '<meta itemprop="name" content="' . esc_attr(amt_process_paged(get_the_title($post->ID))) . '" />';
        // 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)) {
            // Use the post body as the description. Product objects do not support body text.
            $content_desc = sanitize_text_field(amt_sanitize_description($post_body));
        }
        if (!empty($content_desc)) {
            $metadata_arr[] = '<meta itemprop="description" content="' . esc_attr(amt_process_paged($content_desc)) . '" />';
        }
        // Dates
        $metadata_arr[] = '<meta itemprop="releaseDate" content="' . esc_attr(amt_iso8601_date($post->post_date)) . '" />';
        // Images
        // First check if a global image override URL has been entered.
        // If yes, use this image URL and override all other images.
        $global_image_override_url = amt_get_post_meta_image_url($post->ID);
        if (!empty($global_image_override_url)) {
            $metadata_arr[] = '<!-- Scope BEGIN: ImageObject -->';
            $metadata_arr[] = '<span itemprop="image" itemscope itemtype="http://schema.org/ImageObject">';
            $metadata_arr[] = '<meta itemprop="contentUrl" content="' . esc_url_raw($global_image_override_url) . '" />';
            $metadata_arr[] = '</span> <!-- Scope END: ImageObject -->';
            // Further image processing
        } else {
            // 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;
            // Scope BEGIN: ImageObject: http://schema.org/ImageObject
            // Image - Featured image is checked first, so that it can be the first associated image.
            if (function_exists('has_post_thumbnail') && has_post_thumbnail($post->ID)) {
                // Get the image attachment object
                $image = get_post(get_post_thumbnail_id($post->ID));
                // metadata BEGIN
                $metadata_arr[] = '<!-- Scope BEGIN: ImageObject -->';
                $metadata_arr[] = '<span itemprop="image" itemscope itemtype="http://schema.org/ImageObject">';
                // Allow filtering of the image size.
                $image_size = apply_filters('amt_image_size_product', 'full');
                // Get image metatags.
                $metadata_arr = array_merge($metadata_arr, amt_get_schemaorg_image_metatags($image, $size = $image_size));
                // metadata END
                $metadata_arr[] = '</span> <!-- Scope END: ImageObject -->';
                // Images have been found.
                $has_images = true;
            }
            // Scope END: ImageObject
            // If no images have been found so far use the default image, if set.
            // Scope BEGIN: ImageObject: http://schema.org/ImageObject
            if ($has_images === false && !empty($options["default_image_url"])) {
                $metadata_arr[] = '<!-- Scope BEGIN: ImageObject -->';
                $metadata_arr[] = '<span itemprop="image" itemscope itemtype="http://schema.org/ImageObject">';
                $metadata_arr[] = '<meta itemprop="contentUrl" content="' . esc_url_raw($options["default_image_url"]) . '" />';
                $metadata_arr[] = '</span> <!-- Scope END: ImageObject -->';
            }
            // Scope END: ImageObject
        }
        // Extend the current metadata with properties of the Product object.
        // See: http://schema.org/Product
        $metadata_arr = apply_filters('amt_product_data_schemaorg', $metadata_arr, $post);
        // Scope END: Product
        $metadata_arr[] = '</div> <!-- Scope END: Product -->';
        // Filtering of the generated Schema.org metadata
        $metadata_arr = apply_filters('amt_schemaorg_metadata_product', $metadata_arr);
        // Add post body
        // Remove last closing '</div>' tag, add post body and re-add the closing div afterwards.
        $closing_product_tag = array_pop($metadata_arr);
        // Product objects do not support a 'text' itemprop. We just add a div for now
        // for consistency with Article objects.
        // TODO: it should allow filtering '<div>'
        $metadata_arr[] = '<div> <!-- Product text body: BEGIN -->';
        $metadata_arr[] = $post_body;
        $metadata_arr[] = '</div> <!-- Product text body: END -->';
        // Now add closing tag for Article
        $metadata_arr[] = $closing_product_tag;
        // Attachemnts
    } 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);
        // Early metatags - Scope starts
        if ('image' == $attachment_type) {
            // Scope BEGIN: ImageObject: http://schema.org/ImageObject
            $metadata_arr[] = '<!-- Scope BEGIN: ImageObject -->';
            // Construct itemref attribute. Should contain a comma delimited list of IDs.
            $itemref = apply_filters('amt_schemaorg_itemref_attachment_image', '');
            if (!empty($itemref)) {
                $itemref_attrib = ' itemref="' . $itemref . '"';
            } else {
                $itemref_attrib = '';
            }
            $metadata_arr[] = '<div itemscope itemtype="http://schema.org/ImageObject"' . $itemref_attrib . '>';
        } elseif ('video' == $attachment_type) {
            // Scope BEGIN: VideoObject: http://schema.org/VideoObject
            $metadata_arr[] = '<!-- Scope BEGIN: VideoObject -->';
            // Construct itemref attribute. Should contain a comma delimited list of IDs.
            $itemref = apply_filters('amt_schemaorg_itemref_attachment_video', '');
            if (!empty($itemref)) {
                $itemref_attrib = ' itemref="' . $itemref . '"';
            } else {
                $itemref_attrib = '';
            }
            $metadata_arr[] = '<div itemscope itemtype="http://schema.org/VideoObject"' . $itemref_attrib . '>';
        } elseif ('audio' == $attachment_type) {
            // Scope BEGIN: AudioObject: http://schema.org/AudioObject
            $metadata_arr[] = '<!-- Scope BEGIN: AudioObject -->';
            // Construct itemref attribute. Should contain a comma delimited list of IDs.
            $itemref = apply_filters('amt_schemaorg_itemref_attachment_audio', '');
            if (!empty($itemref)) {
                $itemref_attrib = ' itemref="' . $itemref . '"';
            } else {
                $itemref_attrib = '';
            }
            $metadata_arr[] = '<div itemscope itemtype="http://schema.org/AudioObject"' . $itemref_attrib . '>';
        } else {
            // we do not currently support other attachment types, so we stop processing here
            return $post_body;
        }
        // Metadata commong to all attachments
        // Publisher
        // Scope BEGIN: Organization: http://schema.org/Organization
        $metadata_arr[] = '<!-- Scope BEGIN: Organization -->';
        $metadata_arr[] = '<span itemprop="publisher" itemscope itemtype="http://schema.org/Organization">';
        // Get publisher metatags
        $metadata_arr = array_merge($metadata_arr, amt_get_schemaorg_publisher_metatags($options, $post->post_author));
        // Scope END: Organization
        $metadata_arr[] = '</span> <!-- Scope END: Organization -->';
        // Author
        // Scope BEGIN: Person: http://schema.org/Person
        $metadata_arr[] = '<!-- Scope BEGIN: Person -->';
        $metadata_arr[] = '<span itemprop="author" itemscope itemtype="http://schema.org/Person">';
        // Get author metatags
        $metadata_arr = array_merge($metadata_arr, amt_get_schemaorg_author_metatags($post->post_author));
        // Scope END: Person
        $metadata_arr[] = '</span> <!-- Scope END: Person -->';
        // Dates
        $metadata_arr[] = '<meta itemprop="datePublished" content="' . esc_attr(amt_iso8601_date($post->post_date)) . '" />';
        $metadata_arr[] = '<meta itemprop="dateModified" content="' . esc_attr(amt_iso8601_date($post->post_modified)) . '" />';
        $metadata_arr[] = '<meta itemprop="copyrightYear" content="' . esc_attr(mysql2date('Y', $post->post_date)) . '" />';
        // Language
        $metadata_arr[] = '<meta itemprop="inLanguage" content="' . esc_attr(str_replace('-', '_', amt_get_language_content($options))) . '" />';
        // 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');
            // Get image metatags. $post is an image object.
            $metadata_arr = array_merge($metadata_arr, amt_get_schemaorg_image_metatags($post, $size = $image_size, $is_representative = true));
            // Add the post body here
            $metadata_arr[] = $post_body;
            // Scope END: ImageObject
            $metadata_arr[] = '</div> <!-- Scope END: ImageObject -->';
        } elseif ('video' == $attachment_type) {
            // Video specific metatags
            // URL (for attachments: links to attachment page)
            $metadata_arr[] = '<meta itemprop="url" content="' . esc_url_raw(get_permalink($post->ID)) . '" />';
            $metadata_arr[] = '<meta itemprop="contentUrl" content="' . esc_url_raw(wp_get_attachment_url($post->ID)) . '" />';
            $metadata_arr[] = '<meta itemprop="encodingFormat" content="' . esc_attr($mime_type) . '" />';
            // Add the post body here
            $metadata_arr[] = $post_body;
            // Scope END: VideoObject
            $metadata_arr[] = '</div> <!-- Scope END: VideoObject -->';
        } elseif ('audio' == $attachment_type) {
            // Audio specific metatags
            // URL (for attachments: links to attachment page)
            $metadata_arr[] = '<meta itemprop="url" content="' . esc_url_raw(get_permalink($post->ID)) . '" />';
            $metadata_arr[] = '<meta itemprop="contentUrl" content="' . esc_url_raw(wp_get_attachment_url($post->ID)) . '" />';
            $metadata_arr[] = '<meta itemprop="encodingFormat" content="' . esc_attr($mime_type) . '" />';
            // Add the post body here
            $metadata_arr[] = $post_body;
            // Scope END: AudioObject
            $metadata_arr[] = '</div> <!-- Scope END: AudioObject -->';
        }
        // Content
    } else {
        // Set main metadata entity. By default this set to Article.
        $main_content_object = 'Article';
        // Check for Page
        // Main entity is set to WebPage on pages
        // DEV NOTE: Since many themes already set the WebPage itemscope on the
        // body element of the web page, set it to WebPage automatically would
        // result in duplicate entities. So this has to be done manually via
        // a filtering function.
        //        if  ( is_page() ) {
        //            $main_content_object = 'WebPage';
        //        }
        // Check for Review
        $express_review_field_data = amt_get_post_meta_express_review($post->ID);
        $review_data = array();
        if (!empty($express_review_field_data)) {
            $review_data = amt_get_review_data($express_review_field_data);
            if (!empty($review_data)) {
                $main_content_object = 'Review';
            }
        }
        // Allow filtering the main metadata object for content.
        $main_content_object = apply_filters('amt_schemaorg_object_main', $main_content_object);
        // Scope BEGIN: Article: http://schema.org/Article
        $metadata_arr[] = '<!-- Scope BEGIN: ' . esc_attr($main_content_object) . ' -->';
        // Construct itemref attribute. Should contain a comma delimited list of IDs.
        $itemref = apply_filters('amt_schemaorg_itemref_content', '');
        if (!empty($itemref)) {
            $itemref_attrib = ' itemref="' . $itemref . '"';
        } else {
            $itemref_attrib = '';
        }
        $metadata_arr[] = '<div itemscope itemtype="http://schema.org/' . esc_attr($main_content_object) . '"' . $itemref_attrib . '>';
        // Publisher
        // Scope BEGIN: Organization: http://schema.org/Organization
        $metadata_arr[] = '<!-- Scope BEGIN: Organization -->';
        $metadata_arr[] = '<span itemprop="publisher" itemscope itemtype="http://schema.org/Organization">';
        // Get publisher metatags
        $metadata_arr = array_merge($metadata_arr, amt_get_schemaorg_publisher_metatags($options, $post->post_author));
        // Scope END: Organization
        $metadata_arr[] = '</span> <!-- Scope END: Organization -->';
        // Author
        // Scope BEGIN: Person: http://schema.org/Person
        $metadata_arr[] = '<!-- Scope BEGIN: Person -->';
        $metadata_arr[] = '<span itemprop="author" itemscope itemtype="http://schema.org/Person">';
        // Get publisher metatags
        $metadata_arr = array_merge($metadata_arr, amt_get_schemaorg_author_metatags($post->post_author));
        // Scope END: Person
        $metadata_arr[] = '</span> <!-- Scope END: Person -->';
        // URL - Uses amt_get_permalink_for_multipage()
        $metadata_arr[] = '<meta itemprop="url" content="' . esc_url_raw(amt_get_permalink_for_multipage($post)) . '" />';
        // Dates
        $metadata_arr[] = '<meta itemprop="datePublished" content="' . esc_attr(amt_iso8601_date($post->post_date)) . '" />';
        $metadata_arr[] = '<meta itemprop="dateModified" content="' . esc_attr(amt_iso8601_date($post->post_modified)) . '" />';
        $metadata_arr[] = '<meta itemprop="copyrightYear" content="' . esc_attr(mysql2date('Y', $post->post_date)) . '" />';
        // Language
        $metadata_arr[] = '<meta itemprop="inLanguage" content="' . esc_attr(str_replace('-', '_', amt_get_language_content($options))) . '" />';
        // name
        // Note: Contains multipage information through amt_process_paged()
        $metadata_arr[] = '<meta itemprop="name" content="' . esc_attr(amt_process_paged(get_the_title($post->ID))) . '" />';
        // headline
        $metadata_arr[] = '<meta itemprop="headline" content="' . esc_attr(get_the_title($post->ID)) . '" />';
        // 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 itemprop="description" content="' . esc_attr(amt_process_paged($content_desc)) . '" />';
        }
        /*
        // Section: We use the first category as the section
        $first_cat = sanitize_text_field( amt_sanitize_keywords( amt_get_first_category($post) ) );
        if (!empty($first_cat)) {
            $metadata_arr[] = '<meta itemprop="articleSection" content="' . esc_attr( $first_cat ) . '" />';
        }
        */
        // Add articleSection in Article object only.
        if ($main_content_object == 'Article') {
            $categories = get_the_category($post->ID);
            $categories = apply_filters('amt_post_categories_for_schemaorg', $categories);
            foreach ($categories as $cat) {
                $section = trim($cat->cat_name);
                if (!empty($section) && $cat->slug != 'uncategorized') {
                    $metadata_arr[] = '<meta itemprop="articleSection" content="' . esc_attr($section) . '" />';
                }
            }
        }
        // Add review properties if Review
        if ($main_content_object == 'Review') {
            $metadata_arr[] = '<!-- Review Information BEGIN -->';
            $metadata_arr[] = amt_get_review_info_box($review_data);
            $metadata_arr[] = '<!-- Review Information END -->';
        }
        // Keywords - We use the keywords defined by Add-Meta-Tags
        $keywords = amt_get_content_keywords($post);
        if (!empty($keywords)) {
            $metadata_arr[] = '<meta itemprop="keywords" content="' . esc_attr($keywords) . '" />';
        }
        // Referenced Items
        $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 itemprop="referencedItem" content="' . esc_url_raw($referenced_url) . '" />';
            }
        }
        // Images
        // First check if a global image override URL has been entered.
        // If yes, use this image URL and override all other images.
        $global_image_override_url = amt_get_post_meta_image_url($post->ID);
        if (!empty($global_image_override_url)) {
            $metadata_arr[] = '<!-- Scope BEGIN: ImageObject -->';
            $metadata_arr[] = '<span itemprop="image" itemscope itemtype="http://schema.org/ImageObject">';
            $metadata_arr[] = '<meta itemprop="contentUrl" content="' . esc_url_raw($global_image_override_url) . '" />';
            $metadata_arr[] = '</span> <!-- Scope END: ImageObject -->';
            // Further image processing
        } else {
            // 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;
            // Scope BEGIN: ImageObject: http://schema.org/ImageObject
            // Image - Featured image is checked first, so that it can be the first associated image.
            if (function_exists('has_post_thumbnail') && has_post_thumbnail($post->ID)) {
                // Thumbnail URL
                // First add the thumbnail URL of the featured image
                $thumbnail_info = wp_get_attachment_image_src(get_post_thumbnail_id($post->ID), 'thumbnail');
                $metadata_arr[] = '<meta itemprop="thumbnailUrl" content="' . esc_url_raw($thumbnail_info[0]) . '" />';
                // Add full image object for featured image.
                // Get the image attachment object
                $image = get_post(get_post_thumbnail_id($post->ID));
                // metadata BEGIN
                $metadata_arr[] = '<!-- Scope BEGIN: ImageObject -->';
                $metadata_arr[] = '<span itemprop="associatedMedia" itemscope itemtype="http://schema.org/ImageObject">';
                // Allow filtering of the image size.
                $image_size = apply_filters('amt_image_size_content', 'full');
                // Get image metatags.
                $metadata_arr = array_merge($metadata_arr, amt_get_schemaorg_image_metatags($image, $size = $image_size));
                // metadata END
                $metadata_arr[] = '</span> <!-- Scope END: ImageObject -->';
                // Finally, set the $featured_image_id
                $featured_image_id = get_post_thumbnail_id($post->ID);
                // Images have been found.
                $has_images = true;
            }
            // Scope END: ImageObject
            // 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) {
                        // metadata BEGIN
                        $metadata_arr[] = '<!-- Scope BEGIN: ImageObject -->';
                        $metadata_arr[] = '<span itemprop="associatedMedia" itemscope itemtype="http://schema.org/ImageObject">';
                        // Allow filtering of the image size.
                        $image_size = apply_filters('amt_image_size_content', 'full');
                        // Get image metatags.
                        $metadata_arr = array_merge($metadata_arr, amt_get_schemaorg_image_metatags($attachment, $size = $image_size));
                        // metadata END
                        $metadata_arr[] = '</span> <!-- Scope END: ImageObject -->';
                        // Images have been found.
                        $has_images = true;
                    } elseif ('video' == $attachment_type) {
                        // Scope BEGIN: VideoObject: http://schema.org/VideoObject
                        $metadata_arr[] = '<!-- Scope BEGIN: VideoObject -->';
                        $metadata_arr[] = '<span itemprop="associatedMedia" itemscope itemtype="http://schema.org/VideoObject">';
                        // Video specific metatags
                        // URL (for attachments: links to attachment page)
                        $metadata_arr[] = '<meta itemprop="url" content="' . esc_url_raw(get_permalink($attachment->ID)) . '" />';
                        $metadata_arr[] = '<meta itemprop="contentUrl" content="' . esc_url_raw(wp_get_attachment_url($attachment->ID)) . '" />';
                        $metadata_arr[] = '<meta itemprop="encodingFormat" content="' . esc_attr($mime_type) . '" />';
                        // Scope END: VideoObject
                        $metadata_arr[] = '</span> <!-- Scope END: VideoObject -->';
                    } elseif ('audio' == $attachment_type) {
                        // Scope BEGIN: AudioObject: http://schema.org/AudioObject
                        $metadata_arr[] = '<!-- Scope BEGIN: AudioObject -->';
                        $metadata_arr[] = '<span itemprop="associatedMedia" itemscope itemtype="http://schema.org/AudioObject">';
                        // Audio specific metatags
                        // URL (for attachments: links to attachment page)
                        $metadata_arr[] = '<meta itemprop="url" content="' . esc_url_raw(get_permalink($attachment->ID)) . '" />';
                        $metadata_arr[] = '<meta itemprop="contentUrl" content="' . esc_url_raw(wp_get_attachment_url($attachment->ID)) . '" />';
                        $metadata_arr[] = '<meta itemprop="encodingFormat" content="' . esc_attr($mime_type) . '" />';
                        // Scope END: AudioObject
                        $metadata_arr[] = '</span> <!-- Scope END: AudioObject -->';
                    }
                }
            }
            // Embedded Media
            foreach ($embedded_media['images'] as $embedded_item) {
                // Scope BEGIN: ImageObject: http://schema.org/ImageObject
                $metadata_arr[] = '<!-- Scope BEGIN: ImageObject -->';
                $metadata_arr[] = '<span itemprop="associatedMedia" itemscope itemtype="http://schema.org/ImageObject">';
                // name (title)
                $metadata_arr[] = '<meta itemprop="name" content="' . esc_attr($embedded_item['alt']) . '" />';
                // caption
                $metadata_arr[] = '<meta itemprop="caption" content="' . esc_attr($embedded_item['alt']) . '" />';
                // alt
                $metadata_arr[] = '<meta itemprop="text" content="' . esc_attr($embedded_item['alt']) . '" />';
                // URL (links to web page containing the image)
                $metadata_arr[] = '<meta itemprop="url" content="' . esc_url_raw($embedded_item['page']) . '" />';
                // thumbnail url
                $metadata_arr[] = '<meta itemprop="thumbnailUrl" content="' . esc_url_raw($embedded_item['thumbnail']) . '" />';
                // main image
                $metadata_arr[] = '<meta itemprop="contentUrl" content="' . esc_url_raw($embedded_item['image']) . '" />';
                if (apply_filters('amt_extended_image_tags', true)) {
                    $metadata_arr[] = '<meta itemprop="width" content="' . esc_attr($embedded_item['width']) . '" />';
                    $metadata_arr[] = '<meta itemprop="height" content="' . esc_attr($embedded_item['height']) . '" />';
                    $metadata_arr[] = '<meta itemprop="encodingFormat" content="image/jpeg" />';
                }
                // embedURL
                $metadata_arr[] = '<meta itemprop="embedURL" content="' . esc_url_raw($embedded_item['player']) . '" />';
                // Scope END: ImageObject
                $metadata_arr[] = '</span> <!-- Scope END: ImageObject -->';
                // Images have been found.
                $has_images = true;
            }
            foreach ($embedded_media['videos'] as $embedded_item) {
                // Scope BEGIN: VideoObject: http://schema.org/VideoObject
                // See: http://googlewebmastercentral.blogspot.gr/2012/02/using-schemaorg-markup-for-videos.html
                // See: https://support.google.com/webmasters/answer/2413309?hl=en
                $metadata_arr[] = '<!-- Scope BEGIN: VideoObject -->';
                $metadata_arr[] = '<span itemprop="video" itemscope itemtype="http://schema.org/VideoObject">';
                // Video Embed URL
                $metadata_arr[] = '<meta itemprop="embedURL" content="' . esc_url_raw($embedded_item['player']) . '" />';
                // playerType
                $metadata_arr[] = '<meta itemprop="playerType" content="application/x-shockwave-flash" />';
                // size
                $metadata_arr[] = '<meta itemprop="width" content="' . esc_attr($embedded_item['width']) . '" />';
                $metadata_arr[] = '<meta itemprop="height" content="' . esc_attr($embedded_item['height']) . '" />';
                // Scope END: VideoObject
                $metadata_arr[] = '</span> <!-- Scope END: VideoObject -->';
            }
            foreach ($embedded_media['sounds'] as $embedded_item) {
                // Scope BEGIN: AudioObject: http://schema.org/AudioObject
                $metadata_arr[] = '<!-- Scope BEGIN: AudioObject -->';
                $metadata_arr[] = '<span itemprop="audio" itemscope itemtype="http://schema.org/AudioObject">';
                // Audio Embed URL
                $metadata_arr[] = '<meta itemprop="embedURL" content="' . esc_url_raw($embedded_item['player']) . '" />';
                // playerType
                $metadata_arr[] = '<meta itemprop="playerType" content="application/x-shockwave-flash" />';
                // Scope END: AudioObject
                $metadata_arr[] = '</span> <!-- Scope END: AudioObject -->';
            }
            // If no images have been found so far use the default image, if set.
            // Scope BEGIN: ImageObject: http://schema.org/ImageObject
            if ($has_images === false && !empty($options["default_image_url"])) {
                $metadata_arr[] = '<!-- Scope BEGIN: ImageObject -->';
                $metadata_arr[] = '<span itemprop="associatedMedia" itemscope itemtype="http://schema.org/ImageObject">';
                $metadata_arr[] = '<meta itemprop="contentUrl" content="' . esc_url_raw($options["default_image_url"]) . '" />';
                $metadata_arr[] = '</span> <!-- Scope END: ImageObject -->';
            }
            // Scope END: ImageObject
        }
        // Article Body
        // The article body is added after filtering the generated microdata below.
        // TODO: also check: comments, contributor, copyrightHolder, , creator, dateCreated, discussionUrl, editor, version (use post revision if possible)
        // Scope END: Article
        $metadata_arr[] = '</div> <!-- Scope END: ' . esc_attr($main_content_object) . ' -->';
        // Filtering of the generated Schema.org metadata
        $metadata_arr = apply_filters('amt_schemaorg_metadata_content', $metadata_arr);
        // Add articleBody to Artice
        // Now add the article. Remove last closing '</span>' tag, add articleBody and re-add the closing span afterwards.
        $closing_article_tag = array_pop($metadata_arr);
        // Use the 'text' itemprop by default for the main text body of the CreativeWork,
        // so it can be used by more subtypes than Article.
        // But set it explicitly to 'articleBody if the main entiry is 'Article'
        // or 'reviewBody' if the main entity is a 'Review'.
        $main_text_property = 'text';
        if ($main_content_object == 'Article') {
            $main_text_property = 'articleBody';
        } elseif ($main_content_object == 'Review') {
            $main_text_property = 'reviewBody';
        }
        // Allow filtering of the main text property.
        $main_text_property = apply_filters('amt_schemaorg_property_main_text', $main_text_property);
        $metadata_arr[] = '<div itemprop="' . esc_attr($main_text_property) . '">';
        $metadata_arr[] = $post_body;
        $metadata_arr[] = '</div> <!-- Itemprop END: ' . esc_attr($main_text_property) . ' -->';
        // Now add closing tag for Article
        $metadata_arr[] = $closing_article_tag;
    }
    // Add our comment
    if (count($metadata_arr) > 0) {
        array_unshift($metadata_arr, "<!-- BEGIN Schema.org microdata added by Add-Meta-Tags WordPress plugin -->");
        array_unshift($metadata_arr, "");
        // Intentionaly left empty
        array_push($metadata_arr, "<!-- END Schema.org microdata added by Add-Meta-Tags WordPress plugin -->");
        array_push($metadata_arr, "");
        // Intentionaly left empty
    }
    //return $post_body;
    return implode(PHP_EOL, $metadata_arr);
}