google_fonts = $google_fonts; $this->reader_themes = $reader_themes; $this->rest_preloader = $rest_preloader; $this->dependency_support = $dependency_support; $this->loading_error = $loading_error; $this->site_health = $site_health; } /** * Adds hooks. */ public function register() { add_action( 'admin_menu', [ $this, 'add_menu_items' ], 9 ); $plugin_file = preg_replace( '#.+/(?=.+?/.+?)#', '', AMP__FILE__ ); add_filter( "plugin_action_links_{$plugin_file}", [ $this, 'add_plugin_action_links' ] ); add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_assets' ] ); } /** * Add plugin action links. * * @param array $links Links. * @return array Modified links. */ public function add_plugin_action_links( $links ) { return array_merge( [ 'settings' => sprintf( '%2$s', esc_url( add_query_arg( 'page', $this->get_menu_slug(), admin_url( 'admin.php' ) ) ), esc_html__( 'Settings', 'amp' ) ), ], $links ); } /** * Returns the slug for the settings page. * * @return string */ public function get_menu_slug() { return AMP_Options_Manager::OPTION_NAME; } /** * Add menu. */ public function add_menu_items() { require_once ABSPATH . '/wp-admin/includes/plugin.php'; /* * Note that the admin items for Validated URLs and Validation Errors will also be placed under this admin menu * page when the current user can manage_options. */ add_menu_page( esc_html__( 'AMP Settings', 'amp' ), esc_html__( 'AMP', 'amp' ), 'manage_options', $this->get_menu_slug(), [ $this, 'render_screen' ], self::ICON_BASE64_SVG ); add_submenu_page( $this->get_menu_slug(), esc_html__( 'AMP Settings', 'amp' ), esc_html__( 'Settings', 'amp' ), 'manage_options', $this->get_menu_slug() ); } /** * Provides the settings screen handle. * * @return string */ public function screen_handle() { return sprintf( 'toplevel_page_%s', $this->get_menu_slug() ); } /** * Gets analytics vendors list from data directory. */ public function get_analytics_vendors() { $vendors_list_file = AMP__DIR__ . '/includes/ecosystem-data/analytics-vendors.php'; if ( ! file_exists( $vendors_list_file ) ) { return []; // @codeCoverageIgnore } $vendors_list = require $vendors_list_file; return $vendors_list; } /** * Enqueues settings page assets. * * @since 2.0 * * @param string $hook_suffix The current admin page. */ public function enqueue_assets( $hook_suffix ) { if ( $this->screen_handle() !== $hook_suffix ) { return; } /** This action is documented in includes/class-amp-theme-support.php */ do_action( 'amp_register_polyfills' ); $asset_file = AMP__DIR__ . '/assets/js/' . self::ASSET_HANDLE . '.asset.php'; $asset = require $asset_file; $dependencies = $asset['dependencies']; $version = $asset['version']; wp_enqueue_script( self::ASSET_HANDLE, amp_get_asset_url( 'js/' . self::ASSET_HANDLE . '.js' ), $dependencies, $version, true ); wp_enqueue_style( self::ASSET_HANDLE, amp_get_asset_url( 'css/amp-settings.css' ), [ $this->google_fonts->get_handle(), 'wp-components', ], AMP__VERSION ); wp_styles()->add_data( self::ASSET_HANDLE, 'rtl', 'replace' ); $theme = wp_get_theme(); $is_reader_theme = $this->reader_themes->theme_data_exists( get_stylesheet() ); $page_cache_detail = $this->site_health->get_page_cache_detail( true ); $amp_validated_urls_link = admin_url( add_query_arg( [ 'post_type' => AMP_Validated_URL_Post_Type::POST_TYPE_SLUG ], 'edit.php' ) ); $amp_error_index_link = admin_url( add_query_arg( [ 'taxonomy' => AMP_Validation_Error_Taxonomy::TAXONOMY_SLUG, 'post_type' => AMP_Validated_URL_Post_Type::POST_TYPE_SLUG, ], 'edit-tags.php' ) ); $js_data = [ 'AMP_COMPATIBLE_THEMES_URL' => current_user_can( 'install_themes' ) ? admin_url( '/theme-install.php?browse=amp-compatible' ) : 'https://amp-wp.org/ecosystem/themes/', 'AMP_COMPATIBLE_PLUGINS_URL' => current_user_can( 'install_plugins' ) ? admin_url( '/plugin-install.php?tab=amp-compatible' ) : 'https://amp-wp.org/ecosystem/plugins/', 'AMP_QUERY_VAR' => amp_get_slug(), 'AMP_SCAN_IF_STALE' => QueryVar::AMP_SCAN_IF_STALE, 'CURRENT_THEME' => [ 'name' => $theme->get( 'Name' ), 'description' => $theme->get( 'Description' ), 'is_reader_theme' => $is_reader_theme, 'screenshot' => $theme->get_screenshot() ?: null, 'url' => $theme->get( 'ThemeURI' ), ], 'HAS_DEPENDENCY_SUPPORT' => $this->dependency_support->has_support(), 'OPTIONS_REST_PATH' => '/amp/v1/options', 'READER_THEMES_REST_PATH' => '/amp/v1/reader-themes', 'SCANNABLE_URLS_REST_PATH' => '/amp/v1/scannable-urls', 'LEGACY_THEME_SLUG' => ReaderThemes::DEFAULT_READER_THEME, 'USING_FALLBACK_READER_THEME' => $this->reader_themes->using_fallback_theme(), 'UPDATES_NONCE' => current_user_can( 'install_themes' ) ? wp_create_nonce( 'updates' ) : '', 'USER_FIELD_DEVELOPER_TOOLS_ENABLED' => UserAccess::USER_FIELD_DEVELOPER_TOOLS_ENABLED, 'USER_FIELD_REVIEW_PANEL_DISMISSED_FOR_TEMPLATE_MODE' => UserRESTEndpointExtension::USER_FIELD_REVIEW_PANEL_DISMISSED_FOR_TEMPLATE_MODE, 'USERS_RESOURCE_REST_PATH' => '/wp/v2/users', 'VALIDATE_NONCE' => AMP_Validation_Manager::has_cap() ? AMP_Validation_Manager::get_amp_validate_nonce() : '', 'VALIDATED_URLS_LINK' => $amp_validated_urls_link, 'ERROR_INDEX_LINK' => $amp_error_index_link, 'HAS_PAGE_CACHING' => ( is_array( $page_cache_detail ) && 'good' === $page_cache_detail['status'] ), 'ANALYTICS_VENDORS_LIST' => $this->get_analytics_vendors(), ]; wp_add_inline_script( self::ASSET_HANDLE, sprintf( 'var ampSettings = %s;', wp_json_encode( $js_data ) ), 'before' ); if ( function_exists( 'wp_set_script_translations' ) ) { wp_set_script_translations( self::ASSET_HANDLE, 'amp' ); } elseif ( function_exists( 'wp_get_jed_locale_data' ) || function_exists( 'gutenberg_get_jed_locale_data' ) ) { $locale_data = function_exists( 'wp_get_jed_locale_data' ) ? wp_get_jed_locale_data( 'amp' ) : gutenberg_get_jed_locale_data( 'amp' ); $translations = wp_json_encode( $locale_data ); wp_add_inline_script( self::ASSET_HANDLE, 'wp.i18n.setLocaleData( ' . $translations . ', "amp" );', 'after' ); } $this->add_preload_rest_paths(); } /** * Display Settings. */ public function render_screen() { ?>