, CodeTRAX.org
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* The NOTICE file contains additional licensing and copyright information.
*/
/**
* Extended getadata generator.
*
* Contains code that extends the generated metadata for:
* - WooCommerce
* - Easy Digital Downloads
*/
// Prevent direct access to this file.
if ( ! defined( 'ABSPATH' ) ) {
header( 'HTTP/1.0 403 Forbidden' );
echo 'This file should not be accessed directly!';
exit; // Exit if accessed directly
}
/*
* WooCommerce Product and Product Group metadata
*
*/
// Conditional tag that is true when our product page is displayed.
// If such a conditional tag is provided by the e-commerce solution,
// defining such a function is entirely optional.
function amt_is_woocommerce_product() {
// Check if woocommerce product page and return true;
// WooCommerce (http://docs.woothemes.com/document/conditional-tags/)
// Also validates with is_singular().
if ( function_exists('is_product') ) {
if ( is_product() ) {
return true;
}
}
}
// Conditional tag that is true when our product group page is displayed.
// If such a conditional tag is provided by the e-commerce solution,
// defining such a function is entirely optional.
function amt_is_woocommerce_product_group() {
// Check if woocommerce product group page and return true;
// WooCommerce (http://docs.woothemes.com/document/conditional-tags/)
// Also validates with is_tax().
if ( function_exists('is_product_category') || function_exists('is_product_tag') ) {
if ( is_product_category() || is_product_tag() ) {
return true;
}
}
}
// Twitter Cards for woocommerce products
function amt_product_data_tc_woocommerce( $metatags, $post ) {
// Get the product object
$product = get_product($post->ID);
// WC API: http://docs.woothemes.com/wc-apidocs/class-WC_Product.html
// Twitter product card: https://dev.twitter.com/cards/types/product
// In this generator we only add the price. So, the WC product types that are
// supported are those having a single price: simple, external
// Not supported: grouped (no price), variable (multiple prices)
$product_type = $product->product_type;
if ( ! in_array( $product_type, array('simple', 'external') ) ) {
$metatags = apply_filters( 'amt_product_data_woocommerce_twitter_cards', $metatags );
return $metatags;
}
// Price
// get_regular_price
// get_sale_price
// get_price <-- active price (if product is on sale, the sale price is retrieved)
// is_on_sale()
// is_purchasable()
$active_price = $product->get_price();
if ( ! empty($active_price) ) {
$metatags['twitter:label1'] = '';
$metatags['twitter:data1'] = '';
// Currency
$metatags['twitter:label2'] = '';
$metatags['twitter:data2'] = '';
}
$metatags = apply_filters( 'amt_product_data_woocommerce_twitter_cards', $metatags );
return $metatags;
}
// Opengraph for woocommerce products
function amt_product_data_og_woocommerce( $metatags, $post ) {
// Get the product object
$product = get_product($post->ID);
// WC API: http://docs.woothemes.com/wc-apidocs/class-WC_Product.html
// https://developers.facebook.com/docs/reference/opengraph/object-type/product/
// Also check:
// https://developers.facebook.com/docs/reference/opengraph/object-type/product.item/
// Currently, the OG WC generator supports all product types.
// simple, external, grouped (no price), variable (multiple prices)
// The relevant meta tags are generated only if the relevant data can be retrieved
// from the product object.
$product_type = $product->product_type;
//if ( ! in_array( $product_type, array('simple', 'external') ) ) {
// $metatags = apply_filters( 'amt_product_data_woocommerce_opengraph', $metatags );
// return $metatags;
//}
// Opengraph property to WooCommerce attribute map
$property_map = array(
'product:brand' => 'brand',
'product:size' => 'size',
'product:color' => 'color',
'product:material' => 'material',
'product:condition' => 'condition',
'product:target_gender' => 'target_gender',
'product:age_group' => 'age_group',
'product:ean' => 'ean',
'product:isbn' => 'isbn',
'product:mfr_part_no' => 'mpn',
'product:gtin' => 'gtin',
'product:upc' => 'upc',
);
$property_map = apply_filters( 'amt_og_woocommerce_property_map', $property_map );
// Availability
$availability = '';
if ( $product->is_in_stock() ) {
$availability = 'instock';
} elseif ( $product->backorders_allowed() ) {
$availability = 'pending';
} else {
$availability = 'oos';
}
if ( ! empty($availability) ) {
$metatags['og:product:availability'] = '';
}
// Price
// Active price
$active_price = $product->get_price();
if ( ! empty($active_price) ) {
$metatags['og:product:price:amount'] = '';
// Currency
$metatags['og:product:price:currency'] = '';
}
// Regular Price
// get_regular_price
// get_sale_price
// get_price <-- active price
// is_on_sale()
// is_purchasable()
$regular_price = $product->get_regular_price();
if ( ! empty($regular_price) ) {
$metatags['og:product:original_price:amount'] = '';
// Currency
$metatags['og:product:original_price:currency'] = '';
}
// Sale Price
// get_regular_price
// get_sale_price
// get_price <-- active price
// is_on_sale()
// is_purchasable()
//var_dump( $product->is_on_sale() );
$sale_price = $product->get_sale_price();
if ( ! empty($sale_price) ) {
$metatags['og:product:sale_price:amount'] = '';
// Currency
$metatags['og:product:sale_price:currency'] = '';
}
// Sale price from date
$sale_price_date_from = get_post_meta( $post->ID, '_sale_price_dates_from', true );
if ( ! empty($sale_price_date_from) ) {
$metatags['og:product:sale_price_dates:start'] = '';
}
// Sale price to date
$sale_price_date_to = get_post_meta( $post->ID, '_sale_price_dates_to', true );
if ( ! empty($sale_price_date_to) ) {
$metatags['og:product:sale_price_dates:end'] = '';
}
// Product Data
// Product category
$product_cats = wp_get_post_terms( $post->ID, 'product_cat' );
$product_category = array_shift($product_cats);
if ( ! empty($product_category) ) {
$metatags['og:product:category'] = '';
}
// Brand
$brand = $product->get_attribute( $property_map['product:brand'] );
if ( ! empty($brand ) ) {
$metatags['og:product:brand'] = '';
}
// Weight
// Also see:
//product:shipping_weight:value
//product:shipping_weight:units
$weight_unit = apply_filters( 'amt_woocommerce_default_weight_unit', 'kg' );
$weight = wc_get_weight( $product->get_weight(), $weight_unit );
if ( ! empty($weight) ) {
$metatags['product:weight:value'] = '';
$metatags['product:weight:units'] = '';
}
// Size
// Do not confuse this with the product size LxWxH. This is an attribute.
$size = $product->get_attribute( $property_map['product:size'] );
if ( ! empty($size) ) {
$metatags['og:product:size'] = '';
}
// Color
$color = $product->get_attribute( $property_map['product:color'] );
if ( ! empty($color) ) {
$metatags['og:product:color'] = '';
}
// Material
$material = $product->get_attribute( $property_map['product:material'] );
if ( ! empty($material) ) {
$metatags['og:product:material'] = '';
}
// Condition
$condition = $product->get_attribute( $property_map['product:condition'] );
if ( ! empty($condition) ) {
if ( in_array($age_group, array('new', 'refurbished', 'used') ) ) {
$metatags['og:product:condition'] = '';
}
} else {
$metatags['og:product:condition'] = '';
}
// Target gender
$target_gender = $product->get_attribute( $property_map['product:target_gender'] );
if ( ! empty($target_gender) && in_array($target_gender, array('male', 'female', 'unisex')) ) {
$metatags['og:product:target_gender'] = '';
}
// Age group
$age_group = $product->get_attribute( $property_map['product:age_group'] );
if ( ! empty($age_group) && in_array($age_group, array('kids', 'adult')) ) {
$metatags['og:product:age_group'] = '';
}
// Codes
// EAN
$ean = $product->get_attribute( $property_map['product:ean'] );
if ( ! empty($ean) ) {
$metatags['og:product:ean'] = '';
}
// ISBN
$isbn = $product->get_attribute( $property_map['product:isbn'] );
if ( ! empty($isbn) ) {
$metatags['og:product:isbn'] = '';
}
// MPN: A manufacturer's part number for the item
$mpn = $product->get_attribute( $property_map['product:mfr_part_no'] );
if ( ! empty($mpn) ) {
$metatags['og:product:mfr_part_no'] = '';
}
// SKU (product:retailer_part_no?)
// By convention we use the SKU as the product:retailer_part_no. TODO: check this
$sku = $product->get_sku();
if ( ! empty($sku) ) {
$metatags['og:product:retailer_part_no'] = '';
}
// GTIN: A Global Trade Item Number, which encompasses UPC, EAN, JAN, and ISBN
$gtin = $product->get_attribute( $property_map['product:gtin'] );
if ( ! empty($gtin) ) {
$metatags['og:product:gtin'] = '';
}
// UPC: A Universal Product Code (UPC) for the product
$upc = $product->get_attribute( $property_map['product:upc'] );
if ( ! empty($upc) ) {
$metatags['og:product:upc'] = '';
}
// Retailer data
// User, consider adding these using a filtering function.
//product:retailer
//product:retailer_category
//product:retailer_title
//product:product_link
$metatags = apply_filters( 'amt_product_data_woocommerce_opengraph', $metatags );
return $metatags;
}
// Schema.org microdata for woocommerce products
function amt_product_data_schemaorg_woocommerce( $metatags, $post ) {
// Get the product object
$product = get_product($post->ID);
// WC API:
// http://docs.woothemes.com/wc-apidocs/class-WC_Product.html
// http://docs.woothemes.com/wc-apidocs/class-WC_Product_Variable.html
// http://docs.woothemes.com/wc-apidocs/class-WC_Product_Variation.html
// Schema.org:
// http://schema.org/Product
// http://schema.org/IndividualProduct
// http://schema.org/ProductModel
// http://schema.org/Offer
// http://schema.org/Review
// http://schema.org/AggregateRating
// Currently, the schema.org microdata WC generator supports all product types.
// simple, external, grouped (no price), variable (multiple prices)
// The relevant meta tags are generated only if the relevant data can be retrieved
// from the product object.
$product_type = $product->product_type;
//if ( ! in_array( $product_type, array('simple', 'external') ) ) {
// $metatags = apply_filters( 'amt_product_data_woocommerce_opengraph', $metatags );
// return $metatags;
//}
// Variations (only in variable products)
$variations = null;
if ( $product_type == 'variable' ) {
$variations = $product->get_available_variations();
}
//var_dump($variations);
// Variation attributes
$variation_attributes = null;
if ( $product_type == 'variable' ) {
$variation_attributes = $product->get_variation_attributes();
}
//var_dump($variation_attributes);
// Schema.org property to WooCommerce attribute map
$property_map = array(
'brand' => 'brand',
'color' => 'color',
'condition' => 'condition',
'mpn' => 'mpn',
'gtin' => 'gtin',
);
$property_map = apply_filters( 'amt_schemaorg_woocommerce_property_map', $property_map );
// Product category
$product_cats = wp_get_post_terms( $post->ID, 'product_cat' );
$product_category = array_shift($product_cats);
if ( ! empty($product_category) ) {
$metatags['microdata:product:category'] = '';
}
// Brand
$brand = $product->get_attribute( $property_map['brand'] );
if ( ! empty($brand ) ) {
$metatags['microdata:product:brand'] = '';
}
// Weight
$weight_unit = apply_filters( 'amt_woocommerce_default_weight_unit', 'kg' );
$weight = wc_get_weight( $product->get_weight(), $weight_unit );
if ( ! empty($weight) ) {
$metatags['microdata:product:weight:start'] = '';
$metatags['microdata:product:weight:value'] = '';
$metatags['microdata:product:weight:unitText'] = '';
$metatags['microdata:product:weight:end'] = '';
}
// Dimensions
// Schema.org has: width(length), depth(width), height(height)
$dimension_unit = get_option( 'woocommerce_dimension_unit' );
if ( ! empty($product->length) ) {
$metatags['microdata:product:width:start'] = '';
$metatags['microdata:product:width:value'] = '';
$metatags['microdata:product:width:unitText'] = '';
$metatags['microdata:product:width:end'] = '';
}
if ( ! empty($product->width) ) {
$metatags['microdata:product:depth:start'] = '';
$metatags['microdata:product:depth:value'] = '';
$metatags['microdata:product:depth:unitText'] = '';
$metatags['microdata:product:depth:end'] = '';
}
if ( ! empty($product->height) ) {
$metatags['microdata:product:height:start'] = '';
$metatags['microdata:product:height:value'] = '';
$metatags['microdata:product:height:unitText'] = '';
$metatags['microdata:product:height:end'] = '';
}
// Color
$color = $product->get_attribute( $property_map['color'] );
if ( ! empty($color) ) {
$metatags['microdata:product:color'] = '';
}
// Condition
$condition = $product->get_attribute( $property_map['condition'] );
if ( ! empty($condition) ) {
if ( in_array($age_group, array('new', 'refurbished', 'used') ) ) {
$schema_org_condition_map = array(
'new' => 'NewCondition',
'refurbished' => 'RefurbishedCondition',
'used' => 'UsedCondition',
);
$metatags['microdata:product:itemCondition'] = '';
}
} else {
$metatags['microdata:product:itemCondition'] = '';
}
// Codes
// SKU (product:retailer_part_no?)
// By convention we use the SKU as the product:retailer_part_no. TODO: check this
$sku = $product->get_sku();
if ( ! empty($sku) ) {
$metatags['microdata:product:sku'] = '';
}
// GTIN: A Global Trade Item Number, which encompasses UPC, EAN, JAN, and ISBN
$gtin = $product->get_attribute( $property_map['gtin'] );
if ( ! empty($gtin) ) {
$metatags['microdata:product:gtin14'] = '';
}
// MPN: A manufacturer's part number for the item
$mpn = $product->get_attribute( $property_map['mpn'] );
if ( ! empty($mpn) ) {
$metatags['microdata:product:mpn'] = '';
}
// Aggregated Rating
$avg_rating = $product->get_average_rating();
$rating_count = $product->get_rating_count();
$review_count = $product->get_review_count();
if ( $rating_count > 0 ) {
// Scope BEGIN: AggregateRating: http://schema.org/AggregateRating
$metatags['microdata:product:AggregateRating:start:comment'] = '';
$metatags['microdata:product:AggregateRating:start'] = '';
// Rating value
if ( ! empty($avg_rating) ) {
$metatags['microdata:product:AggregateRating:ratingValue'] = '';
}
// Rating count
if ( ! empty($rating_count) ) {
$metatags['microdata:product:AggregateRating:ratingCount'] = '';
}
// Review count
if ( ! empty($review_count) ) {
$metatags['microdata:product:AggregateRating:reviewCount'] = '';
}
// Scope END: AggregateRating
$metatags['microdata:product:AggregateRating:end'] = ' ';
// Reviews
// Review counter
//$rc = 0;
// TODO: check how default reviews are generated by WC
//$metatags[] = '';
//$metatags[] = '';
//$metatags[] = '';
}
// Offers
if ( empty($variations) ) {
// Availability
$availability = '';
if ( $product->is_in_stock() ) {
$availability = 'InStock';
//} elseif ( $product->backorders_allowed() ) {
// $availability = 'pending';
} else {
$availability = 'OutOfStock';
}
// Regular Price Offer
// Scope BEGIN: Offer: http://schema.org/Offer
$metatags['microdata:product:Offer:regular:start:comment'] = '';
$metatags['microdata:product:Offer:regular:start'] = '';
// Availability
if ( ! empty($availability) ) {
$metatags['microdata:product:Offer:regular:availability'] = '';
}
// Regular Price
$regular_price = $product->get_regular_price();
if ( ! empty($regular_price) ) {
$metatags['microdata:product:Offer:regular:price'] = '';
// Currency
$metatags['microdata:product:Offer:regular:priceCurrency'] = '';
}
// Scope END: Offer
$metatags['microdata:product:Offer:regular:end'] = ' ';
// Sale Price Offer
if ( $product->is_on_sale() ) {
// Scope BEGIN: Offer: http://schema.org/Offer
$metatags['microdata:product:Offer:sale:start:comment'] = '';
$metatags['microdata:product:Offer:sale:start'] = '';
// Availability
if ( ! empty($availability) ) {
$metatags['microdata:product:Offer:sale:availability'] = '';
}
// Sale Price
$sale_price = $product->get_sale_price();
if ( ! empty($sale_price) ) {
$metatags['microdata:product:Offer:sale:price'] = '';
// Currency
$metatags['microdata:product:Offer:sale:priceCurrency'] = '';
// Sale price to date
$sale_price_date_to = get_post_meta( $post->ID, '_sale_price_dates_to', true );
if ( ! empty($sale_price_date_to) ) {
$metatags['microdata:product:Offer:sale:priceValidUntil'] = '';
}
}
// Scope END: Offer
$metatags['microdata:product:Offer:sale:end'] = ' ';
}
// Offers for variations (Variable Products)
} else {
// Variation offers counter
$oc = 0;
foreach ( $variations as $variation_info ) {
foreach ( array('regular', 'sale') as $offer_type ) {
// Get the variation object
$variation = $product->get_child($variation_info['variation_id']);
//var_dump($variation);
if ( $offer_type == 'sale' && ! $variation->is_on_sale() ) {
continue;
}
// Increase the Offer counter
$oc++;
// Availability
$availability = '';
if ( $variation->is_in_stock() ) {
$availability = 'InStock';
//} elseif ( $variation->backorders_allowed() ) {
// $availability = 'pending';
} else {
$availability = 'OutOfStock';
}
// Scope BEGIN: Offer: http://schema.org/Offer
$metatags['microdata:product:Offer:'.$oc.':'.$offer_type.':start:comment'] = '';
$metatags['microdata:product:Offer:'.$oc.':'.$offer_type.':start'] = '';
// Availability
if ( ! empty($availability) ) {
$metatags['microdata:product:Offer:'.$oc.':'.$offer_type.':availability'] = '';
}
// Regular Price Offer
if ( $offer_type == 'regular' ) {
// Regular Price
$regular_price = $variation->get_regular_price();
if ( ! empty($regular_price) ) {
$metatags['microdata:product:Offer:'.$oc.':'.$offer_type.':price'] = '';
// Currency
$metatags['microdata:product:Offer:'.$oc.':'.$offer_type.':priceCurrency'] = '';
}
} elseif ( $offer_type == 'sale' ) {
// Sale Price Offer
if ( $variation->is_on_sale() ) {
// Sale Price
$sale_price = $variation->get_sale_price();
if ( ! empty($sale_price) ) {
$metatags['microdata:product:Offer:'.$oc.':'.$offer_type.':price'] = '';
// Currency
$metatags['microdata:product:Offer:'.$oc.':'.$offer_type.':priceCurrency'] = '';
// Sale price to date
$sale_price_date_to = get_post_meta( $variation->variation_id, '_sale_price_dates_to', true );
if ( ! empty($sale_price_date_to) ) {
$metatags['microdata:product:Offer:'.$oc.':'.$offer_type.':priceValidUntil'] = '';
}
}
}
}
// Item Offered
// Check whether you should use 'IndividualProduct)
// Scope BEGIN: Product: http://schema.org/Product
$metatags['microdata:product:Offer:'.$oc.':'.$offer_type.':itemOffered:start:comment'] = '';
$metatags['microdata:product:Offer:'.$oc.':'.$offer_type.':itemOffered:start'] = '';
// Attributes
foreach ( $variation_info['attributes'] as $variation_attribute_name => $variation_attribute_value ) {
$variation_attribute_name = str_replace('attribute_pa_', '', $variation_attribute_name);
$variation_attribute_name = str_replace('attribute_', '', $variation_attribute_name);
if ( ! empty($variation_attribute_value) ) {
$metatags['microdata:product:Offer:'.$oc.':'.$offer_type.':itemOffered:'.$variation_attribute_name.':start'] = '';
$metatags['microdata:product:Offer:'.$oc.':'.$offer_type.':itemOffered:'.$variation_attribute_name.':name'] = '';
$metatags['microdata:product:Offer:'.$oc.':'.$offer_type.':itemOffered:'.$variation_attribute_name.':value'] = '';
$metatags['microdata:product:Offer:'.$oc.':'.$offer_type.':itemOffered:'.$variation_attribute_name.':end'] = '';
}
}
// Weight
$variation_weight = wc_get_weight( $variation->get_weight(), $weight_unit );
if ( ! empty($variation_weight) && $variation_weight != $weight ) {
$metatags['microdata:product:Offer:'.$oc.':'.$offer_type.':itemOffered:weight:start'] = '';
$metatags['microdata:product:Offer:'.$oc.':'.$offer_type.':itemOffered:weight:value'] = '';
$metatags['microdata:product:Offer:'.$oc.':'.$offer_type.':itemOffered:weight:unitText'] = '';
$metatags['microdata:product:Offer:'.$oc.':'.$offer_type.':itemOffered:weight:end'] = '';
}
// Dimensions
// Schema.org has: width(length), depth(width), height(height)
if ( ! empty($variation->length) && $variation->length != $product->length ) {
$metatags['microdata:product:Offer:'.$oc.':'.$offer_type.':itemOffered:width:start'] = '';
$metatags['microdata:product:Offer:'.$oc.':'.$offer_type.':itemOffered:width:value'] = '';
$metatags['microdata:product:Offer:'.$oc.':'.$offer_type.':itemOffered:width:unitText'] = '';
$metatags['microdata:product:Offer:'.$oc.':'.$offer_type.':itemOffered:width:end'] = '';
}
if ( ! empty($variation->width) && $variation->width != $product->width ) {
$metatags['microdata:product:Offer:'.$oc.':'.$offer_type.':itemOffered:depth:start'] = '';
$metatags['microdata:product:Offer:'.$oc.':'.$offer_type.':itemOffered:depth:value'] = '';
$metatags['microdata:product:Offer:'.$oc.':'.$offer_type.':itemOffered:depth:unitText'] = '';
$metatags['microdata:product:Offer:'.$oc.':'.$offer_type.':itemOffered:depth:end'] = '';
}
if ( ! empty($variation->height) && $variation->height != $product->height ) {
$metatags['microdata:product:Offer:'.$oc.':'.$offer_type.':itemOffered:height:start'] = '';
$metatags['microdata:product:Offer:'.$oc.':'.$offer_type.':itemOffered:height:value'] = '';
$metatags['microdata:product:Offer:'.$oc.':'.$offer_type.':itemOffered:height:unitText'] = '';
$metatags['microdata:product:Offer:'.$oc.':'.$offer_type.':itemOffered:height:end'] = '';
}
// Image
$parent_image_id = $product->get_image_id();
$variation_image_id = $variation->get_image_id();
if ( ! empty($variation_image_id) && $variation_image_id != $parent_image_id ) {
$metatags['microdata:product:Offer:'.$oc.':'.$offer_type.':itemOffered:image'] = '';
}
// Codes
// SKU
$variation_sku = $variation->get_sku();
if ( ! empty($variation_sku) && $variation_sku != $sku ) {
$metatags['microdata:product:Offer:'.$oc.':'.$offer_type.':itemOffered:sku'] = '';
}
// Scope END: Product
$metatags['microdata:product:Offer:'.$oc.':'.$offer_type.':itemOffered:end'] = ' ';
// Scope END: Offer
$metatags['microdata:product:Offer:'.$oc.':'.$offer_type.':end'] = ' ';
}
}
}
// productID
//model
// TODO: Check these:
// itemCondition
// productID
// review (check first example)
// offers (check first example)
// sku
$metatags = apply_filters( 'amt_product_data_woocommerce_schemaorg', $metatags );
return $metatags;
}
// JSON-LD Schema.org for woocommerce products
function amt_product_data_jsonld_schemaorg_woocommerce( $metatags, $post ) {
// Get the product object
$product = get_product($post->ID);
// WC API:
// http://docs.woothemes.com/wc-apidocs/class-WC_Product.html
// http://docs.woothemes.com/wc-apidocs/class-WC_Product_Variable.html
// http://docs.woothemes.com/wc-apidocs/class-WC_Product_Variation.html
// Schema.org:
// http://schema.org/Product
// http://schema.org/IndividualProduct
// http://schema.org/ProductModel
// http://schema.org/Offer
// http://schema.org/Review
// http://schema.org/AggregateRating
// Currently, the schema.org JSON-LD WC generator supports all product types.
// simple, external, grouped (no price), variable (multiple prices)
// The relevant meta tags are generated only if the relevant data can be retrieved
// from the product object.
$product_type = $product->product_type;
//if ( ! in_array( $product_type, array('simple', 'external') ) ) {
// $metatags = apply_filters( 'amt_product_data_woocommerce_opengraph', $metatags );
// return $metatags;
//}
// Variations (only in variable products)
$variations = null;
if ( $product_type == 'variable' ) {
$variations = $product->get_available_variations();
}
//var_dump($variations);
// Variation attributes
$variation_attributes = null;
if ( $product_type == 'variable' ) {
$variation_attributes = $product->get_variation_attributes();
}
//var_dump($variation_attributes);
// Schema.org property to WooCommerce attribute map
$property_map = array(
'brand' => 'brand',
'color' => 'color',
'condition' => 'condition',
'mpn' => 'mpn',
'gtin' => 'gtin',
);
$property_map = apply_filters( 'amt_schemaorg_woocommerce_property_map', $property_map );
// Product category
$product_cats = wp_get_post_terms( $post->ID, 'product_cat' );
$product_category = array_shift($product_cats);
if ( ! empty($product_category) ) {
$metatags['category'] = esc_attr($product_category->name);
}
// Brand
$brand = $product->get_attribute( $property_map['brand'] );
if ( ! empty($brand ) ) {
$metatags['brand'] = esc_attr($brand);
}
// Weight
$weight_unit = apply_filters( 'amt_woocommerce_default_weight_unit', 'kg' );
$weight = wc_get_weight( $product->get_weight(), $weight_unit );
if ( ! empty($weight) ) {
$metatags['weight'] = array();
$metatags['weight']['@type'] = 'QuantitativeValue';
$metatags['weight']['value'] = esc_attr($weight);
$metatags['weight']['unitText'] = esc_attr($weight_unit);
}
// Dimensions
// Schema.org has: width(length), depth(width), height(height)
$dimension_unit = get_option( 'woocommerce_dimension_unit' );
if ( ! empty($product->length) ) {
$metatags['width'] = array();
$metatags['width']['@type'] = 'QuantitativeValue';
$metatags['width']['value'] = esc_attr($product->length);
$metatags['width']['unitText'] = esc_attr($dimension_unit);
}
if ( ! empty($product->width) ) {
$metatags['depth'] = array();
$metatags['depth']['@type'] = 'QuantitativeValue';
$metatags['depth']['value'] = esc_attr($product->width);
$metatags['depth']['unitText'] = esc_attr($dimension_unit);
}
if ( ! empty($product->height) ) {
$metatags['height'] = array();
$metatags['height']['@type'] = 'QuantitativeValue';
$metatags['height']['value'] = esc_attr($product->height);
$metatags['height']['unitText'] = esc_attr($dimension_unit);
}
// Color
$color = $product->get_attribute( $property_map['color'] );
if ( ! empty($color) ) {
$metatags['color'] = esc_attr($color);
}
// Condition
$condition = $product->get_attribute( $property_map['condition'] );
if ( ! empty($condition) ) {
if ( in_array($age_group, array('new', 'refurbished', 'used') ) ) {
$schema_org_condition_map = array(
'new' => 'NewCondition',
'refurbished' => 'RefurbishedCondition',
'used' => 'UsedCondition',
);
$metatags['itemCondition'] = esc_attr($schema_org_condition_map[$condition]);
}
} else {
$metatags['itemCondition'] = 'NewCondition';
}
// Codes
// SKU (product:retailer_part_no?)
// By convention we use the SKU as the product:retailer_part_no. TODO: check this
$sku = $product->get_sku();
if ( ! empty($sku) ) {
$metatags['sku'] = esc_attr($sku);
}
// GTIN: A Global Trade Item Number, which encompasses UPC, EAN, JAN, and ISBN
$gtin = $product->get_attribute( $property_map['gtin'] );
if ( ! empty($gtin) ) {
$metatags['gtin14'] = esc_attr($gtin);
}
// MPN: A manufacturer's part number for the item
$mpn = $product->get_attribute( $property_map['mpn'] );
if ( ! empty($mpn) ) {
$metatags['mpn'] = esc_attr($mpn);
}
// Aggregated Rating
$avg_rating = $product->get_average_rating();
$rating_count = $product->get_rating_count();
$review_count = $product->get_review_count();
if ( $rating_count > 0 ) {
$metatags['aggregateRating'] = array();
$metatags['aggregateRating']['@type'] = 'AggregateRating';
// Rating value
if ( ! empty($avg_rating) ) {
$metatags['aggregateRating']['ratingValue'] = esc_attr($avg_rating);
}
// Rating count
if ( ! empty($rating_count) ) {
$metatags['aggregateRating']['ratingCount'] = esc_attr($rating_count);
}
// Review count
if ( ! empty($review_count) ) {
$metatags['aggregateRating']['reviewCount'] = esc_attr($review_count);
}
// Reviews
// Review counter
//$rc = 0;
// TODO: check how default reviews are generated by WC
//$metatags[] = '';
//$metatags[] = '';
//$metatags[] = '';
}
// Offers
$metatags['offers'] = array();
if ( empty($variations) ) {
// Availability
$availability = '';
if ( $product->is_in_stock() ) {
$availability = 'InStock';
//} elseif ( $product->backorders_allowed() ) {
// $availability = 'pending';
} else {
$availability = 'OutOfStock';
}
// Regular Price Offer
$offer = array();
$offer['@type'] = 'Offer';
// Availability
if ( ! empty($availability) ) {
$offer['availability'] = 'http://schema.org/' . esc_attr($availability);
}
// Regular Price
$regular_price = $product->get_regular_price();
if ( ! empty($regular_price) ) {
$offer['price'] = esc_attr($regular_price);
// Currency
$offer['priceCurrency'] = esc_attr(get_woocommerce_currency());
}
$metatags['offers'][] = $offer;
// Sale Price Offer
if ( $product->is_on_sale() ) {
$offer = array();
$offer['@type'] = 'Offer';
// Availability
if ( ! empty($availability) ) {
$offer['availability'] = 'http://schema.org/' . esc_attr($availability);
}
// Sale Price
$sale_price = $product->get_sale_price();
if ( ! empty($sale_price) ) {
$offer['price'] = esc_attr($sale_price);
// Currency
$offer['priceCurrency'] = esc_attr(get_woocommerce_currency());
// Sale price to date
$sale_price_date_to = get_post_meta( $post->ID, '_sale_price_dates_to', true );
if ( ! empty($sale_price_date_to) ) {
$offer['priceValidUntil'] = esc_attr(date_i18n('Y-m-d', $sale_price_date_to));
}
}
$metatags['offers'][] = $offer;
}
// Offers for variations (Variable Products)
} else {
// Variation offers counter
$oc = 0;
foreach ( $variations as $variation_info ) {
foreach ( array('regular', 'sale') as $offer_type ) {
// Get the variation object
$variation = $product->get_child($variation_info['variation_id']);
//var_dump($variation);
if ( $offer_type == 'sale' && ! $variation->is_on_sale() ) {
continue;
}
// Increase the Offer counter
$oc++;
// Availability
$availability = '';
if ( $variation->is_in_stock() ) {
$availability = 'InStock';
//} elseif ( $variation->backorders_allowed() ) {
// $availability = 'pending';
} else {
$availability = 'OutOfStock';
}
$offer = array();
$offer['@type'] = 'Offer';
// Availability
if ( ! empty($availability) ) {
$offer['availability'] = 'http://schema.org/' . esc_attr($availability);
}
// Regular Price Offer
if ( $offer_type == 'regular' ) {
// Regular Price
$regular_price = $variation->get_regular_price();
if ( ! empty($regular_price) ) {
$offer['price'] = esc_attr($regular_price);
// Currency
$offer['priceCurrency'] = esc_attr(get_woocommerce_currency());
}
} elseif ( $offer_type == 'sale' ) {
// Sale Price Offer
if ( $variation->is_on_sale() ) {
// Sale Price
$sale_price = $variation->get_sale_price();
if ( ! empty($sale_price) ) {
$offer['price'] = esc_attr($sale_price);
// Currency
$offer['priceCurrency'] = esc_attr(get_woocommerce_currency());
// Sale price to date
$sale_price_date_to = get_post_meta( $variation->variation_id, '_sale_price_dates_to', true );
if ( ! empty($sale_price_date_to) ) {
$offer['priceValidUntil'] = esc_attr(date_i18n('Y-m-d', $sale_price_date_to));
}
}
}
}
// Item Offered
$offer['itemOffered'] = array();
$offer['itemOffered']['@type'] = 'Product';
// Check whether you should use 'IndividualProduct)
// Attributes
$offer['itemOffered']['additionalProperty'] = array();
foreach ( $variation_info['attributes'] as $variation_attribute_name => $variation_attribute_value ) {
$variation_attribute_name = str_replace('attribute_pa_', '', $variation_attribute_name);
$variation_attribute_name = str_replace('attribute_', '', $variation_attribute_name);
if ( ! empty($variation_attribute_value) ) {
$additional_property = array();
$additional_property['@type'] = 'PropertyValue';
$additional_property['name'] = esc_attr($variation_attribute_name);
$additional_property['value'] = esc_attr($variation_attribute_value);
$offer['itemOffered']['additionalProperty'][] = $additional_property;
}
}
// Weight
$variation_weight = wc_get_weight( $variation->get_weight(), $weight_unit );
if ( ! empty($variation_weight) && $variation_weight != $weight ) {
$offer['itemOffered']['weight'] = array();
$offer['itemOffered']['weight']['@type'] = 'QuantitativeValue';
$offer['itemOffered']['weight']['value'] = esc_attr($variation_weight);
$offer['itemOffered']['weight']['unitText'] = esc_attr($weight_unit);
}
// Dimensions
// Schema.org has: width(length), depth(width), height(height)
if ( ! empty($variation->length) && $variation->length != $product->length ) {
$offer['itemOffered']['width'] = array();
$offer['itemOffered']['width']['@type'] = 'QuantitativeValue';
$offer['itemOffered']['width']['value'] = esc_attr($variation->length);
$offer['itemOffered']['width']['unitText'] = esc_attr($dimension_unit);
}
if ( ! empty($variation->width) && $variation->width != $product->width ) {
$offer['itemOffered']['depth'] = array();
$offer['itemOffered']['depth']['@type'] = 'QuantitativeValue';
$offer['itemOffered']['depth']['value'] = esc_attr($variation->width);
$offer['itemOffered']['depth']['unitText'] = esc_attr($dimension_unit);
}
if ( ! empty($variation->height) && $variation->height != $product->height ) {
$offer['itemOffered']['height'] = array();
$offer['itemOffered']['height']['@type'] = 'QuantitativeValue';
$offer['itemOffered']['height']['value'] = esc_attr($variation->height);
$offer['itemOffered']['height']['unitText'] = esc_attr($dimension_unit);
}
// Image
$parent_image_id = $product->get_image_id();
$variation_image_id = $variation->get_image_id();
if ( ! empty($variation_image_id) && $variation_image_id != $parent_image_id ) {
$offer['itemOffered']['image'] = esc_url_raw( wp_get_attachment_url($variation_image_id) );
}
// Codes
// SKU
$variation_sku = $variation->get_sku();
if ( ! empty($variation_sku) && $variation_sku != $sku ) {
$offer['itemOffered']['sku'] = esc_attr($variation_sku);
}
$metatags['offers'][] = $offer;
}
}
}
$metatags = apply_filters( 'amt_product_data_woocommerce_jsonld_schemaorg', $metatags );
return $metatags;
}
// Retrieves the WooCommerce product group's image URL, if any.
function amt_product_group_image_url_woocommerce( $default_image_url, $tax_term_object ) {
$thumbnail_id = get_woocommerce_term_meta( $tax_term_object->term_id, 'thumbnail_id', true );
if ( ! empty($thumbnail_id) ) {
return wp_get_attachment_url( $thumbnail_id );
}
}
// Retrieve WooCommerce page IDs
//
//get_option( 'woocommerce_shop_page_id' );
//get_option( 'woocommerce_cart_page_id' );
//get_option( 'woocommerce_checkout_page_id' );
//get_option( 'woocommerce_pay_page_id' );
//get_option( 'woocommerce_thanks_page_id' );
//get_option( 'woocommerce_myaccount_page_id' );
//get_option( 'woocommerce_edit_address_page_id' );
//get_option( 'woocommerce_view_order_page_id' );
//get_option( 'woocommerce_terms_page_id' );
/*
* Easy Digital Downloads Product and Product Group metadata
*
*/
// Conditional tag that is true when our product page is displayed.
// If such a conditional tag is provided by the e-commerce solution,
// defining such a function is entirely optional.
function amt_is_edd_product() {
// Check if edd product page and return true;
// * Easy Digital Downloads
if ( is_singular() && 'download' == get_post_type() ) {
return true;
}
}
// Conditional tag that is true when our product group page is displayed.
// If such a conditional tag is provided by the e-commerce solution,
// defining such a function is entirely optional.
function amt_is_edd_product_group() {
// Check if edd product group page and return true;
// * Easy Digital Downloads
// Also validates with is_tax()
if ( is_tax( array( 'download_category', 'download_tag' ) ) ) {
return true;
}
}
// Twitter Cards for edd products
function amt_product_data_tc_edd( $metatags, $post ) {
// Price
$metatags['twitter:label1'] = '';
$metatags['twitter:data1'] = '';
// Currency
$metatags['twitter:label2'] = '';
$metatags['twitter:data2'] = '';
$metatags = apply_filters( 'amt_product_data_edd_twitter_cards', $metatags );
return $metatags;
}
// Opengraph for edd products
function amt_product_data_og_edd( $metatags, $post ) {
// Price
$metatags[] = '';
// Currency
$metatags[] = '';
$metatags = apply_filters( 'amt_product_data_edd_opengraph', $metatags );
return $metatags;
}
// Schema.org for edd products
function amt_product_data_schemaorg_edd( $metatags, $post ) {
// Price
$metatags[] = '';
// Currency
$metatags[] = '';
$metatags = apply_filters( 'amt_product_data_edd_schemaorg', $metatags );
return $metatags;
}
// JSON-LD Schema.org for edd products
function amt_product_data_jsonld_schemaorg_edd( $metatags, $post ) {
// Price
$metatags['price'] = edd_get_download_price($post->ID);
// Currency
$metatags['priceCurrency'] = edd_get_currency();
$metatags = apply_filters( 'amt_product_data_edd_jsonld_schemaorg', $metatags );
return $metatags;
}
// Retrieves the EDD product group's image URL, if any.
function amt_product_group_image_url_edd( $term_id ) {
// Not supported
return '';
}
/*
* E-Commerce Common Detection
*
*/
// Product page detection for Add-Meta-Tags
function amt_detect_ecommerce_product( $default ) {
// First and important check.
// $default is a boolean variable which indicates if custom content has been
// detected by any previous filter.
// Check if custom content has already been detected by another filter.
// If such content has been detected, just return $default (should be true)
// and *do not* add any metadata filters.
// This check is mandatory in order the detection mechanism to work correctly.
if ( $default ) {
return $default;
}
// Get the options the DB
$options = get_option("add_meta_tags_opts");
// WooCommerce product
if ( $options["extended_support_woocommerce"] == "1" && amt_is_woocommerce_product() ) {
// Filter product data meta tags
add_filter( 'amt_product_data_twitter_cards', 'amt_product_data_tc_woocommerce', 10, 2 );
add_filter( 'amt_product_data_opengraph', 'amt_product_data_og_woocommerce', 10, 2 );
if ( $options["schemaorg_force_jsonld"] == "0" ) {
add_filter( 'amt_product_data_schemaorg', 'amt_product_data_schemaorg_woocommerce', 10, 2 );
} else {
add_filter( 'amt_product_data_jsonld_schemaorg', 'amt_product_data_jsonld_schemaorg_woocommerce', 10, 2 );
}
return true;
// Easy-Digital-Downloads product
} elseif ( $options["extended_support_edd"] == "1" && amt_is_edd_product() ) {
add_filter( 'amt_product_data_twitter_cards', 'amt_product_data_tc_edd', 10, 2 );
add_filter( 'amt_product_data_opengraph', 'amt_product_data_og_edd', 10, 2 );
if ( $options["schemaorg_force_jsonld"] == "0" ) {
add_filter( 'amt_product_data_schemaorg', 'amt_product_data_schemaorg_edd', 10, 2 );
} else {
add_filter( 'amt_product_data_jsonld_schemaorg', 'amt_product_data_jsonld_schemaorg_edd', 10, 2 );
}
return true;
}
return false;
}
add_filter( 'amt_is_product', 'amt_detect_ecommerce_product', 10, 1 );
// Product group page detection for Add-Meta-Tags
function amt_detect_ecommerce_product_group( $default ) {
// First and important check.
// $default is a boolean variable which indicates if custom content has been
// detected by any previous filter.
// Check if custom content has already been detected by another filter.
// If such content has been detected, just return $default (should be true)
// and *do not* add any metadata filters.
// This check is mandatory in order the detection mechanism to work correctly.
if ( $default ) {
return $default;
}
// Get the options the DB
$options = get_option("add_meta_tags_opts");
// Only product groups that validate as custom taxonomies are supported
if ( ! is_tax() ) {
return false;
}
// WooCommerce product group
if ( $options["extended_support_woocommerce"] == "1" && amt_is_woocommerce_product_group() ) {
add_filter( 'amt_taxonomy_force_image_url', 'amt_product_group_image_url_woocommerce', 10, 2 );
return true;
// Easy-Digital-Downloads product group
} elseif ( $options["extended_support_edd"] == "1" && amt_is_edd_product_group() ) {
return true;
}
return false;
}
add_filter( 'amt_is_product_group', 'amt_detect_ecommerce_product_group', 10, 1 );
//
//
// BuddyPress Support
//
//
// BuddyPress detection
function amt_detect_buddypress( $default, $post, $options ) {
// First and important check.
// $default is a boolean variable which indicates if custom content has been
// detected by any previous filter.
// Check if custom content has already been detected by another filter.
// If such content has been detected, just return $default (should be true)
// and *do not* add any metadata filters.
// This check is mandatory in order the detection mechanism to work correctly.
if ( $default ) {
return $default;
}
// Process BuddyPress metadata, only if the BuddyPress extended metadata
// support has been enabled in the Add-Meta-Tags settings.
if ( $options["extended_support_buddypress"] == "1" ) {
// Perform the 'function_exists()' test in case BuddyPress is not installed/activated.
if ( ! function_exists('is_buddypress') || ! is_buddypress() ) {
return false;
}
// Insert metadata for BuddyPress pages
// Basic (description/keywords)
//remove_all_filters( 'amt_custom_metadata_basic' ); // CHECK IF NEEDED
add_filter( 'amt_custom_metadata_basic', 'amt_buddypress_basic', 10, 5 );
// Opengraph
add_filter( 'amt_custom_metadata_opengraph', 'amt_buddypress_opengraph', 10, 5 );
// Twitter Cards
add_filter( 'amt_custom_metadata_twitter_cards', 'amt_buddypress_twitter_cards', 10, 5 );
// Dublin Core
add_filter( 'amt_custom_metadata_dublin_core', 'amt_buddypress_dublin_core', 10, 5 );
// Schema.org
if ( $options["schemaorg_force_jsonld"] == "0" ) {
// Microdata
// Non content pages via 'wp_footer' action
add_filter( 'amt_custom_metadata_schemaorg_footer', 'amt_buddypress_schemaorg_footer', 10, 5 );
// Content pages via 'the_content' filter
// add_filter( 'amt_custom_metadata_schemaorg_content_filter', 'amt_buddypress_schemaorg_content_filter', 10, 5 );
} else {
add_filter( 'amt_custom_metadata_jsonld_schemaorg', 'amt_buddypress_jsonld_schemaorg', 10, 5 );
}
// Finally return true. BuddyPress detected.
return true;
}
return false;
}
add_filter( 'amt_is_custom', 'amt_detect_buddypress', 10, 3 );
function amt_buddypress_basic( $metadata_arr, $post, $options, $attachments, $embedded_media ) {
// User Profiles
// Determines if a BuddyPress user profile has been requested
if ( bp_is_user_profile() ) {
// https://codex.buddypress.org/developer/the-bp-global/
global $bp;
// $user_id = $bp->displayed_user->id;
$user_id = bp_displayed_user_id();
// $user_domain = $bp->displayed_user->domain;
// bp_core_get_user_domain( bp_displayed_user_id() )
$user_domain = bp_displayed_user_domain();
$user_profile_url = trailingslashit( bp_displayed_user_domain() . amt_bp_get_profile_slug() );
$user_fullname = $bp->displayed_user->fullname;
// $user_fullname = bp_displayed_user_fullname();
// $user_username = $bp->displayed_user->user_login;
$user_username = bp_get_displayed_user_username();
//$wp_user_obj = get_user_by( 'id', $user_id );
$wp_user_obj = get_userdata( $user_id );
//var_dump($wp_user_obj);
// Related resources
// Perhaps add Facebook, Twitter, Google+ profile URLs in 'og:see_also' meta tags
// og:see_also
// Determines if Extended Profiles component is active.
if ( ! bp_is_active( 'xprofile' ) ) {
// Description
$author_description = sanitize_text_field( amt_sanitize_description( $wp_user_obj->description ) );
if ( empty($author_description) ) {
$metadata_arr[] = '';
} else {
$metadata_arr[] = '';
}
// No automatic keywords
// Extended Profiles
} else {
// https://codex.buddypress.org/themes/guides/displaying-extended-profile-fields-on-member-profiles/
$xprofile_field_map = amt_buddypress_get_xprofile_field_map();
// Get list of IDs of public fields
$xprofile_public_fields = bp_xprofile_get_fields_by_visibility_levels( $user_id, array('public') );
// Description
$field_value = amt_bp_get_profile_field_data( 'description', $user_id, $xprofile_field_map, $xprofile_public_fields );
$field_value = sanitize_text_field( amt_sanitize_description( $field_value ) );
if ( ! empty($field_value) ) {
$metadata_arr[] = '';
} else {
$metadata_arr[] = '';
}
// Keywords
$field_value = amt_bp_get_profile_field_data( 'keywords', $user_id, $xprofile_field_map, $xprofile_public_fields );
$field_value = sanitize_text_field( amt_sanitize_keywords( $field_value ) );
if ( ! empty($field_value) ) {
$metadata_arr[] = '';
}
}
}
// Allow filtering of the generated metadata
// Customize with: add_filter('amt_buddypress_basic_extra', 'my_function', 10, 5);
$metadata_arr = apply_filters( 'amt_buddypress_basic_extra', $metadata_arr, $post, $options, $attachments, $embedded_media );
return $metadata_arr;
}
function amt_buddypress_opengraph( $metadata_arr, $post, $options, $attachments, $embedded_media ) {
// User Profiles
// Determines if a BuddyPress user profile has been requested
if ( bp_is_user_profile() ) {
// https://codex.buddypress.org/developer/the-bp-global/
global $bp;
// $user_id = $bp->displayed_user->id;
$user_id = bp_displayed_user_id();
// $user_domain = $bp->displayed_user->domain;
// bp_core_get_user_domain( bp_displayed_user_id() )
$user_domain = bp_displayed_user_domain();
$user_profile_url = trailingslashit( bp_displayed_user_domain() . amt_bp_get_profile_slug() );
$user_fullname = $bp->displayed_user->fullname;
// $user_fullname = bp_displayed_user_fullname();
// $user_username = $bp->displayed_user->user_login;
$user_username = bp_get_displayed_user_username();
//$wp_user_obj = get_user_by( 'id', $user_id );
$wp_user_obj = get_userdata( $user_id );
//var_dump($wp_user_obj);
// Type
// https://developers.facebook.com/docs/reference/opengraph/object-type/profile/
$metadata_arr[] = '';
// Site Name
$metadata_arr[] = '';
// Title
$metadata_arr['og:title'] = '';
// URL
$metadata_arr[] = '';
// Locale
$metadata_arr[] = '';
// fb:profile_id
// The fb:profile_id field associates the object with a Facebook user.
// Related resources as 'og:see_also meta' tags
// Perhaps add Facebook, Twitter, Google+ profile URLs in 'og:see_also' meta tags
// Facebook Profile
//$fb_author_url = get_the_author_meta('amt_facebook_author_profile_url', $user_id);
$fb_author_url = get_user_meta($user_id, 'amt_facebook_author_profile_url', true);
if ( ! empty($fb_author_url) ) {
$metadata_arr[] = '';
}
// Twitter
//$twitter_author_username = get_the_author_meta('amt_twitter_author_username', $user_id);
$twitter_author_username = get_user_meta($user_id, 'amt_twitter_author_username', true);
if ( ! empty($twitter_author_username) ) {
$metadata_arr[] = '';
}
// Google+
//$googleplus_author_url = get_the_author_meta('amt_googleplus_author_profile_url', $wp_user_obj);
$googleplus_author_url = get_user_meta($user_id, 'amt_googleplus_author_profile_url', true);
if ( ! empty( $googleplus_author_url ) ) {
$metadata_arr[] = '';
}
// profile:username
if ( ! empty($user_username) ) {
$metadata_arr[] = '';
}
// Determines if Extended Profiles component is active.
if ( ! bp_is_active( 'xprofile' ) ) {
// Website
//$website_url = get_user_meta($user_id, 'amt_googleplus_author_profile_url', true);
$website_url = get_the_author_meta( 'user_url', $user_id );
if ( ! empty( $website_url ) ) {
$metadata_arr[] = '';
}
// Description
$author_description = sanitize_text_field( amt_sanitize_description( $wp_user_obj->description ) );
if ( empty($author_description) ) {
$metadata_arr[] = '';
} else {
$metadata_arr[] = '';
}
// Profile Image
$author_email = sanitize_email( $wp_user_obj->user_email );
$avatar_size = apply_filters( 'amt_bp_avatar_size', array('width'=>50, 'height'=>50) );
$avatar_url = '';
// First try to get the avatar link by using get_avatar().
// Important: for this to work the "Show Avatars" option should be enabled in Settings > Discussion.
$avatar_img = get_avatar( get_the_author_meta('ID', $wp_user_obj->ID), $avatar_size, '', get_the_author_meta('display_name', $wp_user_obj->ID) );
if ( ! empty($avatar_img) ) {
if ( preg_match("#src=['\"]([^'\"]+)['\"]#", $avatar_img, $matches) ) {
$avatar_url = $matches[1];
}
} elseif ( ! empty($author_email) ) {
// If the user has provided an email, we use it to construct a gravatar link.
$avatar_url = "http://www.gravatar.com/avatar/" . md5( $author_email ) . "?s=" . $avatar_size;
}
if ( ! empty($avatar_url) ) {
//$avatar_url = html_entity_decode($avatar_url, ENT_NOQUOTES, 'UTF-8');
$metadata_arr[] = '';
// Add an og:imagesecure_url if the image URL uses HTTPS
if ( strpos($avatar_url, 'https://') !== false ) {
$metadata_arr[] = '';
}
if ( apply_filters( 'amt_extended_image_tags', true ) ) {
$metadata_arr[] = '';
$metadata_arr[] = '';
// Since we do not have a way to determine the image type, the following meta tag is commented out
// TODO: make a function that detects the image type from the file extension (if a file extension is available)
//$metadata_arr[] = '';
}
}
// Other Profile Data
// profile:last_name
$last_name = $wp_user_obj->last_name;
if ( ! empty($last_name) ) {
$metadata_arr[] = '';
}
// profile:first_name
$first_name = $wp_user_obj->first_name;
if ( ! empty($first_name) ) {
$metadata_arr[] = '';
}
// Extended Profiles
} else {
// https://codex.buddypress.org/themes/guides/displaying-extended-profile-fields-on-member-profiles/
$xprofile_field_map = amt_buddypress_get_xprofile_field_map();
// Get list of IDs of public fields
$xprofile_public_fields = bp_xprofile_get_fields_by_visibility_levels( $user_id, array('public') );
// Website
$field_value = amt_bp_get_profile_field_data( 'website', $user_id, $xprofile_field_map, $xprofile_public_fields );
$field_value = sanitize_text_field( $field_value );
if ( ! empty($field_value) ) {
$metadata_arr[] = '';
}
// Description
$field_value = amt_bp_get_profile_field_data( 'description', $user_id, $xprofile_field_map, $xprofile_public_fields );
$field_value = sanitize_text_field( amt_sanitize_description( $field_value ) );
if ( ! empty($field_value) ) {
$metadata_arr[] = '';
} else {
$metadata_arr[] = '';
}
// Profile Image
// Important: for this to work the "Show Avatars" option should be enabled in Settings > Discussion.
$avatar_size = apply_filters( 'amt_bp_avatar_size', array('width'=>50, 'height'=>50) );
$avatar_url = '';
$avatar_args = array(
'item_id' => $user_id,
'width' => $avatar_size['width'],
'height' => $avatar_size['height'],
);
$avatar_img = bp_core_fetch_avatar( $avatar_args );
if ( ! empty($avatar_img) ) {
if ( preg_match("#src=['\"]([^'\"]+)['\"]#", $avatar_img, $matches) ) {
$avatar_url = $matches[1];
}
}
if ( ! empty($avatar_url) ) {
//$avatar_url = html_entity_decode($avatar_url, ENT_NOQUOTES, 'UTF-8');
$metadata_arr[] = '';
// Add an og:imagesecure_url if the image URL uses HTTPS
if ( strpos($avatar_url, 'https://') !== false ) {
$metadata_arr[] = '';
}
if ( apply_filters( 'amt_extended_image_tags', true ) ) {
$metadata_arr[] = '';
$metadata_arr[] = '';
// Since we do not have a way to determine the image type, the following meta tag is commented out
// TODO: make a function that detects the image type from the file extension (if a file extension is available)
//$metadata_arr[] = '';
}
}
// Other Profile Data
// profile:last_name
$has_last_name = false;
$field_value = amt_bp_get_profile_field_data( 'last_name', $user_id, $xprofile_field_map, $xprofile_public_fields );
$field_value = sanitize_text_field( $field_value );
if ( ! empty($field_value) ) {
$metadata_arr[] = '';
$has_last_name = true;
}
// profile:first_name
$has_first_name = false;
$field_value = amt_bp_get_profile_field_data( 'first_name', $user_id, $xprofile_field_map, $xprofile_public_fields );
$field_value = sanitize_text_field( $field_value );
if ( ! empty($field_value) ) {
$metadata_arr[] = '';
$has_first_name = true;
}
// Generate first and last name from full name if needed.
if ( ! $has_last_name && ! $has_first_name && ! empty($user_fullname) ) {
$parts = explode(' ', $user_fullname);
$last_name = sanitize_text_field( array_pop($parts) ); // Removes and returns the element off the end of array
if ( ! empty($last_name) ) {
$metadata_arr[] = '';
}
$first_name = sanitize_text_field( implode(' ', $parts) );
if ( ! empty($first_name) ) {
$metadata_arr[] = '';
}
}
// profile:gender
$field_value = amt_bp_get_profile_field_data( 'gender', $user_id, $xprofile_field_map, $xprofile_public_fields );
$field_value = sanitize_text_field( $field_value );
if ( ! empty($field_value) ) {
$metadata_arr[] = '';
}
}
}
/*
if ( bp_is_current_component( 'xprofile' ) ) {
$metadata_arr[] = 'XPROFILE_IS_CURRENT_COMPONENT';
}
if ( bp_is_user() ) {
$metadata_arr[] = 'IS_USER';
}
if ( bp_is_profile_component() ) {
$metadata_arr[] = 'IS_PROFILE_COMPONENT';
}
*/
// Allow filtering of the generated metadata
// Customize with: add_filter('amt_buddypress_opengraph_extra', 'my_function', 10, 5);
$metadata_arr = apply_filters( 'amt_buddypress_opengraph_extra', $metadata_arr, $post, $options, $attachments, $embedded_media );
return $metadata_arr;
}
function amt_buddypress_twitter_cards( $metadata_arr, $post, $options, $attachments, $embedded_media ) {
// User Profiles
// Determines if a BuddyPress user profile has been requested
if ( bp_is_user_profile() ) {
// https://codex.buddypress.org/developer/the-bp-global/
global $bp;
// $user_id = $bp->displayed_user->id;
$user_id = bp_displayed_user_id();
// $user_domain = $bp->displayed_user->domain;
// bp_core_get_user_domain( bp_displayed_user_id() )
$user_domain = bp_displayed_user_domain();
$user_profile_url = trailingslashit( bp_displayed_user_domain() . amt_bp_get_profile_slug() );
$user_fullname = $bp->displayed_user->fullname;
// $user_fullname = bp_displayed_user_fullname();
// $user_username = $bp->displayed_user->user_login;
$user_username = bp_get_displayed_user_username();
//$wp_user_obj = get_user_by( 'id', $user_id );
$wp_user_obj = get_userdata( $user_id );
//var_dump($wp_user_obj);
// Generate a twitter card only if the user and the publisher have
// filled in their Twitter usernames.
$twitter_author_username = get_the_author_meta('amt_twitter_author_username', $user_id);
$twitter_publisher_username = $options['social_main_twitter_publisher_username'];
if ( empty($twitter_author_username) || empty($twitter_publisher_username) ) {
return $metadata_arr;
}
// Type
$metadata_arr[] = '';
// Creator
$metadata_arr[] = '';
// Site
$metadata_arr[] = '';
// Title
$metadata_arr['twitter:title'] = '';
// Determines if Extended Profiles component is active.
if ( ! bp_is_active( 'xprofile' ) ) {
// Description
$author_description = sanitize_text_field( amt_sanitize_description( $wp_user_obj->description ) );
if ( empty($author_description) ) {
$metadata_arr['twitter:description'] = '';
} else {
$metadata_arr['twitter:description'] = '';
}
// Profile Image
$author_email = sanitize_email( $wp_user_obj->user_email );
$avatar_size = apply_filters( 'amt_bp_avatar_size', array('width'=>50, 'height'=>50) );
$avatar_url = '';
// First try to get the avatar link by using get_avatar().
// Important: for this to work the "Show Avatars" option should be enabled in Settings > Discussion.
$avatar_img = get_avatar( get_the_author_meta('ID', $wp_user_obj->ID), $avatar_size, '', get_the_author_meta('display_name', $wp_user_obj->ID) );
if ( ! empty($avatar_img) ) {
if ( preg_match("#src=['\"]([^'\"]+)['\"]#", $avatar_img, $matches) ) {
$avatar_url = $matches[1];
}
} elseif ( ! empty($author_email) ) {
// If the user has provided an email, we use it to construct a gravatar link.
$avatar_url = "http://www.gravatar.com/avatar/" . md5( $author_email ) . "?s=" . $avatar_size;
}
if ( ! empty($avatar_url) ) {
//$avatar_url = html_entity_decode($avatar_url, ENT_NOQUOTES, 'UTF-8');
$metadata_arr[] = '';
if ( apply_filters( 'amt_extended_image_tags', true ) ) {
$metadata_arr[] = '';
$metadata_arr[] = '';
// Since we do not have a way to determine the image type, the following meta tag is commented out
// TODO: make a function that detects the image type from the file extension (if a file extension is available)
//$metadata_arr[] = '';
}
}
// Extended Profiles
} else {
// https://codex.buddypress.org/themes/guides/displaying-extended-profile-fields-on-member-profiles/
$xprofile_field_map = amt_buddypress_get_xprofile_field_map();
// Get list of IDs of public fields
$xprofile_public_fields = bp_xprofile_get_fields_by_visibility_levels( $user_id, array('public') );
// Description
$field_value = amt_bp_get_profile_field_data( 'description', $user_id, $xprofile_field_map, $xprofile_public_fields );
$field_value = sanitize_text_field( amt_sanitize_description( $field_value ) );
if ( ! empty($field_value) ) {
$metadata_arr['twitter:description'] = '';
} else {
$metadata_arr['twitter:description'] = '';
}
// Profile Image
// Important: for this to work the "Show Avatars" option should be enabled in Settings > Discussion.
$avatar_size = apply_filters( 'amt_bp_avatar_size', array('width'=>50, 'height'=>50) );
$avatar_url = '';
$avatar_args = array(
'item_id' => $user_id,
'width' => $avatar_size['width'],
'height' => $avatar_size['height'],
);
$avatar_img = bp_core_fetch_avatar( $avatar_args );
if ( ! empty($avatar_img) ) {
if ( preg_match("#src=['\"]([^'\"]+)['\"]#", $avatar_img, $matches) ) {
$avatar_url = $matches[1];
}
}
if ( ! empty($avatar_url) ) {
//$avatar_url = html_entity_decode($avatar_url, ENT_NOQUOTES, 'UTF-8');
$metadata_arr[] = '';
if ( apply_filters( 'amt_extended_image_tags', true ) ) {
$metadata_arr[] = '';
$metadata_arr[] = '';
// Since we do not have a way to determine the image type, the following meta tag is commented out
// TODO: make a function that detects the image type from the file extension (if a file extension is available)
//$metadata_arr[] = '';
}
}
}
}
// Allow filtering of the generated metadata
// Customize with: add_filter('amt_buddypress_twitter_cards_extra', 'my_function', 10, 5);
$metadata_arr = apply_filters( 'amt_buddypress_twitter_cards_extra', $metadata_arr, $post, $options, $attachments, $embedded_media );
return $metadata_arr;
}
function amt_buddypress_dublin_core( $metadata_arr, $post, $options, $attachments, $embedded_media ) {
// Allow filtering of the generated metadata
// Customize with: add_filter('amt_buddypress_dublin_core_extra', 'my_function', 10, 5);
$metadata_arr = apply_filters( 'amt_buddypress_dublin_core_extra', $metadata_arr, $post, $options, $attachments, $embedded_media );
return $metadata_arr;
}
function amt_buddypress_schemaorg_footer( $metadata_arr, $post, $options, $attachments, $embedded_media ) {
// User Profiles
// Determines if a BuddyPress user profile has been requested
if ( bp_is_user_profile() ) {
// https://codex.buddypress.org/developer/the-bp-global/
global $bp;
// $user_id = $bp->displayed_user->id;
$user_id = bp_displayed_user_id();
// $user_domain = $bp->displayed_user->domain;
// bp_core_get_user_domain( bp_displayed_user_id() )
$user_domain = bp_displayed_user_domain();
$user_profile_url = trailingslashit( bp_displayed_user_domain() . amt_bp_get_profile_slug() );
$user_fullname = $bp->displayed_user->fullname;
// $user_fullname = bp_displayed_user_fullname();
// $user_username = $bp->displayed_user->user_login;
$user_username = bp_get_displayed_user_username();
//$wp_user_obj = get_user_by( 'id', $user_id );
$wp_user_obj = get_userdata( $user_id );
//var_dump($wp_user_obj);
// Author
// Scope BEGIN: Person: http://schema.org/Person
$metadata_arr[] = '';
$metadata_arr[] = '';
// name
$metadata_arr[] = '';
// URL
$metadata_arr[] = '';
// mainEntityOfPage
$metadata_arr[] = '';
// Related resources as sameAs
// Facebook Profile
//$fb_author_url = get_the_author_meta('amt_facebook_author_profile_url', $user_id);
$fb_author_url = get_user_meta($user_id, 'amt_facebook_author_profile_url', true);
if ( ! empty($fb_author_url) ) {
$metadata_arr[] = '';
}
// Twitter
//$twitter_author_username = get_the_author_meta('amt_twitter_author_username', $user_id);
$twitter_author_username = get_user_meta($user_id, 'amt_twitter_author_username', true);
if ( ! empty($twitter_author_username) ) {
$metadata_arr[] = '';
}
// Google+
//$googleplus_author_url = get_the_author_meta('amt_googleplus_author_profile_url', $wp_user_obj);
$googleplus_author_url = get_user_meta($user_id, 'amt_googleplus_author_profile_url', true);
if ( ! empty( $googleplus_author_url ) ) {
$metadata_arr[] = '';
}
// Determines if Extended Profiles component is active.
if ( ! bp_is_active( 'xprofile' ) ) {
// Website
//$website_url = get_user_meta($user_id, 'amt_googleplus_author_profile_url', true);
$website_url = get_the_author_meta( 'user_url', $user_id );
if ( ! empty( $website_url ) ) {
$metadata_arr[] = '';
}
// Description
$author_description = sanitize_text_field( amt_sanitize_description( $wp_user_obj->description ) );
if ( empty($author_description) ) {
$metadata_arr[] = '';
} else {
$metadata_arr[] = '';
}
// Profile Image
$author_email = sanitize_email( $wp_user_obj->user_email );
$avatar_size = apply_filters( 'amt_bp_avatar_size', array('width'=>50, 'height'=>50) );
$avatar_url = '';
// First try to get the avatar link by using get_avatar().
// Important: for this to work the "Show Avatars" option should be enabled in Settings > Discussion.
$avatar_img = get_avatar( get_the_author_meta('ID', $wp_user_obj->ID), $avatar_size, '', get_the_author_meta('display_name', $wp_user_obj->ID) );
if ( ! empty($avatar_img) ) {
if ( preg_match("#src=['\"]([^'\"]+)['\"]#", $avatar_img, $matches) ) {
$avatar_url = $matches[1];
}
} elseif ( ! empty($author_email) ) {
// If the user has provided an email, we use it to construct a gravatar link.
$avatar_url = "http://www.gravatar.com/avatar/" . md5( $author_email ) . "?s=" . $avatar_size;
}
if ( ! empty($avatar_url) ) {
//$avatar_url = html_entity_decode($avatar_url, ENT_NOQUOTES, 'UTF-8');
$metadata_arr[] = '';
}
// familyName
$last_name = $wp_user_obj->last_name;
if ( ! empty($last_name) ) {
$metadata_arr[] = '';
}
// givenName
$first_name = $wp_user_obj->first_name;
if ( ! empty($first_name) ) {
$metadata_arr[] = '';
}
// Extended Profiles
} else {
// https://codex.buddypress.org/themes/guides/displaying-extended-profile-fields-on-member-profiles/
$xprofile_field_map = amt_buddypress_get_xprofile_field_map();
// Get list of IDs of public fields
$xprofile_public_fields = bp_xprofile_get_fields_by_visibility_levels( $user_id, array('public') );
// Website
$field_value = amt_bp_get_profile_field_data( 'website', $user_id, $xprofile_field_map, $xprofile_public_fields );
$field_value = sanitize_text_field( $field_value );
if ( ! empty($field_value) ) {
$metadata_arr[] = '';
}
// Description
$field_value = amt_bp_get_profile_field_data( 'description', $user_id, $xprofile_field_map, $xprofile_public_fields );
$field_value = sanitize_text_field( amt_sanitize_description( $field_value ) );
if ( ! empty($field_value) ) {
$metadata_arr[] = '';
} else {
$metadata_arr[] = '';
}
// Profile Image
// Important: for this to work the "Show Avatars" option should be enabled in Settings > Discussion.
$avatar_size = apply_filters( 'amt_bp_avatar_size', array('width'=>50, 'height'=>50) );
$avatar_url = '';
$avatar_args = array(
'item_id' => $user_id,
'width' => $avatar_size['width'],
'height' => $avatar_size['height'],
);
$avatar_img = bp_core_fetch_avatar( $avatar_args );
if ( ! empty($avatar_img) ) {
if ( preg_match("#src=['\"]([^'\"]+)['\"]#", $avatar_img, $matches) ) {
$avatar_url = $matches[1];
}
}
if ( ! empty($avatar_url) ) {
//$avatar_url = html_entity_decode($avatar_url, ENT_NOQUOTES, 'UTF-8');
$metadata_arr[] = '';
}
// familyName
$has_last_name = false;
$field_value = amt_bp_get_profile_field_data( 'last_name', $user_id, $xprofile_field_map, $xprofile_public_fields );
$field_value = sanitize_text_field( $field_value );
if ( ! empty($field_value) ) {
$metadata_arr[] = '';
$has_last_name = true;
}
// givenName
$has_first_name = false;
$field_value = amt_bp_get_profile_field_data( 'first_name', $user_id, $xprofile_field_map, $xprofile_public_fields );
$field_value = sanitize_text_field( $field_value );
if ( ! empty($field_value) ) {
$metadata_arr[] = '';
$has_first_name = true;
}
// Generate first and last name from full name if needed.
if ( ! $has_last_name && ! $has_first_name && ! empty($user_fullname) ) {
$parts = explode(' ', $user_fullname);
$last_name = sanitize_text_field( array_pop($parts) ); // Removes and returns the element off the end of array
if ( ! empty($last_name) ) {
$metadata_arr[] = '';
}
$first_name = sanitize_text_field( implode(' ', $parts) );
if ( ! empty($first_name) ) {
$metadata_arr[] = '';
}
}
// alternateName
$field_value = amt_bp_get_profile_field_data( 'nickname', $user_id, $xprofile_field_map, $xprofile_public_fields );
$field_value = sanitize_text_field( $field_value );
if ( ! empty($field_value) ) {
$metadata_arr[] = '';
}
// additionalName
$field_value = amt_bp_get_profile_field_data( 'additional_name', $user_id, $xprofile_field_map, $xprofile_public_fields );
$field_value = sanitize_text_field( $field_value );
if ( ! empty($field_value) ) {
$metadata_arr[] = '';
}
// honorificPrefix
$field_value = amt_bp_get_profile_field_data( 'honorific_prefix', $user_id, $xprofile_field_map, $xprofile_public_fields );
$field_value = sanitize_text_field( $field_value );
if ( ! empty($field_value) ) {
$metadata_arr[] = '';
}
// honorificSuffix
$field_value = amt_bp_get_profile_field_data( 'honorific_suffix', $user_id, $xprofile_field_map, $xprofile_public_fields );
$field_value = sanitize_text_field( $field_value );
if ( ! empty($field_value) ) {
$metadata_arr[] = '';
}
// gender
$field_value = amt_bp_get_profile_field_data( 'gender', $user_id, $xprofile_field_map, $xprofile_public_fields );
$field_value = sanitize_text_field( $field_value );
if ( ! empty($field_value) ) {
$metadata_arr[] = '';
}
// nationality
$field_value = amt_bp_get_profile_field_data( 'nationality', $user_id, $xprofile_field_map, $xprofile_public_fields );
$field_value = sanitize_text_field( $field_value );
if ( ! empty($field_value) ) {
$metadata_arr[] = '';
$metadata_arr[] = '';
$metadata_arr[] = '';
$metadata_arr[] = ' ';
}
// telephone
$field_value = amt_bp_get_profile_field_data( 'telephone', $user_id, $xprofile_field_map, $xprofile_public_fields );
$field_value = sanitize_text_field( $field_value );
if ( ! empty($field_value) ) {
$metadata_arr[] = '';
}
// faxNumber
$field_value = amt_bp_get_profile_field_data( 'fax', $user_id, $xprofile_field_map, $xprofile_public_fields );
$field_value = sanitize_text_field( $field_value );
if ( ! empty($field_value) ) {
$metadata_arr[] = '';
}
// email
$field_value = amt_bp_get_profile_field_data( 'email', $user_id, $xprofile_field_map, $xprofile_public_fields );
$field_value = sanitize_text_field( $field_value );
if ( ! empty($field_value) ) {
$metadata_arr[] = '';
}
// jobTitle
$field_value = amt_bp_get_profile_field_data( 'job_title', $user_id, $xprofile_field_map, $xprofile_public_fields );
$field_value = sanitize_text_field( $field_value );
if ( ! empty($field_value) ) {
$metadata_arr[] = '';
}
// worksFor
$work_name = '';
$field_value = amt_bp_get_profile_field_data( 'works_for', $user_id, $xprofile_field_map, $xprofile_public_fields );
$field_value = sanitize_text_field( $field_value );
if ( ! empty($field_value) ) {
$work_name = esc_attr( $field_value );
}
// worksFor URL
$work_url = '';
$field_value = amt_bp_get_profile_field_data( 'works_for_url', $user_id, $xprofile_field_map, $xprofile_public_fields );
$field_value = sanitize_text_field( $field_value );
if ( ! empty($field_value) ) {
$work_url = esc_url( $field_value );
}
if ( ! empty($work_name) || ! empty($work_url) ) {
$metadata_arr[] = '';
$metadata_arr[] = '';
if ( ! empty($work_name) ) {
$metadata_arr[] = '';
}
if ( ! empty($work_url) ) {
$metadata_arr[] = '';
}
$metadata_arr[] = ' ';
}
// Home Location Geo Coordinates
// home latitude
$latitude = '';
$field_value = amt_bp_get_profile_field_data( 'home_latitude', $user_id, $xprofile_field_map, $xprofile_public_fields );
$field_value = sanitize_text_field( $field_value );
if ( ! empty($field_value) ) {
$latitude = esc_attr( $field_value );
}
// home longitude
$longitude = '';
$field_value = amt_bp_get_profile_field_data( 'home_longitude', $user_id, $xprofile_field_map, $xprofile_public_fields );
$field_value = sanitize_text_field( $field_value );
if ( ! empty($field_value) ) {
$longitude = esc_attr( $field_value );
}
if ( ! empty($latitude) && ! empty($longitude) ) {
$metadata_arr[] = '';
$metadata_arr[] = '';
$metadata_arr[] = '';
$metadata_arr[] = '';
$metadata_arr[] = ' ';
}
// Work Location Geo Coordinates
// work latitude
$latitude = '';
$field_value = amt_bp_get_profile_field_data( 'work_latitude', $user_id, $xprofile_field_map, $xprofile_public_fields );
$field_value = sanitize_text_field( $field_value );
if ( ! empty($field_value) ) {
$latitude = esc_attr( $field_value );
}
// work longitude
$longitude = '';
$field_value = amt_bp_get_profile_field_data( 'work_longitude', $user_id, $xprofile_field_map, $xprofile_public_fields );
$field_value = sanitize_text_field( $field_value );
if ( ! empty($field_value) ) {
$longitude = esc_attr( $field_value );
}
if ( ! empty($latitude) && ! empty($longitude) ) {
$metadata_arr[] = '';
$metadata_arr[] = '';
$metadata_arr[] = '';
$metadata_arr[] = '';
$metadata_arr[] = ' ';
}
}
// Scope END: Person
$metadata_arr[] = ' ';
}
// Allow filtering of the generated metadata
// Customize with: add_filter('amt_buddypress_schemaorg_footer_extra', 'my_function', 10, 5);
$metadata_arr = apply_filters( 'amt_buddypress_schemaorg_footer_extra', $metadata_arr, $post, $options, $attachments, $embedded_media );
return $metadata_arr;
}
function amt_buddypress_schemaorg_content_filter( $metadata_arr, $post, $options, $attachments, $embedded_media ) {
// Currently not called. Possibly not needed.
// Allow filtering of the generated metadata
// Customize with: add_filter('amt_buddypress_schemaorg_content_filter_extra', 'my_function', 10, 5);
$metadata_arr = apply_filters( 'amt_buddypress_schemaorg_content_filter_extra', $metadata_arr, $post, $options, $attachments, $embedded_media );
return $metadata_arr;
}
function amt_buddypress_jsonld_schemaorg( $metadata_arr, $post, $options, $attachments, $embedded_media ) {
// User Profiles
// Determines if a BuddyPress user profile has been requested
if ( bp_is_user_profile() ) {
// https://codex.buddypress.org/developer/the-bp-global/
global $bp;
// $user_id = $bp->displayed_user->id;
$user_id = bp_displayed_user_id();
// $user_domain = $bp->displayed_user->domain;
// bp_core_get_user_domain( bp_displayed_user_id() )
$user_domain = bp_displayed_user_domain();
$user_profile_url = trailingslashit( bp_displayed_user_domain() . amt_bp_get_profile_slug() );
$user_fullname = $bp->displayed_user->fullname;
// $user_fullname = bp_displayed_user_fullname();
// $user_username = $bp->displayed_user->user_login;
$user_username = bp_get_displayed_user_username();
//$wp_user_obj = get_user_by( 'id', $user_id );
$wp_user_obj = get_userdata( $user_id );
//var_dump($wp_user_obj);
// Context
$metadata_arr['@context'] = 'http://schema.org';
// Schema.org type
$metadata_arr['@type'] = 'Person';
// name
$metadata_arr['name'] = esc_attr( $user_fullname );
// URL
$metadata_arr['url'] = esc_url( $user_profile_url, array('http', 'https') );
// mainEntityOfPage
$metadata_arr['mainEntityOfPage'] = esc_url( $user_profile_url, array('http', 'https') );
// Related resources as sameAs
$metadata_arr['sameAs'] = array();
// Facebook Profile
//$fb_author_url = get_the_author_meta('amt_facebook_author_profile_url', $user_id);
$fb_author_url = get_user_meta($user_id, 'amt_facebook_author_profile_url', true);
if ( ! empty($fb_author_url) ) {
$metadata_arr['sameAs'][] = esc_url( $fb_author_url, array('http', 'https') );
}
// Twitter
//$twitter_author_username = get_the_author_meta('amt_twitter_author_username', $user_id);
$twitter_author_username = get_user_meta($user_id, 'amt_twitter_author_username', true);
if ( ! empty($twitter_author_username) ) {
$metadata_arr['sameAs'][] = 'https://twitter.com/' . esc_attr( $twitter_author_username );
}
// Google+
//$googleplus_author_url = get_the_author_meta('amt_googleplus_author_profile_url', $wp_user_obj);
$googleplus_author_url = get_user_meta($user_id, 'amt_googleplus_author_profile_url', true);
if ( ! empty( $googleplus_author_url ) ) {
$metadata_arr['sameAs'][] = esc_url( $googleplus_author_url, array('http', 'https') );
}
// Determines if Extended Profiles component is active.
if ( ! bp_is_active( 'xprofile' ) ) {
// Website
//$website_url = get_user_meta($user_id, 'amt_googleplus_author_profile_url', true);
$website_url = get_the_author_meta( 'user_url', $user_id );
if ( ! empty( $website_url ) ) {
$metadata_arr['sameAs'][] = esc_url( $website_url, array('http', 'https') );
}
// Description
$author_description = sanitize_text_field( amt_sanitize_description( $wp_user_obj->description ) );
if ( empty($author_description) ) {
$metadata_arr['description'] = esc_attr( __('Profile of', 'add-meta-tags') . ' ' . $wp_user_obj->display_name );
} else {
$metadata_arr['description'] = esc_attr( $author_description );
}
// Profile Image
$author_email = sanitize_email( $wp_user_obj->user_email );
$avatar_size = apply_filters( 'amt_bp_avatar_size', array('width'=>50, 'height'=>50) );
$avatar_url = '';
// First try to get the avatar link by using get_avatar().
// Important: for this to work the "Show Avatars" option should be enabled in Settings > Discussion.
$avatar_img = get_avatar( get_the_author_meta('ID', $wp_user_obj->ID), $avatar_size, '', get_the_author_meta('display_name', $wp_user_obj->ID) );
if ( ! empty($avatar_img) ) {
if ( preg_match("#src=['\"]([^'\"]+)['\"]#", $avatar_img, $matches) ) {
$avatar_url = $matches[1];
}
} elseif ( ! empty($author_email) ) {
// If the user has provided an email, we use it to construct a gravatar link.
$avatar_url = "http://www.gravatar.com/avatar/" . md5( $author_email ) . "?s=" . $avatar_size;
}
if ( ! empty($avatar_url) ) {
//$avatar_url = html_entity_decode($avatar_url, ENT_NOQUOTES, 'UTF-8');
$metadata_arr['image'] = esc_url( $avatar_url );
}
// familyName
$last_name = $wp_user_obj->last_name;
if ( ! empty($last_name) ) {
$metadata_arr['familyName'] = esc_attr( $last_name );
}
// givenName
$first_name = $wp_user_obj->first_name;
if ( ! empty($first_name) ) {
$metadata_arr['givenName'] = esc_attr( $first_name );
}
// Extended Profiles
} else {
// https://codex.buddypress.org/themes/guides/displaying-extended-profile-fields-on-member-profiles/
$xprofile_field_map = amt_buddypress_get_xprofile_field_map();
// Get list of IDs of public fields
$xprofile_public_fields = bp_xprofile_get_fields_by_visibility_levels( $user_id, array('public') );
// Website
$field_value = amt_bp_get_profile_field_data( 'website', $user_id, $xprofile_field_map, $xprofile_public_fields );
$field_value = sanitize_text_field( $field_value );
if ( ! empty($field_value) ) {
$metadata_arr['sameAs'][] = esc_url( $field_value, array('http', 'https') );
}
// Description
$field_value = amt_bp_get_profile_field_data( 'description', $user_id, $xprofile_field_map, $xprofile_public_fields );
$field_value = sanitize_text_field( amt_sanitize_description( $field_value ) );
if ( ! empty($field_value) ) {
$metadata_arr['description'] = esc_attr( $field_value );
} else {
$metadata_arr['description'] = esc_attr( __('Profile of', 'add-meta-tags') . ' ' . $user_fullname );
}
// Profile Image
// Important: for this to work the "Show Avatars" option should be enabled in Settings > Discussion.
$avatar_size = apply_filters( 'amt_bp_avatar_size', array('width'=>50, 'height'=>50) );
$avatar_url = '';
$avatar_args = array(
'item_id' => $user_id,
'width' => $avatar_size['width'],
'height' => $avatar_size['height'],
);
$avatar_img = bp_core_fetch_avatar( $avatar_args );
if ( ! empty($avatar_img) ) {
if ( preg_match("#src=['\"]([^'\"]+)['\"]#", $avatar_img, $matches) ) {
$avatar_url = $matches[1];
}
}
if ( ! empty($avatar_url) ) {
//$avatar_url = html_entity_decode($avatar_url, ENT_NOQUOTES, 'UTF-8');
$metadata_arr['image'] = esc_url( $avatar_url );
}
// familyName
$has_last_name = false;
$field_value = amt_bp_get_profile_field_data( 'last_name', $user_id, $xprofile_field_map, $xprofile_public_fields );
$field_value = sanitize_text_field( $field_value );
if ( ! empty($field_value) ) {
$metadata_arr['familyName'] = esc_attr( $field_value );
$has_last_name = true;
}
// givenName
$has_first_name = false;
$field_value = amt_bp_get_profile_field_data( 'first_name', $user_id, $xprofile_field_map, $xprofile_public_fields );
$field_value = sanitize_text_field( $field_value );
if ( ! empty($field_value) ) {
$metadata_arr['givenName'] = esc_attr( $field_value );
$has_first_name = true;
}
// Generate first and last name from full name if needed.
if ( ! $has_last_name && ! $has_first_name && ! empty($user_fullname) ) {
$parts = explode(' ', $user_fullname);
$last_name = sanitize_text_field( array_pop($parts) ); // Removes and returns the element off the end of array
if ( ! empty($last_name) ) {
$metadata_arr['familyName'] = esc_attr( $last_name );
}
$first_name = sanitize_text_field( implode(' ', $parts) );
if ( ! empty($first_name) ) {
$metadata_arr['givenName'] = esc_attr( $first_name );
}
}
// alternateName
$field_value = amt_bp_get_profile_field_data( 'nickname', $user_id, $xprofile_field_map, $xprofile_public_fields );
$field_value = sanitize_text_field( $field_value );
if ( ! empty($field_value) ) {
$metadata_arr['alternateName'] = esc_attr( $field_value );
}
// additionalName
$field_value = amt_bp_get_profile_field_data( 'additional_name', $user_id, $xprofile_field_map, $xprofile_public_fields );
$field_value = sanitize_text_field( $field_value );
if ( ! empty($field_value) ) {
$metadata_arr['additionalName'] = esc_attr( $field_value );
}
// honorificPrefix
$field_value = amt_bp_get_profile_field_data( 'honorific_prefix', $user_id, $xprofile_field_map, $xprofile_public_fields );
$field_value = sanitize_text_field( $field_value );
if ( ! empty($field_value) ) {
$metadata_arr['honorificPrefix'] = esc_attr( $field_value );
}
// honorificSuffix
$field_value = amt_bp_get_profile_field_data( 'honorific_suffix', $user_id, $xprofile_field_map, $xprofile_public_fields );
$field_value = sanitize_text_field( $field_value );
if ( ! empty($field_value) ) {
$metadata_arr['honorificSuffix'] = esc_attr( $field_value );
}
// gender
$field_value = amt_bp_get_profile_field_data( 'gender', $user_id, $xprofile_field_map, $xprofile_public_fields );
$field_value = sanitize_text_field( $field_value );
if ( ! empty($field_value) ) {
$metadata_arr['gender'] = esc_attr( $field_value );
}
// nationality
$field_value = amt_bp_get_profile_field_data( 'nationality', $user_id, $xprofile_field_map, $xprofile_public_fields );
$field_value = sanitize_text_field( $field_value );
if ( ! empty($field_value) ) {
$metadata_arr['nationality'] = array();
$metadata_arr['nationality']['@type'] = 'Country';
$metadata_arr['nationality']['name'] = esc_attr( $field_value );
}
// telephone
$field_value = amt_bp_get_profile_field_data( 'telephone', $user_id, $xprofile_field_map, $xprofile_public_fields );
$field_value = sanitize_text_field( $field_value );
if ( ! empty($field_value) ) {
$metadata_arr['telephone'] = esc_attr( $field_value );
}
// faxNumber
$field_value = amt_bp_get_profile_field_data( 'fax', $user_id, $xprofile_field_map, $xprofile_public_fields );
$field_value = sanitize_text_field( $field_value );
if ( ! empty($field_value) ) {
$metadata_arr['faxNumber'] = esc_attr( $field_value );
}
// email
$field_value = amt_bp_get_profile_field_data( 'email', $user_id, $xprofile_field_map, $xprofile_public_fields );
$field_value = sanitize_text_field( $field_value );
if ( ! empty($field_value) ) {
$metadata_arr['email'] = 'mailto:' . esc_attr( $field_value );
}
// jobTitle
$field_value = amt_bp_get_profile_field_data( 'job_title', $user_id, $xprofile_field_map, $xprofile_public_fields );
$field_value = sanitize_text_field( $field_value );
if ( ! empty($field_value) ) {
$metadata_arr['jobTitle'] = esc_attr( $field_value );
}
// worksFor
$field_value = amt_bp_get_profile_field_data( 'works_for', $user_id, $xprofile_field_map, $xprofile_public_fields );
$field_value = sanitize_text_field( $field_value );
if ( ! empty($field_value) ) {
$metadata_arr['worksFor'] = array();
$metadata_arr['worksFor']['@type'] = 'Organization';
$metadata_arr['worksFor']['name'] = esc_attr( $field_value );
}
// worksFor URL
$field_value = amt_bp_get_profile_field_data( 'works_for_url', $user_id, $xprofile_field_map, $xprofile_public_fields );
$field_value = sanitize_text_field( $field_value );
if ( ! empty($field_value) ) {
if ( ! array_key_exists('worksFor', $metadata_arr) || ! is_array($metadata_arr['worksFor']) ) {
$metadata_arr['worksFor'] = array();
$metadata_arr['worksFor']['@type'] = 'Organization';
}
$metadata_arr['worksFor']['url'] = esc_attr( $field_value );
}
// Home Location Geo Coordinates
// home latitude
$latitude = '';
$field_value = amt_bp_get_profile_field_data( 'home_latitude', $user_id, $xprofile_field_map, $xprofile_public_fields );
$field_value = sanitize_text_field( $field_value );
if ( ! empty($field_value) ) {
$latitude = esc_attr( $field_value );
}
// home longitude
$longitude = '';
$field_value = amt_bp_get_profile_field_data( 'home_longitude', $user_id, $xprofile_field_map, $xprofile_public_fields );
$field_value = sanitize_text_field( $field_value );
if ( ! empty($field_value) ) {
$longitude = esc_attr( $field_value );
}
if ( ! empty($latitude) && ! empty($longitude) ) {
$metadata_arr['homeLocation'] = array();
$metadata_arr['homeLocation']['@type'] = 'Place';
$metadata_arr['homeLocation']['latitude'] = esc_attr( $latitude );
$metadata_arr['homeLocation']['longitude'] = esc_attr( $longitude );
}
// Work Location Geo Coordinates
// work latitude
$latitude = '';
$field_value = amt_bp_get_profile_field_data( 'work_latitude', $user_id, $xprofile_field_map, $xprofile_public_fields );
$field_value = sanitize_text_field( $field_value );
if ( ! empty($field_value) ) {
$latitude = esc_attr( $field_value );
}
// work longitude
$longitude = '';
$field_value = amt_bp_get_profile_field_data( 'work_longitude', $user_id, $xprofile_field_map, $xprofile_public_fields );
$field_value = sanitize_text_field( $field_value );
if ( ! empty($field_value) ) {
$longitude = esc_attr( $field_value );
}
if ( ! empty($latitude) && ! empty($longitude) ) {
$metadata_arr['workLocation'] = array();
$metadata_arr['workLocation']['@type'] = 'Place';
$metadata_arr['workLocation']['latitude'] = esc_attr( $latitude );
$metadata_arr['workLocation']['longitude'] = esc_attr( $longitude );
}
}
}
// Allow filtering of the generated metadata
// Customize with: add_filter('amt_buddypress_jsonld_schemaorg_extra', 'my_function', 10, 5);
$metadata_arr = apply_filters( 'amt_buddypress_jsonld_schemaorg_extra', $metadata_arr, $post, $options, $attachments, $embedded_media );
return $metadata_arr;
}
//
//
// bbPress Support
//
//
// bbPress detection
function amt_detect_bbpress( $default, $post, $options ) {
// First and important check.
// $default is a boolean variable which indicates if custom content has been
// detected by any previous filter.
// Check if custom content has already been detected by another filter.
// If such content has been detected, just return $default (should be true)
// and *do not* add any metadata filters.
// This check is mandatory in order the detection mechanism to work correctly.
if ( $default ) {
return $default;
}
// Process bbPress metadata, only if the bbPress extended metadata
// support has been enabled in the Add-Meta-Tags settings.
if ( $options["extended_support_bbpress"] == "1" ) {
// Perform this test in case bbPress is not installed/activated.
if ( ! function_exists('is_bbpress') || ! is_bbpress() ) {
return false;
}
// Insert metadata for bbPress pages
// Basic (description/keywords)
add_filter( 'amt_custom_metadata_basic', 'amt_bbpress_basic', 10, 5 );
// Opengraph
add_filter( 'amt_custom_metadata_opengraph', 'amt_bbpress_opengraph', 10, 5 );
// Twitter Cards
add_filter( 'amt_custom_metadata_twitter_cards', 'amt_bbpress_twitter_cards', 10, 5 );
// Dublin Core
add_filter( 'amt_custom_metadata_dublin_core', 'amt_bbpress_dublin_core', 10, 5 );
// Schema.org
if ( $options["schemaorg_force_jsonld"] == "0" ) {
// Microdata
// Non content pages via 'wp_footer' action
add_filter( 'amt_custom_metadata_schemaorg_footer', 'amt_bbpress_schemaorg_footer', 10, 5 );
// Content pages via 'the_content' filter
add_filter( 'amt_custom_metadata_schemaorg_content_filter', 'amt_bbpress_schemaorg_content_filter', 10, 5 );
} else {
add_filter( 'amt_custom_metadata_jsonld_schemaorg', 'amt_bbpress_jsonld_schemaorg', 10, 5 );
}
// Finally return true. bbPress detected.
return true;
}
return false;
}
add_filter( 'amt_is_custom', 'amt_detect_bbpress', 10, 3 );
function amt_bbpress_basic( $metadata_arr, $post, $options, $attachments, $embedded_media ) {
// Allow filtering of the generated metadata
// Customize with: add_filter('amt_bbpress_basic_extra', 'my_function', 10, 5);
$metadata_arr = apply_filters( 'amt_bbpress_basic_extra', $metadata_arr, $post, $options, $attachments, $embedded_media );
return $metadata_arr;
}
function amt_bbpress_opengraph( $metadata_arr, $post, $options, $attachments, $embedded_media ) {
// Allow filtering of the generated metadata
// Customize with: add_filter('amt_bbpress_opengraph_extra', 'my_function', 10, 5);
$metadata_arr = apply_filters( 'amt_bbpress_opengraph_extra', $metadata_arr, $post, $options, $attachments, $embedded_media );
return $metadata_arr;
}
function amt_bbpress_twitter_cards( $metadata_arr, $post, $options, $attachments, $embedded_media ) {
// Allow filtering of the generated metadata
// Customize with: add_filter('amt_bbpress_twitter_cards_extra', 'my_function', 10, 5);
$metadata_arr = apply_filters( 'amt_bbpress_twitter_cards_extra', $metadata_arr, $post, $options, $attachments, $embedded_media );
return $metadata_arr;
}
function amt_bbpress_dublin_core( $metadata_arr, $post, $options, $attachments, $embedded_media ) {
// Allow filtering of the generated metadata
// Customize with: add_filter('amt_bbpress_dublin_core_extra', 'my_function', 10, 5);
$metadata_arr = apply_filters( 'amt_bbpress_dublin_core_extra', $metadata_arr, $post, $options, $attachments, $embedded_media );
return $metadata_arr;
}
function amt_bbpress_schemaorg_footer( $metadata_arr, $post, $options, $attachments, $embedded_media ) {
// Allow filtering of the generated metadata
// Customize with: add_filter('amt_bbpress_schemaorg_footer_extra', 'my_function', 10, 5);
$metadata_arr = apply_filters( 'amt_bbpress_schemaorg_footer_extra', $metadata_arr, $post, $options, $attachments, $embedded_media );
return $metadata_arr;
}
function amt_bbpress_schemaorg_content_filter( $metadata_arr, $post, $options, $attachments, $embedded_media ) {
// Allow filtering of the generated metadata
// Customize with: add_filter('amt_bbpress_schemaorg_content_filter_extra', 'my_function', 10, 5);
$metadata_arr = apply_filters( 'amt_bbpress_schemaorg_content_filter_extra', $metadata_arr, $post, $options, $attachments, $embedded_media );
return $metadata_arr;
}
function amt_bbpress_jsonld_schemaorg( $metadata_arr, $post, $options, $attachments, $embedded_media ) {
// Allow filtering of the generated metadata
// Customize with: add_filter('amt_bbpress_jsonld_schemaorg_extra', 'my_function', 10, 5);
$metadata_arr = apply_filters( 'amt_bbpress_jsonld_schemaorg_extra', $metadata_arr, $post, $options, $attachments, $embedded_media );
return $metadata_arr;
}