← All changes
|
includes/integrations/class-google-search-console-client.php
+5
-81
1.28.0
→
2.8.0
View file →
| @@ -133,9 +133,9 @@ | ||
| 133 | 133 | $days = (int) str_replace('d', '', $date_range); |
| 134 | 134 | $end_date = gmdate('Y-m-d', strtotime('-2 days')); |
| 135 | 135 | $start_date = gmdate('Y-m-d', strtotime('-' . ($days - 1) . ' days', strtotime($end_date))); |
| 136 | 136 | |
| 137 | - $endpoint = '/sites/' . urlencode($site_url) . '/searchAnalytics/query'; | |
| 137 | + $endpoint = '/sites/' . rawurlencode($site_url) . '/searchAnalytics/query'; | |
| 138 | 138 | |
| 139 | 139 | $request_body = [ |
| 140 | 140 | 'startDate' => $start_date, |
| 141 | 141 | 'endDate' => $end_date, |
| @@ -161,9 +161,9 @@ | ||
| 161 | 161 | $days = (int) str_replace('d', '', $date_range); |
| 162 | 162 | $end_date = gmdate('Y-m-d', strtotime('-2 days')); |
| 163 | 163 | $start_date = gmdate('Y-m-d', strtotime('-' . ($days - 1) . ' days', strtotime($end_date))); |
| 164 | 164 | |
| 165 | - $endpoint = '/sites/' . urlencode($site_url) . '/searchAnalytics/query'; | |
| 165 | + $endpoint = '/sites/' . rawurlencode($site_url) . '/searchAnalytics/query'; | |
| 166 | 166 | |
| 167 | 167 | // diverse from get_search_performance: no dimensions, just totals |
| 168 | 168 | $request_body = [ |
| 169 | 169 | 'startDate' => $start_date, |
| @@ -209,9 +209,9 @@ | ||
| 209 | 209 | * @return array Aggregated totals |
| 210 | 210 | * @throws \Exception If API request fails |
| 211 | 211 | */ |
| 212 | 212 | public function get_search_totals_by_dates(string $site_url, string $start_date, string $end_date): array { |
| 213 | - $endpoint = '/sites/' . urlencode($site_url) . '/searchAnalytics/query'; | |
| 213 | + $endpoint = '/sites/' . rawurlencode($site_url) . '/searchAnalytics/query'; | |
| 214 | 214 | |
| 215 | 215 | $request_body = [ |
| 216 | 216 | 'startDate' => $start_date, |
| 217 | 217 | 'endDate' => $end_date, |
| @@ -246,9 +246,9 @@ | ||
| 246 | 246 | * @return array Raw rows from GSC API |
| 247 | 247 | * @throws \Exception If API request fails |
| 248 | 248 | */ |
| 249 | 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 { |
| 250 | - $endpoint = '/sites/' . urlencode($site_url) . '/searchAnalytics/query'; | |
| 250 | + $endpoint = '/sites/' . rawurlencode($site_url) . '/searchAnalytics/query'; | |
| 251 | 251 | |
| 252 | 252 | $request_body = [ |
| 253 | 253 | 'startDate' => $start_date, |
| 254 | 254 | 'endDate' => $end_date, |
| @@ -308,41 +308,8 @@ | ||
| 308 | 308 | } |
| 309 | 309 | } |
| 310 | 310 | |
| 311 | 311 | /** |
| 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 | 312 | * Get device performance breakdown for mobile SEO insights |
| 346 | 313 | * |
| 347 | 314 | * @param string $site_url Site URL to get data for |
| 348 | 315 | * @param string $date_range Date range for data |
| @@ -403,51 +370,8 @@ | ||
| 403 | 370 | ]; |
| 404 | 371 | } |
| 405 | 372 | |
| 406 | 373 | /** |
| 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 | - } | |
| 448 | - | |
| 449 | - /** | |
| 450 | 374 | * Get keyword opportunities for SEO insights |
| 451 | 375 | * Identifies queries with high impressions but low CTR or position |
| 452 | 376 | * |
| 453 | 377 | * @param string $site_url Site URL to analyze |
| @@ -597,9 +521,9 @@ | ||
| 597 | 521 | * @param string[] $brand_terms Brand keywords to match (substring, case-insensitive) |
| 598 | 522 | * @return array { branded: {...}, non_branded: {...}, total_clicks: int } |
| 599 | 523 | */ |
| 600 | 524 | private function gsc_split_by_brand(string $site_url, string $start, string $end, array $brand_terms): array { |
| 601 | - $url = self::API_BASE_URL . '/sites/' . urlencode($site_url) . '/searchAnalytics/query'; | |
| 525 | + $url = self::API_BASE_URL . '/sites/' . rawurlencode($site_url) . '/searchAnalytics/query'; | |
| 602 | 526 | |
| 603 | 527 | $page_size = 25000; |
| 604 | 528 | $start_row = 0; |
| 605 | 529 | $total_clicks = 0; |