PluginProbe
ThinkRank AI SEO – AI SEO Plugin for WordPress: Schema, XML Sitemaps, Meta Tags, Search Console & Local SEO / 2.7.0
ThinkRank AI SEO – AI SEO Plugin for WordPress: Schema, XML Sitemaps, Meta Tags, Search Console & Local SEO v2.7.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 1.26.0 1.25.0 trunk 1.0.0 1.0.1 1.0.2 1.1.0 1.10.0 All 48 releases
← All changes | includes/core/class-activator.php +97 -1 2.1.02.7.0 View file →
@@ -48,8 +48,12 @@
48 48 delete_option(self::UNINSTALLED_OPTION);
49 49
50 50 $this->check_requirements();
51 51 $this->create_database_tables();
52 + // Both must precede set_default_options(): they read
53 + // `thinkrank_version`, which that method creates.
54 + $this->retire_sitemap_legacy_fallback();
55 + $this->seed_feed_defaults();
52 56 $this->set_default_options();
53 57 $this->setup_indexnow_key();
54 58 $this->schedule_cron_jobs();
55 59 $this->restore_webroot_artifacts();
@@ -179,8 +183,100 @@
179 183
180 184
181 185
182 186 /**
187 + * On a brand-new install, close the pre-2.1.1 sitemap ownership fallback
188 + * before it can ever open.
189 + *
190 + * {@see thinkrank_webroot_sitemap_is_ours()} keeps one narrow escape hatch:
191 + * a sitemap written before 2.1.1 with `enable_styling` off carries neither
192 + * the marker nor our XSL href, so it can only be recognised by the name the
193 + * stored settings derive. That fallback is gated on this install never
194 + * having written a marked sitemap — but "never written one" describes two
195 + * completely different sites:
196 + *
197 + * - a pre-2.1.1 install that has not regenerated since upgrading, which
198 + * is exactly what the fallback exists to recover; and
199 + * - a fresh install that simply has not generated yet, which cannot have
200 + * a legacy file of ours on disk at all.
201 + *
202 + * On the second, the fallback has nothing to recover and can only delete
203 + * somebody else's sitemap from one of the canonical names — #515 again, in
204 + * a site that never had the problem the fallback addresses. It is not a
205 + * narrow window either: `regenerate_sitemap_from_settings()` returns early
206 + * while the master `enabled` flag is off, so a site with sitemaps disabled
207 + * and styling saved off never records a marked write, and stays exposed for
208 + * as long as it stays in that configuration.
209 + *
210 + * Recording the marker here on a fresh install separates the two cases. An
211 + * upgrade does not reach this code — WordPress does not re-run the
212 + * activation hook on update — so a genuine pre-2.1.1 site keeps the
213 + * fallback until its first marked write, exactly as before.
214 + *
215 + * `thinkrank_version` is the signal: set_default_options() adds it only
216 + * when absent and never updates it, so it is missing on the very first
217 + * activation and present on every one after.
218 + *
219 + * @since 2.1.1
220 + *
221 + * @return void
222 + */
223 + private function retire_sitemap_legacy_fallback(): void {
224 + if (get_option('thinkrank_version') !== false) {
225 + return;
226 + }
227 +
228 + require_once THINKRANK_PLUGIN_DIR . 'includes/cleanup-webroot.php';
229 +
230 + add_option(THINKRANK_SITEMAP_MARKED_WRITE_OPTION, '1', '', false);
231 + }
232 +
233 + /**
234 + * Give a brand-new install the feed posture the competitors ship with.
235 + *
236 + * The feed controls (#635) default to off in
237 + * {@see Site_Identity_Manager::get_default_settings()}, and they have to:
238 + * two of the three change what a site already publishes. Signing every
239 + * entry adds a line to what existing subscribers receive, and noindexing
240 + * feeds withdraws URLs a site may have had indexed for years — on a podcast
241 + * site, whose feed has to stay indexable, silently at that. Neither belongs
242 + * in a plugin update.
243 + *
244 + * A first install has no subscribers and no indexed feed, so there is
245 + * nothing to change and the protective defaults are simply the right
246 + * starting point — which is what The SEO Framework, Yoast and Rank Math all
247 + * ship. Seeding them here rather than in the defaults is what separates the
248 + * two cases.
249 + *
250 + * Excerpt-only is left off even here: it changes what readers get rather
251 + * than what scrapers can take, and that is the site owner's call.
252 + *
253 + * Same signal and same reasoning as {@see self::retire_sitemap_legacy_fallback()}:
254 + * `thinkrank_version` is absent only on the very first activation, and an
255 + * upgrade does not re-run the activation hook at all.
256 + *
257 + * @since 2.7.0
258 + *
259 + * @return void
260 + */
261 + private function seed_feed_defaults(): void {
262 + if (get_option('thinkrank_version') !== false) {
263 + return;
264 + }
265 +
266 + $manager = new \ThinkRank\SEO\Site_Identity_Manager();
267 +
268 + $manager->save_settings(
269 + 'site',
270 + null,
271 + [
272 + 'feed_source_link' => true,
273 + 'feed_noindex' => true,
274 + ]
275 + );
276 + }
277 +
278 + /**
183 279 * Set default plugin options
184 280 *
185 281 * @return void
186 282 */
@@ -187,9 +283,9 @@
187 283 private function set_default_options(): void {
188 284 $default_options = [
189 285 'thinkrank_version' => THINKRANK_VERSION,
190 286
191 - 'thinkrank_ai_provider' => 'openai',
287 + 'thinkrank_ai_provider' => \ThinkRank\Core\Settings::AI_PROVIDER_NONE,
192 288 'thinkrank_cache_duration' => 3600, // 1 hour
193 289 'thinkrank_max_requests_per_minute' => 10,
194 290 'thinkrank_enable_logging' => true,
195 291 'thinkrank_auto_optimize' => false,