<?php if ( ! defined( 'ABSPATH' ) ) { die( 'You are not allowed to call this page directly.' ); } /** * @since 3.06.04 */ class FrmUsageController { /** * Option name of flows data. * * @since 6.16.1 * * @var string */ const FLOWS_ACTION_NAME = 'frm_usage_tracking_flows'; /** * Randomize the first send to prevent our servers from crashing. * * @since 3.06.04 * * @return void */ public static function schedule_send() { $timestamp = wp_next_scheduled( 'formidable_send_usage' ); if ( ! self::tracking_allowed() ) { if ( $timestamp ) { // Remove the scheduled event if it's not allowed and it's scheduled. wp_unschedule_event( $timestamp, 'formidable_send_usage' ); } return; } if ( $timestamp ) { return; } $tracking = array( 'day' => random_int( 0, 6 ) * DAY_IN_SECONDS, 'hour' => random_int( 0, 23 ) * HOUR_IN_SECONDS, 'minute' => random_int( 0, 59 ) * MINUTE_IN_SECONDS, 'second' => random_int( 0, 59 ), ); $offset = array_sum( $tracking ); $init_send = strtotime( 'next sunday' ) + $offset; wp_schedule_event( $init_send, 'weekly', 'formidable_send_usage' ); } /** * Adds once weekly to the existing schedules. * * @since 3.06.04 * * @param array $schedules Schedules. * * @return array */ public static function add_schedules( $schedules = array() ) { $schedules['weekly'] = array( 'interval' => DAY_IN_SECONDS * 7, 'display' => __( 'Once Weekly', 'formidable' ), ); return $schedules; } /** * Checks if tracking is allowed. * * @since 6.16.3 * * @return bool */ public static function tracking_allowed() { $settings = FrmAppHelper::get_settings(); return $settings->tracking; } /** * @since 3.06.04 * * @return void */ public static function send_snapshot() { $usage = new FrmUsage(); $usage->send_snapshot(); } /** * Loads scripts. * * @since 6.16.1 * * @return void */ public static function load_scripts() { if ( self::is_forms_list_page() || FrmAppHelper::is_admin_page( 'formidable-form-templates' ) || FrmAppHelper::is_admin_page() ) { wp_enqueue_script( 'frm-usage-tracking', FrmAppHelper::plugin_url() . '/js/admin/usage-tracking.js', array( 'formidable_dom' ), FrmAppHelper::$plug_version, true ); } } /** * Checks if is forms list page. * * @since 6.16.1 * * @return bool */ private static function is_forms_list_page() { if ( ! FrmAppHelper::on_form_listing_page() ) { return false; } // Exclude Trash page. $form_type = FrmAppHelper::simple_get( 'form_type' ); return 'published' === $form_type; } /** * AJAX handler to track flows. * * @since 6.16.1 * * @return void */ public static function ajax_track_flows() { FrmAppHelper::permission_check( 'frm_view_forms' ); check_ajax_referer( 'frm_ajax', 'nonce' ); $key = FrmAppHelper::get_post_param( 'key', '', 'sanitize_text_field' ); $value = FrmAppHelper::get_post_param( 'value', '', 'sanitize_text_field' ); self::update_flows_data( $key, $value ); wp_send_json_success(); } /** * Updates flows data. * * @since 6.16.1 * * @param string $key Flow key. * @param string $value Flow value. * * @return void */ public static function update_flows_data( $key, $value ) { if ( '' === $key || '' === $value ) { return; } $flows_data = self::get_flows_data(); if ( ! isset( $flows_data[ $key ] ) ) { $flows_data[ $key ] = array(); } if ( ! isset( $flows_data[ $key ][ $value ] ) ) { $flows_data[ $key ][ $value ] = 0; } $flows_data[ $key ][ $value ]++; update_option( self::FLOWS_ACTION_NAME, $flows_data ); } /** * Get flows data. * * @since 6.16.1 * * @return array */ public static function get_flows_data() { return get_option( self::FLOWS_ACTION_NAME, array() ); } }