setup(); $instance->hooks(); $instance->includes(); } return $instance; } function setup(){ $this->dir = trailingslashit( plugin_dir_path( AISEEFILE ) ); $this->uri = trailingslashit( plugin_dir_url( AISEEFILE ) ); } function includes(){ } function hooks(){ add_action( 'add_meta_boxes', array( $this,'add_meta_boxes' ) ); // add metaboxes add_action( 'admin_enqueue_scripts', array( $this, 'plugin_styles' ) ); // enqueue plugin styles but only on the specific screen add_action( 'wp_ajax_aisee_tag_cloud', array( $this, 'aisee_tag_cloud' )); // respond to ajax add_action( 'wp_ajax_nopriv_aisee_tag_cloud', '__return_false' ); // do not respont to ajax add_action( 'admin_init', array($this, 'save_gsc_profile' )); add_action( 'wp_ajax_aisee_register', array( $this, 'aisee_register' )); // respond to ajax add_action( 'wp_ajax_nopriv_aisee_register', '__return_false' ); // do not respont to ajax add_action( 'wp_ajax_aisee_gsc_fetch', array( $this, 'aisee_gsc_fetch' )); // respond to ajax add_action( 'wp_ajax_nopriv_aisee_gsc_fetch', '__return_false' ); // do not respont to ajax add_action( 'wp_ajax_aisee_get_connect_link', array( $this, 'get_connect_link' )); // respond to ajax add_action( 'wp_ajax_nopriv_get_connect_link', '__return_false' ); // do not respont to ajax } function save_gsc_profile(){ if ( isset( $_REQUEST['aisee-action'] ) && $_REQUEST['aisee-action'] == 'oauth' ) { wp_verify_nonce( $_REQUEST['origin_nonce'], 'aisee_gscapi' ); if( current_user_can('activate_plugins') && !empty($_REQUEST['success']) && $_REQUEST['success'] == 1 ){ $aisee_reg = get_option('aiseeseo'); if( $aisee_reg ) { $aisee_reg['gsc'] = true; update_option( 'aiseeseo', $aisee_reg ); } } else { } wp_redirect( html_entity_decode( get_edit_post_link( sanitize_text_field( $_REQUEST['post'] ) ) ), 302 ); exit; } if ( isset( $_REQUEST['aisee-action'] ) && $_REQUEST['aisee-action'] == 'revoke' && isset( $_REQUEST['success'] ) && $_REQUEST['success'] == '1' ) { $aisee_reg = get_option('aiseeseo'); if($aisee_reg && !empty($aisee_reg['gsc'])) { unset($aisee_reg['gsc']); update_option('aiseeseo', $aisee_reg); } } } function plugin_styles(){ $screen = get_current_screen(); if( in_array( $screen->post_type , get_post_types(array( 'public' => true) ) ) ) { wp_enqueue_style( 'aisee-stylesheet', $this->uri . 'assets/admin-styles.css' ); } } function stop_words(){ return apply_filters('aisee_stop_words', array('I','I\'d','I\'ll','I\'m','I\'ve','a','about','above','after','again','against','all','am','an','and','any','are','aren\'t','as','at','be','because','been','before','being','below','between','both','but','by','can','can\'t','cannot','com','could','couldn\'t','did','didn\'t','do','does','doesn\'t','doing','don\'t','down','during','each','few','for','from','further','had','hadn\'t','has','hasn\'t','have','haven\'t','having','he','he\'d','he\'ll','he\'s','her','here','here\'s','hers','herself','him','himself','his','how','how\'s','i','i\'d','i\'ll','i\'m','i\'ve','if','in','into','is','isn\'t','it','it\'s','its','itself','let\'s','me','more','most','mustn\'t','my','myself','net','no','nor','not','of','off','on','once','only','or','org','other','ought','our','ours','ourselves','out','over','own','same','shan\'t','she','she\'d','she\'ll','she\'s','should','shouldn\'t','so','some','such','than','that','that\'s','the','their','theirs','them','themselves','then','there','there\'s','these','they','they\'d','they\'ll','they\'re','they\'ve','this','those','through','to','too','use','add','jan','feb','mar','apr','jun','jul','aug','sep','oct','nov','dec','under','until','up','very','was','wasn\'t','we','we\'d','we\'ll','we\'re','we\'ve','were','weren\'t','what','what\'s','when','when\'s','where','where\'s','which','while','who','who\'s','whom','why','why\'s','with','will','won\'t','would','wouldn\'t','www','you','you\'d','you\'ll','you\'re','you\'ve','your','yours','yourself','yourselves','http','https','io','get')); } function add_meta_boxes(){ foreach (get_post_types(array( 'public' => true)) as $post_type) { add_meta_box( 'aisee-gsc', __( 'AiSee Insights from Google™ Search Console', 'aisee' ), array($this, 'aisee_gsc_mb'), $post_type, 'normal', 'high'); add_meta_box( 'aisee-tag', __( 'AiSee Tag Cloud', 'aisee' ), array($this, 'aisee_tag_cloud_mb'), $post_type, 'normal', 'high'); } } function get_status(){ return false; } function aisee_gsc_mb(){ global $post; ?>
Let's start setting up your AISee account to get search insights from Google™ Search Console.
Worry not, it's free and just takes a click!
'; echo 'Connect with Google™ Search Console'; echo '
'; } else { // we are set $meta = get_post_meta($post->ID, '_aisee_keywords', true); $html = ''; if($meta) { $html = $this->generate_html($meta); } echo ''; echo 'Fetch Data from Google™ Search Console'; echo '
'; ?> get_oauth_link($id, 'aisee_gsc_fetch'); $url = add_query_arg( 'cb', time() , $url ); $url = add_query_arg( 'status', $this->get_status(), $url ); $meta = get_post_meta($id, '_aisee_keywords', true); if($meta) { if( (time() - strtotime($meta['time'])) >= (86400 * 15) ) { $meta = false; } } if( ! $meta ){ $args = array( 'httpversion' => '1.1', 'compress' => true, 'headers' => array( 'aisee-gsc-fetch' => true ), ); $response = wp_safe_remote_request( $url, $args ); if( is_wp_error($response) ) { wp_send_json_error( $response->get_error_message() ); } $status_code = wp_remote_retrieve_response_code( $response ); if( 200 != $status_code ) { wp_send_json_error( 'Failed to fetch response from AISee service. Error Code: ' . $status_code ); } $response = wp_remote_retrieve_body($response); if(empty($response) || is_null($response)){ wp_send_json_error( 'Empty server respose.' ); } $response = json_decode( $response, true ); if(is_null($response)) { // NULL if the json cannot be decoded / data is deeper than recursion limit. OR no data exists wp_send_json_error( 'Invalid server response.' ); } if( isset( $response['success'] ) && $response['success'] == true) { if( ! empty( $response['data'] ) ) { $meta = array('time' => time(), 'keywords' => $response['data']); update_post_meta($id, '_aisee_keywords', $meta); $html = $this->generate_html($meta); wp_send_json_success( $html ); } else { wp_send_json_success( 'No keywords yet.' ); } } if( isset( $data['success'] ) && $data['success'] != true) { if( isset($data['data']) ){ wp_send_json_error( sanitize_text_field( $response['data'] ) ); } else { wp_send_json_error( 'Unknown error occurred on the server.' ); } } } else { $html = $this->generate_html($meta); wp_send_json_success( $html ); } } function generate_html($meta){ $html = ''; $keywords = !empty($meta['keywords'])? $meta['keywords']: false; if(!$keywords) { return; } if(count($keywords)) { foreach($keywords as $key => $value) { $html .= '| Keyword Phrase | Clicks | CTR | Impressions | Position |
|---|
| Keyword Phrase | Clicks | CTR | Impressions | Position |
|---|---|---|---|---|
| No keywords found | ||||
Fetched On ' . $fetched . '.
' . $html . 'The data is refreshed every 15 days.
'; } } $html = wp_kses( $html, array( 'p' => array( 'id'=>array(), 'class'=>array() ), 'table' => array( 'id'=>array(), 'class'=>array(), ), 'thead' => array( 'id'=>array(), 'class'=>array(), ), 'tbody' => array( 'id'=>array(), 'class'=>array(), ), 'tr' => array( 'id'=>array(), 'class'=>array(), ), 'th' => array( 'id'=>array(), 'class'=>array(), ), 'td' => array( 'id'=>array(), 'class'=>array(), ), 'tfoot' => array( 'id'=>array(), 'class'=>array(), ), ) ); return $html; } function is_connected(){ return $this->get_setting('gsc'); } function get_oauth_link($id, $action = false){ $statevars = array( 'site_url' => trailingslashit(get_site_url()), 'return_url' => get_edit_post_link($id), 'permalink' => get_permalink($id), 'origin_nonce' => wp_create_nonce( 'aisee_gscapi' ), 'origin_ajaxurl' => admin_url( 'admin-ajax.php' ), ); $account = $this->get_connectable_account(); if(!$account) { return; } $statevars = $this->encode(array_merge($account, $statevars)); $auth = add_query_arg( $action, $statevars, AISEEAPIEPSL ); $auth = add_query_arg( 'aisee_action', $action, $auth ); return $auth; switch($action){ case 'aisee_gsc_authenticate': return 'Connect with Google™ Search Console'; case 'aisee_gsc_fetch': return 'Fetch Data From Google™ Search Console'; } } function get_connect_link(){ check_ajax_referer( 'get_connect_link', 'get_connect_link_nonce' ); $id = !empty($_REQUEST['post_id']) ? sanitize_text_field( $_REQUEST['post_id'] ) : false; if(!$id) { wp_send_json_error('Invalid post ID'); } $account = $this->get_connectable_account(); if(!$account) { wp_send_json_error('Account not setup'); } $auth = $this->get_oauth_link($id, 'aisee_gsc_authenticate'); wp_send_json_success('Connect with Google™ Search Console'); } function aisee_register(){ check_ajax_referer( 'aisee_register', 'aisee_register_nonce' ); if(empty($_REQUEST['user'])) { wp_send_json_error( 'Invalid details' ); } $firstname = !empty($_REQUEST['user']['fn']) ? sanitize_text_field($_REQUEST['user']['fn']) : '' ; $lastname = !empty($_REQUEST['user']['ln']) ? sanitize_text_field($_REQUEST['user']['ln']) : '' ; $useremail = !empty($_REQUEST['user']['email']) ? sanitize_text_field($_REQUEST['user']['email']) : '' ; if(empty($useremail)) { wp_send_json_error( 'Email missing' ); } if ( ! filter_var($useremail, FILTER_VALIDATE_EMAIL)) { wp_send_json_error( 'Invalid email' ); } $args = array( 'user' => array( 'fn' => $firstname, 'ln' => $lastname, 'email' => $useremail, ), 'diag' => array ( 'site_url' => trailingslashit( site_url() ), 'wp' => $wp_version, 'plugin_version' => $this->plugin_data['Version'], 'cachebust' => microtime() ) ); $args = $this->encode($args); $url = add_query_arg( 'aisee_action', 'aisee_register', add_query_arg( 'p', '9', add_query_arg('reg_details',$args, AISEEAPIEPSL) ) ); $response = wp_safe_remote_request( $url ); if( is_wp_error($response) ) { wp_send_json_error( $response->get_error_message() ); } $status_code = wp_remote_retrieve_response_code( $response ); if( 200 != $status_code ) { wp_send_json_error( 'Failed to fetch response from AISee service. Error Code: ' . $status_code ); } $response = wp_remote_retrieve_body($response); if(empty($response) || is_null($response)){ wp_send_json_error( 'No response from AISee Server. Registration Failed.' ); } $response = json_decode( $response, true ); if(is_null($response)) { wp_send_json_error( 'Invalid server response.' ); } if( isset( $response['success'] ) && $response['success'] == true) { if( !empty($response['data']['ID']) && !empty($response['data']['user_email']) ) { update_option( 'aiseeseo', $response['data'] ); // response['data] needs validation wp_send_json_success( $this->get_oauth_link(sanitize_text_field($_REQUEST['postid']), 'aisee_gsc_authenticate') ); } else { wp_send_json_error( 'Invalid server response.' ); } } if( isset( $data['success'] ) && $data['success'] != true) { if( isset($data['data']) ){ wp_send_json_error( sanitize_text_field( $response['data'] ) ); } else { wp_send_json_error( 'Unknown error occurred on the server.' ); } } } function aisee_tag_cloud_mb(){ ?>
Increase this to see a smaller tag cloud; decreasing results in a larger tag cloud
';
print_r($str);
echo '';
}
}
function aisee() {
return AISee::get_instance();
}
// Let's roll!
aisee();