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

<?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 );
}
}