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
PHP
142 lines
3.0 KiB
PHP
<?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;
|
|
}
|
|
}
|