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(), 'wpforms_disabled_entries_count' => count( $this->get_forms_with_disabled_entries( $forms ) ), ]; $wpconsent_source = (string) get_option( 'wpconsent_source', '' ); $wpconsent_date = (int) get_option( 'wpconsent_date', 0 ); if ( $wpconsent_date && strpos( $wpconsent_source, 'WPForms' ) !== false ) { $data['wpforms_wpconsent_date'] = $wpconsent_date; } 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 { 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', 'square-webhooks-id-sandbox', 'square-webhooks-id-live', 'square-webhooks-secret-sandbox', 'square-webhooks-secret-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'] ); } ); } /** * Retrieve forms with disabled entries. * * @since 1.9.8 * * @param array $forms List of forms. * * @return array. */ private function get_forms_with_disabled_entries( array $forms ): array { return array_filter( $forms, static function ( $form ) { return ! empty( $form->post_content['settings']['disable_entries'] ); } ); } /** * 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.TooHigh $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 { $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; } } TV Shows Archive - Bienvenue sur - SIMANDOU TV
Featured

Almost two years after a virus wiped out most of the human race, Phil Miller only wishes for some company, but soon gets more than he bargained for when that company shows up in the form of other survivors.

A Congressman works with his equally conniving wife to exact revenge on the people who betrayed him.

Featured

The trials and tribulations of criminal lawyer, Jimmy McGill, in the time leading up to establishing his strip-mall law office in Albuquerque, New Mexico.

Follow Jeremy, Richard, and James, as they embark on an adventure across the globe. Driving new and exciting automobiles from manufacturers all over the world.

An anthology series exploring a twisted, high-tech world where humanity's greatest innovations and darkest instincts collide.

, , 2013 - 2017, 2018 & 2019

Vikings

New Season 5 just flow in. Watch and Debate

Featured
, 2017 - 2018

Beyond

A young man wakes up from a 12 year coma to discover new abilities that come to propel him into the middle of a dangerous conspiracy

Featured

Set ninety-seven years after a nuclear war has destroyed civilization, when a spaceship housing humanity's lone survivors sends one hundred juvenile delinquents back to Earth, in hopes of possibly re-populating the planet.

Featured

A high school chemistry teacher diagnosed with inoperable lung cancer turns to manufacturing and selling methamphetamine in order to secure his family's future.

Featured

A modern update finds the famous sleuth and his doctor partner solving crime in 21st century London

Featured

A woman who moves into an apartment across the hall from two brilliant but socially awkward physicists shows them how little they know about life outside of the laboratory.

, 2011 - 2012

Homeland

A bipolar CIA operative becomes convinced a prisoner of war has been turned by al-Qaeda and is planning to carry out a terrorist attack on American soil.

Showing all 13 results