Changeset 3795827
- Timestamp:
- 11/11/2026 07:46:45 AM (2 days ago)
- Location:
- optiwebopz-seo-connector
- Files:
-
- 40 edited
- 1 copied
-
tags/2.4.3 (copied) (copied from optiwebopz-seo-connector/trunk )
-
tags/2.4.3/includes/admin.php (modified) (5 diffs)
-
tags/2.4.3/includes/admin/metabox.php (modified) (4 diffs)
-
tags/2.4.3/includes/admin/page-dashboard.php (modified) (3 diffs)
-
tags/2.4.3/includes/admin/page-import.php (modified) (8 diffs)
-
tags/2.4.3/includes/admin/page-links.php (modified) (2 diffs)
-
tags/2.4.3/includes/admin/page-overview.php (modified) (9 diffs)
-
tags/2.4.3/includes/admin/page-performance.php (modified) (3 diffs)
-
tags/2.4.3/includes/admin/page-recommendations.php (modified) (1 diff)
-
tags/2.4.3/includes/admin/page-redirects.php (modified) (1 diff)
-
tags/2.4.3/includes/admin/page-roles.php (modified) (2 diffs)
-
tags/2.4.3/includes/admin/page-suggestions.php (modified) (2 diffs)
-
tags/2.4.3/includes/admin/page-wizard.php (modified) (9 diffs)
-
tags/2.4.3/includes/admin/seo-menu.php (modified) (2 diffs)
-
tags/2.4.3/includes/core/taler-client.php (modified) (1 diff)
-
tags/2.4.3/includes/seo/import-runs.php (modified) (5 diffs)
-
tags/2.4.3/includes/seo/redirects.php (modified) (1 diff)
-
tags/2.4.3/includes/seo/sitemaps.php (modified) (1 diff)
-
tags/2.4.3/includes/seo/terms.php (modified) (2 diffs)
-
tags/2.4.3/optiwebopz-seo-connector.php (modified) (3 diffs)
-
tags/2.4.3/readme.txt (modified) (17 diffs)
-
trunk/includes/admin.php (modified) (5 diffs)
-
trunk/includes/admin/metabox.php (modified) (4 diffs)
-
trunk/includes/admin/page-dashboard.php (modified) (3 diffs)
-
trunk/includes/admin/page-import.php (modified) (8 diffs)
-
trunk/includes/admin/page-links.php (modified) (2 diffs)
-
trunk/includes/admin/page-overview.php (modified) (9 diffs)
-
trunk/includes/admin/page-performance.php (modified) (3 diffs)
-
trunk/includes/admin/page-recommendations.php (modified) (1 diff)
-
trunk/includes/admin/page-redirects.php (modified) (1 diff)
-
trunk/includes/admin/page-roles.php (modified) (2 diffs)
-
trunk/includes/admin/page-suggestions.php (modified) (2 diffs)
-
trunk/includes/admin/page-wizard.php (modified) (9 diffs)
-
trunk/includes/admin/seo-menu.php (modified) (2 diffs)
-
trunk/includes/core/taler-client.php (modified) (1 diff)
-
trunk/includes/seo/import-runs.php (modified) (5 diffs)
-
trunk/includes/seo/redirects.php (modified) (1 diff)
-
trunk/includes/seo/sitemaps.php (modified) (1 diff)
-
trunk/includes/seo/terms.php (modified) (2 diffs)
-
trunk/optiwebopz-seo-connector.php (modified) (3 diffs)
-
trunk/readme.txt (modified) (17 diffs)
Legend:
- Unmodified
- Added
- Removed
-
optiwebopz-seo-connector/tags/2.4.3/includes/admin.php
r3795029 r3795827 48 48 49 49 add_action('admin_menu', static function (): void { 50 add_options_page(' Optiwebopz SEO Connector', 'Optiwebopz SEO Connector', 'manage_options', TALER_CX_PAGE, 'taler_cx_admin_page');50 add_options_page('Taler connection', 'Taler connection', 'manage_options', TALER_CX_PAGE, 'taler_cx_admin_page'); 51 51 }); 52 52 … … 176 176 if (!function_exists('wp_add_privacy_policy_content')) { return; } 177 177 $p = [ 178 __('This site uses the Opti webopz SEO Connectorplugin. It sets no cookies and does not track visitors.', 'optiwebopz-seo-connector'),179 sprintf(/* translators: %d: number of days */ __('If the 404 monitor is on (Opti webopz SEO → Redirects & 404), the plugin records each address on this site that was not found, the address of the page that linked to it (without its query string), how often and when it was requested. It records no IP address, browser or user. A row is removed %d days after its address was last requested, and the log holds at most 5,000 addresses.', 'optiwebopz-seo-connector'), taler_cx_404_days()),178 __('This site uses the OptiWebOpz SEO plugin. It sets no cookies and does not track visitors.', 'optiwebopz-seo-connector'), 179 sprintf(/* translators: %d: number of days */ __('If the 404 monitor is on (OptiWebOpz SEO → Redirects & 404), the plugin records each address on this site that was not found, the address of the page that linked to it (without its query string), how often and when it was requested. It records no IP address, browser or user. A row is removed %d days after its address was last requested, and the log holds at most 5,000 addresses.', 'optiwebopz-seo-connector'), taler_cx_404_days()), 180 180 __('When this site is connected to Taler (an AI blog and SEO service, https://taler.optiwebopz.com/), Taler reads posts through the plugin (title, text, SEO fields and the list of revisions), creates drafts and, when a Taler user asks for it or at a time scheduled in Taler, changes or publishes posts. Before each such change the plugin keeps a copy of the post on this site (the newest 20 per post, deleted with the post).', 'optiwebopz-seo-connector'), 181 __('When an administrator or editor opens Opti webopz SEO → Search performance or a post\'s Optiwebopz SEO box, the plugin asks Taler for search data. It sends this site\'s address, the name of the data, the post\'s address, a time stamp, a random value, the plugin version and a signature. No visitor data is sent.', 'optiwebopz-seo-connector'),182 __('If an administrator switches on "Send performance numbers to Taler" (Settings → Optiwebopz SEO Connector), the plugin sends Taler whole numbers counted on this site once a day and when "Send now" is clicked: post counts, content scores, missing SEO fields, the 404 log and redirect totals, links, images without alt text and sitemap addresses. No post titles, text or addresses, no user data and no visitor data. Suggestions Taler sends are stored on this site with a log of who or what applied them.', 'optiwebopz-seo-connector'), // 2.3.4181 __('When an administrator or editor opens OptiWebOpz SEO → Search performance or a post\'s OptiWebOpz SEO box, the plugin asks Taler for search data. It sends this site\'s address, the name of the data, the post\'s address, a time stamp, a random value, the plugin version and a signature. No visitor data is sent.', 'optiwebopz-seo-connector'), 182 __('If an administrator switches on "Send performance numbers to Taler" (Settings → Taler connection), the plugin sends Taler whole numbers counted on this site once a day and when "Send now" is clicked: post counts, content scores, missing SEO fields, the 404 log and redirect totals, links, images without alt text and sitemap addresses. No post titles, text or addresses, no user data and no visitor data. Suggestions Taler sends are stored on this site with a log of who or what applied them.', 'optiwebopz-seo-connector'), // 2.3.4 183 183 __('An import from Yoast SEO, Rank Math or All in One SEO is logged on this site (the old and new value of each field) so it can be undone. The log stays until the plugin is deleted.', 'optiwebopz-seo-connector'), 184 184 __('If IndexNow is switched on, the addresses of public pages that are published or changed are sent to IndexNow (https://api.indexnow.org/), which shares them with the participating search engines.', 'optiwebopz-seo-connector'), 185 185 ]; 186 wp_add_privacy_policy_content('Opti webopz SEO Connector', wp_kses_post('<p>' . implode('</p><p>', array_map('esc_html', $p)) . '</p>'));186 wp_add_privacy_policy_content('OptiWebOpz SEO', wp_kses_post('<p>' . implode('</p><p>', array_map('esc_html', $p)) . '</p>')); 187 187 } 188 188 … … 234 234 ?> 235 235 <div class="wrap taler-cx"> 236 <h1><?php esc_html_e(' Optiwebopz SEO Connector', 'optiwebopz-seo-connector'); ?></h1>236 <h1><?php esc_html_e('Taler connection', 'optiwebopz-seo-connector'); ?></h1> 237 237 <?php if (isset($msgs[$code])) : ?> 238 238 <div class="notice notice-<?php echo esc_attr($msgs[$code][0]); ?> is-dismissible"><p><?php echo esc_html($msgs[$code][1]); ?></p></div> … … 294 294 <fieldset> 295 295 <legend><strong><?php esc_html_e('Applying Taler\'s suggestions', 'optiwebopz-seo-connector'); ?></strong></legend> 296 <p><label class="taler-cx-check"><input type="checkbox" name="taler_cx_apply_editor" value="1"<?php checked($lset['apply_editor'], 1); ?>> <?php esc_html_e('Editors may apply suggestions (Opti webopz SEO → Suggestions)', 'optiwebopz-seo-connector'); ?></label></p>296 <p><label class="taler-cx-check"><input type="checkbox" name="taler_cx_apply_editor" value="1"<?php checked($lset['apply_editor'], 1); ?>> <?php esc_html_e('Editors may apply suggestions (OptiWebOpz SEO → Suggestions)', 'optiwebopz-seo-connector'); ?></label></p> 297 297 <p><label class="taler-cx-check"><input type="checkbox" name="taler_cx_apply_remote" value="1"<?php checked($lset['apply_remote'], 1); ?>> <?php esc_html_e('Taler may apply suggestions (from the Taler app, its API or its Claude connector)', 'optiwebopz-seo-connector'); ?></label></p> 298 298 <p><label class="taler-cx-check"><input type="checkbox" name="taler_cx_apply_auto" value="1"<?php checked($lset['apply_auto'], 1); ?>> <?php esc_html_e('Apply eligible suggestions automatically (SEO titles and meta descriptions only)', 'optiwebopz-seo-connector'); ?></label></p> … … 371 371 <li><?php esc_html_e('Post editor: load posts, save, SEO fields (Rank Math, Yoast or All in One SEO), FAQ schema, featured image — each write needs a fresh single-use token and is refused if the post changed in WordPress meanwhile.', 'optiwebopz-seo-connector'); ?></li> 372 372 <li><?php esc_html_e('Publish and scheduled publish (the schedule is held in Taler). A snapshot is kept before every change and can be restored.', 'optiwebopz-seo-connector'); ?></li> 373 <li><?php esc_html_e('Opti webopz SEO: titles, meta tags, schema, sitemaps, redirects, post checks and search performance from Taler.', 'optiwebopz-seo-connector'); ?> <a href="<?php echo esc_url(admin_url('admin.php?page=taler-seo')); ?>"><?php esc_html_e('Open Optiwebopz SEO', 'optiwebopz-seo-connector'); ?></a></li>373 <li><?php esc_html_e('OptiWebOpz SEO: titles, meta tags, schema, sitemaps, redirects, post checks and search performance from Taler.', 'optiwebopz-seo-connector'); ?> <a href="<?php echo esc_url(admin_url('admin.php?page=taler-seo')); ?>"><?php esc_html_e('Open OptiWebOpz SEO', 'optiwebopz-seo-connector'); ?></a></li> 374 374 <li><?php esc_html_e('Auto-blogging runs in Taler; this plugin only receives the drafts and publishes Taler asks for.', 'optiwebopz-seo-connector'); ?></li> 375 375 </ul> -
optiwebopz-seo-connector/tags/2.4.3/includes/admin/metabox.php
r3795029 r3795827 51 51 add_action('add_meta_boxes', static function (string $postType): void { 52 52 if (!in_array($postType, taler_cx_box_types(), true) || !taler_cx_box_allowed()) { return; } // 2.1.0: role manager 53 add_meta_box('taler-cx-seo', __('Opti webopz SEO', 'optiwebopz-seo-connector'), 'taler_cx_metabox', $postType, 'normal', 'high');53 add_meta_box('taler-cx-seo', __('OptiWebOpz SEO', 'optiwebopz-seo-connector'), 'taler_cx_metabox', $postType, 'normal', 'high'); 54 54 }); 55 55 … … 233 233 function taler_cx_analysis_schema(WP_Post $p): array { 234 234 if (!taler_cx_module_on('schema')) { 235 return ['id' => 'schema', 'w' => 1, 'ok' => false, 'text' => __('Structured data (schema) is switched off, so this page has none (Opti webopz SEO → Overview).', 'optiwebopz-seo-connector')];235 return ['id' => 'schema', 'w' => 1, 'ok' => false, 'text' => __('Structured data (schema) is switched off, so this page has none (OptiWebOpz SEO → Overview).', 'optiwebopz-seo-connector')]; 236 236 } 237 237 $none = $p->post_type === 'post' && taler_cx_box_meta_str((int) $p->ID, '_taler_schema_type') === 'none'; … … 272 272 <div class="tcx-field"><label for="tcx-canon"><?php esc_html_e('Canonical address (only when another page is the original)', 'optiwebopz-seo-connector'); ?></label> 273 273 <input id="tcx-canon" class="tcx-input" type="url" name="taler_cx[_taler_canonical]" value="<?php echo esc_attr($v('_taler_canonical')); ?>"<?php disabled($roC); ?>> 274 <?php if ($roC) : ?><span class="tcx-muted"><?php esc_html_e('Only some roles may change this (Opti webopz SEO → Roles).', 'optiwebopz-seo-connector'); ?></span><?php endif; ?></div>274 <?php if ($roC) : ?><span class="tcx-muted"><?php esc_html_e('Only some roles may change this (OptiWebOpz SEO → Roles).', 'optiwebopz-seo-connector'); ?></span><?php endif; ?></div> 275 275 <?php if ($post->post_type === 'product' && function_exists('taler_cx_woo_fields')) : foreach (taler_cx_woo_fields() as $wk => $wf) : ?> 276 276 <div class="tcx-field"><label for="tcx<?php echo esc_attr(str_replace('_', '-', $wk)); ?>"><?php echo esc_html($wf[0]); ?></label> … … 282 282 <option value=""><?php echo esc_html(sprintf(/* translators: %s: default type */ __('Site default (%s)', 'optiwebopz-seo-connector'), (string) taler_cx_seo_opt('schema_post_type'))); ?></option> 283 283 <?php foreach (TALER_CX_SCHEMA_TYPES as $t) : ?><option value="<?php echo esc_attr($t); ?>"<?php selected($st, $t); ?>><?php echo esc_html($t); ?></option><?php endforeach; ?> 284 </select><?php if ($roS) : ?><span class="tcx-muted"><?php esc_html_e('Only some roles may change this (Opti webopz SEO → Roles).', 'optiwebopz-seo-connector'); ?></span><?php endif; ?></div>284 </select><?php if ($roS) : ?><span class="tcx-muted"><?php esc_html_e('Only some roles may change this (OptiWebOpz SEO → Roles).', 'optiwebopz-seo-connector'); ?></span><?php endif; ?></div> 285 285 <?php endif; ?> 286 286 <div class="tcx-field tcx-span"> 287 287 <label class="tcx-switch"><input type="checkbox" name="taler_cx[_taler_noindex]" value="1"<?php checked($v('_taler_noindex'), '1'); ?><?php disabled($roR); ?>> <span><?php esc_html_e('Keep this page out of search results (noindex)', 'optiwebopz-seo-connector'); ?></span></label> 288 288 <label class="tcx-switch"><input type="checkbox" name="taler_cx[_taler_nofollow]" value="1"<?php checked($v('_taler_nofollow'), '1'); ?><?php disabled($roR); ?>> <span><?php esc_html_e('Ask search engines not to follow its links (nofollow)', 'optiwebopz-seo-connector'); ?></span></label> 289 <?php if ($roR) : ?><span class="tcx-muted"><?php esc_html_e('Only some roles may change noindex / nofollow (Opti webopz SEO → Roles).', 'optiwebopz-seo-connector'); ?></span><?php endif; ?>289 <?php if ($roR) : ?><span class="tcx-muted"><?php esc_html_e('Only some roles may change noindex / nofollow (OptiWebOpz SEO → Roles).', 'optiwebopz-seo-connector'); ?></span><?php endif; ?> 290 290 </div> 291 291 </div> -
optiwebopz-seo-connector/tags/2.4.3/includes/admin/page-dashboard.php
r3795029 r3795827 85 85 echo '<p>' . esc_html__('For the last 28 days, this screen shows:', 'optiwebopz-seo-connector') . '</p><ul class="tcx-facts">'; 86 86 foreach ($shows as $t) { echo '<li>' . esc_html($t) . '</li>'; } 87 echo '</ul><p>' . esc_html__('This search data comes from the optional Taler link: Taler reads it from Google Search Console and sends the numbers here. No Google sign-in is stored in WordPress. Everything else in Opti webopz SEO works without Taler.', 'optiwebopz-seo-connector') . '</p>';87 echo '</ul><p>' . esc_html__('This search data comes from the optional Taler link: Taler reads it from Google Search Console and sends the numbers here. No Google sign-in is stored in WordPress. Everything else in OptiWebOpz SEO works without Taler.', 'optiwebopz-seo-connector') . '</p>'; 88 88 echo '<p class="tcx-muted">' . esc_html($linked ? taler_cx_pull_message($code) : __('Clicks, impressions and positions come from Google Search Console through Taler. Connect this site to Taler to see them here. Everything else on this page works without it.', 'optiwebopz-seo-connector')) . '</p>'; 89 89 echo '<div class="tcx-actions">'; … … 92 92 . ($linked ? esc_html__('Taler connection settings', 'optiwebopz-seo-connector') : esc_html__('Connect to Taler', 'optiwebopz-seo-connector')) . '</a>'; 93 93 } else { 94 echo '<p class="tcx-muted">' . esc_html__('An administrator can link this site to Taler under Settings → Optiwebopz SEO Connector.', 'optiwebopz-seo-connector') . '</p>';94 echo '<p class="tcx-muted">' . esc_html__('An administrator can link this site to Taler under Settings → Taler connection.', 'optiwebopz-seo-connector') . '</p>'; 95 95 } 96 96 if ($linked) { … … 108 108 echo '<div class="wrap tcx">'; 109 109 taler_cx_seo_header(__('Search performance', 'optiwebopz-seo-connector')); 110 echo '<p class="tcx-banner tcx-banner-info">' . esc_html__('Search performance is switched off (Opti webopz SEO → Overview).', 'optiwebopz-seo-connector') . '</p></div>';110 echo '<p class="tcx-banner tcx-banner-info">' . esc_html__('Search performance is switched off (OptiWebOpz SEO → Overview).', 'optiwebopz-seo-connector') . '</p></div>'; 111 111 return; 112 112 } -
optiwebopz-seo-connector/tags/2.4.3/includes/admin/page-import.php
r3795029 r3795827 56 56 /** The status names shown on the screen. */ 57 57 function taler_cx_import_status_labels(): array { 58 return ['copy' => __('will be copied', 'optiwebopz-seo-connector'), 'same' => __('already the same', 'optiwebopz-seo-connector'), 'conflict' => __('Opti webopz SEO has its own value (kept)', 'optiwebopz-seo-connector'),59 'overwrite' => __('Opti webopz SEO value will be replaced', 'optiwebopz-seo-connector'), 'review' => __('needs review (not copied)', 'optiwebopz-seo-connector'), 'invalid' => __('not usable (not copied)', 'optiwebopz-seo-connector')];58 return ['copy' => __('will be copied', 'optiwebopz-seo-connector'), 'same' => __('already the same', 'optiwebopz-seo-connector'), 'conflict' => __('OptiWebOpz SEO has its own value (kept)', 'optiwebopz-seo-connector'), 59 'overwrite' => __('OptiWebOpz SEO value will be replaced', 'optiwebopz-seo-connector'), 'review' => __('needs review (not copied)', 'optiwebopz-seo-connector'), 'invalid' => __('not usable (not copied)', 'optiwebopz-seo-connector')]; 60 60 } 61 61 … … 172 172 'discarded' => ['info', __('The unfinished import was stopped. What it already copied is in the log and can be undone.', 'optiwebopz-seo-connector')], 173 173 'undo_batch' => ['info', __('Undo: one batch done. Press "Undo this import" again until it says finished.', 'optiwebopz-seo-connector')], 174 'undo_done' => ['success', __('Undo finished. Opti webopz SEO\'s earlier values are back where nothing changed them since.', 'optiwebopz-seo-connector')],174 'undo_done' => ['success', __('Undo finished. OptiWebOpz SEO\'s earlier values are back where nothing changed them since.', 'optiwebopz-seo-connector')], 175 175 'undo_failed' => ['error', __('That import cannot be undone (it was a preview, or its log is gone).', 'optiwebopz-seo-connector')], 176 176 ]); ?> … … 182 182 <div class="tcx-banner tcx-banner-info" data-state="empty"> 183 183 <p><strong><?php esc_html_e('No SEO data from Yoast SEO, Rank Math or All in One SEO was found on this site.', 'optiwebopz-seo-connector'); ?></strong></p> 184 <p><?php esc_html_e('The import looks for those three plugins only, and none of them left data here. Nothing is wrong: there is simply nothing to import, and Opti webopz SEO works fully without an import.', 'optiwebopz-seo-connector'); ?></p>184 <p><?php esc_html_e('The import looks for those three plugins only, and none of them left data here. Nothing is wrong: there is simply nothing to import, and OptiWebOpz SEO works fully without an import.', 'optiwebopz-seo-connector'); ?></p> 185 185 </div> 186 186 <?php endif; ?> … … 205 205 <?php if ($st && empty($st['done'])) : ?> 206 206 <div class="tcx-card"> 207 <h2><?php echo $st['mode'] === 'run' ? esc_html__('Copying into Opti webopz SEO — not finished yet', 'optiwebopz-seo-connector') : esc_html__('Preview — not finished yet', 'optiwebopz-seo-connector'); ?></h2>207 <h2><?php echo $st['mode'] === 'run' ? esc_html__('Copying into OptiWebOpz SEO — not finished yet', 'optiwebopz-seo-connector') : esc_html__('Preview — not finished yet', 'optiwebopz-seo-connector'); ?></h2> 208 208 <p><?php echo esc_html(sprintf(/* translators: 1: plugin, 2: part, 3: items, 4: batches */ __('%1$s · now: %2$s · %3$d items read in %4$d batches.', 'optiwebopz-seo-connector'), 209 209 TALER_CX_IMPORT_SOURCES[$st['src']] ?? '', $parts[$st['phase']] ?? '', (int) $st['items'], (int) $st['batches'])); ?></p> … … 232 232 <?php endforeach; ?> 233 233 </fieldset> 234 <label class="tcx-switch"><input type="checkbox" name="overwrite" value="1"> <span><?php esc_html_e('Replace values Opti webopz SEO already has (off: its own values are kept)', 'optiwebopz-seo-connector'); ?></span></label>234 <label class="tcx-switch"><input type="checkbox" name="overwrite" value="1"> <span><?php esc_html_e('Replace values OptiWebOpz SEO already has (off: its own values are kept)', 'optiwebopz-seo-connector'); ?></span></label> 235 235 <p class="tcx-muted"><?php echo esc_html(sprintf(/* translators: 1: example variables of the other plugins, 2: Taler's variable */ __('Copied: SEO title, meta description, focus keyword and the other keywords, canonical link, noindex / nofollow, social title, description and image, breadcrumb title and article type; for categories and tags their title, description and noindex; and every site-wide setting Taler also has. Variables with the same meaning are converted (for example %1$s → %2$s); any other variable marks the value "needs review" and it is not copied.', 'optiwebopz-seo-connector'), '%%title%%, #post_title', '%title%')); ?></p> 236 236 <p><button type="submit" class="button button-primary tcx-btn"><?php esc_html_e('Make a preview', 'optiwebopz-seo-connector'); ?></button></p> … … 242 242 <div class="tcx-card"> 243 243 <h2><?php echo esc_html(sprintf(/* translators: %s: plugin */ __('Preview from %s', 'optiwebopz-seo-connector'), TALER_CX_IMPORT_SOURCES[$st['src']] ?? '')); ?></h2> 244 <p class="tcx-muted"><?php echo esc_html(sprintf(/* translators: 1: parts, 2: items, 3: yes/no */ __('%1$s · %2$d items read · replace Opti webopz SEO values: %3$s', 'optiwebopz-seo-connector'),244 <p class="tcx-muted"><?php echo esc_html(sprintf(/* translators: 1: parts, 2: items, 3: yes/no */ __('%1$s · %2$d items read · replace OptiWebOpz SEO values: %3$s', 'optiwebopz-seo-connector'), 245 245 implode(', ', array_map(static function ($p) use ($parts) { return $parts[$p] ?? $p; }, (array) $st['parts'])), (int) $st['items'], !empty($st['overwrite']) ? __('yes', 'optiwebopz-seo-connector') : __('no', 'optiwebopz-seo-connector'))); ?></p> 246 246 <?php echo wp_kses(taler_cx_import_counts_html($st), taler_cx_import_allowed_html()); ?> … … 262 262 <?php if (count($prev) >= TALER_CX_IMPORT_PREVIEW_MAX) : ?><p class="tcx-muted"><?php echo esc_html(sprintf(/* translators: %d: rows */ __('The first %d rows are shown; the counts above cover everything.', 'optiwebopz-seo-connector'), TALER_CX_IMPORT_PREVIEW_MAX)); ?></p><?php endif; ?> 263 263 <?php else : ?> 264 <p class="tcx-banner tcx-banner-info"><?php esc_html_e('Nothing to copy: every value is already the same in Opti webopz SEO, or there is none.', 'optiwebopz-seo-connector'); ?></p>264 <p class="tcx-banner tcx-banner-info"><?php esc_html_e('Nothing to copy: every value is already the same in OptiWebOpz SEO, or there is none.', 'optiwebopz-seo-connector'); ?></p> 265 265 <?php endif; ?> 266 266 <?php if ($st['error_list']) : ?> … … 271 271 <?php if ((int) ($st['counts']['copy'] ?? 0) + (int) ($st['counts']['overwrite'] ?? 0) > 0) : ?> 272 272 <div class="tcx-card"> 273 <h2><?php esc_html_e('3. Copy into Opti webopz SEO', 'optiwebopz-seo-connector'); ?></h2>273 <h2><?php esc_html_e('3. Copy into OptiWebOpz SEO', 'optiwebopz-seo-connector'); ?></h2> 274 274 <?php if (!$logOk) : ?><p class="tcx-banner tcx-banner-error"><?php esc_html_e('The import log table is missing, so copying is switched off (there would be no undo). Deactivate and activate the plugin to create it.', 'optiwebopz-seo-connector'); ?></p><?php endif; ?> 275 275 <form method="post" action="<?php echo esc_url(admin_url('admin-post.php')); ?>"> 276 276 <input type="hidden" name="action" value="taler_cx_import_run"> 277 277 <?php wp_nonce_field('taler_cx_import_run'); ?> 278 <label class="tcx-switch"><input type="checkbox" name="confirm" value="1" required> <span><?php esc_html_e('I checked the preview. Copy these values into Opti webopz SEO\'s fields (the other plugin keeps its data; every change is logged and can be undone).', 'optiwebopz-seo-connector'); ?></span></label>279 <p><button type="submit" class="button button-primary tcx-btn"<?php disabled(!$logOk); ?>><?php esc_html_e('Copy into Opti webopz SEO now', 'optiwebopz-seo-connector'); ?></button></p>278 <label class="tcx-switch"><input type="checkbox" name="confirm" value="1" required> <span><?php esc_html_e('I checked the preview. Copy these values into OptiWebOpz SEO\'s fields (the other plugin keeps its data; every change is logged and can be undone).', 'optiwebopz-seo-connector'); ?></span></label> 279 <p><button type="submit" class="button button-primary tcx-btn"<?php disabled(!$logOk); ?>><?php esc_html_e('Copy into OptiWebOpz SEO now', 'optiwebopz-seo-connector'); ?></button></p> 280 280 </form> 281 281 </div> -
optiwebopz-seo-connector/tags/2.4.3/includes/admin/page-links.php
r3795029 r3795827 50 50 <?php taler_cx_seo_header(__('Internal links', 'optiwebopz-seo-connector')); ?> 51 51 <?php taler_cx_seo_notice([ 52 'links_off' => ['warning', __('Internal links is switched off (Opti webopz SEO → Overview).', 'optiwebopz-seo-connector')],52 'links_off' => ['warning', __('Internal links is switched off (OptiWebOpz SEO → Overview).', 'optiwebopz-seo-connector')], 53 53 'links_batch' => ['info', __('One batch indexed. Continue until it says finished, or let it run in the background.', 'optiwebopz-seo-connector')], 54 54 'links_done' => ['success', __('The link index is complete.', 'optiwebopz-seo-connector')], … … 57 57 ]); ?> 58 58 <?php if (!$on) : ?> 59 <p class="tcx-banner tcx-banner-info"><?php esc_html_e('Internal links is switched off (Opti webopz SEO → Overview).', 'optiwebopz-seo-connector'); ?></p>59 <p class="tcx-banner tcx-banner-info"><?php esc_html_e('Internal links is switched off (OptiWebOpz SEO → Overview).', 'optiwebopz-seo-connector'); ?></p> 60 60 </div> 61 61 <?php return; endif; ?> -
optiwebopz-seo-connector/tags/2.4.3/includes/admin/page-overview.php
r3795029 r3795827 44 44 'analysis' => [__('Post analysis', 'optiwebopz-seo-connector'), __('SEO fields and checks under the post editor, with Taler\'s checks on Taler posts.', 'optiwebopz-seo-connector')], 45 45 'dashboard' => [__('Search performance', 'optiwebopz-seo-connector'), __('Clicks, impressions, positions and indexing from Taler (Search Console data stays in Taler).', 'optiwebopz-seo-connector')], 46 'images' => [__('Missing image alt text', 'optiwebopz-seo-connector'), __('An image printed without alt text gets its own title as alt text (when the title reads like words). Off until you switch it on. Fix images one by one under Opti webopz SEO → Images.', 'optiwebopz-seo-connector')],46 'images' => [__('Missing image alt text', 'optiwebopz-seo-connector'), __('An image printed without alt text gets its own title as alt text (when the title reads like words). Off until you switch it on. Fix images one by one under OptiWebOpz SEO → Images.', 'optiwebopz-seo-connector')], 47 47 'indexnow' => [__('IndexNow', 'optiwebopz-seo-connector'), __('Tells Bing and the other IndexNow search engines at once when a page is published or changed (Google does not use IndexNow). Off until you switch it on.', 'optiwebopz-seo-connector')], 48 48 'links' => [__('Internal links', 'optiwebopz-seo-connector'), __('Counts which posts link to which, lists posts nobody links to, and suggests related posts to link while you edit.', 'optiwebopz-seo-connector')], … … 52 52 /** 2.3.0: the one place that says Optiwebopz SEO's output is off ('basic' mode) — neutral words, Overview only. */ 53 53 function taler_cx_seo_off_text(): string { 54 return __('Titles, meta tags, schema and sitemaps from Opti webopz SEO are switched off on this site. Turn them on with the switch below when you are ready.', 'optiwebopz-seo-connector');54 return __('Titles, meta tags, schema and sitemaps from OptiWebOpz SEO are switched off on this site. Turn them on with the switch below when you are ready.', 'optiwebopz-seo-connector'); 55 55 } 56 56 … … 77 77 $t['output'] = ['label' => __('Titles, meta tags, schema, sitemaps', 'optiwebopz-seo-connector'), 78 78 'value' => $mode === 'taler' ? __('On', 'optiwebopz-seo-connector') : ($mode === 'external' ? taler_cx_seo_plugin_name(taler_cx_external_seo()) : $off), 79 'note' => $mode === 'taler' ? __('Opti webopz SEO prints them.', 'optiwebopz-seo-connector') : ($mode === 'external' ? __('That plugin prints them.', 'optiwebopz-seo-connector') : __('Switch them on below.', 'optiwebopz-seo-connector')),79 'note' => $mode === 'taler' ? __('OptiWebOpz SEO prints them.', 'optiwebopz-seo-connector') : ($mode === 'external' ? __('That plugin prints them.', 'optiwebopz-seo-connector') : __('Switch them on below.', 'optiwebopz-seo-connector')), 80 80 'url' => '', 'link' => '', 'src' => 'includes/core/modules.php:taler_cx_seo_mode']; 81 81 … … 202 202 ?> 203 203 <div class="wrap tcx"> 204 <?php taler_cx_seo_header(__('Opti webopz SEO', 'optiwebopz-seo-connector')); ?>204 <?php taler_cx_seo_header(__('OptiWebOpz SEO', 'optiwebopz-seo-connector')); ?> 205 205 <?php taler_cx_seo_notice([ 206 206 'saved' => ['success', __('Saved.', 'optiwebopz-seo-connector')], … … 210 210 'indexnow_failed' => ['warning', __('IndexNow did not accept the addresses. See the last answer below.', 'optiwebopz-seo-connector')], 211 211 'indexnow_key' => ['success', __('A new IndexNow key is in place.', 'optiwebopz-seo-connector')], 212 'wiz_closed' => ['success', __('Setup closed. Open it again any time under Opti webopz SEO → Setup.', 'optiwebopz-seo-connector')],213 'takeover_blocked' => ['warning', __('Opti webopz SEO was not switched on: another SEO plugin is active. Import its data (Optiwebopz SEO → Import), deactivate it, then switch Optiwebopz SEO on.', 'optiwebopz-seo-connector')],212 'wiz_closed' => ['success', __('Setup closed. Open it again any time under OptiWebOpz SEO → Setup.', 'optiwebopz-seo-connector')], 213 'takeover_blocked' => ['warning', __('OptiWebOpz SEO was not switched on: another SEO plugin is active. Import its data (OptiWebOpz SEO → Import), deactivate it, then switch OptiWebOpz SEO on.', 'optiwebopz-seo-connector')], 214 214 ]); ?> 215 215 <?php if (taler_cx_seo_mode() === 'basic') : ?> … … 237 237 <input type="hidden" name="action" value="taler_cx_seo_overview"> 238 238 <?php wp_nonce_field('taler_cx_seo_overview'); ?> 239 <h2><?php esc_html_e('Use Opti webopz SEO on this site', 'optiwebopz-seo-connector'); ?></h2>239 <h2><?php esc_html_e('Use OptiWebOpz SEO on this site', 'optiwebopz-seo-connector'); ?></h2> 240 240 <?php if ($ext !== '') : ?> 241 241 <p><?php echo esc_html(sprintf(/* translators: %1$s: SEO plugin name */ __('%1$s is active. Only one SEO plugin may print titles, meta tags and schema, so this switch is off until %1$s is deactivated.', 'optiwebopz-seo-connector'), taler_cx_seo_plugin_name($ext))); ?></p> … … 243 243 <label class="tcx-switch"> 244 244 <input type="checkbox" name="takeover" value="1"<?php checked(taler_cx_takeover() && $ext === ''); ?><?php disabled($ext !== ''); ?>> 245 <span><?php esc_html_e('Opti webopz SEO prints this site\'s titles, meta tags, schema and sitemaps', 'optiwebopz-seo-connector'); ?></span>245 <span><?php esc_html_e('OptiWebOpz SEO prints this site\'s titles, meta tags, schema and sitemaps', 'optiwebopz-seo-connector'); ?></span> 246 246 </label> 247 247 <h2><?php esc_html_e('Modules', 'optiwebopz-seo-connector'); ?></h2> … … 288 288 <div class="tcx-card"> 289 289 <h2><?php esc_html_e('Taler (optional)', 'optiwebopz-seo-connector'); ?></h2> 290 <p><?php esc_html_e('Taler is a separate AI blog and SEO service. Linking this site adds Taler drafts, the Taler post editor and Google search data on Search performance. Opti webopz SEO works fully without it.', 'optiwebopz-seo-connector'); ?></p>290 <p><?php esc_html_e('Taler is a separate AI blog and SEO service. Linking this site adds Taler drafts, the Taler post editor and Google search data on Search performance. OptiWebOpz SEO works fully without it.', 'optiwebopz-seo-connector'); ?></p> 291 291 <p class="tcx-muted"><?php echo $linked ? esc_html__('This site is linked to Taler.', 'optiwebopz-seo-connector') : esc_html__('This site is not linked to Taler.', 'optiwebopz-seo-connector'); ?></p> 292 292 <?php if (current_user_can('manage_options')) : ?> … … 302 302 if (!current_user_can('manage_options')) { return; } // 2.3.1: the Setup screen is for administrators 303 303 $text = [ 304 0 => __('A short, optional setup: another SEO plugin, your site, titles, modules, sitemap, switching Opti webopz SEO on and the optional Taler link. Every step can be skipped.', 'optiwebopz-seo-connector'),304 0 => __('A short, optional setup: another SEO plugin, your site, titles, modules, sitemap, switching OptiWebOpz SEO on and the optional Taler link. Every step can be skipped.', 'optiwebopz-seo-connector'), 305 305 1 => __('Setup is finished. Run it again to review another SEO plugin, your site, titles, modules, sitemap, the switch and the Taler link; your settings stay until you save a step.', 'optiwebopz-seo-connector'), 306 306 2 => __('Setup was closed before the end. Run it any time; it shows your current settings.', 'optiwebopz-seo-connector'), -
optiwebopz-seo-connector/tags/2.4.3/includes/admin/page-performance.php
r3795029 r3795827 106 106 <?php taler_cx_seo_header(__('Performance', 'optiwebopz-seo-connector')); ?> 107 107 <?php taler_cx_seo_notice([ 108 'an_off' => ['info', __('Post analysis is switched off (Opti webopz SEO → Overview).', 'optiwebopz-seo-connector')],108 'an_off' => ['info', __('Post analysis is switched off (OptiWebOpz SEO → Overview).', 'optiwebopz-seo-connector')], 109 109 'an_batch' => ['info', __('One batch analysed. Continue until it says finished, or let it run in the background.', 'optiwebopz-seo-connector')], 110 110 'an_done' => ['success', __('Every published post has a content score now.', 'optiwebopz-seo-connector')], … … 117 117 <h2 class="tcx-h2"><?php esc_html_e('Content scores', 'optiwebopz-seo-connector'); ?></h2> 118 118 <?php if (!$scores) : ?> 119 <div class="tcx-card"><p><?php esc_html_e('Content scores come from Post analysis. It runs while Opti webopz SEO prints this site\'s titles and meta tags; switch that on under Optiwebopz SEO → Overview to score your posts.', 'optiwebopz-seo-connector'); ?></p></div>119 <div class="tcx-card"><p><?php esc_html_e('Content scores come from Post analysis. It runs while OptiWebOpz SEO prints this site\'s titles and meta tags; switch that on under OptiWebOpz SEO → Overview to score your posts.', 'optiwebopz-seo-connector'); ?></p></div> 120 120 <?php else : $c = taler_cx_analysis_counts(); $st = taler_cx_analysis_state(); ?> 121 121 <?php taler_cx_perf_tiles([ … … 211 211 <h2 class="tcx-h2"><?php esc_html_e('Not found (404) and redirects', 'optiwebopz-seo-connector'); ?></h2> 212 212 <?php $lg = taler_cx_perf_logs(); if (!taler_cx_module_on('redirects') && $lg['f_rows'] === 0 && $lg['r_all'] === 0) : ?> 213 <div class="tcx-card"><p><?php esc_html_e('The 404 log and redirects run with the Redirects module (Opti webopz SEO → Overview).', 'optiwebopz-seo-connector'); ?></p></div>213 <div class="tcx-card"><p><?php esc_html_e('The 404 log and redirects run with the Redirects module (OptiWebOpz SEO → Overview).', 'optiwebopz-seo-connector'); ?></p></div> 214 214 <?php else : ?> 215 215 <?php taler_cx_perf_tiles([ -
optiwebopz-seo-connector/tags/2.4.3/includes/admin/page-recommendations.php
r3795029 r3795827 25 25 <p class="tcx-muted"><?php esc_html_e('What to change on this site, the biggest gain first. Advice only: nothing is changed for you.', 'optiwebopz-seo-connector'); ?></p> 26 26 <?php if (!function_exists('taler_cx_analysis_recommendations')) : ?> 27 <div class="tcx-card"><p><?php esc_html_e('Recommendations come from Post analysis. It runs while Opti webopz SEO prints this site\'s titles and meta tags; switch that on under Optiwebopz SEO → Overview.', 'optiwebopz-seo-connector'); ?></p></div>27 <div class="tcx-card"><p><?php esc_html_e('Recommendations come from Post analysis. It runs while OptiWebOpz SEO prints this site\'s titles and meta tags; switch that on under OptiWebOpz SEO → Overview.', 'optiwebopz-seo-connector'); ?></p></div> 28 28 </div> 29 29 <?php return; endif; ?> -
optiwebopz-seo-connector/tags/2.4.3/includes/admin/page-redirects.php
r3795029 r3795827 172 172 ]); ?> 173 173 <?php if (!taler_cx_module_on('redirects')) : ?> 174 <p class="tcx-banner tcx-banner-info"><?php esc_html_e('Redirects and the 404 log are switched off (Opti webopz SEO → Overview). You can prepare redirects here; they start working when the module is on.', 'optiwebopz-seo-connector'); ?></p>174 <p class="tcx-banner tcx-banner-info"><?php esc_html_e('Redirects and the 404 log are switched off (OptiWebOpz SEO → Overview). You can prepare redirects here; they start working when the module is on.', 'optiwebopz-seo-connector'); ?></p> 175 175 <?php endif; ?> 176 176 <nav class="tcx-tabs" aria-label="<?php esc_attr_e('Sections', 'optiwebopz-seo-connector'); ?>"> -
optiwebopz-seo-connector/tags/2.4.3/includes/admin/page-roles.php
r3795029 r3795827 39 39 <form class="tcx-card" method="post" action="<?php echo esc_url(admin_url('admin-post.php')); ?>"> 40 40 <input type="hidden" name="action" value="taler_cx_roles_save"><?php wp_nonce_field('taler_cx_roles_save'); ?> 41 <h2><?php esc_html_e('Who may use the Opti webopz SEO screens', 'optiwebopz-seo-connector'); ?></h2>42 <p class="tcx-muted"><?php esc_html_e('Administrators always can. The site key (Settings → Optiwebopz SEO Connector) and this page stay for administrators only.', 'optiwebopz-seo-connector'); ?></p>41 <h2><?php esc_html_e('Who may use the OptiWebOpz SEO screens', 'optiwebopz-seo-connector'); ?></h2> 42 <p class="tcx-muted"><?php esc_html_e('Administrators always can. The site key (Settings → Taler connection) and this page stay for administrators only.', 'optiwebopz-seo-connector'); ?></p> 43 43 <ul class="tcx-modules"> 44 44 <?php foreach ($names as $slug => $label) : ?> … … 46 46 <?php endforeach; ?> 47 47 </ul> 48 <h2><?php esc_html_e('Who sees the Opti webopz SEO box in the editor', 'optiwebopz-seo-connector'); ?></h2>48 <h2><?php esc_html_e('Who sees the OptiWebOpz SEO box in the editor', 'optiwebopz-seo-connector'); ?></h2> 49 49 <p class="tcx-muted"><?php esc_html_e('None ticked: everyone who can edit the post (as before). Tick roles to limit it to them (administrators always see it).', 'optiwebopz-seo-connector'); ?></p> 50 50 <ul class="tcx-modules"> -
optiwebopz-seo-connector/tags/2.4.3/includes/admin/page-suggestions.php
r3795029 r3795827 101 101 'sg_dismissed' => ['success', __('Dismissed. Nothing on the post was changed.', 'optiwebopz-seo-connector')], 102 102 'sg_undone' => ['success', __('Undone. The post is back as it was.', 'optiwebopz-seo-connector')], 103 'sg_editor_off' => ['warning', __('Applying from this screen is switched off (Settings → Optiwebopz SEO Connector).', 'optiwebopz-seo-connector')],103 'sg_editor_off' => ['warning', __('Applying from this screen is switched off (Settings → Taler connection).', 'optiwebopz-seo-connector')], 104 104 'sg_stale' => ['warning', __('Not applied: the field had changed since Taler looked at it. Nothing was written.', 'optiwebopz-seo-connector')], 105 105 'sg_expired' => ['warning', __('This suggestion has expired. Nothing was written.', 'optiwebopz-seo-connector')], … … 117 117 echo esc_html(sprintf(/* translators: 1-3: on or off */ __('Applying: editors %1$s · Taler %2$s · automatic %3$s', 'optiwebopz-seo-connector'), $onOff($editorOn), $onOff(taler_cx_link_mode('remote')), $onOff(taler_cx_link_mode('auto')))); 118 118 if ($set['stop']) { echo ' · ' . esc_html__('remote and automatic changes are stopped', 'optiwebopz-seo-connector'); } 119 if (current_user_can('manage_options')) { echo ' <a class="tcx-link" href="' . esc_url(admin_url('options-general.php?page=' . TALER_CX_PAGE)) . '">' . esc_html__('Change in Settings → Optiwebopz SEO Connector', 'optiwebopz-seo-connector') . '</a>'; }119 if (current_user_can('manage_options')) { echo ' <a class="tcx-link" href="' . esc_url(admin_url('options-general.php?page=' . TALER_CX_PAGE)) . '">' . esc_html__('Change in Settings → Taler connection', 'optiwebopz-seo-connector') . '</a>'; } 120 120 ?></p> 121 121 <?php if (!taler_cx_seo_active()) : ?> 122 <p class="tcx-muted"><?php esc_html_e('These are Opti webopz SEO fields. They show on the site while Optiwebopz SEO prints this site\'s titles and meta tags (see Overview).', 'optiwebopz-seo-connector'); ?></p>122 <p class="tcx-muted"><?php esc_html_e('These are OptiWebOpz SEO fields. They show on the site while OptiWebOpz SEO prints this site\'s titles and meta tags (see Overview).', 'optiwebopz-seo-connector'); ?></p> 123 123 <?php endif; ?> 124 124 <nav class="tcx-tabs" aria-label="<?php esc_attr_e('Suggestions', 'optiwebopz-seo-connector'); ?>"> -
optiwebopz-seo-connector/tags/2.4.3/includes/admin/page-wizard.php
r3795029 r3795827 220 220 ?> 221 221 <h2 id="tcx-wiz-title"><?php esc_html_e('Other SEO plugins', 'optiwebopz-seo-connector'); ?></h2> 222 <p><?php esc_html_e('Opti webopz SEO can copy titles, descriptions, focus keywords, robots rules, social fields and redirects from Yoast SEO, Rank Math and All in One SEO. Nothing is copied in this setup: the Import screen first makes a preview, and copies only after you confirm.', 'optiwebopz-seo-connector'); ?></p>222 <p><?php esc_html_e('OptiWebOpz SEO can copy titles, descriptions, focus keywords, robots rules, social fields and redirects from Yoast SEO, Rank Math and All in One SEO. Nothing is copied in this setup: the Import screen first makes a preview, and copies only after you confirm.', 'optiwebopz-seo-connector'); ?></p> 223 223 <ul class="tcx-facts"> 224 224 <?php foreach (TALER_CX_IMPORT_SOURCES as $src => $name) : $d = $det[$src] ?? ['active' => false, 'any' => false, 'posts' => 0, 'terms' => 0, 'global' => false, 'redirects' => null]; ?> … … 230 230 </ul> 231 231 <?php if ($ext !== '') : ?> 232 <p class="tcx-banner tcx-banner-info"><?php echo esc_html(sprintf(/* translators: %1$s: SEO plugin name */ __('%1$s is active. Only one SEO plugin may print titles, meta tags and schema, so Opti webopz SEO cannot be switched on (step 6) until %1$s is deactivated. You can set up everything else now.', 'optiwebopz-seo-connector'), taler_cx_seo_plugin_name($ext))); ?></p>232 <p class="tcx-banner tcx-banner-info"><?php echo esc_html(sprintf(/* translators: %1$s: SEO plugin name */ __('%1$s is active. Only one SEO plugin may print titles, meta tags and schema, so OptiWebOpz SEO cannot be switched on (step 6) until %1$s is deactivated. You can set up everything else now.', 'optiwebopz-seo-connector'), taler_cx_seo_plugin_name($ext))); ?></p> 233 233 <?php endif; ?> 234 234 <?php if ($found) : ?> 235 235 <p><a class="button tcx-btn" href="<?php echo esc_url(admin_url('admin.php?page=taler-seo-import')); ?>"><?php esc_html_e('Open Import (preview first)', 'optiwebopz-seo-connector'); ?></a></p> 236 <p class="tcx-muted"><?php esc_html_e('Come back with Opti webopz SEO → Setup: the setup continues where you left it.', 'optiwebopz-seo-connector'); ?></p>236 <p class="tcx-muted"><?php esc_html_e('Come back with OptiWebOpz SEO → Setup: the setup continues where you left it.', 'optiwebopz-seo-connector'); ?></p> 237 237 <?php endif; ?> 238 238 <?php … … 249 249 <li class="tcx-module"> 250 250 <label class="tcx-switch"><input type="checkbox" name="modules[<?php echo esc_attr($m); ?>]" value="1"<?php checked($state[$m]); ?>> <span><strong><?php echo esc_html($l[0]); ?></strong></span></label> 251 <p class="tcx-muted"><?php echo esc_html($l[1]); ?><?php echo TALER_CX_MODULES[$m][1] ? ' ' . esc_html__('Runs only while Opti webopz SEO is switched on (step 6).', 'optiwebopz-seo-connector') : ''; ?></p>251 <p class="tcx-muted"><?php echo esc_html($l[1]); ?><?php echo TALER_CX_MODULES[$m][1] ? ' ' . esc_html__('Runs only while OptiWebOpz SEO is switched on (step 6).', 'optiwebopz-seo-connector') : ''; ?></p> 252 252 <p class="tcx-pill <?php echo $runs ? 'is-on' : 'is-off'; ?>"><?php echo $runs ? esc_html__('Running', 'optiwebopz-seo-connector') : esc_html__('Not running', 'optiwebopz-seo-connector'); ?></p> 253 253 </li> … … 265 265 <label class="tcx-switch"><input type="checkbox" name="sitemaps_on" value="1"<?php checked($state['sitemaps']); ?>> <span><strong><?php esc_html_e('XML sitemaps', 'optiwebopz-seo-connector'); ?></strong></span></label> 266 266 <?php if ($ext !== '') : ?> 267 <p class="tcx-muted"><?php echo esc_html(sprintf(/* translators: %s: SEO plugin name */ __('%s is active and prints its own sitemap; Opti webopz SEO\'s sitemap starts once Optiwebopz SEO is switched on.', 'optiwebopz-seo-connector'), taler_cx_seo_plugin_name($ext))); ?></p>267 <p class="tcx-muted"><?php echo esc_html(sprintf(/* translators: %s: SEO plugin name */ __('%s is active and prints its own sitemap; OptiWebOpz SEO\'s sitemap starts once OptiWebOpz SEO is switched on.', 'optiwebopz-seo-connector'), taler_cx_seo_plugin_name($ext))); ?></p> 268 268 <?php elseif (!taler_cx_seo_active()) : ?> 269 <p class="tcx-muted"><?php esc_html_e('The sitemap starts once Opti webopz SEO is switched on (step 6).', 'optiwebopz-seo-connector'); ?></p>269 <p class="tcx-muted"><?php esc_html_e('The sitemap starts once OptiWebOpz SEO is switched on (step 6).', 'optiwebopz-seo-connector'); ?></p> 270 270 <?php endif; ?> 271 271 <h3><?php esc_html_e('What the sitemap lists', 'optiwebopz-seo-connector'); ?></h3> … … 304 304 4 => [__('Modules', 'optiwebopz-seo-connector'), $mods ? implode(', ', $mods) : __('none', 'optiwebopz-seo-connector')], 305 305 5 => [__('Sitemap', 'optiwebopz-seo-connector'), $state['sitemaps'] ? sprintf(/* translators: %s: list of contents */ __('on; lists %s', 'optiwebopz-seo-connector'), $sm ? implode(', ', $sm) : __('nothing', 'optiwebopz-seo-connector')) : __('off', 'optiwebopz-seo-connector')], 306 6 => [__('Opti webopz SEO switched on', 'optiwebopz-seo-connector'), taler_cx_seo_active() ? __('yes: Optiwebopz SEO prints titles, meta tags, schema and sitemaps', 'optiwebopz-seo-connector')306 6 => [__('OptiWebOpz SEO switched on', 'optiwebopz-seo-connector'), taler_cx_seo_active() ? __('yes: OptiWebOpz SEO prints titles, meta tags, schema and sitemaps', 'optiwebopz-seo-connector') 307 307 : ($ext !== '' ? sprintf(/* translators: %s: SEO plugin name */ __('no: %s is active', 'optiwebopz-seo-connector'), taler_cx_seo_plugin_name($ext)) : __('no', 'optiwebopz-seo-connector'))], 308 7 => [__('Taler (optional)', 'optiwebopz-seo-connector'), taler_cx_site_key() !== '' ? __('linked', 'optiwebopz-seo-connector') : __('not linked (Opti webopz SEO works fully without it)', 'optiwebopz-seo-connector')],308 7 => [__('Taler (optional)', 'optiwebopz-seo-connector'), taler_cx_site_key() !== '' ? __('linked', 'optiwebopz-seo-connector') : __('not linked (OptiWebOpz SEO works fully without it)', 'optiwebopz-seo-connector')], 309 309 ]; 310 310 } … … 320 320 ?> 321 321 <div class="wrap tcx"> 322 <?php taler_cx_seo_header(__('Set up Opti webopz SEO', 'optiwebopz-seo-connector')); ?>322 <?php taler_cx_seo_header(__('Set up OptiWebOpz SEO', 'optiwebopz-seo-connector')); ?> 323 323 <?php taler_cx_seo_notice([ 324 324 'wiz_saved' => ['success', __('Saved.', 'optiwebopz-seo-connector')], 325 325 'wiz_skipped' => ['info', __('Step skipped. Nothing was changed.', 'optiwebopz-seo-connector')], 326 'wiz_blocked' => ['warning', __('Opti webopz SEO was not switched on: another SEO plugin is active. Deactivate it, then switch Optiwebopz SEO on here or in Overview.', 'optiwebopz-seo-connector')],326 'wiz_blocked' => ['warning', __('OptiWebOpz SEO was not switched on: another SEO plugin is active. Deactivate it, then switch OptiWebOpz SEO on here or in Overview.', 'optiwebopz-seo-connector')], 327 327 'wiz_done' => ['success', __('Setup finished. You can change everything later under Titles & schema and Overview.', 'optiwebopz-seo-connector')], 328 328 ]); ?> … … 351 351 taler_cx_field('schema_post_type', __('Schema type for posts', 'optiwebopz-seo-connector')); 352 352 ?></div> 353 <p class="tcx-muted"><?php esc_html_e('Street address, opening hours, profiles and the other details are under Opti webopz SEO → Titles & schema.', 'optiwebopz-seo-connector'); ?></p>353 <p class="tcx-muted"><?php esc_html_e('Street address, opening hours, profiles and the other details are under OptiWebOpz SEO → Titles & schema.', 'optiwebopz-seo-connector'); ?></p> 354 354 <?php elseif ($step === 3) : ?> 355 355 <h2 id="tcx-wiz-title"><?php esc_html_e('How titles look', 'optiwebopz-seo-connector'); ?></h2> … … 364 364 <?php elseif ($step === 5) : taler_cx_wizard_step_sitemap($ext); ?> 365 365 <?php elseif ($step === 6) : ?> 366 <h2 id="tcx-wiz-title"><?php esc_html_e('Switch Opti webopz SEO on', 'optiwebopz-seo-connector'); ?></h2>366 <h2 id="tcx-wiz-title"><?php esc_html_e('Switch OptiWebOpz SEO on', 'optiwebopz-seo-connector'); ?></h2> 367 367 <?php if ($ext !== '') : ?> 368 368 <p class="tcx-banner tcx-banner-info"><?php echo esc_html(sprintf(/* translators: %1$s: SEO plugin name */ __('%1$s is active. Only one SEO plugin may print titles, meta tags and schema, so this switch is off until %1$s is deactivated. Import its data first (step 1).', 'optiwebopz-seo-connector'), taler_cx_seo_plugin_name($ext))); ?></p> 369 369 <?php else : ?> 370 <p class="tcx-muted"><?php esc_html_e('When this is on, Opti webopz SEO prints the titles, meta tags, schema and sitemaps you set up. You can switch it off again on Overview.', 'optiwebopz-seo-connector'); ?></p>370 <p class="tcx-muted"><?php esc_html_e('When this is on, OptiWebOpz SEO prints the titles, meta tags, schema and sitemaps you set up. You can switch it off again on Overview.', 'optiwebopz-seo-connector'); ?></p> 371 371 <?php endif; ?> 372 <label class="tcx-switch"><input type="checkbox" name="takeover" value="1"<?php checked(taler_cx_takeover() && $ext === ''); ?><?php disabled($ext !== ''); ?>> <span><?php esc_html_e('Opti webopz SEO prints this site\'s titles, meta tags, schema and sitemaps', 'optiwebopz-seo-connector'); ?></span></label>372 <label class="tcx-switch"><input type="checkbox" name="takeover" value="1"<?php checked(taler_cx_takeover() && $ext === ''); ?><?php disabled($ext !== ''); ?>> <span><?php esc_html_e('OptiWebOpz SEO prints this site\'s titles, meta tags, schema and sitemaps', 'optiwebopz-seo-connector'); ?></span></label> 373 373 <?php elseif ($step === 7) : $linked = taler_cx_site_key() !== ''; ?> 374 374 <h2 id="tcx-wiz-title"><?php esc_html_e('Taler (optional)', 'optiwebopz-seo-connector'); ?></h2> 375 <p><?php esc_html_e('Taler is a separate AI blog and SEO service. Linking this site adds Taler drafts, the Taler post editor and Google search data on Search performance. Opti webopz SEO works fully without it, and this setup finishes without it.', 'optiwebopz-seo-connector'); ?></p>375 <p><?php esc_html_e('Taler is a separate AI blog and SEO service. Linking this site adds Taler drafts, the Taler post editor and Google search data on Search performance. OptiWebOpz SEO works fully without it, and this setup finishes without it.', 'optiwebopz-seo-connector'); ?></p> 376 376 <p class="tcx-muted"><?php echo $linked ? esc_html__('This site is linked to Taler.', 'optiwebopz-seo-connector') : esc_html__('This site is not linked to Taler.', 'optiwebopz-seo-connector'); ?></p> 377 377 <p><a class="button tcx-btn" href="<?php echo esc_url(admin_url('options-general.php?page=' . TALER_CX_PAGE)); ?>"><?php echo $linked ? esc_html__('Taler connection settings', 'optiwebopz-seo-connector') : esc_html__('Connect to Taler', 'optiwebopz-seo-connector'); ?></a></p> … … 400 400 </form> 401 401 <?php if ($done === 0) : ?> 402 <p class="tcx-muted"><?php esc_html_e('Not now? Close the setup; open it again any time under Opti webopz SEO → Setup. Your settings stay as they are.', 'optiwebopz-seo-connector'); ?></p>402 <p class="tcx-muted"><?php esc_html_e('Not now? Close the setup; open it again any time under OptiWebOpz SEO → Setup. Your settings stay as they are.', 'optiwebopz-seo-connector'); ?></p> 403 403 <?php taler_cx_wizard_dismiss_form(); ?> 404 404 <?php endif; ?> -
optiwebopz-seo-connector/tags/2.4.3/includes/admin/seo-menu.php
r3795029 r3795827 57 57 58 58 add_action('admin_menu', static function (): void { 59 add_menu_page(__('Opti webopz SEO', 'optiwebopz-seo-connector'), __('Optiwebopz SEO', 'optiwebopz-seo-connector'), taler_cx_seo_cap(), TALER_CX_SEO_SLUG,59 add_menu_page(__('OptiWebOpz SEO', 'optiwebopz-seo-connector'), __('OptiWebOpz SEO', 'optiwebopz-seo-connector'), taler_cx_seo_cap(), TALER_CX_SEO_SLUG, 60 60 'taler_cx_page_overview', 'dashicons-chart-area', 81); 61 61 add_submenu_page(TALER_CX_SEO_SLUG, __('Overview', 'optiwebopz-seo-connector'), __('Overview', 'optiwebopz-seo-connector'), taler_cx_seo_cap(), TALER_CX_SEO_SLUG, 'taler_cx_page_overview'); … … 141 141 echo '<p class="tcx-banner tcx-banner-info">' . esc_html(sprintf( 142 142 /* translators: %1$s: SEO plugin name */ 143 __('%1$s is active, so it prints this site\'s titles, meta tags, schema and sitemaps. Opti webopz SEO output is off; Taler keeps writing its SEO fields into %1$s.', 'optiwebopz-seo-connector'),143 __('%1$s is active, so it prints this site\'s titles, meta tags, schema and sitemaps. OptiWebOpz SEO output is off; Taler keeps writing its SEO fields into %1$s.', 'optiwebopz-seo-connector'), 144 144 taler_cx_seo_plugin_name(taler_cx_external_seo()))) . '</p>'; 145 145 } // 2.3.0: 'basic' (output switched off) is said once, on Overview only — not as a banner on every screen -
optiwebopz-seo-connector/tags/2.4.3/includes/core/taler-client.php
r3795029 r3795827 138 138 function taler_cx_pull_message(string $code): string { 139 139 $m = [ 140 'not_connected' => __('Search data from Taler appears here when this site is linked to Taler (optional; Settings → Optiwebopz SEO Connector).', 'optiwebopz-seo-connector'), // 2.3.0: not a fault141 'no_app_url' => __('Add the Taler app address (https) in Settings → Optiwebopz SEO Connectorto see Taler data here.', 'optiwebopz-seo-connector'),140 'not_connected' => __('Search data from Taler appears here when this site is linked to Taler (optional; Settings → Taler connection).', 'optiwebopz-seo-connector'), // 2.3.0: not a fault 141 'no_app_url' => __('Add the Taler app address (https) in Settings → Taler connection to see Taler data here.', 'optiwebopz-seo-connector'), 142 142 'rate_limited' => __('Taler data was asked for too often in the last hour. It will refresh automatically later.', 'optiwebopz-seo-connector'), 143 143 'unreachable' => __('Taler could not be reached just now.', 'optiwebopz-seo-connector'), -
optiwebopz-seo-connector/tags/2.4.3/includes/seo/import-runs.php
r3795029 r3795827 238 238 if ($t === '' || !in_array($t, TALER_CX_SCHEMA_TYPES, true)) { 239 239 /* translators: %s: schema type of the other plugin */ 240 return ['status' => 'review', 'new' => '', 'raw' => is_scalar($raw) ? sanitize_text_field((string) $raw) : '', 'note' => sprintf(__('schema type "%s" has no Opti webopz SEO equivalent', 'optiwebopz-seo-connector'), sanitize_text_field((string) $raw))];240 return ['status' => 'review', 'new' => '', 'raw' => is_scalar($raw) ? sanitize_text_field((string) $raw) : '', 'note' => sprintf(__('schema type "%s" has no OptiWebOpz SEO equivalent', 'optiwebopz-seo-connector'), sanitize_text_field((string) $raw))]; 241 241 } 242 242 $new = $t; … … 250 250 if (!in_array($c, TALER_CX_SEPARATORS, true)) { 251 251 /* translators: %s: separator character */ 252 return ['status' => 'review', 'new' => '', 'raw' => is_scalar($raw) ? sanitize_text_field((string) $raw) : '', 'note' => sprintf(__('separator "%s" is not one Opti webopz SEO offers', 'optiwebopz-seo-connector'), sanitize_text_field($c))];252 return ['status' => 'review', 'new' => '', 'raw' => is_scalar($raw) ? sanitize_text_field((string) $raw) : '', 'note' => sprintf(__('separator "%s" is not one OptiWebOpz SEO offers', 'optiwebopz-seo-connector'), sanitize_text_field($c))]; 253 253 } 254 254 $new = $c; … … 261 261 $left = array_values(array_diff(array_unique($m[0] ?? []), ['%title%', '%sitename%', '%sep%', '%page%', '%excerpt%', '%tagline%', '%year%', '%term%', '%author%', '%search%'])); 262 262 /* translators: %s: variables of the other plugin */ 263 return ['status' => 'review', 'new' => '', 'raw' => is_scalar($raw) ? sanitize_text_field((string) $raw) : '', 'note' => sprintf(__('variables Opti webopz SEO does not understand: %s', 'optiwebopz-seo-connector'), implode(' ', $left))];263 return ['status' => 'review', 'new' => '', 'raw' => is_scalar($raw) ? sanitize_text_field((string) $raw) : '', 'note' => sprintf(__('variables OptiWebOpz SEO does not understand: %s', 'optiwebopz-seo-connector'), implode(' ', $left))]; 264 264 } 265 265 $txt = $c; … … 292 292 if ($kind === 'org_kind') { 293 293 if (in_array($v, ['Organization', 'LocalBusiness'], true)) { return ['status' => 'ok', 'new' => $v]; } 294 return $why('review', __('the site is set up as a person; Opti webopz SEO describes an organization or a local business', 'optiwebopz-seo-connector'));294 return $why('review', __('the site is set up as a person; OptiWebOpz SEO describes an organization or a local business', 'optiwebopz-seo-connector')); 295 295 } 296 296 if ($kind === 'local_type') { 297 297 if (in_array($v, TALER_CX_LOCAL_TYPES, true)) { return ['status' => 'ok', 'new' => $v]; } 298 298 /* translators: %s: business type of the other plugin */ 299 return $why('review', sprintf(__('business type "%s" is not one Opti webopz SEO offers', 'optiwebopz-seo-connector'), sanitize_text_field($v)));299 return $why('review', sprintf(__('business type "%s" is not one OptiWebOpz SEO offers', 'optiwebopz-seo-connector'), sanitize_text_field($v))); 300 300 } 301 301 if ($kind === 'image') { // an attachment id, or an address in this site's media library … … 329 329 $t = trim(sanitize_text_field($v)); // name: plain text; "the site title" variables mean "not set" (Taler then uses the site title too) 330 330 if ($t === '' || in_array($t, ['%%sitename%%', '%sitename%', '#site_title'], true)) { return $none; } 331 if (preg_match('/%%[a-z_]+%%|#[a-z_]{3,}|%[a-z_]+%/i', $t)) { return $why('review', __('holds a variable; Opti webopz SEO needs plain text here', 'optiwebopz-seo-connector')); }331 if (preg_match('/%%[a-z_]+%%|#[a-z_]{3,}|%[a-z_]+%/i', $t)) { return $why('review', __('holds a variable; OptiWebOpz SEO needs plain text here', 'optiwebopz-seo-connector')); } 332 332 return ['status' => 'ok', 'new' => mb_substr($t, 0, $max)]; 333 333 } -
optiwebopz-seo-connector/tags/2.4.3/includes/seo/redirects.php
r3795029 r3795827 318 318 return; 319 319 } 320 header('X-Redirect-By: Opti webopz SEO');321 wp_redirect((string) $r['target'], $code, 'Opti webopz SEO'); // phpcs:ignore WordPress.Security.SafeRedirect.wp_redirect_wp_redirect -- external targets are allowed on purpose: admin-entered, scheme-checked at save time320 header('X-Redirect-By: OptiWebOpz SEO'); 321 wp_redirect((string) $r['target'], $code, 'OptiWebOpz SEO'); // phpcs:ignore WordPress.Security.SafeRedirect.wp_redirect_wp_redirect -- external targets are allowed on purpose: admin-entered, scheme-checked at save time 322 322 exit; 323 323 } -
optiwebopz-seo-connector/tags/2.4.3/includes/seo/sitemaps.php
r3795029 r3795827 232 232 $home = strtolower(untrailingslashit((string) wp_parse_url(home_url('/'), PHP_URL_PATH))); 233 233 if (in_array($path, [$home . '/sitemap.xml', $home . '/sitemap_index.xml', $home . '/wp-sitemap.xml'], true)) { 234 wp_safe_redirect(taler_cx_sitemap_url(), 301, 'Opti webopz SEO');234 wp_safe_redirect(taler_cx_sitemap_url(), 301, 'OptiWebOpz SEO'); 235 235 exit; 236 236 } -
optiwebopz-seo-connector/tags/2.4.3/includes/seo/terms.php
r3795029 r3795827 67 67 ?> 68 68 <div class="form-field tcx tcx-term"> 69 <label for="tcx-term-title"><?php esc_html_e('SEO title (Opti webopz SEO)', 'optiwebopz-seo-connector'); ?></label>69 <label for="tcx-term-title"><?php esc_html_e('SEO title (OptiWebOpz SEO)', 'optiwebopz-seo-connector'); ?></label> 70 70 <input id="tcx-term-title" class="tcx-input" type="text" name="taler_cx_term[_taler_seo_title]" maxlength="200" placeholder="<?php echo esc_attr((string) taler_cx_seo_opt('title_term')); ?>"> 71 <label for="tcx-term-desc"><?php esc_html_e('Meta description (Opti webopz SEO)', 'optiwebopz-seo-connector'); ?></label>71 <label for="tcx-term-desc"><?php esc_html_e('Meta description (OptiWebOpz SEO)', 'optiwebopz-seo-connector'); ?></label> 72 72 <textarea id="tcx-term-desc" class="tcx-input" rows="2" name="taler_cx_term[_taler_meta_desc]" maxlength="400"></textarea> 73 73 <label class="tcx-switch"><input type="checkbox" name="taler_cx_term[_taler_noindex]" value="1"> <span><?php esc_html_e('Keep this archive out of search results (noindex)', 'optiwebopz-seo-connector'); ?></span></label> … … 82 82 ?> 83 83 <tr class="form-field tcx tcx-term"> 84 <th scope="row"><label for="tcx-term-title"><?php esc_html_e('SEO title (Opti webopz SEO)', 'optiwebopz-seo-connector'); ?></label></th>84 <th scope="row"><label for="tcx-term-title"><?php esc_html_e('SEO title (OptiWebOpz SEO)', 'optiwebopz-seo-connector'); ?></label></th> 85 85 <td><input id="tcx-term-title" class="tcx-input" type="text" name="taler_cx_term[_taler_seo_title]" maxlength="200" value="<?php echo esc_attr($s['title']); ?>" placeholder="<?php echo esc_attr((string) taler_cx_seo_opt('title_term')); ?>"></td> 86 86 </tr> 87 87 <tr class="form-field tcx tcx-term"> 88 <th scope="row"><label for="tcx-term-desc"><?php esc_html_e('Meta description (Opti webopz SEO)', 'optiwebopz-seo-connector'); ?></label></th>88 <th scope="row"><label for="tcx-term-desc"><?php esc_html_e('Meta description (OptiWebOpz SEO)', 'optiwebopz-seo-connector'); ?></label></th> 89 89 <td><textarea id="tcx-term-desc" class="tcx-input" rows="2" name="taler_cx_term[_taler_meta_desc]" maxlength="400"><?php echo esc_textarea($s['desc']); ?></textarea></td> 90 90 </tr> -
optiwebopz-seo-connector/tags/2.4.3/optiwebopz-seo-connector.php
r3795029 r3795827 4 4 * Plugin URI: https://taler.optiwebopz.com/ 5 5 * Description: Connects this WordPress site to Taler and adds Optiwebopz SEO: titles, meta, Open Graph, canonical and robots; one schema graph (Article, FAQ, Breadcrumb, Organization or LocalBusiness, Product); XML and image sitemaps; redirects and a 404 monitor; a per-post analysis panel with Taler's checks; and search performance from Taler (Search Console data stays in Taler). Works next to Rank Math, Yoast or All in One SEO (Optiwebopz SEO output stays off while one is active). Keeps every Taler route: drafts, the Taler post editor, media upload, publishing and Taler-held scheduling. 6 * Version: 2.4. 26 * Version: 2.4.3 7 7 * Requires at least: 6.0 8 8 * Requires PHP: 8.1 … … 114 114 $folder = $taler_cx_other !== '' ? dirname($taler_cx_other) : 'taler-seo-connector'; 115 115 /* translators: 1: the older copy's plugin name, 2: its folder name */ 116 echo '<div class="notice notice-warning"><p>' . esc_html(sprintf(__('Two copies of this plugin are active. The older one, %1$s (folder %2$s), runs; Opti webopz SEO Connectorstays idle. Deactivate %1$s first, then delete it. All copies use the same settings and data, so nothing is lost.', 'optiwebopz-seo-connector'), $name, $folder)) . '</p></div>';116 echo '<div class="notice notice-warning"><p>' . esc_html(sprintf(__('Two copies of this plugin are active. The older one, %1$s (folder %2$s), runs; OptiWebOpz SEO stays idle. Deactivate %1$s first, then delete it. All copies use the same settings and data, so nothing is lost.', 'optiwebopz-seo-connector'), $name, $folder)) . '</p></div>'; 117 117 }; 118 118 add_action('admin_notices', $taler_cx_twice); … … 126 126 const TALER_CX_OLD_BASENAME = 'taler-connector/taler-connector.php'; 127 127 128 define('TALER_CX_VERSION', '2.4. 2');128 define('TALER_CX_VERSION', '2.4.3'); 129 129 define('TALER_CX_DB_VERSION', '6'); // 2.3.4: {prefix}taler_suggestions 130 130 define('TALER_CX_NS', 'taler/v1'); -
optiwebopz-seo-connector/tags/2.4.3/readme.txt
r3795029 r3795827 5 5 Tested up to: 7.1 6 6 Requires PHP: 8.1 7 Stable tag: 2.4. 27 Stable tag: 2.4.3 8 8 License: GPLv2 or later 9 9 License URI: https://www.gnu.org/licenses/gpl-2.0.html … … 14 14 15 15 OptiWebOpz SEO is a complete SEO plugin for WordPress. It works on its own: it needs no account, and nothing leaves your 16 site unless an administrator switches a feature on. Its screens are under Opti webopz SEO in wp-admin.16 site unless an administrator switches a feature on. Its screens are under OptiWebOpz SEO in wp-admin. 17 17 18 18 Connecting the site to Taler (https://taler.optiwebopz.com/), a separate AI blog and SEO service, is optional and needs a … … 23 23 24 24 * SEO title and meta description for every post, page and public custom post type, with title templates and a separator 25 (Opti webopz SEO → Titles & schema);25 (OptiWebOpz SEO → Titles & schema); 26 26 * canonical links, robots rules (noindex / nofollow per post, noindex rules for author, date and tag archives); 27 27 * Open Graph and Twitter tags, with a default sharing image; … … 48 48 = Post checks and content score = 49 49 50 * an "Opti webopz SEO" box under the post editor: SEO title, description, focus keyword and secondary keywords, social50 * an "OptiWebOpz SEO" box under the post editor: SEO title, description, focus keyword and secondary keywords, social 51 51 title, description and image, canonical, robots, breadcrumb title and article type, with offline checks of the post; 52 52 * a content score from 0 to 100 for every published post (headings, length, sentences and paragraphs, keywords, links, … … 93 93 = Setup, shortcodes and tools = 94 94 95 * an optional eight-step setup (Opti webopz SEO → Setup); every step can be skipped;95 * an optional eight-step setup (OptiWebOpz SEO → Setup); every step can be skipped; 96 96 * shortcodes [taler_breadcrumbs] (a breadcrumb trail) and [taler_html_sitemap] (a list of posts and pages); 97 97 * background work through Action Scheduler when another plugin provides it, or the WP-CLI command wp taler-cx jobs run; … … 104 104 * Google Search Console clicks, impressions, average position, the queries behind each post and Google's index status, 105 105 and, when Taler stores them, Google Analytics 4 visits and the most-visited pages. Read from Taler when the site is 106 connected (Opti webopz SEO → Search performance and the post box); the plugin holds no Google key.106 connected (OptiWebOpz SEO → Search performance and the post box); the plugin holds no Google key. 107 107 108 108 = What runs by default = … … 110 110 Right after activation, with nothing switched on and no Taler account: 111 111 112 * the Opti webopz SEO screens in wp-admin;112 * the OptiWebOpz SEO screens in wp-admin; 113 113 * the internal link index: built by the background work after activation (see Installation), updated when a post is saved, 114 114 with a "Links" column in the wp-admin post lists; … … 117 117 Open Graph / Twitter tags and one article schema. 118 118 119 Off until you switch them on: the titles, meta tags, schema, sitemaps and post box (one switch, "Use Opti webopz SEO on this119 Off until you switch them on: the titles, meta tags, schema, sitemaps and post box (one switch, "Use OptiWebOpz SEO on this 120 120 site", which works only while Rank Math, Yoast SEO and All in One SEO are inactive), redirects and the 404 log, IndexNow, 121 121 the missing-alt output, the "By author" line on Taler posts, and the optional link features (sending performance numbers 122 to Taler, and each way of applying Taler's suggestions; Settings → Optiwebopz SEO Connector). While another SEO plugin is122 to Taler, and each way of applying Taler's suggestions; Settings → Taler connection). While another SEO plugin is 123 123 active, OptiWebOpz SEO prints nothing in the page head and Taler writes its SEO fields into that plugin. 124 124 … … 129 129 Taler. Optional link features, each off until you switch it on: send this site's performance numbers to Taler, ask 130 130 Taler to read the site, and apply Taler's suggestions for SEO titles, descriptions, focus keywords and social text 131 (Opti webopz SEO → Suggestions, with a change log and Undo). See "External services" below for exactly what each key131 (OptiWebOpz SEO → Suggestions, with a change log and Undo). See "External services" below for exactly what each key 132 132 allows and what is sent. 133 133 … … 135 135 136 136 1. In WordPress: Plugins → Add New Plugin → search for "OptiWebOpz SEO" → Install Now → Activate. 137 2. Opti webopz SEO works on its own: open Optiwebopz SEO → Setup, or Optiwebopz SEO → Overview and switch "Use Optiwebopz SEO on this site" on137 2. OptiWebOpz SEO works on its own: open OptiWebOpz SEO → Setup, or OptiWebOpz SEO → Overview and switch "Use OptiWebOpz SEO on this site" on 138 138 (only possible while no other SEO plugin is active). Steps 3 and 4 are only needed to connect the site to a Taler account. 139 3. Settings → Optiwebopz SEO Connector→ "Generate a site key" (shown once) — or paste a key you created in Taler.139 3. Settings → Taler connection → "Generate a site key" (shown once) — or paste a key you created in Taler. 140 140 4. In Taler: Settings → Sites → this site → paste the same key as the Site key → Save → "Test key". 141 141 142 142 Optional: set the key in wp-config.php instead: define('TALER_SITE_KEY', 'your-key'); 143 143 144 To see search data from Taler, also enter the Taler app address (https) in Settings → Optiwebopz SEO Connector.144 To see search data from Taler, also enter the Taler app address (https) in Settings → Taler connection. 145 145 146 146 Background work (for example building the link index or removing old 404 rows) runs through Action Scheduler when another … … 153 153 = Do I need a Taler account? = 154 154 155 No, not for Opti webopz SEO, the import and the shortcodes. Drafts from Taler, the Taler post editor, publishing from Taler and155 No, not for OptiWebOpz SEO, the import and the shortcodes. Drafts from Taler, the Taler post editor, publishing from Taler and 156 156 search data from Taler need a Taler account and a site key. 157 157 158 158 = Does it replace Yoast SEO or Rank Math? = 159 159 160 It can. Import their data first (Opti webopz SEO → Import; the other plugin's data is only read, never changed), deactivate the161 other plugin, then switch "Use Opti webopz SEO on this site" on. While Yoast SEO, Rank Math or All in One SEO is active, Optiwebopz SEO160 It can. Import their data first (OptiWebOpz SEO → Import; the other plugin's data is only read, never changed), deactivate the 161 other plugin, then switch "Use OptiWebOpz SEO on this site" on. While Yoast SEO, Rank Math or All in One SEO is active, OptiWebOpz SEO 162 162 prints nothing in the page head, so there is never a second set of tags; Taler then writes its SEO fields into that plugin. 163 163 164 164 = What data leaves my site? = 165 165 166 Nothing until an administrator sets it up. With a site key and the Taler address set, opening Opti webopz SEO → Search performance or a167 post's Opti webopz SEO box asks Taler for search data (details under External services). Taler itself reads and writes posts166 Nothing until an administrator sets it up. With a site key and the Taler address set, opening OptiWebOpz SEO → Search performance or a 167 post's OptiWebOpz SEO box asks Taler for search data (details under External services). Taler itself reads and writes posts 168 168 through this plugin's REST routes with the site key. If you switch IndexNow on, the addresses of changed public pages go to 169 169 IndexNow. If you switch on "Send performance numbers to Taler", whole numbers counted on this site (no titles, text or … … 173 173 = How do I import from another SEO plugin? = 174 174 175 Opti webopz SEO → Import (administrators). Pick the plugin and the parts, make a preview (it changes nothing), check the conflicts175 OptiWebOpz SEO → Import (administrators). Pick the plugin and the parts, make a preview (it changes nothing), check the conflicts 176 176 and the values that need review, tick the confirm box and copy. Every value written is logged and the whole import can be 177 177 undone from the same screen. … … 188 188 = How do I uninstall it? = 189 189 190 Deactivate it: Opti webopz SEO output and redirects stop at once and Taler can no longer reach the site. Delete it: its options190 Deactivate it: OptiWebOpz SEO output and redirects stop at once and Taler can no longer reach the site. Delete it: its options 191 191 and tables (snapshots, cache, redirects, 404 log, link index, import log) are removed, on every site of a multisite network. 192 192 Posts and their SEO fields stay, because they are your content (the secondary keywords an import kept and the content scores … … 199 199 200 200 **Taler** (https://taler.optiwebopz.com/, an AI blog and SEO service; the address is the one the administrator enters in 201 Settings → Optiwebopz SEO Connector).201 Settings → Taler connection, and every call from this site goes to connector-api.php at that address). 202 202 203 203 From this site to Taler — used to show Google Search Console numbers (clicks, impressions, positions, searches), Google 204 index status, Google Analytics 4 visits when Taler stores them, and Taler's checks on Opti webopz SEO → Search performance and in the Optiwebopz SEO box. Search Console data is read204 index status, Google Analytics 4 visits when Taler stores them, and Taler's checks on OptiWebOpz SEO → Search performance and in the OptiWebOpz SEO box. Search Console data is read 205 205 by Taler; the plugin holds no Google sign-in, key or token and never contacts Google: 206 206 207 * When: only while an administrator or editor opens Opti webopz SEO → Search performance or a post's Optiwebopz SEO box, at most once207 * When: only while an administrator or editor opens OptiWebOpz SEO → Search performance or a post's OptiWebOpz SEO box, at most once 208 208 per page and data type every 6 to 12 hours (answers are cached; the "Ask Taler again" button asks again), and only after 209 209 a site key and the Taler address are set. Never on the public site. Disconnecting deletes the cached answers. … … 219 219 tags, SEO fields, FAQ, featured image) and the list of its revisions and snapshots; list posts and drafts; change the 220 220 title, excerpt, SEO title, SEO description and focus keyword of any blog post, published posts included; switch the table of contents 221 and the "By author" line on Taler posts (an administrator's own choice in Settings → Optiwebopz SEO Connectoralways wins).221 and the "By author" line on Taler posts (an administrator's own choice in Settings → Taler connection always wins). 222 222 * With the media key (derived from the site key): upload images to the media library and set the featured image of a 223 223 draft. … … 230 230 * Taler Privacy Policy: https://taler.optiwebopz.com/privacy 231 231 232 **Optional link features (from 2.3.4).** Each one is off until the site owner switches it on in Settings → Optiwebopz SEO Connector, and works only while the site is linked to Taler (a site key and the Taler address are set).232 **Optional link features (from 2.3.4).** Each one is off until the site owner switches it on in Settings → Taler connection, and works only while the site is linked to Taler (a site key and the Taler address are set). 233 233 234 234 * Performance numbers, from this site to Taler (the Taler address above): sent only while "Send performance numbers to Taler" is on, once a day through the plugin's background jobs (Action Scheduler when another plugin provides it, otherwise a server cron running wp taler-cx jobs run) and when an administrator clicks "Send now". Never when a page is opened and never on the public site. What is sent: whole numbers only, counted on this site: published posts; posts with a content score; the average content score; posts with a good, OK and needs-work score; posts with something to fix; posts by text length (under 300, 300 to 599, 600 to 1,199, 1,200 or more words, no readable text); posts without an SEO title, a meta description or a focus keyword; posts set to noindex; posts not updated in 6 and in 12 months; 404 addresses, 404 requests and new 404 addresses in 7 and in 30 days; redirects switched on, all redirects, redirect uses, redirects used in 30 days and redirects never used; posts nobody links to, posts and internal links in the link index; images without alt text; addresses in the XML sitemap. With them: this site's address, a time stamp, a random one-time value, the plugin version and a signature made with the site key. No post titles, text or addresses, no user data and no visitor data. 235 235 * Crawl request, from this site to Taler: sent only when an administrator clicks "Ask Taler to read this site", at most once a day. What is sent: this site's address, a time stamp, a random one-time value, the plugin version and a signature. Taler then reads this site's public pages, as a visitor's browser would, to keep its knowledge of the site up to date. 236 * Suggestions arrive from Taler: Taler sends suggested changes to a post's or page's SEO title, meta description, focus keyword, social title or social description, each with its reason, signed with a key derived from the site key. They are stored on this site and listed in Opti webopz SEO → Suggestions. Nothing changes on a post until a suggestion is applied, and only in a way the site owner switched on (all off by default): an editor clicks Apply; Taler applies it (from the Taler app, its API or its Claude connector); or automatic apply. Automatic apply happens only when the site owner turns it on, only for SEO titles and meta descriptions, and at most the daily number set there. "Stop remote and automatic changes" turns both of those off at once. Every applied change keeps a copy of the post first, is listed with who or what applied it, when, and the old and new value, and can be undone.236 * Suggestions arrive from Taler: Taler sends suggested changes to a post's or page's SEO title, meta description, focus keyword, social title or social description, each with its reason, signed with a key derived from the site key. They are stored on this site and listed in OptiWebOpz SEO → Suggestions. Nothing changes on a post until a suggestion is applied, and only in a way the site owner switched on (all off by default): an editor clicks Apply; Taler applies it (from the Taler app, its API or its Claude connector); or automatic apply. Automatic apply happens only when the site owner turns it on, only for SEO titles and meta descriptions, and at most the daily number set there. "Stop remote and automatic changes" turns both of those off at once. Every applied change keeps a copy of the post first, is listed with who or what applied it, when, and the old and new value, and can be undone. 237 237 238 238 **IndexNow** (https://api.indexnow.org/indexnow). Off by default; used only when an administrator switches IndexNow on 239 in Optiwebopz SEO (and only while Optiwebopz SEO is on and no other SEO plugin is active). 240 241 * When: after a public post or page is published or changed, at most 100 addresses per send and at least 60 seconds apart. 239 in OptiWebOpz SEO (and only while OptiWebOpz SEO is on and no other SEO plugin is active). 240 241 * When: after a public post or page is published or changed, at most 100 addresses per send and at least 60 seconds apart; 242 and when a user who may open the OptiWebOpz SEO screens (administrators, and the roles chosen under OptiWebOpz SEO → Roles) 243 clicks "Send waiting addresses now" in OptiWebOpz SEO → Overview, which sends them at once. 242 244 * What is sent: this site's host name, the site's public IndexNow key (which the plugin creates and shows at 243 /<key>.txt, as the protocol requires) and the addresses of the changed pages. Nothing else.245 /<key>.txt, as the protocol requires), the address of that key file and the addresses of the changed pages. Nothing else. 244 246 * IndexNow shares the addresses with the participating search engines (for example Bing); Google does not take part. 245 247 * IndexNow terms: https://www.indexnow.org/terms · documentation: https://www.indexnow.org/documentation … … 259 261 260 262 == Changelog == 263 264 = 2.4.3 — 2026-11-10 = 265 * The admin menu and the plugin's messages now spell the name OptiWebOpz SEO; the settings page where the optional Taler link is set up is now called Settings → Taler connection. External services: IndexNow's "Send waiting addresses now" button and the key file address are listed. No behaviour change. 261 266 262 267 = 2.4.2 — 2026-11-09 = -
optiwebopz-seo-connector/trunk/includes/admin.php
r3795029 r3795827 48 48 49 49 add_action('admin_menu', static function (): void { 50 add_options_page(' Optiwebopz SEO Connector', 'Optiwebopz SEO Connector', 'manage_options', TALER_CX_PAGE, 'taler_cx_admin_page');50 add_options_page('Taler connection', 'Taler connection', 'manage_options', TALER_CX_PAGE, 'taler_cx_admin_page'); 51 51 }); 52 52 … … 176 176 if (!function_exists('wp_add_privacy_policy_content')) { return; } 177 177 $p = [ 178 __('This site uses the Opti webopz SEO Connectorplugin. It sets no cookies and does not track visitors.', 'optiwebopz-seo-connector'),179 sprintf(/* translators: %d: number of days */ __('If the 404 monitor is on (Opti webopz SEO → Redirects & 404), the plugin records each address on this site that was not found, the address of the page that linked to it (without its query string), how often and when it was requested. It records no IP address, browser or user. A row is removed %d days after its address was last requested, and the log holds at most 5,000 addresses.', 'optiwebopz-seo-connector'), taler_cx_404_days()),178 __('This site uses the OptiWebOpz SEO plugin. It sets no cookies and does not track visitors.', 'optiwebopz-seo-connector'), 179 sprintf(/* translators: %d: number of days */ __('If the 404 monitor is on (OptiWebOpz SEO → Redirects & 404), the plugin records each address on this site that was not found, the address of the page that linked to it (without its query string), how often and when it was requested. It records no IP address, browser or user. A row is removed %d days after its address was last requested, and the log holds at most 5,000 addresses.', 'optiwebopz-seo-connector'), taler_cx_404_days()), 180 180 __('When this site is connected to Taler (an AI blog and SEO service, https://taler.optiwebopz.com/), Taler reads posts through the plugin (title, text, SEO fields and the list of revisions), creates drafts and, when a Taler user asks for it or at a time scheduled in Taler, changes or publishes posts. Before each such change the plugin keeps a copy of the post on this site (the newest 20 per post, deleted with the post).', 'optiwebopz-seo-connector'), 181 __('When an administrator or editor opens Opti webopz SEO → Search performance or a post\'s Optiwebopz SEO box, the plugin asks Taler for search data. It sends this site\'s address, the name of the data, the post\'s address, a time stamp, a random value, the plugin version and a signature. No visitor data is sent.', 'optiwebopz-seo-connector'),182 __('If an administrator switches on "Send performance numbers to Taler" (Settings → Optiwebopz SEO Connector), the plugin sends Taler whole numbers counted on this site once a day and when "Send now" is clicked: post counts, content scores, missing SEO fields, the 404 log and redirect totals, links, images without alt text and sitemap addresses. No post titles, text or addresses, no user data and no visitor data. Suggestions Taler sends are stored on this site with a log of who or what applied them.', 'optiwebopz-seo-connector'), // 2.3.4181 __('When an administrator or editor opens OptiWebOpz SEO → Search performance or a post\'s OptiWebOpz SEO box, the plugin asks Taler for search data. It sends this site\'s address, the name of the data, the post\'s address, a time stamp, a random value, the plugin version and a signature. No visitor data is sent.', 'optiwebopz-seo-connector'), 182 __('If an administrator switches on "Send performance numbers to Taler" (Settings → Taler connection), the plugin sends Taler whole numbers counted on this site once a day and when "Send now" is clicked: post counts, content scores, missing SEO fields, the 404 log and redirect totals, links, images without alt text and sitemap addresses. No post titles, text or addresses, no user data and no visitor data. Suggestions Taler sends are stored on this site with a log of who or what applied them.', 'optiwebopz-seo-connector'), // 2.3.4 183 183 __('An import from Yoast SEO, Rank Math or All in One SEO is logged on this site (the old and new value of each field) so it can be undone. The log stays until the plugin is deleted.', 'optiwebopz-seo-connector'), 184 184 __('If IndexNow is switched on, the addresses of public pages that are published or changed are sent to IndexNow (https://api.indexnow.org/), which shares them with the participating search engines.', 'optiwebopz-seo-connector'), 185 185 ]; 186 wp_add_privacy_policy_content('Opti webopz SEO Connector', wp_kses_post('<p>' . implode('</p><p>', array_map('esc_html', $p)) . '</p>'));186 wp_add_privacy_policy_content('OptiWebOpz SEO', wp_kses_post('<p>' . implode('</p><p>', array_map('esc_html', $p)) . '</p>')); 187 187 } 188 188 … … 234 234 ?> 235 235 <div class="wrap taler-cx"> 236 <h1><?php esc_html_e(' Optiwebopz SEO Connector', 'optiwebopz-seo-connector'); ?></h1>236 <h1><?php esc_html_e('Taler connection', 'optiwebopz-seo-connector'); ?></h1> 237 237 <?php if (isset($msgs[$code])) : ?> 238 238 <div class="notice notice-<?php echo esc_attr($msgs[$code][0]); ?> is-dismissible"><p><?php echo esc_html($msgs[$code][1]); ?></p></div> … … 294 294 <fieldset> 295 295 <legend><strong><?php esc_html_e('Applying Taler\'s suggestions', 'optiwebopz-seo-connector'); ?></strong></legend> 296 <p><label class="taler-cx-check"><input type="checkbox" name="taler_cx_apply_editor" value="1"<?php checked($lset['apply_editor'], 1); ?>> <?php esc_html_e('Editors may apply suggestions (Opti webopz SEO → Suggestions)', 'optiwebopz-seo-connector'); ?></label></p>296 <p><label class="taler-cx-check"><input type="checkbox" name="taler_cx_apply_editor" value="1"<?php checked($lset['apply_editor'], 1); ?>> <?php esc_html_e('Editors may apply suggestions (OptiWebOpz SEO → Suggestions)', 'optiwebopz-seo-connector'); ?></label></p> 297 297 <p><label class="taler-cx-check"><input type="checkbox" name="taler_cx_apply_remote" value="1"<?php checked($lset['apply_remote'], 1); ?>> <?php esc_html_e('Taler may apply suggestions (from the Taler app, its API or its Claude connector)', 'optiwebopz-seo-connector'); ?></label></p> 298 298 <p><label class="taler-cx-check"><input type="checkbox" name="taler_cx_apply_auto" value="1"<?php checked($lset['apply_auto'], 1); ?>> <?php esc_html_e('Apply eligible suggestions automatically (SEO titles and meta descriptions only)', 'optiwebopz-seo-connector'); ?></label></p> … … 371 371 <li><?php esc_html_e('Post editor: load posts, save, SEO fields (Rank Math, Yoast or All in One SEO), FAQ schema, featured image — each write needs a fresh single-use token and is refused if the post changed in WordPress meanwhile.', 'optiwebopz-seo-connector'); ?></li> 372 372 <li><?php esc_html_e('Publish and scheduled publish (the schedule is held in Taler). A snapshot is kept before every change and can be restored.', 'optiwebopz-seo-connector'); ?></li> 373 <li><?php esc_html_e('Opti webopz SEO: titles, meta tags, schema, sitemaps, redirects, post checks and search performance from Taler.', 'optiwebopz-seo-connector'); ?> <a href="<?php echo esc_url(admin_url('admin.php?page=taler-seo')); ?>"><?php esc_html_e('Open Optiwebopz SEO', 'optiwebopz-seo-connector'); ?></a></li>373 <li><?php esc_html_e('OptiWebOpz SEO: titles, meta tags, schema, sitemaps, redirects, post checks and search performance from Taler.', 'optiwebopz-seo-connector'); ?> <a href="<?php echo esc_url(admin_url('admin.php?page=taler-seo')); ?>"><?php esc_html_e('Open OptiWebOpz SEO', 'optiwebopz-seo-connector'); ?></a></li> 374 374 <li><?php esc_html_e('Auto-blogging runs in Taler; this plugin only receives the drafts and publishes Taler asks for.', 'optiwebopz-seo-connector'); ?></li> 375 375 </ul> -
optiwebopz-seo-connector/trunk/includes/admin/metabox.php
r3795029 r3795827 51 51 add_action('add_meta_boxes', static function (string $postType): void { 52 52 if (!in_array($postType, taler_cx_box_types(), true) || !taler_cx_box_allowed()) { return; } // 2.1.0: role manager 53 add_meta_box('taler-cx-seo', __('Opti webopz SEO', 'optiwebopz-seo-connector'), 'taler_cx_metabox', $postType, 'normal', 'high');53 add_meta_box('taler-cx-seo', __('OptiWebOpz SEO', 'optiwebopz-seo-connector'), 'taler_cx_metabox', $postType, 'normal', 'high'); 54 54 }); 55 55 … … 233 233 function taler_cx_analysis_schema(WP_Post $p): array { 234 234 if (!taler_cx_module_on('schema')) { 235 return ['id' => 'schema', 'w' => 1, 'ok' => false, 'text' => __('Structured data (schema) is switched off, so this page has none (Opti webopz SEO → Overview).', 'optiwebopz-seo-connector')];235 return ['id' => 'schema', 'w' => 1, 'ok' => false, 'text' => __('Structured data (schema) is switched off, so this page has none (OptiWebOpz SEO → Overview).', 'optiwebopz-seo-connector')]; 236 236 } 237 237 $none = $p->post_type === 'post' && taler_cx_box_meta_str((int) $p->ID, '_taler_schema_type') === 'none'; … … 272 272 <div class="tcx-field"><label for="tcx-canon"><?php esc_html_e('Canonical address (only when another page is the original)', 'optiwebopz-seo-connector'); ?></label> 273 273 <input id="tcx-canon" class="tcx-input" type="url" name="taler_cx[_taler_canonical]" value="<?php echo esc_attr($v('_taler_canonical')); ?>"<?php disabled($roC); ?>> 274 <?php if ($roC) : ?><span class="tcx-muted"><?php esc_html_e('Only some roles may change this (Opti webopz SEO → Roles).', 'optiwebopz-seo-connector'); ?></span><?php endif; ?></div>274 <?php if ($roC) : ?><span class="tcx-muted"><?php esc_html_e('Only some roles may change this (OptiWebOpz SEO → Roles).', 'optiwebopz-seo-connector'); ?></span><?php endif; ?></div> 275 275 <?php if ($post->post_type === 'product' && function_exists('taler_cx_woo_fields')) : foreach (taler_cx_woo_fields() as $wk => $wf) : ?> 276 276 <div class="tcx-field"><label for="tcx<?php echo esc_attr(str_replace('_', '-', $wk)); ?>"><?php echo esc_html($wf[0]); ?></label> … … 282 282 <option value=""><?php echo esc_html(sprintf(/* translators: %s: default type */ __('Site default (%s)', 'optiwebopz-seo-connector'), (string) taler_cx_seo_opt('schema_post_type'))); ?></option> 283 283 <?php foreach (TALER_CX_SCHEMA_TYPES as $t) : ?><option value="<?php echo esc_attr($t); ?>"<?php selected($st, $t); ?>><?php echo esc_html($t); ?></option><?php endforeach; ?> 284 </select><?php if ($roS) : ?><span class="tcx-muted"><?php esc_html_e('Only some roles may change this (Opti webopz SEO → Roles).', 'optiwebopz-seo-connector'); ?></span><?php endif; ?></div>284 </select><?php if ($roS) : ?><span class="tcx-muted"><?php esc_html_e('Only some roles may change this (OptiWebOpz SEO → Roles).', 'optiwebopz-seo-connector'); ?></span><?php endif; ?></div> 285 285 <?php endif; ?> 286 286 <div class="tcx-field tcx-span"> 287 287 <label class="tcx-switch"><input type="checkbox" name="taler_cx[_taler_noindex]" value="1"<?php checked($v('_taler_noindex'), '1'); ?><?php disabled($roR); ?>> <span><?php esc_html_e('Keep this page out of search results (noindex)', 'optiwebopz-seo-connector'); ?></span></label> 288 288 <label class="tcx-switch"><input type="checkbox" name="taler_cx[_taler_nofollow]" value="1"<?php checked($v('_taler_nofollow'), '1'); ?><?php disabled($roR); ?>> <span><?php esc_html_e('Ask search engines not to follow its links (nofollow)', 'optiwebopz-seo-connector'); ?></span></label> 289 <?php if ($roR) : ?><span class="tcx-muted"><?php esc_html_e('Only some roles may change noindex / nofollow (Opti webopz SEO → Roles).', 'optiwebopz-seo-connector'); ?></span><?php endif; ?>289 <?php if ($roR) : ?><span class="tcx-muted"><?php esc_html_e('Only some roles may change noindex / nofollow (OptiWebOpz SEO → Roles).', 'optiwebopz-seo-connector'); ?></span><?php endif; ?> 290 290 </div> 291 291 </div> -
optiwebopz-seo-connector/trunk/includes/admin/page-dashboard.php
r3795029 r3795827 85 85 echo '<p>' . esc_html__('For the last 28 days, this screen shows:', 'optiwebopz-seo-connector') . '</p><ul class="tcx-facts">'; 86 86 foreach ($shows as $t) { echo '<li>' . esc_html($t) . '</li>'; } 87 echo '</ul><p>' . esc_html__('This search data comes from the optional Taler link: Taler reads it from Google Search Console and sends the numbers here. No Google sign-in is stored in WordPress. Everything else in Opti webopz SEO works without Taler.', 'optiwebopz-seo-connector') . '</p>';87 echo '</ul><p>' . esc_html__('This search data comes from the optional Taler link: Taler reads it from Google Search Console and sends the numbers here. No Google sign-in is stored in WordPress. Everything else in OptiWebOpz SEO works without Taler.', 'optiwebopz-seo-connector') . '</p>'; 88 88 echo '<p class="tcx-muted">' . esc_html($linked ? taler_cx_pull_message($code) : __('Clicks, impressions and positions come from Google Search Console through Taler. Connect this site to Taler to see them here. Everything else on this page works without it.', 'optiwebopz-seo-connector')) . '</p>'; 89 89 echo '<div class="tcx-actions">'; … … 92 92 . ($linked ? esc_html__('Taler connection settings', 'optiwebopz-seo-connector') : esc_html__('Connect to Taler', 'optiwebopz-seo-connector')) . '</a>'; 93 93 } else { 94 echo '<p class="tcx-muted">' . esc_html__('An administrator can link this site to Taler under Settings → Optiwebopz SEO Connector.', 'optiwebopz-seo-connector') . '</p>';94 echo '<p class="tcx-muted">' . esc_html__('An administrator can link this site to Taler under Settings → Taler connection.', 'optiwebopz-seo-connector') . '</p>'; 95 95 } 96 96 if ($linked) { … … 108 108 echo '<div class="wrap tcx">'; 109 109 taler_cx_seo_header(__('Search performance', 'optiwebopz-seo-connector')); 110 echo '<p class="tcx-banner tcx-banner-info">' . esc_html__('Search performance is switched off (Opti webopz SEO → Overview).', 'optiwebopz-seo-connector') . '</p></div>';110 echo '<p class="tcx-banner tcx-banner-info">' . esc_html__('Search performance is switched off (OptiWebOpz SEO → Overview).', 'optiwebopz-seo-connector') . '</p></div>'; 111 111 return; 112 112 } -
optiwebopz-seo-connector/trunk/includes/admin/page-import.php
r3795029 r3795827 56 56 /** The status names shown on the screen. */ 57 57 function taler_cx_import_status_labels(): array { 58 return ['copy' => __('will be copied', 'optiwebopz-seo-connector'), 'same' => __('already the same', 'optiwebopz-seo-connector'), 'conflict' => __('Opti webopz SEO has its own value (kept)', 'optiwebopz-seo-connector'),59 'overwrite' => __('Opti webopz SEO value will be replaced', 'optiwebopz-seo-connector'), 'review' => __('needs review (not copied)', 'optiwebopz-seo-connector'), 'invalid' => __('not usable (not copied)', 'optiwebopz-seo-connector')];58 return ['copy' => __('will be copied', 'optiwebopz-seo-connector'), 'same' => __('already the same', 'optiwebopz-seo-connector'), 'conflict' => __('OptiWebOpz SEO has its own value (kept)', 'optiwebopz-seo-connector'), 59 'overwrite' => __('OptiWebOpz SEO value will be replaced', 'optiwebopz-seo-connector'), 'review' => __('needs review (not copied)', 'optiwebopz-seo-connector'), 'invalid' => __('not usable (not copied)', 'optiwebopz-seo-connector')]; 60 60 } 61 61 … … 172 172 'discarded' => ['info', __('The unfinished import was stopped. What it already copied is in the log and can be undone.', 'optiwebopz-seo-connector')], 173 173 'undo_batch' => ['info', __('Undo: one batch done. Press "Undo this import" again until it says finished.', 'optiwebopz-seo-connector')], 174 'undo_done' => ['success', __('Undo finished. Opti webopz SEO\'s earlier values are back where nothing changed them since.', 'optiwebopz-seo-connector')],174 'undo_done' => ['success', __('Undo finished. OptiWebOpz SEO\'s earlier values are back where nothing changed them since.', 'optiwebopz-seo-connector')], 175 175 'undo_failed' => ['error', __('That import cannot be undone (it was a preview, or its log is gone).', 'optiwebopz-seo-connector')], 176 176 ]); ?> … … 182 182 <div class="tcx-banner tcx-banner-info" data-state="empty"> 183 183 <p><strong><?php esc_html_e('No SEO data from Yoast SEO, Rank Math or All in One SEO was found on this site.', 'optiwebopz-seo-connector'); ?></strong></p> 184 <p><?php esc_html_e('The import looks for those three plugins only, and none of them left data here. Nothing is wrong: there is simply nothing to import, and Opti webopz SEO works fully without an import.', 'optiwebopz-seo-connector'); ?></p>184 <p><?php esc_html_e('The import looks for those three plugins only, and none of them left data here. Nothing is wrong: there is simply nothing to import, and OptiWebOpz SEO works fully without an import.', 'optiwebopz-seo-connector'); ?></p> 185 185 </div> 186 186 <?php endif; ?> … … 205 205 <?php if ($st && empty($st['done'])) : ?> 206 206 <div class="tcx-card"> 207 <h2><?php echo $st['mode'] === 'run' ? esc_html__('Copying into Opti webopz SEO — not finished yet', 'optiwebopz-seo-connector') : esc_html__('Preview — not finished yet', 'optiwebopz-seo-connector'); ?></h2>207 <h2><?php echo $st['mode'] === 'run' ? esc_html__('Copying into OptiWebOpz SEO — not finished yet', 'optiwebopz-seo-connector') : esc_html__('Preview — not finished yet', 'optiwebopz-seo-connector'); ?></h2> 208 208 <p><?php echo esc_html(sprintf(/* translators: 1: plugin, 2: part, 3: items, 4: batches */ __('%1$s · now: %2$s · %3$d items read in %4$d batches.', 'optiwebopz-seo-connector'), 209 209 TALER_CX_IMPORT_SOURCES[$st['src']] ?? '', $parts[$st['phase']] ?? '', (int) $st['items'], (int) $st['batches'])); ?></p> … … 232 232 <?php endforeach; ?> 233 233 </fieldset> 234 <label class="tcx-switch"><input type="checkbox" name="overwrite" value="1"> <span><?php esc_html_e('Replace values Opti webopz SEO already has (off: its own values are kept)', 'optiwebopz-seo-connector'); ?></span></label>234 <label class="tcx-switch"><input type="checkbox" name="overwrite" value="1"> <span><?php esc_html_e('Replace values OptiWebOpz SEO already has (off: its own values are kept)', 'optiwebopz-seo-connector'); ?></span></label> 235 235 <p class="tcx-muted"><?php echo esc_html(sprintf(/* translators: 1: example variables of the other plugins, 2: Taler's variable */ __('Copied: SEO title, meta description, focus keyword and the other keywords, canonical link, noindex / nofollow, social title, description and image, breadcrumb title and article type; for categories and tags their title, description and noindex; and every site-wide setting Taler also has. Variables with the same meaning are converted (for example %1$s → %2$s); any other variable marks the value "needs review" and it is not copied.', 'optiwebopz-seo-connector'), '%%title%%, #post_title', '%title%')); ?></p> 236 236 <p><button type="submit" class="button button-primary tcx-btn"><?php esc_html_e('Make a preview', 'optiwebopz-seo-connector'); ?></button></p> … … 242 242 <div class="tcx-card"> 243 243 <h2><?php echo esc_html(sprintf(/* translators: %s: plugin */ __('Preview from %s', 'optiwebopz-seo-connector'), TALER_CX_IMPORT_SOURCES[$st['src']] ?? '')); ?></h2> 244 <p class="tcx-muted"><?php echo esc_html(sprintf(/* translators: 1: parts, 2: items, 3: yes/no */ __('%1$s · %2$d items read · replace Opti webopz SEO values: %3$s', 'optiwebopz-seo-connector'),244 <p class="tcx-muted"><?php echo esc_html(sprintf(/* translators: 1: parts, 2: items, 3: yes/no */ __('%1$s · %2$d items read · replace OptiWebOpz SEO values: %3$s', 'optiwebopz-seo-connector'), 245 245 implode(', ', array_map(static function ($p) use ($parts) { return $parts[$p] ?? $p; }, (array) $st['parts'])), (int) $st['items'], !empty($st['overwrite']) ? __('yes', 'optiwebopz-seo-connector') : __('no', 'optiwebopz-seo-connector'))); ?></p> 246 246 <?php echo wp_kses(taler_cx_import_counts_html($st), taler_cx_import_allowed_html()); ?> … … 262 262 <?php if (count($prev) >= TALER_CX_IMPORT_PREVIEW_MAX) : ?><p class="tcx-muted"><?php echo esc_html(sprintf(/* translators: %d: rows */ __('The first %d rows are shown; the counts above cover everything.', 'optiwebopz-seo-connector'), TALER_CX_IMPORT_PREVIEW_MAX)); ?></p><?php endif; ?> 263 263 <?php else : ?> 264 <p class="tcx-banner tcx-banner-info"><?php esc_html_e('Nothing to copy: every value is already the same in Opti webopz SEO, or there is none.', 'optiwebopz-seo-connector'); ?></p>264 <p class="tcx-banner tcx-banner-info"><?php esc_html_e('Nothing to copy: every value is already the same in OptiWebOpz SEO, or there is none.', 'optiwebopz-seo-connector'); ?></p> 265 265 <?php endif; ?> 266 266 <?php if ($st['error_list']) : ?> … … 271 271 <?php if ((int) ($st['counts']['copy'] ?? 0) + (int) ($st['counts']['overwrite'] ?? 0) > 0) : ?> 272 272 <div class="tcx-card"> 273 <h2><?php esc_html_e('3. Copy into Opti webopz SEO', 'optiwebopz-seo-connector'); ?></h2>273 <h2><?php esc_html_e('3. Copy into OptiWebOpz SEO', 'optiwebopz-seo-connector'); ?></h2> 274 274 <?php if (!$logOk) : ?><p class="tcx-banner tcx-banner-error"><?php esc_html_e('The import log table is missing, so copying is switched off (there would be no undo). Deactivate and activate the plugin to create it.', 'optiwebopz-seo-connector'); ?></p><?php endif; ?> 275 275 <form method="post" action="<?php echo esc_url(admin_url('admin-post.php')); ?>"> 276 276 <input type="hidden" name="action" value="taler_cx_import_run"> 277 277 <?php wp_nonce_field('taler_cx_import_run'); ?> 278 <label class="tcx-switch"><input type="checkbox" name="confirm" value="1" required> <span><?php esc_html_e('I checked the preview. Copy these values into Opti webopz SEO\'s fields (the other plugin keeps its data; every change is logged and can be undone).', 'optiwebopz-seo-connector'); ?></span></label>279 <p><button type="submit" class="button button-primary tcx-btn"<?php disabled(!$logOk); ?>><?php esc_html_e('Copy into Opti webopz SEO now', 'optiwebopz-seo-connector'); ?></button></p>278 <label class="tcx-switch"><input type="checkbox" name="confirm" value="1" required> <span><?php esc_html_e('I checked the preview. Copy these values into OptiWebOpz SEO\'s fields (the other plugin keeps its data; every change is logged and can be undone).', 'optiwebopz-seo-connector'); ?></span></label> 279 <p><button type="submit" class="button button-primary tcx-btn"<?php disabled(!$logOk); ?>><?php esc_html_e('Copy into OptiWebOpz SEO now', 'optiwebopz-seo-connector'); ?></button></p> 280 280 </form> 281 281 </div> -
optiwebopz-seo-connector/trunk/includes/admin/page-links.php
r3795029 r3795827 50 50 <?php taler_cx_seo_header(__('Internal links', 'optiwebopz-seo-connector')); ?> 51 51 <?php taler_cx_seo_notice([ 52 'links_off' => ['warning', __('Internal links is switched off (Opti webopz SEO → Overview).', 'optiwebopz-seo-connector')],52 'links_off' => ['warning', __('Internal links is switched off (OptiWebOpz SEO → Overview).', 'optiwebopz-seo-connector')], 53 53 'links_batch' => ['info', __('One batch indexed. Continue until it says finished, or let it run in the background.', 'optiwebopz-seo-connector')], 54 54 'links_done' => ['success', __('The link index is complete.', 'optiwebopz-seo-connector')], … … 57 57 ]); ?> 58 58 <?php if (!$on) : ?> 59 <p class="tcx-banner tcx-banner-info"><?php esc_html_e('Internal links is switched off (Opti webopz SEO → Overview).', 'optiwebopz-seo-connector'); ?></p>59 <p class="tcx-banner tcx-banner-info"><?php esc_html_e('Internal links is switched off (OptiWebOpz SEO → Overview).', 'optiwebopz-seo-connector'); ?></p> 60 60 </div> 61 61 <?php return; endif; ?> -
optiwebopz-seo-connector/trunk/includes/admin/page-overview.php
r3795029 r3795827 44 44 'analysis' => [__('Post analysis', 'optiwebopz-seo-connector'), __('SEO fields and checks under the post editor, with Taler\'s checks on Taler posts.', 'optiwebopz-seo-connector')], 45 45 'dashboard' => [__('Search performance', 'optiwebopz-seo-connector'), __('Clicks, impressions, positions and indexing from Taler (Search Console data stays in Taler).', 'optiwebopz-seo-connector')], 46 'images' => [__('Missing image alt text', 'optiwebopz-seo-connector'), __('An image printed without alt text gets its own title as alt text (when the title reads like words). Off until you switch it on. Fix images one by one under Opti webopz SEO → Images.', 'optiwebopz-seo-connector')],46 'images' => [__('Missing image alt text', 'optiwebopz-seo-connector'), __('An image printed without alt text gets its own title as alt text (when the title reads like words). Off until you switch it on. Fix images one by one under OptiWebOpz SEO → Images.', 'optiwebopz-seo-connector')], 47 47 'indexnow' => [__('IndexNow', 'optiwebopz-seo-connector'), __('Tells Bing and the other IndexNow search engines at once when a page is published or changed (Google does not use IndexNow). Off until you switch it on.', 'optiwebopz-seo-connector')], 48 48 'links' => [__('Internal links', 'optiwebopz-seo-connector'), __('Counts which posts link to which, lists posts nobody links to, and suggests related posts to link while you edit.', 'optiwebopz-seo-connector')], … … 52 52 /** 2.3.0: the one place that says Optiwebopz SEO's output is off ('basic' mode) — neutral words, Overview only. */ 53 53 function taler_cx_seo_off_text(): string { 54 return __('Titles, meta tags, schema and sitemaps from Opti webopz SEO are switched off on this site. Turn them on with the switch below when you are ready.', 'optiwebopz-seo-connector');54 return __('Titles, meta tags, schema and sitemaps from OptiWebOpz SEO are switched off on this site. Turn them on with the switch below when you are ready.', 'optiwebopz-seo-connector'); 55 55 } 56 56 … … 77 77 $t['output'] = ['label' => __('Titles, meta tags, schema, sitemaps', 'optiwebopz-seo-connector'), 78 78 'value' => $mode === 'taler' ? __('On', 'optiwebopz-seo-connector') : ($mode === 'external' ? taler_cx_seo_plugin_name(taler_cx_external_seo()) : $off), 79 'note' => $mode === 'taler' ? __('Opti webopz SEO prints them.', 'optiwebopz-seo-connector') : ($mode === 'external' ? __('That plugin prints them.', 'optiwebopz-seo-connector') : __('Switch them on below.', 'optiwebopz-seo-connector')),79 'note' => $mode === 'taler' ? __('OptiWebOpz SEO prints them.', 'optiwebopz-seo-connector') : ($mode === 'external' ? __('That plugin prints them.', 'optiwebopz-seo-connector') : __('Switch them on below.', 'optiwebopz-seo-connector')), 80 80 'url' => '', 'link' => '', 'src' => 'includes/core/modules.php:taler_cx_seo_mode']; 81 81 … … 202 202 ?> 203 203 <div class="wrap tcx"> 204 <?php taler_cx_seo_header(__('Opti webopz SEO', 'optiwebopz-seo-connector')); ?>204 <?php taler_cx_seo_header(__('OptiWebOpz SEO', 'optiwebopz-seo-connector')); ?> 205 205 <?php taler_cx_seo_notice([ 206 206 'saved' => ['success', __('Saved.', 'optiwebopz-seo-connector')], … … 210 210 'indexnow_failed' => ['warning', __('IndexNow did not accept the addresses. See the last answer below.', 'optiwebopz-seo-connector')], 211 211 'indexnow_key' => ['success', __('A new IndexNow key is in place.', 'optiwebopz-seo-connector')], 212 'wiz_closed' => ['success', __('Setup closed. Open it again any time under Opti webopz SEO → Setup.', 'optiwebopz-seo-connector')],213 'takeover_blocked' => ['warning', __('Opti webopz SEO was not switched on: another SEO plugin is active. Import its data (Optiwebopz SEO → Import), deactivate it, then switch Optiwebopz SEO on.', 'optiwebopz-seo-connector')],212 'wiz_closed' => ['success', __('Setup closed. Open it again any time under OptiWebOpz SEO → Setup.', 'optiwebopz-seo-connector')], 213 'takeover_blocked' => ['warning', __('OptiWebOpz SEO was not switched on: another SEO plugin is active. Import its data (OptiWebOpz SEO → Import), deactivate it, then switch OptiWebOpz SEO on.', 'optiwebopz-seo-connector')], 214 214 ]); ?> 215 215 <?php if (taler_cx_seo_mode() === 'basic') : ?> … … 237 237 <input type="hidden" name="action" value="taler_cx_seo_overview"> 238 238 <?php wp_nonce_field('taler_cx_seo_overview'); ?> 239 <h2><?php esc_html_e('Use Opti webopz SEO on this site', 'optiwebopz-seo-connector'); ?></h2>239 <h2><?php esc_html_e('Use OptiWebOpz SEO on this site', 'optiwebopz-seo-connector'); ?></h2> 240 240 <?php if ($ext !== '') : ?> 241 241 <p><?php echo esc_html(sprintf(/* translators: %1$s: SEO plugin name */ __('%1$s is active. Only one SEO plugin may print titles, meta tags and schema, so this switch is off until %1$s is deactivated.', 'optiwebopz-seo-connector'), taler_cx_seo_plugin_name($ext))); ?></p> … … 243 243 <label class="tcx-switch"> 244 244 <input type="checkbox" name="takeover" value="1"<?php checked(taler_cx_takeover() && $ext === ''); ?><?php disabled($ext !== ''); ?>> 245 <span><?php esc_html_e('Opti webopz SEO prints this site\'s titles, meta tags, schema and sitemaps', 'optiwebopz-seo-connector'); ?></span>245 <span><?php esc_html_e('OptiWebOpz SEO prints this site\'s titles, meta tags, schema and sitemaps', 'optiwebopz-seo-connector'); ?></span> 246 246 </label> 247 247 <h2><?php esc_html_e('Modules', 'optiwebopz-seo-connector'); ?></h2> … … 288 288 <div class="tcx-card"> 289 289 <h2><?php esc_html_e('Taler (optional)', 'optiwebopz-seo-connector'); ?></h2> 290 <p><?php esc_html_e('Taler is a separate AI blog and SEO service. Linking this site adds Taler drafts, the Taler post editor and Google search data on Search performance. Opti webopz SEO works fully without it.', 'optiwebopz-seo-connector'); ?></p>290 <p><?php esc_html_e('Taler is a separate AI blog and SEO service. Linking this site adds Taler drafts, the Taler post editor and Google search data on Search performance. OptiWebOpz SEO works fully without it.', 'optiwebopz-seo-connector'); ?></p> 291 291 <p class="tcx-muted"><?php echo $linked ? esc_html__('This site is linked to Taler.', 'optiwebopz-seo-connector') : esc_html__('This site is not linked to Taler.', 'optiwebopz-seo-connector'); ?></p> 292 292 <?php if (current_user_can('manage_options')) : ?> … … 302 302 if (!current_user_can('manage_options')) { return; } // 2.3.1: the Setup screen is for administrators 303 303 $text = [ 304 0 => __('A short, optional setup: another SEO plugin, your site, titles, modules, sitemap, switching Opti webopz SEO on and the optional Taler link. Every step can be skipped.', 'optiwebopz-seo-connector'),304 0 => __('A short, optional setup: another SEO plugin, your site, titles, modules, sitemap, switching OptiWebOpz SEO on and the optional Taler link. Every step can be skipped.', 'optiwebopz-seo-connector'), 305 305 1 => __('Setup is finished. Run it again to review another SEO plugin, your site, titles, modules, sitemap, the switch and the Taler link; your settings stay until you save a step.', 'optiwebopz-seo-connector'), 306 306 2 => __('Setup was closed before the end. Run it any time; it shows your current settings.', 'optiwebopz-seo-connector'), -
optiwebopz-seo-connector/trunk/includes/admin/page-performance.php
r3795029 r3795827 106 106 <?php taler_cx_seo_header(__('Performance', 'optiwebopz-seo-connector')); ?> 107 107 <?php taler_cx_seo_notice([ 108 'an_off' => ['info', __('Post analysis is switched off (Opti webopz SEO → Overview).', 'optiwebopz-seo-connector')],108 'an_off' => ['info', __('Post analysis is switched off (OptiWebOpz SEO → Overview).', 'optiwebopz-seo-connector')], 109 109 'an_batch' => ['info', __('One batch analysed. Continue until it says finished, or let it run in the background.', 'optiwebopz-seo-connector')], 110 110 'an_done' => ['success', __('Every published post has a content score now.', 'optiwebopz-seo-connector')], … … 117 117 <h2 class="tcx-h2"><?php esc_html_e('Content scores', 'optiwebopz-seo-connector'); ?></h2> 118 118 <?php if (!$scores) : ?> 119 <div class="tcx-card"><p><?php esc_html_e('Content scores come from Post analysis. It runs while Opti webopz SEO prints this site\'s titles and meta tags; switch that on under Optiwebopz SEO → Overview to score your posts.', 'optiwebopz-seo-connector'); ?></p></div>119 <div class="tcx-card"><p><?php esc_html_e('Content scores come from Post analysis. It runs while OptiWebOpz SEO prints this site\'s titles and meta tags; switch that on under OptiWebOpz SEO → Overview to score your posts.', 'optiwebopz-seo-connector'); ?></p></div> 120 120 <?php else : $c = taler_cx_analysis_counts(); $st = taler_cx_analysis_state(); ?> 121 121 <?php taler_cx_perf_tiles([ … … 211 211 <h2 class="tcx-h2"><?php esc_html_e('Not found (404) and redirects', 'optiwebopz-seo-connector'); ?></h2> 212 212 <?php $lg = taler_cx_perf_logs(); if (!taler_cx_module_on('redirects') && $lg['f_rows'] === 0 && $lg['r_all'] === 0) : ?> 213 <div class="tcx-card"><p><?php esc_html_e('The 404 log and redirects run with the Redirects module (Opti webopz SEO → Overview).', 'optiwebopz-seo-connector'); ?></p></div>213 <div class="tcx-card"><p><?php esc_html_e('The 404 log and redirects run with the Redirects module (OptiWebOpz SEO → Overview).', 'optiwebopz-seo-connector'); ?></p></div> 214 214 <?php else : ?> 215 215 <?php taler_cx_perf_tiles([ -
optiwebopz-seo-connector/trunk/includes/admin/page-recommendations.php
r3795029 r3795827 25 25 <p class="tcx-muted"><?php esc_html_e('What to change on this site, the biggest gain first. Advice only: nothing is changed for you.', 'optiwebopz-seo-connector'); ?></p> 26 26 <?php if (!function_exists('taler_cx_analysis_recommendations')) : ?> 27 <div class="tcx-card"><p><?php esc_html_e('Recommendations come from Post analysis. It runs while Opti webopz SEO prints this site\'s titles and meta tags; switch that on under Optiwebopz SEO → Overview.', 'optiwebopz-seo-connector'); ?></p></div>27 <div class="tcx-card"><p><?php esc_html_e('Recommendations come from Post analysis. It runs while OptiWebOpz SEO prints this site\'s titles and meta tags; switch that on under OptiWebOpz SEO → Overview.', 'optiwebopz-seo-connector'); ?></p></div> 28 28 </div> 29 29 <?php return; endif; ?> -
optiwebopz-seo-connector/trunk/includes/admin/page-redirects.php
r3795029 r3795827 172 172 ]); ?> 173 173 <?php if (!taler_cx_module_on('redirects')) : ?> 174 <p class="tcx-banner tcx-banner-info"><?php esc_html_e('Redirects and the 404 log are switched off (Opti webopz SEO → Overview). You can prepare redirects here; they start working when the module is on.', 'optiwebopz-seo-connector'); ?></p>174 <p class="tcx-banner tcx-banner-info"><?php esc_html_e('Redirects and the 404 log are switched off (OptiWebOpz SEO → Overview). You can prepare redirects here; they start working when the module is on.', 'optiwebopz-seo-connector'); ?></p> 175 175 <?php endif; ?> 176 176 <nav class="tcx-tabs" aria-label="<?php esc_attr_e('Sections', 'optiwebopz-seo-connector'); ?>"> -
optiwebopz-seo-connector/trunk/includes/admin/page-roles.php
r3795029 r3795827 39 39 <form class="tcx-card" method="post" action="<?php echo esc_url(admin_url('admin-post.php')); ?>"> 40 40 <input type="hidden" name="action" value="taler_cx_roles_save"><?php wp_nonce_field('taler_cx_roles_save'); ?> 41 <h2><?php esc_html_e('Who may use the Opti webopz SEO screens', 'optiwebopz-seo-connector'); ?></h2>42 <p class="tcx-muted"><?php esc_html_e('Administrators always can. The site key (Settings → Optiwebopz SEO Connector) and this page stay for administrators only.', 'optiwebopz-seo-connector'); ?></p>41 <h2><?php esc_html_e('Who may use the OptiWebOpz SEO screens', 'optiwebopz-seo-connector'); ?></h2> 42 <p class="tcx-muted"><?php esc_html_e('Administrators always can. The site key (Settings → Taler connection) and this page stay for administrators only.', 'optiwebopz-seo-connector'); ?></p> 43 43 <ul class="tcx-modules"> 44 44 <?php foreach ($names as $slug => $label) : ?> … … 46 46 <?php endforeach; ?> 47 47 </ul> 48 <h2><?php esc_html_e('Who sees the Opti webopz SEO box in the editor', 'optiwebopz-seo-connector'); ?></h2>48 <h2><?php esc_html_e('Who sees the OptiWebOpz SEO box in the editor', 'optiwebopz-seo-connector'); ?></h2> 49 49 <p class="tcx-muted"><?php esc_html_e('None ticked: everyone who can edit the post (as before). Tick roles to limit it to them (administrators always see it).', 'optiwebopz-seo-connector'); ?></p> 50 50 <ul class="tcx-modules"> -
optiwebopz-seo-connector/trunk/includes/admin/page-suggestions.php
r3795029 r3795827 101 101 'sg_dismissed' => ['success', __('Dismissed. Nothing on the post was changed.', 'optiwebopz-seo-connector')], 102 102 'sg_undone' => ['success', __('Undone. The post is back as it was.', 'optiwebopz-seo-connector')], 103 'sg_editor_off' => ['warning', __('Applying from this screen is switched off (Settings → Optiwebopz SEO Connector).', 'optiwebopz-seo-connector')],103 'sg_editor_off' => ['warning', __('Applying from this screen is switched off (Settings → Taler connection).', 'optiwebopz-seo-connector')], 104 104 'sg_stale' => ['warning', __('Not applied: the field had changed since Taler looked at it. Nothing was written.', 'optiwebopz-seo-connector')], 105 105 'sg_expired' => ['warning', __('This suggestion has expired. Nothing was written.', 'optiwebopz-seo-connector')], … … 117 117 echo esc_html(sprintf(/* translators: 1-3: on or off */ __('Applying: editors %1$s · Taler %2$s · automatic %3$s', 'optiwebopz-seo-connector'), $onOff($editorOn), $onOff(taler_cx_link_mode('remote')), $onOff(taler_cx_link_mode('auto')))); 118 118 if ($set['stop']) { echo ' · ' . esc_html__('remote and automatic changes are stopped', 'optiwebopz-seo-connector'); } 119 if (current_user_can('manage_options')) { echo ' <a class="tcx-link" href="' . esc_url(admin_url('options-general.php?page=' . TALER_CX_PAGE)) . '">' . esc_html__('Change in Settings → Optiwebopz SEO Connector', 'optiwebopz-seo-connector') . '</a>'; }119 if (current_user_can('manage_options')) { echo ' <a class="tcx-link" href="' . esc_url(admin_url('options-general.php?page=' . TALER_CX_PAGE)) . '">' . esc_html__('Change in Settings → Taler connection', 'optiwebopz-seo-connector') . '</a>'; } 120 120 ?></p> 121 121 <?php if (!taler_cx_seo_active()) : ?> 122 <p class="tcx-muted"><?php esc_html_e('These are Opti webopz SEO fields. They show on the site while Optiwebopz SEO prints this site\'s titles and meta tags (see Overview).', 'optiwebopz-seo-connector'); ?></p>122 <p class="tcx-muted"><?php esc_html_e('These are OptiWebOpz SEO fields. They show on the site while OptiWebOpz SEO prints this site\'s titles and meta tags (see Overview).', 'optiwebopz-seo-connector'); ?></p> 123 123 <?php endif; ?> 124 124 <nav class="tcx-tabs" aria-label="<?php esc_attr_e('Suggestions', 'optiwebopz-seo-connector'); ?>"> -
optiwebopz-seo-connector/trunk/includes/admin/page-wizard.php
r3795029 r3795827 220 220 ?> 221 221 <h2 id="tcx-wiz-title"><?php esc_html_e('Other SEO plugins', 'optiwebopz-seo-connector'); ?></h2> 222 <p><?php esc_html_e('Opti webopz SEO can copy titles, descriptions, focus keywords, robots rules, social fields and redirects from Yoast SEO, Rank Math and All in One SEO. Nothing is copied in this setup: the Import screen first makes a preview, and copies only after you confirm.', 'optiwebopz-seo-connector'); ?></p>222 <p><?php esc_html_e('OptiWebOpz SEO can copy titles, descriptions, focus keywords, robots rules, social fields and redirects from Yoast SEO, Rank Math and All in One SEO. Nothing is copied in this setup: the Import screen first makes a preview, and copies only after you confirm.', 'optiwebopz-seo-connector'); ?></p> 223 223 <ul class="tcx-facts"> 224 224 <?php foreach (TALER_CX_IMPORT_SOURCES as $src => $name) : $d = $det[$src] ?? ['active' => false, 'any' => false, 'posts' => 0, 'terms' => 0, 'global' => false, 'redirects' => null]; ?> … … 230 230 </ul> 231 231 <?php if ($ext !== '') : ?> 232 <p class="tcx-banner tcx-banner-info"><?php echo esc_html(sprintf(/* translators: %1$s: SEO plugin name */ __('%1$s is active. Only one SEO plugin may print titles, meta tags and schema, so Opti webopz SEO cannot be switched on (step 6) until %1$s is deactivated. You can set up everything else now.', 'optiwebopz-seo-connector'), taler_cx_seo_plugin_name($ext))); ?></p>232 <p class="tcx-banner tcx-banner-info"><?php echo esc_html(sprintf(/* translators: %1$s: SEO plugin name */ __('%1$s is active. Only one SEO plugin may print titles, meta tags and schema, so OptiWebOpz SEO cannot be switched on (step 6) until %1$s is deactivated. You can set up everything else now.', 'optiwebopz-seo-connector'), taler_cx_seo_plugin_name($ext))); ?></p> 233 233 <?php endif; ?> 234 234 <?php if ($found) : ?> 235 235 <p><a class="button tcx-btn" href="<?php echo esc_url(admin_url('admin.php?page=taler-seo-import')); ?>"><?php esc_html_e('Open Import (preview first)', 'optiwebopz-seo-connector'); ?></a></p> 236 <p class="tcx-muted"><?php esc_html_e('Come back with Opti webopz SEO → Setup: the setup continues where you left it.', 'optiwebopz-seo-connector'); ?></p>236 <p class="tcx-muted"><?php esc_html_e('Come back with OptiWebOpz SEO → Setup: the setup continues where you left it.', 'optiwebopz-seo-connector'); ?></p> 237 237 <?php endif; ?> 238 238 <?php … … 249 249 <li class="tcx-module"> 250 250 <label class="tcx-switch"><input type="checkbox" name="modules[<?php echo esc_attr($m); ?>]" value="1"<?php checked($state[$m]); ?>> <span><strong><?php echo esc_html($l[0]); ?></strong></span></label> 251 <p class="tcx-muted"><?php echo esc_html($l[1]); ?><?php echo TALER_CX_MODULES[$m][1] ? ' ' . esc_html__('Runs only while Opti webopz SEO is switched on (step 6).', 'optiwebopz-seo-connector') : ''; ?></p>251 <p class="tcx-muted"><?php echo esc_html($l[1]); ?><?php echo TALER_CX_MODULES[$m][1] ? ' ' . esc_html__('Runs only while OptiWebOpz SEO is switched on (step 6).', 'optiwebopz-seo-connector') : ''; ?></p> 252 252 <p class="tcx-pill <?php echo $runs ? 'is-on' : 'is-off'; ?>"><?php echo $runs ? esc_html__('Running', 'optiwebopz-seo-connector') : esc_html__('Not running', 'optiwebopz-seo-connector'); ?></p> 253 253 </li> … … 265 265 <label class="tcx-switch"><input type="checkbox" name="sitemaps_on" value="1"<?php checked($state['sitemaps']); ?>> <span><strong><?php esc_html_e('XML sitemaps', 'optiwebopz-seo-connector'); ?></strong></span></label> 266 266 <?php if ($ext !== '') : ?> 267 <p class="tcx-muted"><?php echo esc_html(sprintf(/* translators: %s: SEO plugin name */ __('%s is active and prints its own sitemap; Opti webopz SEO\'s sitemap starts once Optiwebopz SEO is switched on.', 'optiwebopz-seo-connector'), taler_cx_seo_plugin_name($ext))); ?></p>267 <p class="tcx-muted"><?php echo esc_html(sprintf(/* translators: %s: SEO plugin name */ __('%s is active and prints its own sitemap; OptiWebOpz SEO\'s sitemap starts once OptiWebOpz SEO is switched on.', 'optiwebopz-seo-connector'), taler_cx_seo_plugin_name($ext))); ?></p> 268 268 <?php elseif (!taler_cx_seo_active()) : ?> 269 <p class="tcx-muted"><?php esc_html_e('The sitemap starts once Opti webopz SEO is switched on (step 6).', 'optiwebopz-seo-connector'); ?></p>269 <p class="tcx-muted"><?php esc_html_e('The sitemap starts once OptiWebOpz SEO is switched on (step 6).', 'optiwebopz-seo-connector'); ?></p> 270 270 <?php endif; ?> 271 271 <h3><?php esc_html_e('What the sitemap lists', 'optiwebopz-seo-connector'); ?></h3> … … 304 304 4 => [__('Modules', 'optiwebopz-seo-connector'), $mods ? implode(', ', $mods) : __('none', 'optiwebopz-seo-connector')], 305 305 5 => [__('Sitemap', 'optiwebopz-seo-connector'), $state['sitemaps'] ? sprintf(/* translators: %s: list of contents */ __('on; lists %s', 'optiwebopz-seo-connector'), $sm ? implode(', ', $sm) : __('nothing', 'optiwebopz-seo-connector')) : __('off', 'optiwebopz-seo-connector')], 306 6 => [__('Opti webopz SEO switched on', 'optiwebopz-seo-connector'), taler_cx_seo_active() ? __('yes: Optiwebopz SEO prints titles, meta tags, schema and sitemaps', 'optiwebopz-seo-connector')306 6 => [__('OptiWebOpz SEO switched on', 'optiwebopz-seo-connector'), taler_cx_seo_active() ? __('yes: OptiWebOpz SEO prints titles, meta tags, schema and sitemaps', 'optiwebopz-seo-connector') 307 307 : ($ext !== '' ? sprintf(/* translators: %s: SEO plugin name */ __('no: %s is active', 'optiwebopz-seo-connector'), taler_cx_seo_plugin_name($ext)) : __('no', 'optiwebopz-seo-connector'))], 308 7 => [__('Taler (optional)', 'optiwebopz-seo-connector'), taler_cx_site_key() !== '' ? __('linked', 'optiwebopz-seo-connector') : __('not linked (Opti webopz SEO works fully without it)', 'optiwebopz-seo-connector')],308 7 => [__('Taler (optional)', 'optiwebopz-seo-connector'), taler_cx_site_key() !== '' ? __('linked', 'optiwebopz-seo-connector') : __('not linked (OptiWebOpz SEO works fully without it)', 'optiwebopz-seo-connector')], 309 309 ]; 310 310 } … … 320 320 ?> 321 321 <div class="wrap tcx"> 322 <?php taler_cx_seo_header(__('Set up Opti webopz SEO', 'optiwebopz-seo-connector')); ?>322 <?php taler_cx_seo_header(__('Set up OptiWebOpz SEO', 'optiwebopz-seo-connector')); ?> 323 323 <?php taler_cx_seo_notice([ 324 324 'wiz_saved' => ['success', __('Saved.', 'optiwebopz-seo-connector')], 325 325 'wiz_skipped' => ['info', __('Step skipped. Nothing was changed.', 'optiwebopz-seo-connector')], 326 'wiz_blocked' => ['warning', __('Opti webopz SEO was not switched on: another SEO plugin is active. Deactivate it, then switch Optiwebopz SEO on here or in Overview.', 'optiwebopz-seo-connector')],326 'wiz_blocked' => ['warning', __('OptiWebOpz SEO was not switched on: another SEO plugin is active. Deactivate it, then switch OptiWebOpz SEO on here or in Overview.', 'optiwebopz-seo-connector')], 327 327 'wiz_done' => ['success', __('Setup finished. You can change everything later under Titles & schema and Overview.', 'optiwebopz-seo-connector')], 328 328 ]); ?> … … 351 351 taler_cx_field('schema_post_type', __('Schema type for posts', 'optiwebopz-seo-connector')); 352 352 ?></div> 353 <p class="tcx-muted"><?php esc_html_e('Street address, opening hours, profiles and the other details are under Opti webopz SEO → Titles & schema.', 'optiwebopz-seo-connector'); ?></p>353 <p class="tcx-muted"><?php esc_html_e('Street address, opening hours, profiles and the other details are under OptiWebOpz SEO → Titles & schema.', 'optiwebopz-seo-connector'); ?></p> 354 354 <?php elseif ($step === 3) : ?> 355 355 <h2 id="tcx-wiz-title"><?php esc_html_e('How titles look', 'optiwebopz-seo-connector'); ?></h2> … … 364 364 <?php elseif ($step === 5) : taler_cx_wizard_step_sitemap($ext); ?> 365 365 <?php elseif ($step === 6) : ?> 366 <h2 id="tcx-wiz-title"><?php esc_html_e('Switch Opti webopz SEO on', 'optiwebopz-seo-connector'); ?></h2>366 <h2 id="tcx-wiz-title"><?php esc_html_e('Switch OptiWebOpz SEO on', 'optiwebopz-seo-connector'); ?></h2> 367 367 <?php if ($ext !== '') : ?> 368 368 <p class="tcx-banner tcx-banner-info"><?php echo esc_html(sprintf(/* translators: %1$s: SEO plugin name */ __('%1$s is active. Only one SEO plugin may print titles, meta tags and schema, so this switch is off until %1$s is deactivated. Import its data first (step 1).', 'optiwebopz-seo-connector'), taler_cx_seo_plugin_name($ext))); ?></p> 369 369 <?php else : ?> 370 <p class="tcx-muted"><?php esc_html_e('When this is on, Opti webopz SEO prints the titles, meta tags, schema and sitemaps you set up. You can switch it off again on Overview.', 'optiwebopz-seo-connector'); ?></p>370 <p class="tcx-muted"><?php esc_html_e('When this is on, OptiWebOpz SEO prints the titles, meta tags, schema and sitemaps you set up. You can switch it off again on Overview.', 'optiwebopz-seo-connector'); ?></p> 371 371 <?php endif; ?> 372 <label class="tcx-switch"><input type="checkbox" name="takeover" value="1"<?php checked(taler_cx_takeover() && $ext === ''); ?><?php disabled($ext !== ''); ?>> <span><?php esc_html_e('Opti webopz SEO prints this site\'s titles, meta tags, schema and sitemaps', 'optiwebopz-seo-connector'); ?></span></label>372 <label class="tcx-switch"><input type="checkbox" name="takeover" value="1"<?php checked(taler_cx_takeover() && $ext === ''); ?><?php disabled($ext !== ''); ?>> <span><?php esc_html_e('OptiWebOpz SEO prints this site\'s titles, meta tags, schema and sitemaps', 'optiwebopz-seo-connector'); ?></span></label> 373 373 <?php elseif ($step === 7) : $linked = taler_cx_site_key() !== ''; ?> 374 374 <h2 id="tcx-wiz-title"><?php esc_html_e('Taler (optional)', 'optiwebopz-seo-connector'); ?></h2> 375 <p><?php esc_html_e('Taler is a separate AI blog and SEO service. Linking this site adds Taler drafts, the Taler post editor and Google search data on Search performance. Opti webopz SEO works fully without it, and this setup finishes without it.', 'optiwebopz-seo-connector'); ?></p>375 <p><?php esc_html_e('Taler is a separate AI blog and SEO service. Linking this site adds Taler drafts, the Taler post editor and Google search data on Search performance. OptiWebOpz SEO works fully without it, and this setup finishes without it.', 'optiwebopz-seo-connector'); ?></p> 376 376 <p class="tcx-muted"><?php echo $linked ? esc_html__('This site is linked to Taler.', 'optiwebopz-seo-connector') : esc_html__('This site is not linked to Taler.', 'optiwebopz-seo-connector'); ?></p> 377 377 <p><a class="button tcx-btn" href="<?php echo esc_url(admin_url('options-general.php?page=' . TALER_CX_PAGE)); ?>"><?php echo $linked ? esc_html__('Taler connection settings', 'optiwebopz-seo-connector') : esc_html__('Connect to Taler', 'optiwebopz-seo-connector'); ?></a></p> … … 400 400 </form> 401 401 <?php if ($done === 0) : ?> 402 <p class="tcx-muted"><?php esc_html_e('Not now? Close the setup; open it again any time under Opti webopz SEO → Setup. Your settings stay as they are.', 'optiwebopz-seo-connector'); ?></p>402 <p class="tcx-muted"><?php esc_html_e('Not now? Close the setup; open it again any time under OptiWebOpz SEO → Setup. Your settings stay as they are.', 'optiwebopz-seo-connector'); ?></p> 403 403 <?php taler_cx_wizard_dismiss_form(); ?> 404 404 <?php endif; ?> -
optiwebopz-seo-connector/trunk/includes/admin/seo-menu.php
r3795029 r3795827 57 57 58 58 add_action('admin_menu', static function (): void { 59 add_menu_page(__('Opti webopz SEO', 'optiwebopz-seo-connector'), __('Optiwebopz SEO', 'optiwebopz-seo-connector'), taler_cx_seo_cap(), TALER_CX_SEO_SLUG,59 add_menu_page(__('OptiWebOpz SEO', 'optiwebopz-seo-connector'), __('OptiWebOpz SEO', 'optiwebopz-seo-connector'), taler_cx_seo_cap(), TALER_CX_SEO_SLUG, 60 60 'taler_cx_page_overview', 'dashicons-chart-area', 81); 61 61 add_submenu_page(TALER_CX_SEO_SLUG, __('Overview', 'optiwebopz-seo-connector'), __('Overview', 'optiwebopz-seo-connector'), taler_cx_seo_cap(), TALER_CX_SEO_SLUG, 'taler_cx_page_overview'); … … 141 141 echo '<p class="tcx-banner tcx-banner-info">' . esc_html(sprintf( 142 142 /* translators: %1$s: SEO plugin name */ 143 __('%1$s is active, so it prints this site\'s titles, meta tags, schema and sitemaps. Opti webopz SEO output is off; Taler keeps writing its SEO fields into %1$s.', 'optiwebopz-seo-connector'),143 __('%1$s is active, so it prints this site\'s titles, meta tags, schema and sitemaps. OptiWebOpz SEO output is off; Taler keeps writing its SEO fields into %1$s.', 'optiwebopz-seo-connector'), 144 144 taler_cx_seo_plugin_name(taler_cx_external_seo()))) . '</p>'; 145 145 } // 2.3.0: 'basic' (output switched off) is said once, on Overview only — not as a banner on every screen -
optiwebopz-seo-connector/trunk/includes/core/taler-client.php
r3795029 r3795827 138 138 function taler_cx_pull_message(string $code): string { 139 139 $m = [ 140 'not_connected' => __('Search data from Taler appears here when this site is linked to Taler (optional; Settings → Optiwebopz SEO Connector).', 'optiwebopz-seo-connector'), // 2.3.0: not a fault141 'no_app_url' => __('Add the Taler app address (https) in Settings → Optiwebopz SEO Connectorto see Taler data here.', 'optiwebopz-seo-connector'),140 'not_connected' => __('Search data from Taler appears here when this site is linked to Taler (optional; Settings → Taler connection).', 'optiwebopz-seo-connector'), // 2.3.0: not a fault 141 'no_app_url' => __('Add the Taler app address (https) in Settings → Taler connection to see Taler data here.', 'optiwebopz-seo-connector'), 142 142 'rate_limited' => __('Taler data was asked for too often in the last hour. It will refresh automatically later.', 'optiwebopz-seo-connector'), 143 143 'unreachable' => __('Taler could not be reached just now.', 'optiwebopz-seo-connector'), -
optiwebopz-seo-connector/trunk/includes/seo/import-runs.php
r3795029 r3795827 238 238 if ($t === '' || !in_array($t, TALER_CX_SCHEMA_TYPES, true)) { 239 239 /* translators: %s: schema type of the other plugin */ 240 return ['status' => 'review', 'new' => '', 'raw' => is_scalar($raw) ? sanitize_text_field((string) $raw) : '', 'note' => sprintf(__('schema type "%s" has no Opti webopz SEO equivalent', 'optiwebopz-seo-connector'), sanitize_text_field((string) $raw))];240 return ['status' => 'review', 'new' => '', 'raw' => is_scalar($raw) ? sanitize_text_field((string) $raw) : '', 'note' => sprintf(__('schema type "%s" has no OptiWebOpz SEO equivalent', 'optiwebopz-seo-connector'), sanitize_text_field((string) $raw))]; 241 241 } 242 242 $new = $t; … … 250 250 if (!in_array($c, TALER_CX_SEPARATORS, true)) { 251 251 /* translators: %s: separator character */ 252 return ['status' => 'review', 'new' => '', 'raw' => is_scalar($raw) ? sanitize_text_field((string) $raw) : '', 'note' => sprintf(__('separator "%s" is not one Opti webopz SEO offers', 'optiwebopz-seo-connector'), sanitize_text_field($c))];252 return ['status' => 'review', 'new' => '', 'raw' => is_scalar($raw) ? sanitize_text_field((string) $raw) : '', 'note' => sprintf(__('separator "%s" is not one OptiWebOpz SEO offers', 'optiwebopz-seo-connector'), sanitize_text_field($c))]; 253 253 } 254 254 $new = $c; … … 261 261 $left = array_values(array_diff(array_unique($m[0] ?? []), ['%title%', '%sitename%', '%sep%', '%page%', '%excerpt%', '%tagline%', '%year%', '%term%', '%author%', '%search%'])); 262 262 /* translators: %s: variables of the other plugin */ 263 return ['status' => 'review', 'new' => '', 'raw' => is_scalar($raw) ? sanitize_text_field((string) $raw) : '', 'note' => sprintf(__('variables Opti webopz SEO does not understand: %s', 'optiwebopz-seo-connector'), implode(' ', $left))];263 return ['status' => 'review', 'new' => '', 'raw' => is_scalar($raw) ? sanitize_text_field((string) $raw) : '', 'note' => sprintf(__('variables OptiWebOpz SEO does not understand: %s', 'optiwebopz-seo-connector'), implode(' ', $left))]; 264 264 } 265 265 $txt = $c; … … 292 292 if ($kind === 'org_kind') { 293 293 if (in_array($v, ['Organization', 'LocalBusiness'], true)) { return ['status' => 'ok', 'new' => $v]; } 294 return $why('review', __('the site is set up as a person; Opti webopz SEO describes an organization or a local business', 'optiwebopz-seo-connector'));294 return $why('review', __('the site is set up as a person; OptiWebOpz SEO describes an organization or a local business', 'optiwebopz-seo-connector')); 295 295 } 296 296 if ($kind === 'local_type') { 297 297 if (in_array($v, TALER_CX_LOCAL_TYPES, true)) { return ['status' => 'ok', 'new' => $v]; } 298 298 /* translators: %s: business type of the other plugin */ 299 return $why('review', sprintf(__('business type "%s" is not one Opti webopz SEO offers', 'optiwebopz-seo-connector'), sanitize_text_field($v)));299 return $why('review', sprintf(__('business type "%s" is not one OptiWebOpz SEO offers', 'optiwebopz-seo-connector'), sanitize_text_field($v))); 300 300 } 301 301 if ($kind === 'image') { // an attachment id, or an address in this site's media library … … 329 329 $t = trim(sanitize_text_field($v)); // name: plain text; "the site title" variables mean "not set" (Taler then uses the site title too) 330 330 if ($t === '' || in_array($t, ['%%sitename%%', '%sitename%', '#site_title'], true)) { return $none; } 331 if (preg_match('/%%[a-z_]+%%|#[a-z_]{3,}|%[a-z_]+%/i', $t)) { return $why('review', __('holds a variable; Opti webopz SEO needs plain text here', 'optiwebopz-seo-connector')); }331 if (preg_match('/%%[a-z_]+%%|#[a-z_]{3,}|%[a-z_]+%/i', $t)) { return $why('review', __('holds a variable; OptiWebOpz SEO needs plain text here', 'optiwebopz-seo-connector')); } 332 332 return ['status' => 'ok', 'new' => mb_substr($t, 0, $max)]; 333 333 } -
optiwebopz-seo-connector/trunk/includes/seo/redirects.php
r3795029 r3795827 318 318 return; 319 319 } 320 header('X-Redirect-By: Opti webopz SEO');321 wp_redirect((string) $r['target'], $code, 'Opti webopz SEO'); // phpcs:ignore WordPress.Security.SafeRedirect.wp_redirect_wp_redirect -- external targets are allowed on purpose: admin-entered, scheme-checked at save time320 header('X-Redirect-By: OptiWebOpz SEO'); 321 wp_redirect((string) $r['target'], $code, 'OptiWebOpz SEO'); // phpcs:ignore WordPress.Security.SafeRedirect.wp_redirect_wp_redirect -- external targets are allowed on purpose: admin-entered, scheme-checked at save time 322 322 exit; 323 323 } -
optiwebopz-seo-connector/trunk/includes/seo/sitemaps.php
r3795029 r3795827 232 232 $home = strtolower(untrailingslashit((string) wp_parse_url(home_url('/'), PHP_URL_PATH))); 233 233 if (in_array($path, [$home . '/sitemap.xml', $home . '/sitemap_index.xml', $home . '/wp-sitemap.xml'], true)) { 234 wp_safe_redirect(taler_cx_sitemap_url(), 301, 'Opti webopz SEO');234 wp_safe_redirect(taler_cx_sitemap_url(), 301, 'OptiWebOpz SEO'); 235 235 exit; 236 236 } -
optiwebopz-seo-connector/trunk/includes/seo/terms.php
r3795029 r3795827 67 67 ?> 68 68 <div class="form-field tcx tcx-term"> 69 <label for="tcx-term-title"><?php esc_html_e('SEO title (Opti webopz SEO)', 'optiwebopz-seo-connector'); ?></label>69 <label for="tcx-term-title"><?php esc_html_e('SEO title (OptiWebOpz SEO)', 'optiwebopz-seo-connector'); ?></label> 70 70 <input id="tcx-term-title" class="tcx-input" type="text" name="taler_cx_term[_taler_seo_title]" maxlength="200" placeholder="<?php echo esc_attr((string) taler_cx_seo_opt('title_term')); ?>"> 71 <label for="tcx-term-desc"><?php esc_html_e('Meta description (Opti webopz SEO)', 'optiwebopz-seo-connector'); ?></label>71 <label for="tcx-term-desc"><?php esc_html_e('Meta description (OptiWebOpz SEO)', 'optiwebopz-seo-connector'); ?></label> 72 72 <textarea id="tcx-term-desc" class="tcx-input" rows="2" name="taler_cx_term[_taler_meta_desc]" maxlength="400"></textarea> 73 73 <label class="tcx-switch"><input type="checkbox" name="taler_cx_term[_taler_noindex]" value="1"> <span><?php esc_html_e('Keep this archive out of search results (noindex)', 'optiwebopz-seo-connector'); ?></span></label> … … 82 82 ?> 83 83 <tr class="form-field tcx tcx-term"> 84 <th scope="row"><label for="tcx-term-title"><?php esc_html_e('SEO title (Opti webopz SEO)', 'optiwebopz-seo-connector'); ?></label></th>84 <th scope="row"><label for="tcx-term-title"><?php esc_html_e('SEO title (OptiWebOpz SEO)', 'optiwebopz-seo-connector'); ?></label></th> 85 85 <td><input id="tcx-term-title" class="tcx-input" type="text" name="taler_cx_term[_taler_seo_title]" maxlength="200" value="<?php echo esc_attr($s['title']); ?>" placeholder="<?php echo esc_attr((string) taler_cx_seo_opt('title_term')); ?>"></td> 86 86 </tr> 87 87 <tr class="form-field tcx tcx-term"> 88 <th scope="row"><label for="tcx-term-desc"><?php esc_html_e('Meta description (Opti webopz SEO)', 'optiwebopz-seo-connector'); ?></label></th>88 <th scope="row"><label for="tcx-term-desc"><?php esc_html_e('Meta description (OptiWebOpz SEO)', 'optiwebopz-seo-connector'); ?></label></th> 89 89 <td><textarea id="tcx-term-desc" class="tcx-input" rows="2" name="taler_cx_term[_taler_meta_desc]" maxlength="400"><?php echo esc_textarea($s['desc']); ?></textarea></td> 90 90 </tr> -
optiwebopz-seo-connector/trunk/optiwebopz-seo-connector.php
r3795029 r3795827 4 4 * Plugin URI: https://taler.optiwebopz.com/ 5 5 * Description: Connects this WordPress site to Taler and adds Optiwebopz SEO: titles, meta, Open Graph, canonical and robots; one schema graph (Article, FAQ, Breadcrumb, Organization or LocalBusiness, Product); XML and image sitemaps; redirects and a 404 monitor; a per-post analysis panel with Taler's checks; and search performance from Taler (Search Console data stays in Taler). Works next to Rank Math, Yoast or All in One SEO (Optiwebopz SEO output stays off while one is active). Keeps every Taler route: drafts, the Taler post editor, media upload, publishing and Taler-held scheduling. 6 * Version: 2.4. 26 * Version: 2.4.3 7 7 * Requires at least: 6.0 8 8 * Requires PHP: 8.1 … … 114 114 $folder = $taler_cx_other !== '' ? dirname($taler_cx_other) : 'taler-seo-connector'; 115 115 /* translators: 1: the older copy's plugin name, 2: its folder name */ 116 echo '<div class="notice notice-warning"><p>' . esc_html(sprintf(__('Two copies of this plugin are active. The older one, %1$s (folder %2$s), runs; Opti webopz SEO Connectorstays idle. Deactivate %1$s first, then delete it. All copies use the same settings and data, so nothing is lost.', 'optiwebopz-seo-connector'), $name, $folder)) . '</p></div>';116 echo '<div class="notice notice-warning"><p>' . esc_html(sprintf(__('Two copies of this plugin are active. The older one, %1$s (folder %2$s), runs; OptiWebOpz SEO stays idle. Deactivate %1$s first, then delete it. All copies use the same settings and data, so nothing is lost.', 'optiwebopz-seo-connector'), $name, $folder)) . '</p></div>'; 117 117 }; 118 118 add_action('admin_notices', $taler_cx_twice); … … 126 126 const TALER_CX_OLD_BASENAME = 'taler-connector/taler-connector.php'; 127 127 128 define('TALER_CX_VERSION', '2.4. 2');128 define('TALER_CX_VERSION', '2.4.3'); 129 129 define('TALER_CX_DB_VERSION', '6'); // 2.3.4: {prefix}taler_suggestions 130 130 define('TALER_CX_NS', 'taler/v1'); -
optiwebopz-seo-connector/trunk/readme.txt
r3795029 r3795827 5 5 Tested up to: 7.1 6 6 Requires PHP: 8.1 7 Stable tag: 2.4. 27 Stable tag: 2.4.3 8 8 License: GPLv2 or later 9 9 License URI: https://www.gnu.org/licenses/gpl-2.0.html … … 14 14 15 15 OptiWebOpz SEO is a complete SEO plugin for WordPress. It works on its own: it needs no account, and nothing leaves your 16 site unless an administrator switches a feature on. Its screens are under Opti webopz SEO in wp-admin.16 site unless an administrator switches a feature on. Its screens are under OptiWebOpz SEO in wp-admin. 17 17 18 18 Connecting the site to Taler (https://taler.optiwebopz.com/), a separate AI blog and SEO service, is optional and needs a … … 23 23 24 24 * SEO title and meta description for every post, page and public custom post type, with title templates and a separator 25 (Opti webopz SEO → Titles & schema);25 (OptiWebOpz SEO → Titles & schema); 26 26 * canonical links, robots rules (noindex / nofollow per post, noindex rules for author, date and tag archives); 27 27 * Open Graph and Twitter tags, with a default sharing image; … … 48 48 = Post checks and content score = 49 49 50 * an "Opti webopz SEO" box under the post editor: SEO title, description, focus keyword and secondary keywords, social50 * an "OptiWebOpz SEO" box under the post editor: SEO title, description, focus keyword and secondary keywords, social 51 51 title, description and image, canonical, robots, breadcrumb title and article type, with offline checks of the post; 52 52 * a content score from 0 to 100 for every published post (headings, length, sentences and paragraphs, keywords, links, … … 93 93 = Setup, shortcodes and tools = 94 94 95 * an optional eight-step setup (Opti webopz SEO → Setup); every step can be skipped;95 * an optional eight-step setup (OptiWebOpz SEO → Setup); every step can be skipped; 96 96 * shortcodes [taler_breadcrumbs] (a breadcrumb trail) and [taler_html_sitemap] (a list of posts and pages); 97 97 * background work through Action Scheduler when another plugin provides it, or the WP-CLI command wp taler-cx jobs run; … … 104 104 * Google Search Console clicks, impressions, average position, the queries behind each post and Google's index status, 105 105 and, when Taler stores them, Google Analytics 4 visits and the most-visited pages. Read from Taler when the site is 106 connected (Opti webopz SEO → Search performance and the post box); the plugin holds no Google key.106 connected (OptiWebOpz SEO → Search performance and the post box); the plugin holds no Google key. 107 107 108 108 = What runs by default = … … 110 110 Right after activation, with nothing switched on and no Taler account: 111 111 112 * the Opti webopz SEO screens in wp-admin;112 * the OptiWebOpz SEO screens in wp-admin; 113 113 * the internal link index: built by the background work after activation (see Installation), updated when a post is saved, 114 114 with a "Links" column in the wp-admin post lists; … … 117 117 Open Graph / Twitter tags and one article schema. 118 118 119 Off until you switch them on: the titles, meta tags, schema, sitemaps and post box (one switch, "Use Opti webopz SEO on this119 Off until you switch them on: the titles, meta tags, schema, sitemaps and post box (one switch, "Use OptiWebOpz SEO on this 120 120 site", which works only while Rank Math, Yoast SEO and All in One SEO are inactive), redirects and the 404 log, IndexNow, 121 121 the missing-alt output, the "By author" line on Taler posts, and the optional link features (sending performance numbers 122 to Taler, and each way of applying Taler's suggestions; Settings → Optiwebopz SEO Connector). While another SEO plugin is122 to Taler, and each way of applying Taler's suggestions; Settings → Taler connection). While another SEO plugin is 123 123 active, OptiWebOpz SEO prints nothing in the page head and Taler writes its SEO fields into that plugin. 124 124 … … 129 129 Taler. Optional link features, each off until you switch it on: send this site's performance numbers to Taler, ask 130 130 Taler to read the site, and apply Taler's suggestions for SEO titles, descriptions, focus keywords and social text 131 (Opti webopz SEO → Suggestions, with a change log and Undo). See "External services" below for exactly what each key131 (OptiWebOpz SEO → Suggestions, with a change log and Undo). See "External services" below for exactly what each key 132 132 allows and what is sent. 133 133 … … 135 135 136 136 1. In WordPress: Plugins → Add New Plugin → search for "OptiWebOpz SEO" → Install Now → Activate. 137 2. Opti webopz SEO works on its own: open Optiwebopz SEO → Setup, or Optiwebopz SEO → Overview and switch "Use Optiwebopz SEO on this site" on137 2. OptiWebOpz SEO works on its own: open OptiWebOpz SEO → Setup, or OptiWebOpz SEO → Overview and switch "Use OptiWebOpz SEO on this site" on 138 138 (only possible while no other SEO plugin is active). Steps 3 and 4 are only needed to connect the site to a Taler account. 139 3. Settings → Optiwebopz SEO Connector→ "Generate a site key" (shown once) — or paste a key you created in Taler.139 3. Settings → Taler connection → "Generate a site key" (shown once) — or paste a key you created in Taler. 140 140 4. In Taler: Settings → Sites → this site → paste the same key as the Site key → Save → "Test key". 141 141 142 142 Optional: set the key in wp-config.php instead: define('TALER_SITE_KEY', 'your-key'); 143 143 144 To see search data from Taler, also enter the Taler app address (https) in Settings → Optiwebopz SEO Connector.144 To see search data from Taler, also enter the Taler app address (https) in Settings → Taler connection. 145 145 146 146 Background work (for example building the link index or removing old 404 rows) runs through Action Scheduler when another … … 153 153 = Do I need a Taler account? = 154 154 155 No, not for Opti webopz SEO, the import and the shortcodes. Drafts from Taler, the Taler post editor, publishing from Taler and155 No, not for OptiWebOpz SEO, the import and the shortcodes. Drafts from Taler, the Taler post editor, publishing from Taler and 156 156 search data from Taler need a Taler account and a site key. 157 157 158 158 = Does it replace Yoast SEO or Rank Math? = 159 159 160 It can. Import their data first (Opti webopz SEO → Import; the other plugin's data is only read, never changed), deactivate the161 other plugin, then switch "Use Opti webopz SEO on this site" on. While Yoast SEO, Rank Math or All in One SEO is active, Optiwebopz SEO160 It can. Import their data first (OptiWebOpz SEO → Import; the other plugin's data is only read, never changed), deactivate the 161 other plugin, then switch "Use OptiWebOpz SEO on this site" on. While Yoast SEO, Rank Math or All in One SEO is active, OptiWebOpz SEO 162 162 prints nothing in the page head, so there is never a second set of tags; Taler then writes its SEO fields into that plugin. 163 163 164 164 = What data leaves my site? = 165 165 166 Nothing until an administrator sets it up. With a site key and the Taler address set, opening Opti webopz SEO → Search performance or a167 post's Opti webopz SEO box asks Taler for search data (details under External services). Taler itself reads and writes posts166 Nothing until an administrator sets it up. With a site key and the Taler address set, opening OptiWebOpz SEO → Search performance or a 167 post's OptiWebOpz SEO box asks Taler for search data (details under External services). Taler itself reads and writes posts 168 168 through this plugin's REST routes with the site key. If you switch IndexNow on, the addresses of changed public pages go to 169 169 IndexNow. If you switch on "Send performance numbers to Taler", whole numbers counted on this site (no titles, text or … … 173 173 = How do I import from another SEO plugin? = 174 174 175 Opti webopz SEO → Import (administrators). Pick the plugin and the parts, make a preview (it changes nothing), check the conflicts175 OptiWebOpz SEO → Import (administrators). Pick the plugin and the parts, make a preview (it changes nothing), check the conflicts 176 176 and the values that need review, tick the confirm box and copy. Every value written is logged and the whole import can be 177 177 undone from the same screen. … … 188 188 = How do I uninstall it? = 189 189 190 Deactivate it: Opti webopz SEO output and redirects stop at once and Taler can no longer reach the site. Delete it: its options190 Deactivate it: OptiWebOpz SEO output and redirects stop at once and Taler can no longer reach the site. Delete it: its options 191 191 and tables (snapshots, cache, redirects, 404 log, link index, import log) are removed, on every site of a multisite network. 192 192 Posts and their SEO fields stay, because they are your content (the secondary keywords an import kept and the content scores … … 199 199 200 200 **Taler** (https://taler.optiwebopz.com/, an AI blog and SEO service; the address is the one the administrator enters in 201 Settings → Optiwebopz SEO Connector).201 Settings → Taler connection, and every call from this site goes to connector-api.php at that address). 202 202 203 203 From this site to Taler — used to show Google Search Console numbers (clicks, impressions, positions, searches), Google 204 index status, Google Analytics 4 visits when Taler stores them, and Taler's checks on Opti webopz SEO → Search performance and in the Optiwebopz SEO box. Search Console data is read204 index status, Google Analytics 4 visits when Taler stores them, and Taler's checks on OptiWebOpz SEO → Search performance and in the OptiWebOpz SEO box. Search Console data is read 205 205 by Taler; the plugin holds no Google sign-in, key or token and never contacts Google: 206 206 207 * When: only while an administrator or editor opens Opti webopz SEO → Search performance or a post's Optiwebopz SEO box, at most once207 * When: only while an administrator or editor opens OptiWebOpz SEO → Search performance or a post's OptiWebOpz SEO box, at most once 208 208 per page and data type every 6 to 12 hours (answers are cached; the "Ask Taler again" button asks again), and only after 209 209 a site key and the Taler address are set. Never on the public site. Disconnecting deletes the cached answers. … … 219 219 tags, SEO fields, FAQ, featured image) and the list of its revisions and snapshots; list posts and drafts; change the 220 220 title, excerpt, SEO title, SEO description and focus keyword of any blog post, published posts included; switch the table of contents 221 and the "By author" line on Taler posts (an administrator's own choice in Settings → Optiwebopz SEO Connectoralways wins).221 and the "By author" line on Taler posts (an administrator's own choice in Settings → Taler connection always wins). 222 222 * With the media key (derived from the site key): upload images to the media library and set the featured image of a 223 223 draft. … … 230 230 * Taler Privacy Policy: https://taler.optiwebopz.com/privacy 231 231 232 **Optional link features (from 2.3.4).** Each one is off until the site owner switches it on in Settings → Optiwebopz SEO Connector, and works only while the site is linked to Taler (a site key and the Taler address are set).232 **Optional link features (from 2.3.4).** Each one is off until the site owner switches it on in Settings → Taler connection, and works only while the site is linked to Taler (a site key and the Taler address are set). 233 233 234 234 * Performance numbers, from this site to Taler (the Taler address above): sent only while "Send performance numbers to Taler" is on, once a day through the plugin's background jobs (Action Scheduler when another plugin provides it, otherwise a server cron running wp taler-cx jobs run) and when an administrator clicks "Send now". Never when a page is opened and never on the public site. What is sent: whole numbers only, counted on this site: published posts; posts with a content score; the average content score; posts with a good, OK and needs-work score; posts with something to fix; posts by text length (under 300, 300 to 599, 600 to 1,199, 1,200 or more words, no readable text); posts without an SEO title, a meta description or a focus keyword; posts set to noindex; posts not updated in 6 and in 12 months; 404 addresses, 404 requests and new 404 addresses in 7 and in 30 days; redirects switched on, all redirects, redirect uses, redirects used in 30 days and redirects never used; posts nobody links to, posts and internal links in the link index; images without alt text; addresses in the XML sitemap. With them: this site's address, a time stamp, a random one-time value, the plugin version and a signature made with the site key. No post titles, text or addresses, no user data and no visitor data. 235 235 * Crawl request, from this site to Taler: sent only when an administrator clicks "Ask Taler to read this site", at most once a day. What is sent: this site's address, a time stamp, a random one-time value, the plugin version and a signature. Taler then reads this site's public pages, as a visitor's browser would, to keep its knowledge of the site up to date. 236 * Suggestions arrive from Taler: Taler sends suggested changes to a post's or page's SEO title, meta description, focus keyword, social title or social description, each with its reason, signed with a key derived from the site key. They are stored on this site and listed in Opti webopz SEO → Suggestions. Nothing changes on a post until a suggestion is applied, and only in a way the site owner switched on (all off by default): an editor clicks Apply; Taler applies it (from the Taler app, its API or its Claude connector); or automatic apply. Automatic apply happens only when the site owner turns it on, only for SEO titles and meta descriptions, and at most the daily number set there. "Stop remote and automatic changes" turns both of those off at once. Every applied change keeps a copy of the post first, is listed with who or what applied it, when, and the old and new value, and can be undone.236 * Suggestions arrive from Taler: Taler sends suggested changes to a post's or page's SEO title, meta description, focus keyword, social title or social description, each with its reason, signed with a key derived from the site key. They are stored on this site and listed in OptiWebOpz SEO → Suggestions. Nothing changes on a post until a suggestion is applied, and only in a way the site owner switched on (all off by default): an editor clicks Apply; Taler applies it (from the Taler app, its API or its Claude connector); or automatic apply. Automatic apply happens only when the site owner turns it on, only for SEO titles and meta descriptions, and at most the daily number set there. "Stop remote and automatic changes" turns both of those off at once. Every applied change keeps a copy of the post first, is listed with who or what applied it, when, and the old and new value, and can be undone. 237 237 238 238 **IndexNow** (https://api.indexnow.org/indexnow). Off by default; used only when an administrator switches IndexNow on 239 in Optiwebopz SEO (and only while Optiwebopz SEO is on and no other SEO plugin is active). 240 241 * When: after a public post or page is published or changed, at most 100 addresses per send and at least 60 seconds apart. 239 in OptiWebOpz SEO (and only while OptiWebOpz SEO is on and no other SEO plugin is active). 240 241 * When: after a public post or page is published or changed, at most 100 addresses per send and at least 60 seconds apart; 242 and when a user who may open the OptiWebOpz SEO screens (administrators, and the roles chosen under OptiWebOpz SEO → Roles) 243 clicks "Send waiting addresses now" in OptiWebOpz SEO → Overview, which sends them at once. 242 244 * What is sent: this site's host name, the site's public IndexNow key (which the plugin creates and shows at 243 /<key>.txt, as the protocol requires) and the addresses of the changed pages. Nothing else.245 /<key>.txt, as the protocol requires), the address of that key file and the addresses of the changed pages. Nothing else. 244 246 * IndexNow shares the addresses with the participating search engines (for example Bing); Google does not take part. 245 247 * IndexNow terms: https://www.indexnow.org/terms · documentation: https://www.indexnow.org/documentation … … 259 261 260 262 == Changelog == 263 264 = 2.4.3 — 2026-11-10 = 265 * The admin menu and the plugin's messages now spell the name OptiWebOpz SEO; the settings page where the optional Taler link is set up is now called Settings → Taler connection. External services: IndexNow's "Send waiting addresses now" button and the key file address are listed. No behaviour change. 261 266 262 267 = 2.4.2 — 2026-11-09 =
Note:
See TracChangeset
for help on using the changeset viewer.