*/ namespace RankMath\Analytics\Workflow; use Exception; use RankMath\Helper; use RankMath\Helpers\DB; use RankMath\Traits\Hooker; defined( 'ABSPATH' ) || exit; /** * Objects class. */ class Objects extends Base { use Hooker; /** * Constructor. */ public function __construct() { $done = \boolval( get_option( 'rank_math_analytics_installed' ) ); if ( $done ) { return; } $this->create_tables(); $this->create_data_job(); $this->flat_posts(); update_option( 'rank_math_analytics_installed', true ); } /** * Create tables. */ public function create_tables() { global $wpdb; $collate = $wpdb->get_charset_collate(); $table = 'rank_math_analytics_objects'; // Early Bail!! if ( DB::check_table_exists( $table ) ) { return; } $schema = "CREATE TABLE {$wpdb->prefix}{$table} ( id bigint(20) unsigned NOT NULL auto_increment, created timestamp NOT NULL, title text NOT NULL, page varchar(500) NOT NULL, object_type varchar(100) NOT NULL, object_subtype varchar(100) NOT NULL, object_id bigint(20) unsigned NOT NULL, primary_key varchar(255) NOT NULL, seo_score tinyint NOT NULL default 0, page_score tinyint NOT NULL default 0, is_indexable tinyint(1) NOT NULL default 1, schemas_in_use varchar(500), desktop_interactive double default 0, desktop_pagescore double default 0, mobile_interactive double default 0, mobile_pagescore double default 0, pagespeed_refreshed timestamp, PRIMARY KEY (id), KEY analytics_object_page (page(190)) ) $collate;"; require_once ABSPATH . 'wp-admin/includes/upgrade.php'; try { dbDelta( $schema ); } catch ( Exception $e ) { // phpcs:ignore // Will log. } } /** * Create jobs to fetch data. */ public function create_data_job() { // Clear old schedule. wp_clear_scheduled_hook( 'rank_math/analytics/get_analytics' ); // Add action for scheduler. $task_name = 'rank_math/analytics/data_fetch'; $fetch_gap = apply_filters( 'rank_math/analytics/fetch_gap', 7, 'objects' ); // Schedule new action only when there is no existing action. if ( false === as_next_scheduled_action( $task_name ) ) { $schedule_in_minute = wp_rand( 3, defined( 'RANK_MATH_PRO_FILE' ) ? 1380 : 4320 ); $time_to_schedule = ( strtotime( 'tomorrow' ) + ( $schedule_in_minute * MINUTE_IN_SECONDS ) ); as_schedule_recurring_action( $time_to_schedule, DAY_IN_SECONDS * $fetch_gap, $task_name, [], 'rank-math' ); } } /** * Flat posts */ public function flat_posts() { $post_types = $this->do_filter( 'analytics/post_types', Helper::get_accessible_post_types() ); unset( $post_types['attachment'] ); $ids = get_posts( [ 'post_type' => array_keys( $post_types ), 'post_status' => 'publish', 'fields' => 'ids', 'posts_per_page' => -1, ] ); $counter = 0; $chunks = \array_chunk( $ids, 50 ); foreach ( $chunks as $chunk ) { $counter++; as_schedule_single_action( time() + ( 60 * ( $counter / 2 ) ), 'rank_math/analytics/flat_posts', [ $chunk ], 'rank-math' ); } // Check for posts. as_schedule_single_action( time() + ( 60 * ( ( $counter + 1 ) / 2 ) ), 'rank_math/analytics/flat_posts_completed', [], 'rank-math' ); // Clear cache. Workflow::add_clear_cache( time() + ( 60 * ( ( $counter + 2 ) / 2 ) ) ); } }