154 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			154 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
/**
 | 
						|
 * Output Opengraph tags for specific schema types.
 | 
						|
 *
 | 
						|
 * @since      1.0.56
 | 
						|
 * @package    RankMath
 | 
						|
 * @subpackage RankMath\Schema
 | 
						|
 * @author     Rank Math <support@rankmath.com>
 | 
						|
 */
 | 
						|
 | 
						|
namespace RankMath\Schema;
 | 
						|
 | 
						|
use RankMath\Helper;
 | 
						|
use RankMath\Traits\Hooker;
 | 
						|
 | 
						|
defined( 'ABSPATH' ) || exit;
 | 
						|
 | 
						|
/**
 | 
						|
 * Opengraph class.
 | 
						|
 */
 | 
						|
class Opengraph {
 | 
						|
 | 
						|
	use Hooker;
 | 
						|
 | 
						|
	/**
 | 
						|
	 * The Constructor.
 | 
						|
	 */
 | 
						|
	public function __construct() {
 | 
						|
		$this->action( 'rank_math/opengraph/facebook', 'add_schema_tags', 90 );
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Output the schema opengraph tags.
 | 
						|
	 *
 | 
						|
	 * @param OpenGraph $opengraph The current opengraph network object.
 | 
						|
	 */
 | 
						|
	public function add_schema_tags( $opengraph ) {
 | 
						|
		if ( ! is_singular() ) {
 | 
						|
			return;
 | 
						|
		}
 | 
						|
 | 
						|
		$schemas = $this->get_schemas();
 | 
						|
		if ( empty( $schemas ) ) {
 | 
						|
			return;
 | 
						|
		}
 | 
						|
 | 
						|
		$hash = [
 | 
						|
			'VideoObject' => 'video',
 | 
						|
			'Product'     => 'product',
 | 
						|
			'Article'     => 'article',
 | 
						|
			'NewsArticle' => 'article',
 | 
						|
			'BlogPosting' => 'article',
 | 
						|
		];
 | 
						|
 | 
						|
		foreach ( $schemas as $schema ) {
 | 
						|
			$method = $hash[ $schema['@type'] ];
 | 
						|
			$this->$method( $schema, $opengraph );
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Function to get schema data.
 | 
						|
	 */
 | 
						|
	private function get_schemas() {
 | 
						|
		global $post;
 | 
						|
		$schemas = array_filter(
 | 
						|
			DB::get_schemas( $post->ID ),
 | 
						|
			function( $schema ) {
 | 
						|
				return ! empty( $schema['@type'] ) && in_array( $schema['@type'], [ 'Article', 'NewsArticle', 'BlogPosting', 'Product', 'VideoObject' ], true );
 | 
						|
			}
 | 
						|
		);
 | 
						|
 | 
						|
		if ( ! empty( $schemas ) ) {
 | 
						|
			return $schemas;
 | 
						|
		}
 | 
						|
 | 
						|
		$default_schema = Helper::get_default_schema_type( $post->ID, true, false );
 | 
						|
		if ( ! in_array( $default_schema, [ 'Article', 'BlogPosting', 'NewsArticle' ], true ) ) {
 | 
						|
			return false;
 | 
						|
		}
 | 
						|
 | 
						|
		return [
 | 
						|
			[
 | 
						|
				'@type'         => $default_schema,
 | 
						|
				'datePublished' => '%date(Y-m-d\TH:i:sP)%',
 | 
						|
				'dateModified'  => '%modified(Y-m-d\TH:i:sP)%',
 | 
						|
			],
 | 
						|
		];
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Output Video Schema tags.
 | 
						|
	 *
 | 
						|
	 * @param array     $schema    Schema Data.
 | 
						|
	 * @param OpenGraph $opengraph The current opengraph network object.
 | 
						|
	 */
 | 
						|
	private function video( $schema, $opengraph ) {
 | 
						|
		$video_url = ! empty( $schema['contentUrl'] ) ? $schema['contentUrl'] : ( ! empty( $schema['embedUrl'] ) ? $schema['embedUrl'] : '' );
 | 
						|
		if ( ! $video_url ) {
 | 
						|
			return;
 | 
						|
		}
 | 
						|
 | 
						|
		$opengraph->tag( 'og:video', $video_url );
 | 
						|
		if ( ! empty( $schema['duration'] ) ) {
 | 
						|
			global $post;
 | 
						|
			$opengraph->tag( 'video:duration', Helper::duration_to_seconds( Helper::replace_vars( $schema['duration'], $post ) ) );
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Output Product Schema tags.
 | 
						|
	 *
 | 
						|
	 * @param array     $schema    Schema Data.
 | 
						|
	 * @param OpenGraph $opengraph The current opengraph network object.
 | 
						|
	 */
 | 
						|
	public function product( $schema, $opengraph ) {
 | 
						|
		if ( isset( $schema['brand'], $schema['brand']['name'] ) ) {
 | 
						|
			$opengraph->tag( 'product:brand', $schema['brand']['name'] );
 | 
						|
		}
 | 
						|
 | 
						|
		$tags = [
 | 
						|
			'product:price:amount'   => ! empty( $schema['offers']['price'] ) ? $schema['offers']['price'] : '',
 | 
						|
			'product:price:currency' => ! empty( $schema['offers']['priceCurrency'] ) ? $schema['offers']['priceCurrency'] : '',
 | 
						|
			'product:availability'   => ! empty( $schema['offers']['availability'] ) && 'instock' === $schema['offers']['availability'] ? 'instock' : '',
 | 
						|
		];
 | 
						|
 | 
						|
		foreach ( $tags as $tag => $value ) {
 | 
						|
			$opengraph->tag( $tag, $value );
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Output Article Schema tags.
 | 
						|
	 *
 | 
						|
	 * @param array     $schema    Schema Data.
 | 
						|
	 * @param OpenGraph $opengraph The current opengraph network object.
 | 
						|
	 */
 | 
						|
	private function article( $schema, $opengraph ) {
 | 
						|
		if ( empty( $schema['datePublished'] ) || empty( $schema['dateModified'] ) ) {
 | 
						|
			return;
 | 
						|
		}
 | 
						|
 | 
						|
		global $post;
 | 
						|
		$pub = '%date(Y-m-dTH:i:sP)%' === $schema['datePublished'] ? '%date(Y-m-d\TH:i:sP)%' : $schema['datePublished'];
 | 
						|
		$mod = '%modified(Y-m-dTH:i:sP)%' === $schema['dateModified'] ? '%modified(Y-m-d\TH:i:sP)%' : $schema['dateModified'];
 | 
						|
		$pub = Helper::replace_vars( $pub, $post );
 | 
						|
		$mod = Helper::replace_vars( $mod, $post );
 | 
						|
		$opengraph->tag( 'article:published_time', $pub );
 | 
						|
		if ( $mod !== $pub ) {
 | 
						|
			$opengraph->tag( 'article:modified_time', $mod );
 | 
						|
		}
 | 
						|
	}
 | 
						|
}
 |