*/
if ( ! class_exists( 'GooglePageSpeed' ) ) {
class GooglePageSpeed {
public $url;
public $insight;
public $options;
public function __construct() {
$needed_keys = [ 'google_pagepseed_user_roles', 'google_pagepseed_api_key' ];
$this->options = (array) array_intersect_key( AdminSettings::get_instance()->get(), array_flip( $needed_keys ) );
// $this->url = WP_ADMINIFY_URL . 'Inc/Modules/GooglePageSpeed';
add_action( 'admin_menu', [ $this, 'GooglePageSpeed' ], 47 );
add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_scripts' ], 100 );
add_action( 'wp_ajax_adminify_page_speed', [ $this, 'handle_adminify_page_speed' ] );
add_action( 'init', [ $this, 'maybe_create_tables' ], 0 );
}
public function is_module_active() {
$mopdule_roles = array_filter( (array) $this->options['google_pagepseed_user_roles'] );
if ( empty( $mopdule_roles ) ) {
return true;
}
$user = wp_get_current_user();
return ! empty( array_intersect( $mopdule_roles, $user->roles ) );
}
/**
* Google Pagespeed Menu
*/
public function GooglePageSpeed() {
if ( ! $this->is_module_active() ) {
return;
}
add_submenu_page(
'wp-adminify-settings',
esc_html__( 'Google Pagespeed Insights by WP Adminify', 'adminify' ),
esc_html__( 'Pagespeed Insights', 'adminify' ),
apply_filters( 'jltwp_adminify_capability', 'manage_options' ),
'adminify-pagespeed-insights', // Page slug, will be displayed in URL
[ $this, 'jltwp_adminify_menu_editor_contents' ]
);
}
public function jltwp_adminify_menu_editor_contents() {
echo '
';
}
public function load_insight_class() {
require_once 'class-pagespeed-insights.php';
if ( ! ( $this->insight instanceof PageSpeed_Insight ) ) {
$this->insight = new PageSpeed_Insight( $this->options['google_pagepseed_api_key'] );
}
return $this->insight;
}
public function handle_adminify_page_speed() {
check_ajax_referer( '__adminify-page_speed-secirity__' );
if ( ! empty( $_POST['route'] ) ) {
$route_handler = 'handle_' . sanitize_text_field( wp_unslash( $_POST['route'] ) );
if ( is_callable( get_class( $this ), $route_handler ) ) {
$this->$route_handler( $_POST );
}
}
wp_send_json_error( [ 'message' => __( 'Something is wrong, no route found' ) ], 400 );
}
private function _get_analyze_data( $url ) {
$data = [
'desktop' => null,
'mobile' => null,
];
$result = $this->insight->run_insight( $url, [ 'strategy' => 'desktop' ] );
if ( ! empty( $result ) && $result['responseCode'] == 200 && ! empty( $result['data'] ) ) {
$data['desktop'] = $result['data'];
$result_mobile = $this->insight->run_insight( $url, [ 'strategy' => 'mobile' ] );
if ( ! empty( $result_mobile ) && $result_mobile['responseCode'] == 200 && ! empty( $result_mobile['data'] ) ) {
$data['mobile'] = $result_mobile['data'];
return $data;
}
}
return false;
}
public function handle_new_analyze( $data ) {
check_ajax_referer( '__adminify-page_speed-secirity__' );
if ( empty( $data['url'] ) || ! wp_http_validate_url( $data['url'] ) ) {
wp_send_json_error( [ 'message' => __( 'Something is wrong, URL is missing or wrong formatted' ) ], 400 );
}
set_time_limit( 300 );
$this->load_insight_class();
$analyze_data = $this->_get_analyze_data( $data['url'] );
if ( $analyze_data === false ) {
wp_send_json_error( [ 'message' => __( 'Couldn\'t fetch the result, Please try again later' ) ], 503 );
}
$saved = $this->save_analyze( $analyze_data );
if ( empty( $saved ) ) {
wp_send_json_error( [ 'message' => __( 'Couldn\'t save the result, Please try again later' ) ], 500 );
}
wp_send_json_success( $saved );
}
public function save_analyze( $analyze_data ) {
$data_desktop = $analyze_data['desktop'];
$data_mobile = $analyze_data['mobile'];
$url = $data_desktop->id;
$score_desktop = $data_desktop->lighthouseResult->categories->performance->score * 100;
$score_mobile = $data_mobile->lighthouseResult->categories->performance->score * 100;
$screenshot = $data_desktop->lighthouseResult->audits->{'final-screenshot'}->details->data;
// unset( $data_desktop->lighthouseResult->audits->{'final-screenshot'} );
// unset( $data_mobile->lighthouseResult->audits->{'final-screenshot'} );
$data = [
'url' => $url,
'score_desktop' => (int) $score_desktop,
'score_mobile' => (int) $score_mobile,
'data_desktop' => json_encode( $data_desktop ),
'data_mobile' => json_encode( $data_mobile ),
'screenshot' => $screenshot,
'time' => current_time( 'mysql' ),
];
global $wpdb;
$result = $wpdb->insert(
"{$wpdb->prefix}adminify_page_speed",
$data,
[
'url' => '%s',
'score_desktop' => '%d',
'score_mobile' => '%d',
'data_desktop' => '%s',
'data_mobile' => '%s',
'screenshot' => '%s',
'time' => '%s',
]
);
if ( empty( $result ) ) {
return false;
}
return $wpdb->insert_id;
}
public function handle_count_total( $data ) {
check_ajax_referer( '__adminify-page_speed-secirity__' );
global $wpdb;
$table_name = $wpdb->prefix . 'adminify_page_speed';
$total_query = "SELECT COUNT(*) FROM $table_name";
$total = $wpdb->get_var( $total_query );
wp_send_json_success( $total );
}
public function handle_fetch_histories( $data ) {
check_ajax_referer( '__adminify-page_speed-secirity__' );
global $wpdb;
$table_name = $wpdb->prefix . 'adminify_page_speed';
$fields = 'id, url, score_desktop, score_mobile, time, screenshot';
$items_per_page = empty( $data['items_per_page'] ) ? 1 : abs( (int) $data['items_per_page'] );
$page = empty( $data['page'] ) ? 1 : abs( (int) $data['page'] );
$offset = ( $page * $items_per_page ) - $items_per_page;
$query = "SELECT {$fields} FROM $table_name";
$total_query = "SELECT COUNT(1) FROM (${query}) AS combined_table";
$total = $wpdb->get_var( $total_query );
$histories = $wpdb->get_results( $query . ' ORDER BY time DESC LIMIT ' . $offset . ', ' . $items_per_page, ARRAY_A );
foreach ( $histories as &$history ) {
$history['formated_date'] = date( 'Y-m-d', strtotime( $history['time'] ) );
$history['formated_time'] = date( 'H:i:s', strtotime( $history['time'] ) );
}
wp_send_json_success(
[
'total' => (int) $total,
'histories' => (array) $histories,
]
);
}
public function handle_fetch_history( $data ) {
check_ajax_referer( '__adminify-page_speed-secirity__' );
if ( empty( $data['id'] ) ) {
wp_send_json_error( 'Something is wrong, Try again later', 400 );
}
global $wpdb;
$table_name = $wpdb->prefix . 'adminify_page_speed';
$history_id = $data['id'];
$fields = 'id, url, score_desktop, score_mobile, data_desktop, data_mobile, time';
$history = $wpdb->get_row( $wpdb->prepare( "SELECT {$fields} FROM $table_name WHERE id = %d", $history_id ), ARRAY_A );
if ( empty( $history ) || $wpdb->last_error !== '' ) {
wp_send_json_error( $wpdb->last_error, 400 );
}
$history['data_desktop'] = json_decode( $history['data_desktop'], true );
$history['data_mobile'] = json_decode( $history['data_mobile'], true );
wp_send_json_success(
[
'history' => $history,
]
);
}
public function handle_delete_history() {
check_ajax_referer( '__adminify-page_speed-secirity__' );
if ( empty( $_POST['ids'] ) ) {
wp_send_json_error( 'Something is wrong, Try again later', 400 );
}
global $wpdb;
$ids = implode( ',', array_map( 'absint', $_POST['ids'] ) );
$wpdb->query( "DELETE FROM {$wpdb->prefix}adminify_page_speed WHERE ID IN($ids)" );
if ( $wpdb->last_error !== '' ) {
wp_send_json_error( $wpdb->last_error, 400 );
}
wp_send_json_success(
[
'message' => 'History has been deleted',
]
);
}
public function enqueue_scripts() {
wp_enqueue_style( 'wp-adminify--page-speed', WP_ADMINIFY_URL . 'assets/admin/css/wp-adminify--page-speed.css', [], WP_ADMINIFY_VER );
$data = [
'adminurl' => admin_url(),
'ajaxurl' => admin_url( 'admin-ajax.php' ),
'nonce' => wp_create_nonce( '__adminify-page_speed-secirity__' ),
'is_pro' => wp_validate_boolean( jltwp_adminify()->can_use_premium_code__premium_only() ),
'pro_notice' => Utils::adminify_upgrade_pro(),
];
wp_localize_script( 'wp-adminify--page-speed', 'wp_adminify__pagespeed_data', $data );
wp_enqueue_script( 'wp-adminify--page-speed' );
}
public function maybe_create_tables() {
global $wpdb;
// delete_option( "{$wpdb->prefix}adminify_page_speed_db_version" );
$db_version = '1.0';
if ( get_option( "{$wpdb->prefix}adminify_page_speed_db_version" ) == $db_version ) {
return; // vail early
}
require_once ABSPATH . 'wp-admin/includes/upgrade.php';
$sql = "CREATE TABLE IF NOT EXISTS {$wpdb->prefix}adminify_page_speed (
id BIGINT(20) unsigned NOT NULL AUTO_INCREMENT,
url VARCHAR(255) NOT NULL,
score_desktop VARCHAR(3) NOT NULL,
score_mobile VARCHAR(3) NOT NULL,
data_desktop MEDIUMTEXT NOT NULL,
data_mobile MEDIUMTEXT NOT NULL,
screenshot MEDIUMTEXT NOT NULL,
time DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (id)
)" . $wpdb->get_charset_collate() . ';';
if ( get_option( "{$wpdb->prefix}adminify_page_speed_db_version" ) < $db_version ) {
dbDelta( $sql );
}
update_option( "{$wpdb->prefix}adminify_page_speed_db_version", $db_version );
}
}
}