admin_asset_manager = $admin_asset_manager; $this->options_helper = $options_helper; $this->woocommerce_helper = $woocommerce_helper; } /** * {@inheritDoc} */ public function register_hooks() { \add_filter( 'wpseo_submenu_pages', [ $this, 'add_submenu_page' ], 10 ); \add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_assets' ], 11 ); } /** * Adds the integrations submenu page. * * @param array $submenu_pages The Yoast SEO submenu pages. * * @return array The filtered submenu pages. */ public function add_submenu_page( $submenu_pages ) { $integrations_page = [ 'wpseo_dashboard', '', \__( 'Integrations', 'wordpress-seo' ), 'wpseo_manage_options', 'wpseo_integrations', [ $this, 'render_target' ], ]; \array_splice( $submenu_pages, 1, 0, [ $integrations_page ] ); return $submenu_pages; } /** * Enqueue the integrations app. * * @return void */ public function enqueue_assets() { // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Date is not processed or saved. if ( ! isset( $_GET['page'] ) || $_GET['page'] !== 'wpseo_integrations' ) { return; } $this->admin_asset_manager->enqueue_style( 'admin-css' ); $this->admin_asset_manager->enqueue_style( 'tailwind' ); $this->admin_asset_manager->enqueue_style( 'monorepo' ); $this->admin_asset_manager->enqueue_script( 'integrations-page' ); $elementor_conditional = new Elementor_Activated_Conditional(); $jetpack_conditional = new Jetpack_Conditional(); $jetpack_boost_active_conditional = new Jetpack_Boost_Active_Conditional(); $jetpack_boost_not_premium_conditional = new Jetpack_Boost_Not_Premium_Conditional(); $woocommerce_seo_file = 'wpseo-woocommerce/wpseo-woocommerce.php'; $acf_seo_file = 'acf-content-analysis-for-yoast-seo/yoast-acf-analysis.php'; $acf_seo_file_github = 'yoast-acf-analysis/yoast-acf-analysis.php'; $algolia_file = 'wp-search-with-algolia/algolia.php'; $old_algolia_file = 'search-by-algolia-instant-relevant-results/algolia.php'; $host = \YoastSEO()->helpers->url->get_url_host( \get_site_url() ); $addon_manager = new WPSEO_Addon_Manager(); $woocommerce_seo_installed = $addon_manager->is_installed( WPSEO_Addon_Manager::WOOCOMMERCE_SLUG ); $woocommerce_seo_active = \is_plugin_active( $woocommerce_seo_file ); $woocommerce_active = $this->woocommerce_helper->is_active(); $acf_seo_installed = \file_exists( \WP_PLUGIN_DIR . '/' . $acf_seo_file ); $acf_seo_github_installed = \file_exists( \WP_PLUGIN_DIR . '/' . $acf_seo_file_github ); $acf_seo_active = \is_plugin_active( $acf_seo_file ); $acf_seo_github_active = \is_plugin_active( $acf_seo_file_github ); $acf_active = \class_exists( 'acf' ); $algolia_active = \is_plugin_active( $algolia_file ); $edd_active = \class_exists( Easy_Digital_Downloads::class ); $jetpack_boost_active = $jetpack_boost_active_conditional->is_met(); $jetpack_boost_premium = ( ! $jetpack_boost_not_premium_conditional->is_met() ); $old_algolia_active = \is_plugin_active( $old_algolia_file ); $tec_active = \class_exists( Events_Schema::class ); $ssp_active = \class_exists( PodcastEpisode::class ); $wp_recipe_maker_active = \class_exists( WP_Recipe_Maker::class ); $mastodon_active = $this->is_mastodon_active(); $woocommerce_seo_activate_url = \wp_nonce_url( \self_admin_url( 'plugins.php?action=activate&plugin=' . $woocommerce_seo_file ), 'activate-plugin_' . $woocommerce_seo_file ); if ( $acf_seo_installed ) { $acf_seo_activate_url = \wp_nonce_url( \self_admin_url( 'plugins.php?action=activate&plugin=' . $acf_seo_file ), 'activate-plugin_' . $acf_seo_file ); } else { $acf_seo_activate_url = \wp_nonce_url( \self_admin_url( 'plugins.php?action=activate&plugin=' . $acf_seo_file_github ), 'activate-plugin_' . $acf_seo_file_github ); } $acf_seo_install_url = \wp_nonce_url( \self_admin_url( 'update.php?action=install-plugin&plugin=acf-content-analysis-for-yoast-seo' ), 'install-plugin_acf-content-analysis-for-yoast-seo' ); $this->admin_asset_manager->localize_script( 'integrations-page', 'wpseoIntegrationsData', [ 'semrush_integration_active' => $this->options_helper->get( 'semrush_integration_active', true ), 'allow_semrush_integration' => $this->options_helper->get( 'allow_semrush_integration_active', true ), 'algolia_integration_active' => $this->options_helper->get( 'algolia_integration_active', false ), 'allow_algolia_integration' => $this->options_helper->get( 'allow_algolia_integration_active', true ), 'wincher_integration_active' => $this->options_helper->get( 'wincher_integration_active', true ), 'allow_wincher_integration' => null, 'elementor_integration_active' => $elementor_conditional->is_met(), 'jetpack_integration_active' => $jetpack_conditional->is_met(), 'woocommerce_seo_installed' => $woocommerce_seo_installed, 'woocommerce_seo_active' => $woocommerce_seo_active, 'woocommerce_active' => $woocommerce_active, 'woocommerce_seo_activate_url' => $woocommerce_seo_activate_url, 'acf_seo_installed' => $acf_seo_installed || $acf_seo_github_installed, 'acf_seo_active' => $acf_seo_active || $acf_seo_github_active, 'acf_active' => $acf_active, 'acf_seo_activate_url' => $acf_seo_activate_url, 'acf_seo_install_url' => $acf_seo_install_url, 'algolia_active' => $algolia_active || $old_algolia_active, 'edd_integration_active' => $edd_active, 'ssp_integration_active' => $ssp_active, 'tec_integration_active' => $tec_active, 'wp-recipe-maker_integration_active' => $wp_recipe_maker_active, 'mastodon_active' => $mastodon_active, 'is_multisite' => \is_multisite(), 'plugin_url' => \plugins_url( '', \WPSEO_FILE ), 'jetpack-boost_active' => $jetpack_boost_active, 'jetpack-boost_premium' => $jetpack_boost_premium, 'jetpack-boost_logo_link' => WPSEO_Shortlinker::get( 'https://yoa.st/integrations-logo-jetpack-boost' ), 'jetpack-boost_get_link' => WPSEO_Shortlinker::get( 'https://yoa.st/integrations-get-jetpack-boost?domain=' . $host ), 'jetpack-boost_upgrade_link' => WPSEO_Shortlinker::get( 'https://yoa.st/integrations-upgrade-jetpack-boost?domain=' . $host ), 'jetpack-boost_learn_more_link' => \admin_url( 'admin.php?page=jetpack-boost' ), ] ); } /** * Renders the target for the React to mount to. * * @return void */ public function render_target() { ?>