h( $_SERVER['SERVER_SOFTWARE'] ) ) : '', 'is_ssl' => is_ssl(), 'is_multisite' => is_multisite(), 'is_network_activated' => $this->is_active_for_network(), 'is_wpcom' => defined( 'IS_WPCOM' ) && IS_WPCOM, 'is_wpcom_vip' => ( defined( 'WPCOM_IS_VIP_ENV' ) && WPCOM_IS_VIP_ENV ) || ( function_exists( 'wpcom_is_vip' ) && wpcom_is_vip() ), 'is_wp_cache' => defined( 'WP_CACHE' ) && WP_CACHE, 'is_wp_rest_api_enabled' => $this->is_rest_api_enabled(), 'is_user_logged_in' => is_user_logged_in(), 'sites_count' => $this->get_sites_total(), 'active_plugins' => $this->get_active_plugins(), 'theme_name' => $theme_data->get( 'Name' ), 'theme_version' => $theme_data->get( 'Version' ), 'locale' => get_locale(), 'timezone_offset' => wp_timezone_string(), // WPForms-specific data. 'wpforms_version' => WPFORMS_VERSION, 'wpforms_license_key' => wpforms_get_license_key(), 'wpforms_license_type' => $this->get_license_type(), 'wpforms_license_status' => $this->get_license_status(), 'wpforms_is_pro' => wpforms()->is_pro(), 'wpforms_entries_avg' => $this->get_entries_avg( $forms_total, $entries_total ), 'wpforms_entries_total' => $entries_total, 'wpforms_entries_last_7days' => $this->get_entries_total( '7days' ), 'wpforms_entries_last_30days' => $this->get_entries_total( '30days' ), 'wpforms_forms_total' => $forms_total, 'wpforms_form_fields_count' => $form_fields_count, 'wpforms_form_templates_total' => $form_templates_total, 'wpforms_form_antispam_stat' => $this->get_form_antispam_stat( $forms ), 'wpforms_challenge_stats' => get_option( 'wpforms_challenge', [] ), 'wpforms_lite_installed_date' => $this->get_installed( $activated_dates, 'lite' ), 'wpforms_pro_installed_date' => $this->get_installed( $activated_dates, 'pro' ), 'wpforms_builder_opened_date' => (int) get_option( 'wpforms_builder_opened_date', 0 ), 'wpforms_settings' => $this->get_settings( $forms ), 'wpforms_integration_active' => $this->get_forms_integrations( $forms ), 'wpforms_payments_active' => $this->get_payments_active( $forms ), 'wpforms_product_quantities' => [ 'payment-single' => $this->count_fields_with_setting( $forms, 'payment-single', 'enable_quantity' ), 'payment-select' => $this->count_fields_with_setting( $forms, 'payment-select', 'enable_quantity' ), ], 'wpforms_order_summaries' => $this->count_fields_with_setting( $forms, 'payment-total', 'summary' ), 'wpforms_multiple_confirmations' => count( $this->get_forms_with_multiple_confirmations( $forms ) ), 'wpforms_multiple_notifications' => count( $this->get_forms_with_multiple_notifications( $forms ) ), 'wpforms_ajax_form_submissions' => count( $this->get_ajax_form_submissions( $forms ) ), 'wpforms_notification_count' => wpforms()->obj( 'notifications' )->get_count(), 'wpforms_stats' => $this->get_additional_stats(), 'wpforms_ai' => AIHelpers::is_used(), 'wpforms_ai_killswitch' => AIHelpers::is_disabled(), ]; if ( ! empty( $first_form_date ) ) { $data['wpforms_forms_first_created'] = $first_form_date; } if ( $data['is_multisite'] ) { $data['url_primary'] = network_site_url(); } return $data; } /** * Get the license type. * * @since 1.6.1 * @since 1.7.2 Clarified the license type. * @since 1.7.9 Return only the license type, not the status. * * @return string */ private function get_license_type(): string { return wpforms()->is_pro() ? wpforms_get_license_type() : 'lite'; } /** * Get the license status. * * @since 1.7.9 * * @return string */ private function get_license_status(): string { // phpcs:ignore Generic.Metrics.CyclomaticComplexity.TooHigh if ( ! wpforms()->is_pro() ) { return 'lite'; } $license_type = wpforms_get_license_type(); $license_key = wpforms_get_license_key(); if ( ! $license_type ) { return empty( $license_key ) ? 'no license' : 'not verified'; } if ( wpforms_setting( 'is_expired', false, 'wpforms_license' ) ) { return 'expired'; } if ( wpforms_setting( 'is_disabled', false, 'wpforms_license' ) ) { return 'disabled'; } if ( wpforms_setting( 'is_invalid', false, 'wpforms_license' ) ) { return 'invalid'; } // The correct type is returned in get_license_type(), so we "collapse" them here to a single value. if ( in_array( $license_type, [ 'basic', 'plus', 'pro', 'elite', 'ultimate', 'agency' ], true ) ) { $license_type = 'correct'; } return $license_type; } /** * Get all settings, except those with sensitive data. * * @since 1.6.1 * @since 1.9.3 Added $forms parameter. * * @param array $forms List of forms. * * @return array */ private function get_settings( array $forms ): array { // Remove keys with exact names that we don't need. $settings = array_diff_key( get_option( 'wpforms_settings', [] ), array_flip( [ 'stripe-test-secret-key', 'stripe-test-publishable-key', 'stripe-live-secret-key', 'stripe-live-publishable-key', 'stripe-webhooks-secret-test', 'stripe-webhooks-secret-live', 'stripe-webhooks-id-test', 'stripe-webhooks-id-live', 'authorize_net-test-api-login-id', 'authorize_net-test-transaction-key', 'authorize_net-live-api-login-id', 'authorize_net-live-transaction-key', 'square-location-id-sandbox', 'square-location-id-production', 'geolocation-google-places-api-key', 'geolocation-algolia-places-application-id', 'geolocation-algolia-places-search-only-api-key', 'geolocation-mapbox-search-access-token', 'recaptcha-site-key', 'recaptcha-secret-key', 'recaptcha-fail-msg', 'hcaptcha-site-key', 'hcaptcha-secret-key', 'hcaptcha-fail-msg', 'turnstile-site-key', 'turnstile-secret-key', 'turnstile-fail-msg', 'pdf-ninja-api_key', ] ) ); $data = []; // Remove keys with a vague names that we don't need. foreach ( $settings as $key => $value ) { if ( strpos( $key, 'validation-' ) !== false ) { continue; } $data[ $key ] = $value; } $lite_connect_data = get_option( Integration::get_option_name() ); // If lite connect has been restored, set lite connect data. if ( isset( $lite_connect_data['import']['status'] ) && $lite_connect_data['import']['status'] === 'done' ) { $data['lite_connect'] = [ 'restore_date' => $lite_connect_data['import']['ended_at'], 'restored_entry_count' => Integration::get_entries_count(), ]; } // Add Dropbox Delete Local Files setting usage count. $data['dropbox_delete_local_files_setting_count'] = $this->get_dropbox_delete_local_files_setting_count( $forms ); // Add favorite templates to the settings array. return array_merge( $data, $this->get_favorite_templates() ); } /** * Get the count of forms with Delete Local Files active option for Dropbox. * * @since 1.9.3 * * @param array $forms List of forms. * * @return int */ private function get_dropbox_delete_local_files_setting_count( array $forms ): int { $delete_local_files_count = 0; foreach ( $forms as $form ) { // Check if the Dropbox integration is configured in the form. if ( empty( $form->post_content['providers']['dropbox'] ) ) { continue; } // Delete Local Files option is applied for all connections if applied, // so it's enough to check the first connection only. $connection = current( $form->post_content['providers']['dropbox'] ); if ( ! $connection || ! isset( $connection['delete_local_files'] ) ) { continue; } ++$delete_local_files_count; } return $delete_local_files_count; } /** * Get the list of active plugins. * * @since 1.6.1 * * @return array */ private function get_active_plugins(): array { if ( ! function_exists( 'get_plugins' ) ) { include ABSPATH . '/wp-admin/includes/plugin.php'; } $active = is_multisite() ? array_merge( get_option( 'active_plugins', [] ), array_flip( get_site_option( 'active_sitewide_plugins', [] ) ) ) : get_option( 'active_plugins', [] ); $plugins = array_intersect_key( get_plugins(), array_flip( $active ) ); return array_map( static function ( $plugin ) { if ( isset( $plugin['Version'] ) ) { return $plugin['Version']; } return 'Not Set'; }, $plugins ); } /** * Installed date. * * @since 1.6.1 * * @param array $activated_dates Input array with dates. * @param string $key Input key what you want to get. * * @return mixed */ private function get_installed( array $activated_dates, string $key ) { if ( ! empty( $activated_dates[ $key ] ) ) { return $activated_dates[ $key ]; } return false; } /** * Number of forms with some integrations active. * * @since 1.6.1 * * @param array $forms List of forms. * * @return array List of forms with active integrations count. */ private function get_forms_integrations( array $forms ): array { $integrations = array_map( static function ( $form ) { if ( empty( $form->post_content['providers'] ) ) { return false; } $active_integrations = []; foreach ( $form->post_content['providers'] as $provider_slug => $connections ) { if ( ! empty( $connections ) ) { $active_integrations[] = $provider_slug; } } return $active_integrations; }, $forms ); $integrations = array_filter( $integrations ); if ( count( $integrations ) > 0 ) { $integrations = call_user_func_array( 'array_merge', array_values( $integrations ) ); } return array_count_values( $integrations ); } /** * Number of forms with active payments. * * @since 1.6.1 * * @param array $forms Input forms list. * * @return array List of forms with active payments count. */ private function get_payments_active( array $forms ): array { $payments = array_map( static function ( $form ) { if ( empty( $form->post_content['payments'] ) ) { return false; } $enabled = []; foreach ( $form->post_content['payments'] as $key => $value ) { if ( ! empty( $value['enable'] ) ) { $enabled[] = $key; } } return empty( $enabled ) ? false : $enabled; }, $forms ); $payments = array_filter( $payments ); if ( count( $payments ) > 0 ) { $payments = call_user_func_array( 'array_merge', array_values( $payments ) ); } return array_count_values( $payments ); } /** * Forms with multiple notifications. * * @since 1.6.1 * * @param array $forms List of forms to check. * * @return array List of forms with multiple notifications. */ private function get_forms_with_multiple_notifications( array $forms ): array { return array_filter( $forms, static function ( $form ) { return ! empty( $form->post_content['settings']['notifications'] ) && count( $form->post_content['settings']['notifications'] ) > 1; } ); } /** * Forms with multiple confirmations. * * @since 1.6.1 * * @param array $forms List of forms to check. * * @return array List of forms with multiple confirmations. */ private function get_forms_with_multiple_confirmations( array $forms ): array { return array_filter( $forms, static function ( $form ) { return ! empty( $form->post_content['settings']['confirmations'] ) && count( $form->post_content['settings']['confirmations'] ) > 1; } ); } /** * Forms with ajax submission option enabled. * * @since 1.6.1 * * @param array $forms All forms. * * @return array */ private function get_ajax_form_submissions( array $forms ): array { return array_filter( $forms, static function ( $form ) { return ! empty( $form->post_content['settings']['ajax_submit'] ); } ); } /** * Total number of sites. * * @since 1.6.1 * * @return int */ private function get_sites_total(): int { return function_exists( 'get_blog_count' ) ? (int) get_blog_count() : 1; } /** * Total number of entries. * * @since 1.6.1 * * @param string $period Which period should be counted? Possible values: 7days, 30days. * Everything else will mean "all" entries. * * @return int */ private function get_entries_total( string $period = 'all' ): int { if ( ! wpforms()->is_pro() ) { return $this->get_entries_total_lite( $period ); } $args = []; // Limit results to only forms, excluding form templates. $form_ids = wp_list_pluck( $this->get_all_forms(), 'ID' ); if ( ! empty( $form_ids ) ) { $args['form_id'] = $form_ids; } switch ( $period ) { case '7days': $args = [ 'date' => [ gmdate( 'Y-m-d', strtotime( '-7 days' ) ), gmdate( 'Y-m-d' ), ], ]; break; case '30days': $args = [ 'date' => [ gmdate( 'Y-m-d', strtotime( '-30 days' ) ), gmdate( 'Y-m-d' ), ], ]; break; } $entry_obj = wpforms()->obj( 'entry' ); return $entry_obj ? $entry_obj->get_entries( $args, true ) : 0; } /** * Total number of entries in Lite. * * @since 1.9.0 * * @param string $period Which period should be counted? Possible values: 7days, 30days. * Everything else will mean "all" entries. * * @return int */ private function get_entries_total_lite( string $period = 'all' ): int { if ( $period === '7days' || $period === '30days' ) { return 0; } global $wpdb; // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching $count = $wpdb->get_var( "SELECT SUM(meta_value) FROM $wpdb->postmeta WHERE meta_key = 'wpforms_entries_count';" ); return (int) $count; } /** * Forms field occurrences. * * @since 1.7.9 * * @param array $forms List of forms. * * @return array List of field occurrences in all forms created. */ private function get_form_fields_count( array $forms ): array { // Bail early, in case there are no forms created yet! if ( empty( $forms ) ) { return []; } $fields = array_map( static function ( $form ) { return $form->post_content['fields'] ?? []; }, $forms ); $fields_flatten = array_merge( [], ...$fields ); $field_types = array_column( $fields_flatten, 'type' ); return array_count_values( $field_types ); } /** * Determines whether the plugin is active for the entire network. * * This is a copy of the WP core is_plugin_active_for_network() function. * * @since 1.8.2 * * @return bool */ private function is_active_for_network(): bool { // Bail early, in case we are not in multisite. if ( ! is_multisite() ) { return false; } // Get all active plugins. $plugins = get_site_option( 'active_sitewide_plugins' ); // Bail early, in case the plugin is active for the entire network. if ( isset( $plugins[ plugin_basename( WPFORMS_PLUGIN_FILE ) ] ) ) { return true; } return false; } /** * Average entries count. * * @since 1.6.1 * * @param int $forms Total forms count. * @param int $entries Total entries count. * * @return int */ private function get_entries_avg( int $forms, int $entries ): int { return $forms ? round( $entries / $forms ) : 0; } /** * Get all forms. * * @since 1.6.1 * @since 1.8.9 Added post_type parameter. * * @param string|string[] $post_type Allow to sort result by post_type. By default, it's 'wpforms'. * * @return array */ private function get_all_forms( $post_type = 'wpforms' ): array { $forms = wpforms()->obj( 'form' )->get( '', [ 'post_type' => $post_type ] ); if ( ! is_array( $forms ) ) { return []; } return array_map( static function ( $form ) { $form->post_content = wpforms_decode( $form->post_content ); return $form; }, $forms ); } /** * Get the favorite templates. * * @since 1.7.7 * * @return array */ private function get_favorite_templates(): array { $settings = []; $templates = (array) get_option( Templates::FAVORITE_TEMPLATES_OPTION, [] ); foreach ( $templates as $user_templates ) { foreach ( $user_templates as $template => $v ) { $name = 'fav_templates_' . str_replace( '-', '_', $template ); $settings[ $name ] = empty( $settings[ $name ] ) ? 1 : ++$settings[ $name ]; } } return $settings; } /** * Test if the REST API is accessible. * * The REST API might be inaccessible due to various security measures, * or it might be completely disabled by a plugin. * * @since 1.8.2.2 * * @return bool */ private function is_rest_api_enabled(): bool { // phpcs:disable WPForms.PHP.ValidateHooks.InvalidHookName /** This filter is documented in wp-includes/class-wp-http-streams.php */ $sslverify = apply_filters( 'https_local_ssl_verify', false ); // phpcs:enable WPForms.PHP.ValidateHooks.InvalidHookName $url = rest_url( 'wp/v2/types/post' ); $response = wp_remote_get( $url, [ 'timeout' => 10, 'cookies' => is_user_logged_in() ? wp_unslash( $_COOKIE ) : [], 'sslverify' => $sslverify, 'headers' => [ 'Cache-Control' => 'no-cache', 'X-WP-Nonce' => wp_create_nonce( 'wp_rest' ), ], ] ); // When testing the REST API, an error was encountered, leave early. if ( is_wp_error( $response ) ) { return false; } // When testing the REST API, an unexpected result was returned, leave early. if ( wp_remote_retrieve_response_code( $response ) !== 200 ) { return false; } // The REST API did not behave correctly, leave early. if ( ! wpforms_is_json( wp_remote_retrieve_body( $response ) ) ) { return false; } // We are all set. Confirm the connection. return true; } /** * Retrieves additional statistics. * * @since 1.8.8 * * @return array */ private function get_additional_stats(): array { // Initialize an empty array to store the statistics. $stats = []; return $this->get_admin_pointer_stats( $stats ); } /** * Retrieves statistics for admin pointers. * This function retrieves statistics for admin pointers based on their engagement or dismissal status. * * Note: Pointers can only be engaged (interacted with) or dismissed. * * - If the value is 1 or true, it means the pointer is shown and interacted with (engaged). * - If the value is 0 or false, it means the pointer is dismissed. * - If there is no pointer ID in the stats, it means the user hasn't seen the pointer yet. * * @since 1.8.8 * * @param array $stats An array containing existing statistics. * * @return array */ private function get_admin_pointer_stats( array $stats ): array { $pointers = get_option( 'wpforms_pointers', [] ); // If there are no pointers, return empty statistics. if ( empty( $pointers ) ) { return $stats; } // Pointers can only be interacted with or dismissed. // If there are engagement pointers, process them. if ( isset( $pointers['engagement'] ) ) { foreach ( $pointers['engagement'] as $pointer ) { $stats[ sanitize_key( $pointer ) ] = true; } } // If there are dismiss pointers, process them. if ( isset( $pointers['dismiss'] ) ) { foreach ( $pointers['dismiss'] as $pointer ) { $stats[ sanitize_key( $pointer ) ] = false; } } return $stats; } /** * Retrieves form anti-spam settings statistic. * * @since 1.9.0 * * @param array $forms List of forms and their settings. * * @return array */ private function get_form_antispam_stat( array $forms ): array { // phpcs:ignore Generic.Metrics.CyclomaticComplexity.MaxExceeded $stat = [ 'antispam' => 0, 'antispam_v3' => 0, 'akismet' => 0, 'store_spam_entries' => 0, 'time_limit' => 0, 'country_filter' => 0, 'keyword_filter' => 0, 'captcha' => 0, ]; foreach ( $forms as $form ) { $settings = $form->post_content['settings'] ?? []; // Skip forms with disabled anti-spam settings. if ( empty( $settings['antispam'] ) && empty( $settings['antispam_v3'] ) ) { continue; } // Increment the counters for each form with enabled anti-spam settings. $stat['antispam'] += ! empty( $settings['antispam'] ) ? 1 : 0; // Classic anti-spam enabled. $stat['antispam_v3'] += ! empty( $settings['antispam_v3'] ) ? 1 : 0; // Modern anti-spam enabled. $anti_spam = $settings['anti_spam'] ?? []; // Increment the counter for each enabled anti-spam feature. $stat['akismet'] += ! empty( $anti_spam['akismet'] ) ? 1 : 0; $stat['store_spam_entries'] += ! empty( $settings['store_spam_entries'] ) ? 1 : 0; $stat['time_limit'] += ! empty( $anti_spam['time_limit']['enable'] ) ? 1 : 0; $stat['country_filter'] += ! empty( $anti_spam['country_filter']['enable'] ) ? 1 : 0; $stat['keyword_filter'] += ! empty( $anti_spam['keyword_filter']['enable'] ) ? 1 : 0; $stat['captcha'] += ! empty( $settings['recaptcha'] ) ? 1 : 0; } // Count the list of keywords for the keyword filter. $keyword_filter = wpforms()->obj( 'antispam_keyword_filter' ); $keywords = method_exists( $keyword_filter, 'get_keywords' ) ? $keyword_filter->get_keywords() : []; $stat['keywords'] = count( $keywords ); return $stat; } /** * Count how many field have a specific setting enabled. * * @since 1.9.0.3 * * @param array $forms Published forms. * @param string $field_type Field type. * @param string $field_setting Field setting. * * @return int */ private function count_fields_with_setting( array $forms, string $field_type, string $field_setting ): int { // phpcs:ignore Generic.Metrics.CyclomaticComplexity.TooHigh $counter = 0; // Bail early, in case there are no forms. if ( empty( $forms ) ) { return $counter; } // Go through all forms. foreach ( $forms as $form ) { $fields = $form->post_content['fields'] ?? []; if ( empty( $fields ) ) { continue; } // Go through all fields on the form. foreach ( $fields as $field ) { if ( ! empty( $field['type'] ) && $field['type'] === $field_type && ! empty( $field[ $field_setting ] ) ) { ++$counter; } } } return $counter; } } compare – داروخانه دکتر سیده زهره حسینی

دسته بندی کالاها

ورود به سایت

بازنشانی رمز عبور

تا کنون ثبت نام نکرده اید؟ثبت نام

عضویت

شماره موبایل یا ایمیل را وارد کنید

پسورد را وارد کنید

ثبت نام

سبد خالی

مقایسه محصولات در دسته