You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
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 );
|
|
}
|
|
}
|
|
}
|