# powerkit/2.2.9/modules/post-views/admin/class-powerkit-post-views-admin.php

Powerkit – Supercharge your WordPress Site, version 2.2.9. 390 lines.

- Page: https://pluginprobe.com/plugins/powerkit/2.2.9/code/modules/post-views/admin/class-powerkit-post-views-admin.php
- Raw: https://pluginprobe.com/plugins/powerkit/2.2.9/raw/modules/post-views/admin/class-powerkit-post-views-admin.php
- Modified: 2020-07-23T12:03:52+00:00

Line numbers below start at 1. Link to a line or a range by appending a fragment to the
page URL, for example `https://pluginprobe.com/plugins/powerkit/2.2.9/code/modules/post-views/admin/class-powerkit-post-views-admin.php#L10-L20`.

```php
<?php
/**
 * The admin-specific functionality of the module.
 *
 * @link       https://codesupply.co
 * @since      1.0.0
 *
 * @package    Powerkit
 * @subpackage Modules/Admin
 */

/**
 * The admin-specific functionality of the module.
 */
class Powerkit_Post_Views_Admin extends Powerkit_Module_Admin {

	/**
	 * Initialize
	 */
	public function initialize() {

		add_filter( 'init', function() {
			$post_types = get_post_types( array(
				'publicly_queryable' => 1,
				'_builtin'           => false,
			) );

			// Merge post types.
			$post_types = array_merge( array(
				'post' => 'post',
			), $post_types );

			foreach ( $post_types as $post_type ) {
				add_filter( "manage_{$post_type}_posts_columns", array( $this, 'column_views' ) );
				add_action( "manage_{$post_type}_posts_custom_column", array( $this, 'custom_column_views' ), 6, 2 );
			}
		} );

		add_action( 'admin_menu', array( $this, 'register_options_page' ) );
		add_action( 'admin_head', array( $this, 'column_style' ) );
		add_action( 'admin_notices', array( $this, 'admin_notice' ) );
	}

	/**
	 * Register admin page
	 */
	public function register_options_page() {
		add_options_page( esc_html__( 'Post Views', 'powerkit' ), esc_html__( 'Post Views', 'powerkit' ), 'manage_options', powerkit_get_page_slug( $this->slug ), array( $this, 'build_options_page' ) );
	}

	/**
	 * Build admin page
	 */
	public function build_options_page() {

		if ( ! current_user_can( 'manage_options' ) ) {
			wp_die( esc_html__( 'You do not have sufficient rights to view this page.', 'powerkit' ) );
		}

		$this->process_options_page();

		$options = powerkit_post_views_options();
		?>
			<div class="wrap pk-wrap">
				<h1><?php esc_html_e( 'Post Views Settings', 'powerkit' ); ?></h1>

				<div class="pk-settings">
					<form method="post" action="<?php echo esc_url( powerkit_get_page_url( $this->slug ) ); ?>">
						<table class="form-table">
							<tbody>
								<?php
								if ( empty( $options['token'] ) ) {

									if ( empty( $options['clientid'] ) || empty( $options['psecret'] ) ) {
										?>

										<p><?php echo wp_kses( __( 'In order to connect to your Google Analytics Account, you need to create a new project in the <a href="https://console.developers.google.com/project" target="_blank">Google API Console</a> and activate the Analytics API in "APIs &amp; Services"', 'powerkit' ), 'post' ); ?></p>

										<ol>
											<li><?php echo wp_kses( __( 'Go to "APIs &amp; Services".', 'powerkit' ), 'post' ); ?></li>
											<li><?php echo wp_kses( __( 'On the tab "OAuth consent screen" register the application, select "User Type" (External) and click "Create".', 'powerkit' ), 'post' ); ?></li>
											<li><?php echo wp_kses( __( 'On the tab "OAuth consent screen" enter "Application name" and add your domain.', 'powerkit' ), 'post' ); ?></li>
											<li><?php echo wp_kses( sprintf( __( 'Then, create an OAuth Client ID in "APIs  &amp; Services > Credentials" (Select "Web application", enter this URL %s for the "Authorized redirect URIs" field). ', 'powerkit' ), '<code>' . powerkit_get_page_url( $this->slug ) . '</code>' ), 'post' ); ?></li>
											<li><?php echo wp_kses( __( 'Enter your access below and connect to Google Analytics (if you have received a notice - "This app is not verified", then you can continue by clicking on "Advanced" link and follow the instructions).', 'powerkit' ), 'post' ); ?></li>
										</ol>

										<!-- Client ID -->
										<tr>
											<th scope="row"><label for="powerkit_post_views_clientid"><?php esc_html_e( 'Client ID', 'powerkit' ); ?></label></th>
											<td><input class="regular-text" id="powerkit_post_views_clientid" name="powerkit_post_views_clientid" type="text" value="<?php echo esc_attr( $options['clientid'] ); ?>"></td>
										</tr>
										<!-- Client secret -->
										<tr>
											<th scope="row"><label for="powerkit_post_views_psecret"><?php esc_html_e( 'Client secret', 'powerkit' ); ?></label></th>
											<td><input class="regular-text" id="powerkit_post_views_psecret" name="powerkit_post_views_psecret" type="text" value="<?php echo esc_attr( $options['psecret'] ); ?>"></td>
										</tr>
									<?php
									} else {
										$googleapis_auth = add_query_arg( array(
											'client_id'    => $options['clientid'],
											'redirect_uri' => powerkit_get_page_url( $this->slug ),
											'scope'        => 'https://www.googleapis.com/auth/analytics.readonly+https://www.googleapis.com/auth/userinfo.email+https://www.googleapis.com/auth/userinfo.profile&response_type=code&access_type=offline&state=init&approval_prompt=force',
										), 'https://accounts.google.com/o/oauth2/auth' );
										?>
											<tr>
												<td colspan="2">
													<p><a class="button" href="<?php echo esc_url( $googleapis_auth ); ?>"><?php esc_html_e( 'Connect to Google Analytics', 'powerkit' ); ?> &raquo;</a></p>

													<p><a class="button" href="<?php echo esc_url( powerkit_get_page_url( $this->slug . '&state=clear-api' ) ); ?>"><?php esc_html_e( 'Clear the API keys', 'powerkit' ); ?> &raquo;</a></p>
												</td>
											</tr>

											<tr><td colspan="2"><hr></td></tr>
										<?php
									}
								} else {
									?>
										<p><?php esc_html_e( 'You are connected to Google Analytics with the e-mail address', 'powerkit' ); ?> <?php echo esc_html( $options['gmail'] ); ?></p>

										<p><a href="<?php echo esc_url( powerkit_get_page_url( $this->slug . '&state=disconnect' ) ); ?>"><?php esc_html_e( 'Disconnect from Google Analytics', 'powerkit' ); ?> &raquo;</a></p>

										<p><a href="<?php echo esc_url( powerkit_get_page_url( $this->slug . '&state=reset-cache' ) ); ?>"><?php esc_html_e( 'Empty page views cache', 'powerkit' ); ?> &raquo;</a></p>

										<!-- Use this website to retrieve pageviews numbers -->
										<tr>
											<th scope="row"><label for="powerkit_post_views_wid"><?php esc_html_e( 'Use this website to retrieve pageviews numbers', 'powerkit' ); ?></label></th>
											<td>
												<select id="powerkit_post_views_wid" name="powerkit_post_views_wid">
													<option value="" <?php selected( empty( $options['wid'] ), true ); ?>><?php esc_html_e( 'None', 'powerkit' ); ?></option>

													<?php
													$wjson = powerkit_post_views_api_call( 'https://www.googleapis.com/analytics/v3/management/accounts/~all/webproperties/~all/profiles', array() );

													if ( is_array( $wjson->items ) ) {

														foreach ( $wjson->items as $item ) {

															if ( 'WEB' !== $item->type ) {
																continue;
															}
															?>
															<option value="<?php echo esc_attr( $item->id ); ?>" <?php selected( $options['wid'], $item->id ); ?>>
																<?php echo esc_html( $item->name .' (' . $item->websiteUrl . ')' ); ?>
															</option>
															<?php
														}
													}
													?>
												</select>
											</td>
										</tr>
										<!-- Metrics to retrieve -->
										<tr>
											<th scope="row"><label for="powerkit_post_views_metric"><?php esc_html_e( 'Metrics to retrieve', 'powerkit' ); ?></label></th>
											<td>
												<select id="powerkit_post_views_metric" name="powerkit_post_views_metric">
													<option value="ga:pageviews" <?php selected( $options['metric'], 'ga:pageviews' ); ?>>
														<?php esc_html_e( 'Page views', 'powerkit' ); ?>
													</option>
													<option value="ga:uniquePageviews" <?php selected( $options['metric'], 'ga:uniquePageviews' ); ?>>
														<?php esc_html_e( 'Unique page views', 'powerkit' ); ?>
													</option>
												</select>
											</td>
										</tr>
										<!-- Start date for the analytics -->
										<tr>
											<th scope="row"><label for="powerkit_post_views_startdate"><?php esc_html_e( 'Start date for the analytics', 'powerkit' ); ?></label></th>
											<td><input class="regular-text" id="powerkit_post_views_startdate" name="powerkit_post_views_startdate" type="date" value="<?php echo esc_attr( $options['startdate'] ); ?>"></td>
										</tr>
										<!-- Default value when a count cannot be fetched -->
										<tr>
											<th scope="row"><label for="powerkit_post_views_defaultval"><?php esc_html_e( 'Default value when a count cannot be fetched', 'powerkit' ); ?></label></th>
											<td><input class="regular-text" id="powerkit_post_views_defaultval" name="powerkit_post_views_defaultval" type="text" value="<?php echo esc_attr( $options['defaultval'] ); ?>"></td>
										</tr>
										<!-- Display the Views column in Posts list -->
										<tr>
											<th scope="row"><label for="powerkit_post_views_column"><?php esc_html_e( 'Display the Views column in Posts list', 'powerkit' ); ?></label></th>
											<td><input class="regular-text" id="powerkit_post_views_column" name="powerkit_post_views_column" type="checkbox" value="true" <?php checked( (bool) $options['column'] ); ?>></td>
										</tr>
										<!-- Search pageviews slugs with trailing slash -->
										<tr>
											<th scope="row"><label for="powerkit_post_views_trailing"><?php esc_html_e( 'Search pageviews slugs with trailing slash', 'powerkit' ); ?></label></th>
											<td><input class="regular-text" id="powerkit_post_views_trailing" name="powerkit_post_views_trailing" type="checkbox" value="true" <?php checked( (bool) $options['trailing'] ); ?>></td>
										</tr>
									<?php
								}
								?>
							</tbody>
						</table>

						<?php wp_nonce_field(); ?>

						<p class="submit"><input class="button button-primary" name="save_settings" type="submit" value="<?php esc_html_e( 'Save changes', 'powerkit' ); ?>" /></p>
					</form>
				</div>
			</div>
		<?php
	}

	/**
	 * Process options page
	 */
	public function process_options_page() {
		wp_verify_nonce( null );

		global $wpdb;

		$options = powerkit_post_views_options();

		/** Save settings */
		/** ------------------- */

		if ( isset( $_POST['save_settings'] ) ) { // Input var ok; sanitization ok.

			if ( isset( $_POST['powerkit_post_views_clientid'] ) ) { // Input var ok; sanitization ok.
				$options['clientid'] = sanitize_text_field( $_POST['powerkit_post_views_clientid'] ); // Input var ok; sanitization ok.
			}

			if ( isset( $_POST['powerkit_post_views_psecret'] ) ) { // Input var ok; sanitization ok.
				$options['psecret'] = sanitize_text_field( $_POST['powerkit_post_views_psecret'] ); // Input var ok; sanitization ok.
			}

			if ( isset( $_POST['powerkit_post_views_wid'] ) ) { // Input var ok; sanitization ok.
				$options['wid'] = sanitize_text_field( $_POST['powerkit_post_views_wid'] ); // Input var ok; sanitization ok.
			}

			if ( isset( $_POST['powerkit_post_views_startdate'] ) ) { // Input var ok; sanitization ok.
				$options['startdate'] = sanitize_text_field( $_POST['powerkit_post_views_startdate'] ); // Input var ok; sanitization ok.
			}

			if ( isset( $_POST['powerkit_post_views_defaultval'] ) ) { // Input var ok; sanitization ok.
				$options['defaultval'] = sanitize_text_field( $_POST['powerkit_post_views_defaultval'] ); // Input var ok; sanitization ok.
			}

			if ( isset( $_POST['powerkit_post_views_metric'] ) ) { // Input var ok; sanitization ok.
				$options['metric'] = sanitize_text_field( $_POST['powerkit_post_views_metric'] ); // Input var ok; sanitization ok.
			}

			$options['column']   = ( isset( $_POST['powerkit_post_views_column'] ) ); // Input var ok; sanitization ok.
			$options['trailing'] = ( isset( $_POST['powerkit_post_views_trailing'] ) ); // Input var ok; sanitization ok.

			update_option( 'powerkit_post_views_options', $options );

			printf( '<div id="message" class="updated fade"><p><strong>%s</strong></p></div>', esc_html__( 'Settings saved.', 'powerkit' ) );
		}

		/** Actions */
		/** ------------------- */

		if ( isset( $_GET['state'] ) && 'init' === $_GET['state'] ) { // Input var ok; sanitization ok.

			$request = new WP_Http();

			$result = $request->request( 'https://accounts.google.com/o/oauth2/token', array(
				'method' => 'POST',
				'body'   => array(
					'code'          => sanitize_text_field( isset( $_GET['code'] ) ? $_GET['code'] : null ), // Input var ok; sanitization ok.
					'client_id'     => $options['clientid'],
					'client_secret' => $options['psecret'],
					'redirect_uri'  => powerkit_get_page_url( $this->slug ),
					'grant_type'    => 'authorization_code',
				),
			) );

			if ( ! is_array( $result ) || ! isset( $result['response']['code'] ) && 200 !== $result['response']['code'] ) {
				?>
				<div id="message" class="error">
					<p>
						<?php esc_html_e( 'There was something wrong with Google!', 'powerkit' ); ?>
					</p>
				</div>
				<?php
			}

			$tjson = json_decode( $result['body'] );

			$options['token']         = $tjson->access_token;
			$options['token_refresh'] = $tjson->refresh_token;
			$options['expires']       = time() + $tjson->expires_in;

			update_option( 'powerkit_post_views_options', $options );

			$ijson = powerkit_post_views_api_call( 'https://www.googleapis.com/oauth2/v1/userinfo', array() );

			$options['gid']   = $ijson->id;
			$options['gmail'] = $ijson->email;

			update_option( 'powerkit_post_views_options', $options );

			if ( ! empty( $options['token'] ) && ! empty( $options['gmail'] ) ) {
				?>
					<script>window.location = '<?php echo esc_url( powerkit_get_page_url( $this->slug ) ); ?> ';</script>
				<?php
				exit;
			}
		} elseif ( isset( $_GET['state'] ) && 'disconnect' === $_GET['state'] ) { // Input var ok; sanitization ok.

			$options['gid']           = null;
			$options['gmail']         = null;
			$options['token']         = null;
			$options['token_refresh'] = null;
			$options['expires']       = null;
			$options['defaultval']    = 0;

			update_option( 'powerkit_post_views_options', $options );

		} elseif ( isset( $_GET['state'] ) && 'clear-api' === $_GET['state'] ) { // Input var ok; sanitization ok.

			$options['clientid'] = null;
			$options['psecret']  = null;

			update_option( 'powerkit_post_views_options', $options );

			printf( '<div id="message" class="updated fade"><p><strong>%s</strong></p></div>', esc_html__( 'API Keys removed.', 'powerkit' ) );

		} elseif ( isset( $_GET['state'] ) && 'refresh-token' === $_GET['state'] ) { // Input var ok; sanitization ok.

			powerkit_post_views_refresh_token();

			printf( '<div id="message" class="updated fade"><p><strong>%s</strong></p></div>', esc_html__( 'Token refreshed successfully.', 'powerkit' ) );

		} elseif ( isset( $_GET['state'] ) && 'reset-cache' === $_GET['state'] ) { // Input var ok; sanitization ok.

			$wpdb->query( "UPDATE {$wpdb->prefix}pk_post_views SET period = 0" ); // db call ok; no-cache ok.

			printf( '<div id="message" class="updated fade"><p><strong>%s</strong></p></div>', esc_html__( 'Cache flushed successfully.', 'powerkit' ) );
		}
	}

	/**
	 * Filters the columns displayed in the Posts list table.
	 *
	 * @param array $post_columns An associative array of column headings.
	 */
	public function column_views( $post_columns ) {

		$options = powerkit_post_views_options();

		if ( ! empty( $options['token'] ) && $options['column'] ) {

			$post_columns['pk_post_views'] = esc_html__( 'Views', 'powerkit' );

		}

		return $post_columns;
	}

	/**
	 * Fires in each custom column in the Posts list table.
	 *
	 * @param string $column_name The name of the column to display.
	 * @param int    $post_id     The current post ID.
	 */
	public function custom_column_views( $column_name, $post_id ) {

		if ( 'pk_post_views' === $column_name ) {

			echo powerkit_get_post_views( get_the_ID(), true, true ); // XSS.
		}
	}

	/**
	 * Add column style.
	 */
	public function column_style() {
		echo '<style>.column-pk_post_views { width: 120px; }</style>';
	}

	/**
	 * Output notice.
	 */
	public function admin_notice() {

		$options = powerkit_post_views_options();

		if ( current_user_can( 'manage_options' ) ) {

			if ( isset( $options['token'] ) && empty( $options['token'] ) ) {

				echo '<div class="error"><p>' . esc_html__( 'Google Post Views Warning: You have to (re)connect the plugin to your Google account.' ) . '<br><a href="' . esc_url( powerkit_get_page_url( $this->slug ) ) . '">' . esc_html__( 'Update settings', 'powerkit' ) . ' &rarr;</a></p></div>';

			} elseif ( isset( $options['error'] ) && ! empty( $options['error'] ) ) {

				echo '<div class="error"><p>' . esc_html__( 'Google Post Views Error: ', 'powerkit' ) . wp_kses( $options['error'], 'post' ) . '<br><a href="' . esc_url( powerkit_get_page_url( $this->slug ) ) . '">' . esc_html__( 'Update settings', 'powerkit' ) . ' &rarr;</a></p></div>';
			}
		}
	}
}

```
