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
PHP
153 lines
3.5 KiB
PHP
<?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 ) ) );
|
|
}
|
|
}
|