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.

142 lines
3.0 KiB
PHTML

<?php
/**
* The Singular Class.
*
* @since 1.0.13
* @package RankMath
* @subpackage RankMath\Schema
* @author Rank Math <support@rankmath.com>
*/
namespace RankMath\Schema;
use RankMath\Helper;
use RankMath\Traits\Hooker;
use RankMath\Schema\DB;
defined( 'ABSPATH' ) || exit;
/**
* Singular class.
*/
class Singular implements Snippet {
use Hooker;
/**
* Generate rich snippet.
*
* @param array $data Array of JSON-LD data.
* @param JsonLD $jsonld JsonLD Instance.
*
* @return array
*/
public function process( $data, $jsonld ) {
$schema = $this->can_add_schema( $jsonld );
if ( false === $schema ) {
return $data;
}
$hook = 'snippet/rich_snippet_' . $schema;
/**
* Short-circuit if 3rd party is interested generating his own data.
*/
$pre = $this->do_filter( $hook, false, $jsonld->parts, $data );
if ( false !== $pre ) {
$data['richSnippet'] = $this->do_filter( $hook . '_entity', $pre );
return $data;
}
$object = $this->get_schema_class( $schema );
if ( false === $object ) {
return $data;
}
$entity = $object->process( $data, $jsonld );
$data['richSnippet'] = $this->do_filter( $hook . '_entity', $entity );
return $data;
}
/**
* Get Schema type.
*
* @param JsonLD $jsonld JsonLD Instance.
*
* @return boolean|string
*/
private function can_add_schema( $jsonld ) {
if ( empty( $jsonld->post_id ) ) {
return false;
}
$schemas = DB::get_schemas( $jsonld->post_id );
if ( ! empty( $schemas ) ) {
$has_product = array_filter(
$schemas,
function( $schema ) {
return ! empty( $schema['@type'] ) && in_array( $schema['@type'], [ 'WooCommerceProduct', 'EDDProduct' ], true );
}
);
return ! empty( $has_product ) ? 'product' : false;
}
if ( metadata_exists( 'post', $jsonld->post_id, 'rank_math_rich_snippet' ) ) {
return Helper::get_post_meta( 'rich_snippet' );
}
if ( ! Helper::can_use_default_schema( $jsonld->post_id ) ) {
return false;
}
return $this->get_default_schema( $jsonld );
}
/**
* Get Default Rich Snippet type from Settings.
*
* @param JsonLD $jsonld JsonLD Instance.
*
* @return string
*/
private function get_default_schema( $jsonld ) {
$schema = Helper::get_default_schema_type( $jsonld->post_id, true );
if ( ! $schema ) {
return false;
}
if ( in_array( $schema, [ 'BlogPosting', 'NewsArticle', 'Article' ], true ) ) {
return 'article';
}
if (
( Helper::is_woocommerce_active() && is_singular( 'product' ) ) ||
( Helper::is_edd_active() && is_singular( 'download' ) )
) {
return 'product';
}
return false;
}
/**
* Get appropriate Schema Class.
*
* @param string $schema Schema type.
* @return bool|Class
*/
private function get_schema_class( $schema ) {
$data = [
'article' => '\\RankMath\\Schema\\Article',
'product' => '\\RankMath\\Schema\\Product',
];
if ( isset( $data[ $schema ] ) && class_exists( $data[ $schema ] ) ) {
return new $data[ $schema ]();
}
return false;
}
}