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.
211 lines
4.9 KiB
PHP
211 lines
4.9 KiB
PHP
<?php
|
|
/**
|
|
* Workflow Base.
|
|
*
|
|
* @since 1.0.54
|
|
* @package RankMath
|
|
* @subpackage RankMath\modules
|
|
* @author Rank Math <support@rankmath.com>
|
|
*/
|
|
|
|
namespace RankMath\Analytics\Workflow;
|
|
|
|
use RankMath\Helper;
|
|
use function has_filter;
|
|
use RankMath\Analytics\DB;
|
|
use RankMath\Traits\Hooker;
|
|
use function as_schedule_single_action;
|
|
|
|
defined( 'ABSPATH' ) || exit;
|
|
|
|
/**
|
|
* Base class.
|
|
*/
|
|
abstract class Base {
|
|
|
|
use Hooker;
|
|
|
|
/**
|
|
* Start fetching process.
|
|
*
|
|
* @param integer $days Number of days to fetch from past.
|
|
* @param string $action Action to perform.
|
|
* @return integer
|
|
*/
|
|
public function create_jobs( $days = 90, $action = 'console' ) {
|
|
$count = $this->add_data_pull( $days + 3, $action );
|
|
$time_gap = $this->get_schedule_gap();
|
|
|
|
Workflow::add_clear_cache( time() + ( $time_gap * ( $count + 1 ) ) );
|
|
|
|
update_option( 'rank_math_analytics_first_fetch', 'fetching' );
|
|
|
|
return $count;
|
|
}
|
|
|
|
/**
|
|
* Add data pull jobs.
|
|
*
|
|
* @param integer $days Number of days to fetch from past.
|
|
* @param string $action Action to perform.
|
|
* @return integer
|
|
*/
|
|
private function add_data_pull( $days, $action = 'console' ) {
|
|
$count = 1;
|
|
$start = Helper::get_midnight( time() + DAY_IN_SECONDS );
|
|
$interval = $this->get_data_interval();
|
|
$time_gap = $this->get_schedule_gap();
|
|
|
|
$hook = "get_{$action}_data";
|
|
if ( 1 === $interval ) {
|
|
for ( $current = 1; $current <= $days; $current++ ) {
|
|
$date = date_i18n( 'Y-m-d', $start - ( DAY_IN_SECONDS * $current ) );
|
|
if ( ! DB::date_exists( $date, $action ) ) {
|
|
$count++;
|
|
as_schedule_single_action(
|
|
time() + ( $time_gap * $count ),
|
|
'rank_math/analytics/' . $hook,
|
|
[ $date ],
|
|
'rank-math'
|
|
);
|
|
}
|
|
}
|
|
} else {
|
|
for ( $current = 1; $current <= $days; $current = $current + $interval ) {
|
|
for ( $j = 0; $j < $interval; $j++ ) {
|
|
$date = date_i18n( 'Y-m-d', $start - ( DAY_IN_SECONDS * ( $current + $j ) ) );
|
|
if ( ! DB::date_exists( $date, $action ) ) {
|
|
$count++;
|
|
as_schedule_single_action(
|
|
time() + ( $time_gap * $count ),
|
|
'rank_math/analytics/' . $hook,
|
|
[ $date ],
|
|
'rank-math'
|
|
);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return $count;
|
|
}
|
|
|
|
/**
|
|
* Get data interval.
|
|
*
|
|
* @return int
|
|
*/
|
|
private function get_data_interval() {
|
|
$is_custom = has_filter( 'rank_math/analytics/app_url' );
|
|
|
|
return $is_custom ? $this->do_filter( 'analytics/data_interval', 7 ) : 7;
|
|
}
|
|
|
|
/**
|
|
* Get schedule gap.
|
|
*
|
|
* @return int
|
|
*/
|
|
private function get_schedule_gap() {
|
|
return $this->do_filter( 'analytics/schedule_gap', 30 );
|
|
}
|
|
|
|
/**
|
|
* Check if google profile is updated.
|
|
*
|
|
* @param string $param Google profile param name.
|
|
* @param string $prev Previous profile data.
|
|
* @param string $new New posted profile data.
|
|
*
|
|
* @return boolean
|
|
*/
|
|
public function is_profile_updated( $param, $prev, $new ) {
|
|
if (
|
|
! is_null( $prev ) &&
|
|
! is_null( $new ) &&
|
|
isset( $prev[ $param ] ) &&
|
|
isset( $new[ $param ] ) &&
|
|
$prev[ $param ] === $new[ $param ]
|
|
) {
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* Function to get the dates.
|
|
*
|
|
* @param int $days Number of days.
|
|
*
|
|
* @return array
|
|
*/
|
|
public static function get_dates( $days = 90 ) {
|
|
$end = Helper::get_midnight( strtotime( '-1 day', time() ) );
|
|
$start = strtotime( '-' . $days . ' day', $end );
|
|
|
|
return [
|
|
'start_date' => date_i18n( 'Y-m-d', $start ),
|
|
'end_date' => date_i18n( 'Y-m-d', $end ),
|
|
];
|
|
}
|
|
|
|
/**
|
|
* Schedule single action
|
|
*
|
|
* @param int $days Number of days.
|
|
* @param string $action Name of the action hook.
|
|
* @param array $args Arguments to pass to callbacks when the hook triggers.
|
|
* @param string $group The group to assign this job to.
|
|
* @param boolean $unique Whether the action should be unique.
|
|
*/
|
|
public function schedule_single_action( $days = 90, $action = '', $args = [], $group = 'rank-math', $unique = false ) {
|
|
$timestamp = get_option( 'rank_math_analytics_last_single_action_schedule_time', time() );
|
|
$time_gap = $this->get_schedule_gap();
|
|
|
|
$dates = self::get_dates( $days );
|
|
|
|
// Get the analytics dates in which analytics data is actually available.
|
|
$days = apply_filters(
|
|
'rank_math/analytics/get_' . $action . '_days',
|
|
[
|
|
'start_date' => $dates['start_date'],
|
|
'end_date' => $dates['end_date'],
|
|
]
|
|
);
|
|
|
|
// No days then don't schedule the action.
|
|
if ( empty( $days ) ) {
|
|
return;
|
|
}
|
|
|
|
foreach ( $days as $day ) {
|
|
|
|
// Next schedule time.
|
|
$timestamp = $timestamp + $time_gap;
|
|
|
|
$args = wp_parse_args(
|
|
[
|
|
'start_date' => $day['start_date'],
|
|
'end_date' => $day['end_date'],
|
|
],
|
|
$args
|
|
);
|
|
|
|
as_schedule_single_action(
|
|
$timestamp,
|
|
'rank_math/analytics/get_' . $action . '_data',
|
|
$args,
|
|
$group,
|
|
$unique
|
|
);
|
|
|
|
}
|
|
|
|
Workflow::add_clear_cache( $timestamp );
|
|
|
|
// Update timestamp.
|
|
update_option( 'rank_math_analytics_last_single_action_schedule_time', $timestamp );
|
|
}
|
|
}
|