plugin_file_path = $plugin_file_path; $this->plugin_dir_path = rtrim( plugin_dir_path( $plugin_file_path ), '/' ); $this->plugin_basename = plugin_basename( $plugin_file_path ); if ( $this->plugin_slug && isset( $GLOBALS['aws_meta'][ $this->plugin_slug ]['version'] ) ) { $this->plugin_version = $GLOBALS['aws_meta'][ $this->plugin_slug ]['version']; } $plugin_headers = array(); if ( is_admin() ) { if ( ! function_exists( 'get_plugin_data' ) ) { require_once ABSPATH . 'wp-admin/includes/plugin.php'; } $plugin_headers = get_plugin_data( $plugin_file_path, false, false ); } // Fallback to generic plugin name if it can't be retrieved from the plugin headers. $this->plugin_name = empty( $plugin_headers['Name'] ) ? 'WP Offload Media' : $plugin_headers['Name']; } /** * Accessor for plugin name. * * @return string */ public function get_plugin_name() { return $this->plugin_name; } /** * Accessor for plugin version * * @return mixed */ public function get_plugin_version() { return $this->plugin_version; } /** * Accessor for plugin slug * * @return string */ public function get_plugin_slug() { return $this->plugin_slug; } /** * Accessor for plugin basename * * @return string */ public function get_plugin_basename() { return $this->plugin_basename; } /** * Accessor for plugin file path * * @return string */ public function get_plugin_file_path() { return $this->plugin_file_path; } /** * Accessor for plugin dir path * * @return string */ public function get_plugin_dir_path() { return $this->plugin_dir_path; } /** * Accessor for plugin sdks dir path * * @return string */ public function get_plugin_sdks_dir_path() { return $this->get_plugin_dir_path() . '/vendor'; } /** * Which page name should we use? * * @return string */ public static function get_plugin_pagenow() { return is_multisite() ? 'settings.php' : 'options-general.php'; } /** * Get a specific setting. * * @param string $key * @param mixed $default * * @return mixed */ public function get_setting( string $key, $default = '' ) { $this->get_settings(); if ( isset( $this->settings[ $key ] ) ) { $setting = $this->settings[ $key ]; } else { $setting = $default; } /** * Filter the setting value retrieved for the given key. * * @param mixed $setting * @param string $key */ return apply_filters( 'as3cf_get_setting', $setting, $key ); } /** * Get a specific setting from the core plugin. * * @param string $key * @param mixed $default * * @return mixed */ public function get_core_setting( string $key, $default = '' ) { return $this->get_setting( $key, $default ); } /** * Add or overwrite new style defined values with legacy value. * * Should be overridden by concrete plugin classes. * * @param array $defines * * @return array */ protected function get_legacy_defined_settings( array $defines ): array { return $defines; } /** * Which defined settings keys are from the standard settings constant? * * @return array */ public function get_non_legacy_defined_settings_keys(): array { static $keys = null; if ( is_null( $keys ) ) { $keys = array_keys( array_diff_key( $this->get_defined_settings(), $this->get_legacy_defined_settings( array() ) ) ); } return $keys; } /** * Allowed settings keys for this plugin. * Meant to be overridden in child classes. * * @param bool $include_legacy Should legacy keys be included? Optional, default false. * * @return array */ public function get_allowed_settings_keys( bool $include_legacy = false ): array { return array(); } /** * Get the settings that should not be shown once saved. * * @return array */ public function get_sensitive_settings(): array { return array(); } /** * Get the blacklisted settings for monitoring changes in defines. * These settings will not be saved in the database. * Meant to be overridden in child classes. * * @return array */ public function get_monitored_settings_blacklist(): array { return array(); } /** * List of settings that should skip full sanitize. * * @return array */ public function get_skip_sanitize_settings(): array { return array(); } /** * List of settings that should be treated as paths. * * @return array */ public function get_path_format_settings(): array { return array(); } /** * List of settings that should be treated as directory paths. * * @return array */ public function get_prefix_format_settings(): array { return array(); } /** * List of settings that should be treated as booleans. * * @return array */ public function get_boolean_format_settings(): array { return array(); } /** * Render a view template file * * @param string $view View filename without the extension * @param array $args Arguments to pass to the view */ public function render_view( $view, $args = array() ) { extract( $args ); include $this->plugin_dir_path . '/view/' . $view . '.php'; } /** * Helper method to return the settings page URL for the plugin * * @param array $args * @param string $url_method To prepend to admin_url() * @param bool $escape Should we escape the URL * * @return string */ public static function get_plugin_page_url( $args = array(), $url_method = 'network', $escape = true ) { $default_args = array( 'page' => static::$plugin_page, ); $args = array_merge( $default_args, $args ); switch ( $url_method ) { case 'self': $base_url = self_admin_url( static::get_plugin_pagenow() ); break; default: $base_url = network_admin_url( static::get_plugin_pagenow() ); } // Add a hash to the URL $hash = false; if ( isset( $args['hash'] ) ) { $hash = $args['hash']; unset( $args['hash'] ); } $url = add_query_arg( $args, $base_url ); if ( $hash ) { $url .= '#' . $hash; } if ( $escape ) { $url = esc_url_raw( $url ); } return $url; } /** * The text for the plugin action link for the plugin on the plugins page. * * @return string */ function get_plugin_action_settings_text() { return __( 'Settings', 'amazon-s3-and-cloudfront' ); } /** * Add a link to the plugin row for the plugin on the plugins page. * Needs to be implemented for an extending class using - * add_filter( 'plugin_action_links', array( $this, 'plugin_actions_settings_link' ), 10, 2 ); * * @param array $links * @param string $file * * @return array */ function plugin_actions_settings_link( $links, $file ) { $url = $this->get_plugin_page_url(); $text = $this->get_plugin_action_settings_text(); $settings_link = '' . esc_html( $text ) . ''; if ( $file == $this->plugin_basename ) { array_unshift( $links, $settings_link ); } return $links; } /** * Enqueue script. * * @param string $handle * @param string $path * @param array $deps * @param bool $footer */ public function enqueue_script( $handle, $path, $deps = array(), $footer = true ) { $version = $this->get_asset_version(); $suffix = $this->get_asset_suffix(); $src = plugins_url( $path . $suffix . '.js', $this->plugin_file_path ); wp_enqueue_script( $handle, $src, $deps, $version, $footer ); } /** * Enqueue style. * * @param string $handle * @param string $path * @param array $deps */ public function enqueue_style( $handle, $path, $deps = array() ) { $version = $this->get_asset_version(); $src = plugins_url( $path . '.css', $this->plugin_file_path ); wp_enqueue_style( $handle, $src, $deps, $version ); } /** * Get the version used for script enqueuing * * @return mixed */ public function get_asset_version() { return defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? time() : $this->plugin_version; } /** * Get the filename suffix used for script enqueuing * * @return mixed */ public function get_asset_suffix() { return defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : '.min'; } /** * Generate Delicious Brains site URL with correct UTM tags. * * @param string $path * @param array $args * @param string $hash * * @return string */ public static function dbrains_url( $path, $args = array(), $hash = '' ) { $args = wp_parse_args( $args, array( 'utm_medium' => 'insideplugin', 'utm_source' => static::get_utm_source(), ) ); $args = array_map( 'urlencode', $args ); $url = trailingslashit( self::DBRAINS_URL ) . ltrim( $path, '/' ); $url = add_query_arg( $args, $url ); if ( $hash ) { $url .= '#' . $hash; } return $url; } /** * Generate WP Engine site URL with correct UTM tags. * * @param string $path * @param array $args * @param string $hash * * @return string */ public static function wpe_url( $path = '', $args = array(), $hash = '' ) { $args = wp_parse_args( $args, array( 'utm_medium' => 'referral', 'utm_source' => 'ome_plugin', 'utm_campaign' => 'bx_prod_referral', ) ); $args = array_map( 'urlencode', $args ); $url = trailingslashit( self::WPE_URL ) . ltrim( $path, '/' ); $url = add_query_arg( $args, $url ); if ( $hash ) { $url .= '#' . $hash; } return $url; } /** * Get UTM source for plugin. * * @return string */ protected static function get_utm_source() { return 'AWS'; } /** * Get UTM content for WP Engine URL. * * @param string $content * * @return string */ protected static function get_wpe_url_utm_content( $content = 'plugin_footer_text' ) { return $content; } /** * Get the My Account URL * * @param array $args * @param string $hash * * @return string */ public function get_my_account_url( $args = array(), $hash = '' ) { return $this->dbrains_url( '/my-account/', $args, $hash ); } /** * Sets up hooks to alter the footer of our admin pages. * * @return void */ protected function init_admin_footer() { add_filter( 'admin_footer_text', array( $this, 'filter_admin_footer_text' ) ); add_filter( 'update_footer', array( $this, 'filter_update_footer' ) ); } /** * Filters the admin footer text to add our own links. * * @param string $text * * @return string */ public function filter_admin_footer_text( $text ) { $product_link = AS3CF_Utils::dbrains_link( static::dbrains_url( '/wp-offload-media/', array( 'utm_campaign' => 'plugin_footer', 'utm_content' => 'footer_colophon' ) ), $this->plugin_name ); $wpe_link = AS3CF_Utils::dbrains_link( static::wpe_url( '', array( 'utm_content' => static::get_wpe_url_utm_content() ) ), 'WP Engine' ); return sprintf( /* translators: %1$s is a link to WP Offload Media's website, and %2$s is a link to WP Engine's website. */ __( '%1$s is developed and maintained by %2$s.', 'amazon-s3-and-cloudfront' ), $product_link, $wpe_link ); } /** * Filters the admin footer's WordPress version text to add our own links. * * @param string $content * * @return string */ public function filter_update_footer( $content ) { $links[] = AS3CF_Utils::dbrains_link( static::dbrains_url( '/wp-offload-media/docs/', array( 'utm_campaign' => 'plugin_footer', 'utm_content' => 'footer_navigation' ) ), __( 'Documentation', 'amazon-s3-and-cloudfront' ) ); $links[] = '' . __( 'Support', 'amazon-s3-and-cloudfront' ) . ''; $links[] = AS3CF_Utils::dbrains_link( static::dbrains_url( '/wp-offload-media/feedback/', array( 'utm_campaign' => 'plugin_footer', 'utm_content' => 'footer_navigation' ) ), __( 'Feedback', 'amazon-s3-and-cloudfront' ) ); $links[] = AS3CF_Utils::dbrains_link( static::dbrains_url( '/wp-offload-media/whats-new/', array( 'utm_campaign' => 'plugin_footer', 'utm_content' => 'footer_navigation' ) ), $this->plugin_name . ' ' . $this->plugin_version, 'whats-new' ); return join( ' ∙ ', $links ); } }