PluginProbe
ThinkRank AI SEO – AI SEO Plugin for WordPress: Schema, XML Sitemaps, Meta Tags, Search Console & Local SEO / 2.14.1
ThinkRank AI SEO – AI SEO Plugin for WordPress: Schema, XML Sitemaps, Meta Tags, Search Console & Local SEO v2.14.1
2.14.1 2.14.0 2.13.0 2.12.0 2.11.0 2.10.0 2.9.0 2.8.0 2.7.0 2.6.0 2.5.0 2.4.0 2.3.0 2.2.0 2.1.1 2.1.0 2.0.2 2.0.1 2.0.0 1.32.0 1.31.0 1.30.0 1.29.0 1.28.0 1.27.0 All 56 releases
← All changes | includes/integrations/class-google-search-console-client.php +16 -77 2.0.1 → 2.14.1 View file →
@@ -61,10 +61,16 @@
61 61 'message' => 'Google Search Console API connection successful',
62 62 'sites_count' => count($result['siteEntry'] ?? [])
63 63 ];
64 64 } catch (\Exception $e) {
65 + // `message` as well as `error`: the success branch above reports
66 + // its outcome as `message`, and every consumer reads that key, so
67 + // a failure that only set `error` was reported to the admin as an
68 + // error with no reason at all (#852). `error` is kept for any
69 + // caller that already reads it.
65 70 return [
66 71 'success' => false,
72 + 'message' => $e->getMessage(),
67 73 'error' => $e->getMessage()
68 74 ];
69 75 }
70 76 }
@@ -242,12 +248,15 @@
242 248 * @param string $site_url Site URL to get data for
243 249 * @param string $start_date Start date (Y-m-d)
244 250 * @param string $end_date End date (Y-m-d)
245 251 * @param int $row_limit Maximum rows to return
252 + * @param array $dimensions Dimensions to group by
253 + * @param array $filters Optional dimension filters (ANDed), each
254 + * {dimension, operator, expression}. @since 2.15.0
246 255 * @return array Raw rows from GSC API
247 256 * @throws \Exception If API request fails
248 257 */
249 - public function get_search_performance_by_dates(string $site_url, string $start_date, string $end_date, int $row_limit = 500, array $dimensions = ['query']): array {
258 + public function get_search_performance_by_dates(string $site_url, string $start_date, string $end_date, int $row_limit = 500, array $dimensions = ['query'], array $filters = []): array {
250 259 $endpoint = '/sites/' . rawurlencode($site_url) . '/searchAnalytics/query';
251 260
252 261 $request_body = [
253 262 'startDate' => $start_date,
@@ -259,8 +268,14 @@
259 268 // last 2-4 days aren't missing.
260 269 'dataState' => 'all',
261 270 ];
262 271
272 + // Optional dimension filters, ANDed, e.g. one page's queries:
273 + // [['dimension' => 'page', 'operator' => 'equals', 'expression' => $url]].
274 + if (!empty($filters)) {
275 + $request_body['dimensionFilterGroups'] = [['filters' => array_values($filters)]];
276 + }
277 +
263 278 $full_url = self::API_BASE_URL . $endpoint;
264 279 $response = $this->make_request($full_url, $request_body, 'POST');
265 280
266 281 return $response['rows'] ?? [];
@@ -308,41 +323,8 @@
308 323 }
309 324 }
310 325
311 326 /**
312 - * Get page performance data for SEO analytics
313 - *
314 - * @param string $site_url Site URL to get data for
315 - * @param string $date_range Date range for data
316 - * @param int $limit Number of pages to retrieve
317 - * @return array Page performance data
318 - * @throws \Exception If API request fails
319 - */
320 - public function get_page_performance(string $site_url, string $date_range = '30d', int $limit = 25): array {
321 - $result = $this->get_search_performance($site_url, $date_range, ['page'], $limit);
322 -
323 - $pages = [];
324 - $rows = $result['rows'] ?? [];
325 -
326 - foreach ($rows as $row) {
327 - $pages[] = [
328 - 'page' => $row['keys'][0] ?? '',
329 - 'clicks' => $row['clicks'] ?? 0,
330 - 'impressions' => $row['impressions'] ?? 0,
331 - 'ctr' => round(($row['ctr'] ?? 0) * 100, 2), // Convert to percentage
332 - 'position' => round($row['position'] ?? 0, 1)
333 - ];
334 - }
335 -
336 - return [
337 - 'pages' => $pages,
338 - 'site_url' => $site_url,
339 - 'date_range' => $date_range,
340 - 'total_pages' => count($pages)
341 - ];
342 - }
343 -
344 - /**
345 327 * Get device performance breakdown for mobile SEO insights
346 328 *
347 329 * @param string $site_url Site URL to get data for
348 330 * @param string $date_range Date range for data
@@ -400,51 +382,8 @@
400 382 'appearances' => $appearances,
401 383 'site_url' => $site_url,
402 384 'date_range' => $date_range
403 385 ];
404 - }
405 -
406 - /**
407 - * Get site indexing status and coverage data
408 - *
409 - * @param string $site_url Site URL to check
410 - * @return array Indexing status and coverage data
411 - * @throws \Exception If API request fails
412 - */
413 - public function get_indexing_status(string $site_url): array {
414 - try {
415 - // Get overall search performance to estimate indexed pages
416 - $performance = $this->get_search_performance($site_url, '30d', ['page'], 1000);
417 - $indexed_pages = count($performance['rows'] ?? []);
418 -
419 - // Get basic site info
420 - $sites = $this->list_sites();
421 - $site_info = null;
422 -
423 - foreach ($sites['siteEntry'] ?? [] as $site) {
424 - if ($site['siteUrl'] === $site_url) {
425 - $site_info = $site;
426 - break;
427 - }
428 - }
429 -
430 - return [
431 - 'site_url' => $site_url,
432 - 'is_verified' => !is_null($site_info),
433 - 'indexed_pages_estimate' => $indexed_pages,
434 - 'permission_level' => $site_info['permissionLevel'] ?? 'none',
435 - 'last_updated' => gmdate('Y-m-d H:i:s')
436 - ];
437 - } catch (\Exception $e) {
438 - return [
439 - 'site_url' => $site_url,
440 - 'is_verified' => false,
441 - 'indexed_pages_estimate' => 0,
442 - 'permission_level' => 'none',
443 - 'error' => $e->getMessage(),
444 - 'last_updated' => gmdate('Y-m-d H:i:s')
445 - ];
446 - }
447 386 }
448 387
449 388 /**
450 389 * Get keyword opportunities for SEO insights