class-gsc-count.php
5.09 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
<?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 );
}
}