ic function get_by_slugs( $slugs ) { if ( empty( $slugs ) || ! is_array( $slugs ) ) { return []; } $result_addons = []; foreach ( $slugs as $slug ) { $addon = $this->get_addon( $slug ); if ( ! empty( $addon ) ) { $result_addons[] = $addon; } } return $result_addons; } /** * Get available addon data by slug. * * @since 1.6.6 * * @param string $slug Addon slug, can be both "wpforms-drip" and "drip". * * @return array Single addon data. Empty array if addon is not found. */ public function get_addon( $slug ) { $slug = 'wpforms-' . str_replace( 'wpforms-', '', sanitize_key( $slug ) ); $addon = ! empty( $this->available_addons[ $slug ] ) ? $this->available_addons[ $slug ] : []; // In case if addon is "not available" let's try to get and prepare addon data from all addons. if ( empty( $addon ) ) { $addon = ! empty( $this->addons[ $slug ] ) ? $this->prepare_addon_data( $this->addons[ $slug ] ) : []; } return $addon; } /** * Get license level of the addon. * * @since 1.6.6 * * @param array|string $addon Addon data array OR addon slug. * * @return string License level: pro | elite. */ private function get_license_level( $addon ) { if ( empty( $addon ) ) { return ''; } $levels = [ self::BASIC, self::PLUS, self::PRO, self::ELITE, self::AGENCY, self::ULTIMATE ]; $license = ''; $addon_license = $this->get_addon_license( $addon ); foreach ( $levels as $level ) { if ( in_array( $level, $addon_license, true ) ) { $license = $level; break; } } if ( empty( $license ) ) { return ''; } return in_array( $license, [ self::BASIC, self::PLUS, self::PRO ], true ) ? self::PRO : self::ELITE; } /** * Get addon license. * * @since 1.8.2 * * @param array|string $addon Addon data array OR addon slug. * * @return array */ private function get_addon_license( $addon ) { $addon = is_string( $addon ) ? $this->get_addon( $addon ) : $addon; return $this->default_data( $addon, 'license', [] ); } /** * Determine if user's license level has access. * * @since 1.6.6 * * @param array|string $addon Addon data array OR addon slug. * * @return bool */ protected function has_access( $addon ) { return false; } /** * Return array of addons available to display. All data prepared and normalized. * "Available to display" means that addon need to be displayed as education item (addon is not installed or not activated). * * @since 1.6.6 * * @return array */ public function get_available() { if ( empty( $this->addons ) || ! is_array( $this->addons ) ) { return []; } if ( empty( $this->available_addons ) ) { $this->available_addons = array_map( [ $this, 'prepare_addon_data' ], $this->addons ); $this->available_addons = array_filter( $this->available_addons, static function( $addon ) { return isset( $addon['status'], $addon['plugin_allow'] ) && ( $addon['status'] !== 'active' || ! $addon['plugin_allow'] ); } ); } return $this->available_addons; } /** * Prepare addon data. * * @since 1.6.6 * * @param array $addon Addon data. * * @return array Extended addon data. */ protected function prepare_addon_data( $addon ) { if ( empty( $addon ) ) { return []; } $addon['title'] = $this->default_data( $addon, 'title', '' ); $addon['slug'] = $this->default_data( $addon, 'slug', '' ); // We need the cleared name of the addon, without the ' addon' suffix, for further use. $addon['name'] = preg_replace( '/ addon$/i', '', $addon['title'] ); $addon['modal_name'] = sprintf( /* translators: %s - addon name. */ esc_html__( '%s addon', 'wpforms-lite' ), $addon['name'] ); $addon['clear_slug'] = str_replace( 'wpforms-', '', $addon['slug'] ); $addon['utm_content'] = ucwords( str_replace( '-', ' ', $addon['clear_slug'] ) ); $addon['license'] = $this->default_data( $addon, 'license', [] ); $addon['license_level'] = $this->get_license_level( $addon ); $addon['icon'] = $this->default_data( $addon, 'icon', '' ); $addon['path'] = sprintf( '%1$s/%1$s.php', $addon['slug'] ); $addon['video'] = $this->default_data( $addon, 'video', '' ); $addon['plugin_allow'] = $this->has_access( $addon ); $addon['status'] = 'missing'; $addon['action'] = 'upgrade'; $addon['page_url'] = $this->default_data( $addon, 'url', '' ); $addon['doc_url'] = $this->default_data( $addon, 'doc', '' ); $addon['url'] = ''; static $nonce = ''; $nonce = empty( $nonce ) ? wp_create_nonce( 'wpforms-admin' ) : $nonce; $addon['nonce'] = $nonce; return $addon; } /** * Get default data. * * @since 1.8.2 * * @param array $addon Addon data. * @param string $key Key. * @param mixed $default Default data. * * @return array|string|mixed */ private function default_data( $addon, $key, $default ) { if ( is_string( $default ) ) { return ! empty( $addon[ $key ] ) ? $addon[ $key ] : $default; } if ( is_array( $default ) ) { return ! empty( $addon[ $key ] ) ? (array) $addon[ $key ] : $default; } return $addon[ $key ]; } }