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.
148 lines
3.9 KiB
PHTML
148 lines
3.9 KiB
PHTML
7 months ago
|
<?php
|
||
|
/**
|
||
|
* The Schema helpers.
|
||
|
*
|
||
|
* @since 1.0.62
|
||
|
* @package RankMath
|
||
|
* @subpackage RankMath\Helpers
|
||
|
* @author Rank Math <support@rankmath.com>
|
||
|
*/
|
||
|
|
||
|
namespace RankMath\Helpers;
|
||
|
|
||
|
use RankMath\Helper;
|
||
|
use RankMath\Admin\Admin_Helper;
|
||
|
|
||
|
defined( 'ABSPATH' ) || exit;
|
||
|
|
||
|
/**
|
||
|
* Schema class.
|
||
|
*/
|
||
|
trait Schema {
|
||
|
/**
|
||
|
* Function to get Default Schema type by post_type.
|
||
|
*
|
||
|
* @param int $post_id Post ID.
|
||
|
* @param boolean $return_valid Whether to return valid schema type which can be used on the frontend.
|
||
|
* @param boolean $sanitize Return santized Schema type.
|
||
|
*
|
||
|
* @return string Default Schema Type.
|
||
|
*/
|
||
|
public static function get_default_schema_type( $post_id, $return_valid = false, $sanitize = false ) {
|
||
|
if ( metadata_exists( 'post', $post_id, 'rank_math_rich_snippet' ) || ! self::can_use_default_schema( $post_id ) ) {
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
$post_type = get_post_type( $post_id );
|
||
|
if ( ! in_array( $post_type, Helper::get_accessible_post_types(), true ) ) {
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
$schema = Helper::get_settings( "titles.pt_{$post_type}_default_rich_snippet" );
|
||
|
if ( ! $schema ) {
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
if ( 'article' === $schema ) {
|
||
|
/**
|
||
|
* Filter: Allow changing the default schema type.
|
||
|
*
|
||
|
* @param string $schema Schema type.
|
||
|
* @param string $post_type Post type.
|
||
|
* @param int $post_id Post ID.
|
||
|
*/
|
||
|
$schema = apply_filters(
|
||
|
'rank_math/schema/default_type',
|
||
|
Helper::get_settings( "titles.pt_{$post_type}_default_article_type" ),
|
||
|
$post_type,
|
||
|
$post_id
|
||
|
);
|
||
|
}
|
||
|
|
||
|
if ( class_exists( 'WooCommerce' ) && 'product' === $post_type ) {
|
||
|
$schema = 'WooCommerceProduct';
|
||
|
}
|
||
|
|
||
|
if ( class_exists( 'Easy_Digital_Downloads' ) && 'download' === $post_type ) {
|
||
|
$schema = 'EDDProduct';
|
||
|
}
|
||
|
|
||
|
if ( $return_valid && ! in_array( $schema, [ 'Article', 'NewsArticle', 'BlogPosting', 'WooCommerceProduct', 'EDDProduct' ], true ) ) {
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
return $sanitize ? self::sanitize_schema_title( $schema ) : $schema;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Sanitize schema title.
|
||
|
*
|
||
|
* @param string $schema Schema.
|
||
|
* @param boolean $translate Whether to return the translated string.
|
||
|
* @return string
|
||
|
*/
|
||
|
public static function sanitize_schema_title( $schema, $translate = true ) {
|
||
|
if ( in_array( $schema, [ 'BlogPosting', 'NewsArticle' ], true ) ) {
|
||
|
return $translate ? esc_html__( 'Article', 'rank-math' ) : esc_html( 'Article' );
|
||
|
}
|
||
|
|
||
|
if ( 'WooCommerceProduct' === $schema ) {
|
||
|
return $translate ? esc_html__( 'WooCommerce Product', 'rank-math' ) : esc_html( 'WooCommerce Product' );
|
||
|
}
|
||
|
|
||
|
if ( 'EDDProduct' === $schema ) {
|
||
|
return $translate ? esc_html__( 'EDD Product', 'rank-math' ) : esc_html( 'EDD Product' );
|
||
|
}
|
||
|
|
||
|
if ( 'VideoObject' === $schema ) {
|
||
|
return $translate ? esc_html__( 'Video', 'rank-math' ) : esc_html( 'Video' );
|
||
|
}
|
||
|
|
||
|
if ( 'JobPosting' === $schema ) {
|
||
|
return $translate ? esc_html__( 'Job Posting', 'rank-math' ) : esc_html( 'Job Posting' );
|
||
|
}
|
||
|
|
||
|
if ( 'SoftwareApplication' === $schema ) {
|
||
|
return $translate ? esc_html__( 'Software Application', 'rank-math' ) : esc_html( 'Software Application' );
|
||
|
}
|
||
|
|
||
|
if ( 'MusicGroup' === $schema || 'MusicAlbum' === $schema ) {
|
||
|
return $translate ? esc_html__( 'Music', 'rank-math' ) : esc_html( 'Music' );
|
||
|
}
|
||
|
|
||
|
return $schema;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
/**
|
||
|
* Whether to use default schema.
|
||
|
*
|
||
|
* @param int $post_id Post ID.
|
||
|
* @return bool
|
||
|
*/
|
||
|
public static function can_use_default_schema( $post_id ) {
|
||
|
$pages = array_map(
|
||
|
'absint',
|
||
|
array_filter(
|
||
|
[
|
||
|
Helper::get_settings( 'titles.local_seo_about_page' ),
|
||
|
Helper::get_settings( 'titles.local_seo_contact_page' ),
|
||
|
get_option( 'page_for_posts' ),
|
||
|
]
|
||
|
)
|
||
|
);
|
||
|
|
||
|
return ! in_array( (int) $post_id, $pages, true );
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Whether to use default Product schema on WooCommerce pages.
|
||
|
*
|
||
|
* @return bool
|
||
|
*/
|
||
|
public static function can_use_default_product_schema() {
|
||
|
return apply_filters( 'rank_math/schema/use_default_product', true );
|
||
|
}
|
||
|
}
|