You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

153 lines
3.5 KiB
PHTML

<?php
/**
* Install objects.
*
* @since 1.0.49
* @package RankMath
* @subpackage RankMath\modules
* @author Rank Math <support@rankmath.com>
*/
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 ) ) );
}
}