<?php
// phpcs:disable Yoast.NamingConventions.NamespaceName.TooLong
namespace Yoast\WP\SEO\Schema\Application\Configuration;
use Easy_Digital_Downloads;
use SeriouslySimplePodcasting\Integrations\Yoast\Schema\PodcastEpisode;
use TEC\Events\Integrations\Plugins\WordPress_SEO\Events_Schema;
use WP_Recipe_Maker;
use WPSEO_Addon_Manager;
use Yoast\WP\SEO\Helpers\Options_Helper;
use Yoast\WP\SEO\Helpers\Product_Helper;
use Yoast\WP\SEO\Helpers\Woocommerce_Helper;
/**
* Responsible for the schema configuration.
*
* @makePublic
*/
class Schema_Configuration {
/**
* The WooCommerce helper.
*
* @var Woocommerce_Helper
*/
private $woocommerce_helper;
/**
* The product helper.
*
* @var Product_Helper
*/
private $product_helper;
/**
* The addon manager.
*
* @var WPSEO_Addon_Manager
*/
private $addon_manager;
/**
* The options helper.
*
* @var Options_Helper
*/
private $options_helper;
/**
* Schema_Configuration constructor.
*
* @param Woocommerce_Helper $woocommerce_helper The WooCommerce helper.
* @param Product_Helper $product_helper The product helper.
* @param WPSEO_Addon_Manager $addon_manager The addon manager.
* @param Options_Helper $options_helper The options helper.
*/
public function __construct(
Woocommerce_Helper $woocommerce_helper,
Product_Helper $product_helper,
WPSEO_Addon_Manager $addon_manager,
Options_Helper $options_helper
) {
$this->woocommerce_helper = $woocommerce_helper;
$this->product_helper = $product_helper;
$this->addon_manager = $addon_manager;
$this->options_helper = $options_helper;
}
/**
* Returns the schema configuration.
*
* @return array<string, bool|array<string, array<string, bool|string>>>
*/
public function get_configuration(): array {
return [
'isSchemaDisabledProgrammatically' => $this->is_schema_disabled_programmatically(),
'schemaApiIntegrations' => $this->get_schema_api_integrations(),
];
}
/**
* Gets the schema API integrations status.
*
* @return array<string, array<string, bool|string>> The schema API integrations status.
*/
public function get_schema_api_integrations(): array {
$woocommerce_seo_file = 'wpseo-woocommerce/wpseo-woocommerce.php';
$woocommerce_active = $this->woocommerce_helper->is_active();
$woocommerce_seo_active = \is_plugin_active( $woocommerce_seo_file );
$woocommerce_seo_installed = $this->addon_manager->is_installed( WPSEO_Addon_Manager::WOOCOMMERCE_SLUG );
$woocommerce_seo_activate_url = \wp_nonce_url(
\self_admin_url( 'plugins.php?action=activate&plugin=' . $woocommerce_seo_file ),
'activate-plugin_' . $woocommerce_seo_file,
);
$is_premium = $this->product_helper->is_premium();
return [
'tec' => [
'isActive' => \class_exists( Events_Schema::class ),
],
'ssp' => [
'isActive' => \class_exists( PodcastEpisode::class ),
],
'wp-recipe-maker' => [
'isActive' => \class_exists( WP_Recipe_Maker::class ),
],
'woocommerce' => [
'isPrerequisiteActive' => $woocommerce_active,
'isActive' => $woocommerce_seo_active,
'isInstalled' => $woocommerce_seo_installed,
'activationLink' => $woocommerce_seo_activate_url,
],
'edd' => [
'isActive' => \class_exists( Easy_Digital_Downloads::class ),
'isPremium' => $is_premium,
],
];
}
/**
* Checks if the schema is disabled programmatically via the wpseo_json_ld_output filter.
*
* Only returns true if schema is enabled via the option (toggle) but disabled by external code.
*
* @return bool Whether schema is disabled by external code.
*/
public function is_schema_disabled_programmatically(): bool {
$deprecated_data = [
'_deprecated' => 'Please use the "wpseo_schema_*" filters to extend the Yoast SEO schema data - see the WPSEO_Schema class.',
];
/**
* Filter documented in Schema_Presenter::present().
*/
$filtered_schema = \apply_filters( 'wpseo_json_ld_output', $deprecated_data, '' );
return ( $filtered_schema === [] || $filtered_schema === false );
}
}