This repository has been archived on 2026-10-23. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
2015-08-12 20:16:07 +02:00

223 lines
5.1 KiB
PHP

<?php
/**
* @package WPSEO\Admin|Google_Search_Console
*/
/**
* Class WPSEO_GSC_Count
*/
class WPSEO_GSC_Count {
// The last checked timestamp.
const OPTION_CI_LAST_FETCH = 'wpseo_gsc_last_fetch';
// The option name where the issues counts are saved.
const OPTION_CI_COUNTS = 'wpseo_gsc_issues_counts';
/**
* @var WPSEO_GSC_Service
*/
private $service;
/**
* Holder for the fetched issues from GSC
*
* @var array
*/
private $issues = array();
/**
* Fetching the counts
*
* @param WPSEO_GSC_Service $service
*/
public function __construct( WPSEO_GSC_Service $service ) {
$this->service = $service;
}
/**
* Getting the counts for given platform and return them as an array
*
* @param string $platform
*
* @return array
*/
public function get_platform_counts( $platform ) {
$counts = $this->get_counts();
if ( array_key_exists( $platform, $counts ) ) {
return $counts[ $platform ];
}
return array();
}
/**
* Return the fetched issues
*
* @return array
*/
public function get_issues() {
return $this->issues;
}
/**
* Listing the issues an gives them back as fetched issues
*
* @param string $platform
* @param string $category
*/
public function list_issues( $platform, $category ) {
$counts = $this->get_counts();
if ( array_key_exists( $platform, $counts ) ) {
$counts[ $platform ] = $this->list_category_issues( $counts[ $platform ], $platform, $category );
// Write the new counts value.
$this->set_counts( $counts );
}
}
/**
* Getting the counts for given platform and category.
*
* @param string $platform
* @param string $category
*
* @return integer
*/
public function get_issue_count( $platform, $category ) {
$counts = $this->get_counts();
if ( ! empty( $counts[ $platform ][ $category ]['count'] ) ) {
return $counts[ $platform ][ $category ]['count'];
}
return 0;
}
/**
* Update the count of the issues
*
* @param string $platform
* @param string $category
* @param integer $new_count
*/
public function update_issue_count( $platform, $category, $new_count ) {
$counts = $this->get_counts();
if ( ! empty( $counts[ $platform ][ $category ] ) && is_array( $counts[ $platform ][ $category ] ) ) {
$counts[ $platform ][ $category ]['count'] = $new_count;
}
$this->set_counts( $counts );
}
/**
* Fetching the counts from the GSC API
*/
public function fetch_counts() {
if ( WPSEO_GSC_Settings::get_profile() && $this->get_last_fetch() <= strtotime( '-12 hours' ) ) {
// Remove the timestamp.
$this->remove_last_fetch();
// Getting the counts and parse them.
$counts = $this->parse_counts( $this->service->get_crawl_issue_counts() );
// Fetching the counts by setting an option.
$this->set_counts( $counts );
// Saving the current timestamp.
$this->save_last_fetch();
}
}
/**
* Parsing the received counts from the API and map the keys to plugin friendly values
*
* @param array $fetched_counts
*
* @return array
*/
private function parse_counts( array $fetched_counts ) {
$counts = array();
foreach ( $fetched_counts as $platform_name => $categories ) {
$new_platform = WPSEO_GSC_Mapper::platform_from_api( $platform_name );
foreach ( $categories as $category_name => $category ) {
$new_category = WPSEO_GSC_Mapper::category_from_api( $category_name );
$counts[ $new_platform ][ $new_category ] = $category;
}
}
return $counts;
}
/**
* Listing the issues for current category.
*
* @param array $counts
* @param string $platform
* @param string $category
*
* @return array
*/
private function list_category_issues( array $counts, $platform, $category ) {
// When the issues have to be fetched.
if ( array_key_exists( $category, $counts ) && $counts[ $category ]['count'] > 0 && $counts[ $category ]['last_fetch'] <= strtotime( '-12 hours' ) ) {
if ( $issues = $this->service->fetch_category_issues( WPSEO_GSC_Mapper::platform_to_api( $platform ), WPSEO_GSC_Mapper::category_to_api( $category ) ) ) {
$this->issues = $issues;
}
// Be sure the total count is correct.
$counts[ $category ]['count'] = count( $this->issues );
// Set last fetch.
$counts[ $category ]['last_fetch'] = time();
}
return $counts;
}
/**
* Getting the counts from the options
*
* @return array
*/
private function get_counts() {
return get_option( self::OPTION_CI_COUNTS, array() );
}
/**
* Fetching the counts from the service and store them in an option
*
* @param array $counts
*/
private function set_counts( array $counts ) {
update_option( self::OPTION_CI_COUNTS, $counts );
}
/**
* Store the timestamp of when crawl errors were saved the last time.
*/
private function save_last_fetch() {
add_option( self::OPTION_CI_LAST_FETCH, time(), '', 'no' );
}
/**
* Remove the last checked option
*/
private function remove_last_fetch() {
delete_option( self::OPTION_CI_LAST_FETCH );
}
/**
* Get the timestamp of when the crawl errors were last saved
*
* @return int
*/
private function get_last_fetch() {
return get_option( self::OPTION_CI_LAST_FETCH, 0 );
}
}