| @@ -286,30 +286,35 @@ | ||
| 286 | 286 | $metadata, |
| 287 | 287 | $score_options |
| 288 | 288 | ); |
| 289 | 289 | |
| 290 | - // Add readability_score and content_quality from frontend if | |
| 291 | - // provided. `!== null`, not `!empty()`: 0 is a legitimate score and | |
| 292 | - // empty() discarded it, so a post the editor scored as 0 kept | |
| 293 | - // whatever the calculator had produced instead (#394). Both params | |
| 294 | - // already default to null above, so null means "not sent". | |
| 290 | + // The browser's own readability_score and content_quality are no | |
| 291 | + // longer applied. They used to be written over the labels this | |
| 292 | + // request had just computed, and then persisted, so the saved | |
| 293 | + // Readability and Content Quality described the editor text alone | |
| 294 | + // (#829). | |
| 295 | 295 | // |
| 296 | - // Only when the editor actually measured something, though. Inside a | |
| 297 | - // page builder there is no editor content to read, so Refresh sent an | |
| 298 | - // empty `live_content` along with the two labels derived from that | |
| 299 | - // empty string — the literal words "No content" — and they were | |
| 300 | - // applied over the correct server-side analysis this request had just | |
| 301 | - // run, then persisted by save_score(). That is what put "No content" | |
| 302 | - // on the dashboard for a page with a valid score (#778). With nothing | |
| 303 | - // measured, the analysis above is the better answer. | |
| 304 | - $editor_measured = '' !== trim((string) $live_content); | |
| 296 | + // That is wrong whenever the two see different content, which is | |
| 297 | + // exactly when it matters: `analyze_live_content()` resolves what | |
| 298 | + // the editor sent AND whatever `thinkrank_analyzable_content` | |
| 299 | + // contributes on top, so a post with 2 words in the editor and 615 | |
| 300 | + // added by a filter scored 617 words server-side and saved | |
| 301 | + // "Too short" / "Needs improvement" from the browser's 2. | |
| 302 | + // | |
| 303 | + // Nothing is lost by ignoring them: when `live_content` is non-empty | |
| 304 | + // the server analysed the very text the editor measured, so its | |
| 305 | + // labels cover the live case too. The parameters stay accepted so an | |
| 306 | + // older cached bundle still gets a successful response, and they | |
| 307 | + // stay documented in the route args; they simply no longer win. | |
| 308 | + // | |
| 309 | + // The panel keeps computing them in the browser for instant feedback | |
| 310 | + // between calculations. What it must not do is persist them. | |
| 311 | + unset($readability_score, $content_quality); | |
| 305 | 312 | |
| 306 | - if ($editor_measured && null !== $readability_score) { | |
| 307 | - $score_data['readability_score'] = $readability_score; | |
| 308 | - } | |
| 309 | - if ($editor_measured && null !== $content_quality) { | |
| 310 | - $score_data['content_quality'] = $content_quality; | |
| 311 | - } | |
| 313 | + // The resolved word count, so the panel can show the number this | |
| 314 | + // score was actually calculated from rather than its own count of | |
| 315 | + // the editor text (#829). | |
| 316 | + $score_data['word_count'] = (int) ($content_data['word_count'] ?? 0); | |
| 312 | 317 | |
| 313 | 318 | // Save score if requested |
| 314 | 319 | if ($save_score) { |
| 315 | 320 | $user_id = get_current_user_id(); |