Plugin Directory

Changeset 3795827


Ignore:
Timestamp:
11/11/2026 07:46:45 AM (2 days ago)
Author:
optiwebopz
Message:

Release 2.4.3

Location:
optiwebopz-seo-connector
Files:
40 edited
1 copied

Legend:

Unmodified
Added
Removed
  • optiwebopz-seo-connector/tags/2.4.3/includes/admin.php

    r3795029 r3795827  
    4848
    4949add_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');
    5151});
    5252
    … …  
    176176    if (!function_exists('wp_add_privacy_policy_content')) { return; }
    177177    $p = [
    178         __('This site uses the Optiwebopz SEO Connector 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()),
     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()),
    180180        __('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 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 → 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.4
     181        __('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
    183183        __('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'),
    184184        __('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'),
    185185    ];
    186     wp_add_privacy_policy_content('Optiwebopz 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>'));
    187187}
    188188
    … …  
    234234    ?>
    235235    <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>
    237237      <?php if (isset($msgs[$code])) : ?>
    238238        <div class="notice notice-<?php echo esc_attr($msgs[$code][0]); ?> is-dismissible"><p><?php echo esc_html($msgs[$code][1]); ?></p></div>
    … …  
    294294          <fieldset>
    295295            <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 (Optiwebopz 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>
    297297            <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>
    298298            <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>
    … …  
    371371          <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>
    372372          <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('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>
     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>
    374374          <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>
    375375        </ul>
  • optiwebopz-seo-connector/tags/2.4.3/includes/admin/metabox.php

    r3795029 r3795827  
    5151add_action('add_meta_boxes', static function (string $postType): void {
    5252    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', __('Optiwebopz 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');
    5454});
    5555
    … …  
    233233function taler_cx_analysis_schema(WP_Post $p): array {
    234234    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 (Optiwebopz 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')];
    236236    }
    237237    $none = $p->post_type === 'post' && taler_cx_box_meta_str((int) $p->ID, '_taler_schema_type') === 'none';
    … …  
    272272        <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>
    273273          <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 (Optiwebopz 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>
    275275        <?php if ($post->post_type === 'product' && function_exists('taler_cx_woo_fields')) : foreach (taler_cx_woo_fields() as $wk => $wf) : ?>
    276276        <div class="tcx-field"><label for="tcx<?php echo esc_attr(str_replace('_', '-', $wk)); ?>"><?php echo esc_html($wf[0]); ?></label>
    … …  
    282282            <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>
    283283            <?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 (Optiwebopz 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>
    285285        <?php endif; ?>
    286286        <div class="tcx-field tcx-span">
    287287          <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>
    288288          <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 (Optiwebopz 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; ?>
    290290        </div>
    291291      </div>
  • optiwebopz-seo-connector/tags/2.4.3/includes/admin/page-dashboard.php

    r3795029 r3795827  
    8585    echo '<p>' . esc_html__('For the last 28 days, this screen shows:', 'optiwebopz-seo-connector') . '</p><ul class="tcx-facts">';
    8686    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 Optiwebopz 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>';
    8888    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>';
    8989    echo '<div class="tcx-actions">';
    … …  
    9292            . ($linked ? esc_html__('Taler connection settings', 'optiwebopz-seo-connector') : esc_html__('Connect to Taler', 'optiwebopz-seo-connector')) . '</a>';
    9393    } 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>';
    9595    }
    9696    if ($linked) {
    … …  
    108108        echo '<div class="wrap tcx">';
    109109        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 (Optiwebopz 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>';
    111111        return;
    112112    }
  • optiwebopz-seo-connector/tags/2.4.3/includes/admin/page-import.php

    r3795029 r3795827  
    5656/** The status names shown on the screen. */
    5757function taler_cx_import_status_labels(): array {
    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')];
     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')];
    6060}
    6161
    … …  
    172172          'discarded' => ['info', __('The unfinished import was stopped. What it already copied is in the log and can be undone.', 'optiwebopz-seo-connector')],
    173173          '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. Optiwebopz 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')],
    175175          'undo_failed' => ['error', __('That import cannot be undone (it was a preview, or its log is gone).', 'optiwebopz-seo-connector')],
    176176      ]); ?>
    … …  
    182182          <div class="tcx-banner tcx-banner-info" data-state="empty">
    183183            <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 Optiwebopz 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>
    185185          </div>
    186186        <?php endif; ?>
    … …  
    205205      <?php if ($st && empty($st['done'])) : ?>
    206206        <div class="tcx-card">
    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>
     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>
    208208          <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'),
    209209              TALER_CX_IMPORT_SOURCES[$st['src']] ?? '', $parts[$st['phase']] ?? '', (int) $st['items'], (int) $st['batches'])); ?></p>
    … …  
    232232            <?php endforeach; ?>
    233233            </fieldset>
    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>
     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>
    235235            <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>
    236236            <p><button type="submit" class="button button-primary tcx-btn"><?php esc_html_e('Make a preview', 'optiwebopz-seo-connector'); ?></button></p>
    … …  
    242242        <div class="tcx-card">
    243243          <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 Optiwebopz 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'),
    245245              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>
    246246          <?php echo wp_kses(taler_cx_import_counts_html($st), taler_cx_import_allowed_html()); ?>
    … …  
    262262            <?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; ?>
    263263          <?php else : ?>
    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>
     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>
    265265          <?php endif; ?>
    266266          <?php if ($st['error_list']) : ?>
    … …  
    271271        <?php if ((int) ($st['counts']['copy'] ?? 0) + (int) ($st['counts']['overwrite'] ?? 0) > 0) : ?>
    272272        <div class="tcx-card">
    273           <h2><?php esc_html_e('3. Copy into Optiwebopz SEO', 'optiwebopz-seo-connector'); ?></h2>
     273          <h2><?php esc_html_e('3. Copy into OptiWebOpz SEO', 'optiwebopz-seo-connector'); ?></h2>
    274274          <?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; ?>
    275275          <form method="post" action="<?php echo esc_url(admin_url('admin-post.php')); ?>">
    276276            <input type="hidden" name="action" value="taler_cx_import_run">
    277277            <?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 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>
     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>
    280280          </form>
    281281        </div>
  • optiwebopz-seo-connector/tags/2.4.3/includes/admin/page-links.php

    r3795029 r3795827  
    5050      <?php taler_cx_seo_header(__('Internal links', 'optiwebopz-seo-connector')); ?>
    5151      <?php taler_cx_seo_notice([
    52           'links_off' => ['warning', __('Internal links is switched off (Optiwebopz SEO → Overview).', 'optiwebopz-seo-connector')],
     52          'links_off' => ['warning', __('Internal links is switched off (OptiWebOpz SEO → Overview).', 'optiwebopz-seo-connector')],
    5353          'links_batch' => ['info', __('One batch indexed. Continue until it says finished, or let it run in the background.', 'optiwebopz-seo-connector')],
    5454          'links_done' => ['success', __('The link index is complete.', 'optiwebopz-seo-connector')],
    … …  
    5757      ]); ?>
    5858      <?php if (!$on) : ?>
    59         <p class="tcx-banner tcx-banner-info"><?php esc_html_e('Internal links is switched off (Optiwebopz 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>
    6060      </div>
    6161        <?php return; endif; ?>
  • optiwebopz-seo-connector/tags/2.4.3/includes/admin/page-overview.php

    r3795029 r3795827  
    4444        'analysis' => [__('Post analysis', 'optiwebopz-seo-connector'), __('SEO fields and checks under the post editor, with Taler\'s checks on Taler posts.', 'optiwebopz-seo-connector')],
    4545        '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 Optiwebopz 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')],
    4747        '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')],
    4848        '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')],
    … …  
    5252/** 2.3.0: the one place that says Optiwebopz SEO's output is off ('basic' mode) — neutral words, Overview only. */
    5353function taler_cx_seo_off_text(): string {
    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');
     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');
    5555}
    5656
    … …  
    7777    $t['output'] = ['label' => __('Titles, meta tags, schema, sitemaps', 'optiwebopz-seo-connector'),
    7878        'value' => $mode === 'taler' ? __('On', 'optiwebopz-seo-connector') : ($mode === 'external' ? taler_cx_seo_plugin_name(taler_cx_external_seo()) : $off),
    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')),
     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')),
    8080        'url' => '', 'link' => '', 'src' => 'includes/core/modules.php:taler_cx_seo_mode'];
    8181
    … …  
    202202    ?>
    203203    <div class="wrap tcx">
    204       <?php taler_cx_seo_header(__('Optiwebopz SEO', 'optiwebopz-seo-connector')); ?>
     204      <?php taler_cx_seo_header(__('OptiWebOpz SEO', 'optiwebopz-seo-connector')); ?>
    205205      <?php taler_cx_seo_notice([
    206206          'saved' => ['success', __('Saved.', 'optiwebopz-seo-connector')],
    … …  
    210210          'indexnow_failed' => ['warning', __('IndexNow did not accept the addresses. See the last answer below.', 'optiwebopz-seo-connector')],
    211211          '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 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')],
     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')],
    214214      ]); ?>
    215215      <?php if (taler_cx_seo_mode() === 'basic') : ?>
    … …  
    237237        <input type="hidden" name="action" value="taler_cx_seo_overview">
    238238        <?php wp_nonce_field('taler_cx_seo_overview'); ?>
    239         <h2><?php esc_html_e('Use Optiwebopz SEO on this site', 'optiwebopz-seo-connector'); ?></h2>
     239        <h2><?php esc_html_e('Use OptiWebOpz SEO on this site', 'optiwebopz-seo-connector'); ?></h2>
    240240        <?php if ($ext !== '') : ?>
    241241          <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>
    … …  
    243243        <label class="tcx-switch">
    244244          <input type="checkbox" name="takeover" value="1"<?php checked(taler_cx_takeover() && $ext === ''); ?><?php disabled($ext !== ''); ?>>
    245           <span><?php esc_html_e('Optiwebopz 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>
    246246        </label>
    247247        <h2><?php esc_html_e('Modules', 'optiwebopz-seo-connector'); ?></h2>
    … …  
    288288      <div class="tcx-card">
    289289        <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. Optiwebopz 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>
    291291        <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>
    292292        <?php if (current_user_can('manage_options')) : ?>
    … …  
    302302    if (!current_user_can('manage_options')) { return; }   // 2.3.1: the Setup screen is for administrators
    303303    $text = [
    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'),
     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'),
    305305        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'),
    306306        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  
    106106      <?php taler_cx_seo_header(__('Performance', 'optiwebopz-seo-connector')); ?>
    107107      <?php taler_cx_seo_notice([
    108           'an_off' => ['info', __('Post analysis is switched off (Optiwebopz SEO → Overview).', 'optiwebopz-seo-connector')],
     108          'an_off' => ['info', __('Post analysis is switched off (OptiWebOpz SEO → Overview).', 'optiwebopz-seo-connector')],
    109109          'an_batch' => ['info', __('One batch analysed. Continue until it says finished, or let it run in the background.', 'optiwebopz-seo-connector')],
    110110          'an_done' => ['success', __('Every published post has a content score now.', 'optiwebopz-seo-connector')],
    … …  
    117117      <h2 class="tcx-h2"><?php esc_html_e('Content scores', 'optiwebopz-seo-connector'); ?></h2>
    118118      <?php if (!$scores) : ?>
    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>
     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>
    120120      <?php else : $c = taler_cx_analysis_counts(); $st = taler_cx_analysis_state(); ?>
    121121        <?php taler_cx_perf_tiles([
    … …  
    211211      <h2 class="tcx-h2"><?php esc_html_e('Not found (404) and redirects', 'optiwebopz-seo-connector'); ?></h2>
    212212      <?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 (Optiwebopz 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>
    214214      <?php else : ?>
    215215        <?php taler_cx_perf_tiles([
  • optiwebopz-seo-connector/tags/2.4.3/includes/admin/page-recommendations.php

    r3795029 r3795827  
    2525      <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>
    2626      <?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 Optiwebopz 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>
    2828      </div>
    2929        <?php return; endif; ?>
  • optiwebopz-seo-connector/tags/2.4.3/includes/admin/page-redirects.php

    r3795029 r3795827  
    172172      ]); ?>
    173173      <?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 (Optiwebopz 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>
    175175      <?php endif; ?>
    176176      <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  
    3939      <form class="tcx-card" method="post" action="<?php echo esc_url(admin_url('admin-post.php')); ?>">
    4040        <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 Optiwebopz 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>
    4343        <ul class="tcx-modules">
    4444          <?php foreach ($names as $slug => $label) : ?>
    … …  
    4646          <?php endforeach; ?>
    4747        </ul>
    48         <h2><?php esc_html_e('Who sees the Optiwebopz 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>
    4949        <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>
    5050        <ul class="tcx-modules">
  • optiwebopz-seo-connector/tags/2.4.3/includes/admin/page-suggestions.php

    r3795029 r3795827  
    101101          'sg_dismissed' => ['success', __('Dismissed. Nothing on the post was changed.', 'optiwebopz-seo-connector')],
    102102          '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')],
    104104          'sg_stale' => ['warning', __('Not applied: the field had changed since Taler looked at it. Nothing was written.', 'optiwebopz-seo-connector')],
    105105          'sg_expired' => ['warning', __('This suggestion has expired. Nothing was written.', 'optiwebopz-seo-connector')],
    … …  
    117117        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'))));
    118118        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>'; }
    120120      ?></p>
    121121      <?php if (!taler_cx_seo_active()) : ?>
    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>
     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>
    123123      <?php endif; ?>
    124124      <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  
    220220    ?>
    221221    <h2 id="tcx-wiz-title"><?php esc_html_e('Other SEO plugins', 'optiwebopz-seo-connector'); ?></h2>
    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>
     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>
    223223    <ul class="tcx-facts">
    224224      <?php foreach (TALER_CX_IMPORT_SOURCES as $src => $name) : $d = $det[$src] ?? ['active' => false, 'any' => false, 'posts' => 0, 'terms' => 0, 'global' => false, 'redirects' => null]; ?>
    … …  
    230230    </ul>
    231231    <?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 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>
     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>
    233233    <?php endif; ?>
    234234    <?php if ($found) : ?>
    235235      <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 Optiwebopz 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>
    237237    <?php endif; ?>
    238238    <?php
    … …  
    249249      <li class="tcx-module">
    250250        <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 Optiwebopz 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>
    252252        <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>
    253253      </li>
    … …  
    265265    <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>
    266266    <?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; Optiwebopz 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>
    268268    <?php elseif (!taler_cx_seo_active()) : ?>
    269       <p class="tcx-muted"><?php esc_html_e('The sitemap starts once Optiwebopz 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>
    270270    <?php endif; ?>
    271271    <h3><?php esc_html_e('What the sitemap lists', 'optiwebopz-seo-connector'); ?></h3>
    … …  
    304304        4 => [__('Modules', 'optiwebopz-seo-connector'), $mods ? implode(', ', $mods) : __('none', 'optiwebopz-seo-connector')],
    305305        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 => [__('Optiwebopz 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')
    307307            : ($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 (Optiwebopz 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')],
    309309    ];
    310310}
    … …  
    320320    ?>
    321321    <div class="wrap tcx">
    322       <?php taler_cx_seo_header(__('Set up Optiwebopz SEO', 'optiwebopz-seo-connector')); ?>
     322      <?php taler_cx_seo_header(__('Set up OptiWebOpz SEO', 'optiwebopz-seo-connector')); ?>
    323323      <?php taler_cx_seo_notice([
    324324          'wiz_saved' => ['success', __('Saved.', 'optiwebopz-seo-connector')],
    325325          'wiz_skipped' => ['info', __('Step skipped. Nothing was changed.', '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')],
     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')],
    327327          'wiz_done' => ['success', __('Setup finished. You can change everything later under Titles & schema and Overview.', 'optiwebopz-seo-connector')],
    328328      ]); ?>
    … …  
    351351            taler_cx_field('schema_post_type', __('Schema type for posts', 'optiwebopz-seo-connector'));
    352352          ?></div>
    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>
     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>
    354354        <?php elseif ($step === 3) : ?>
    355355          <h2 id="tcx-wiz-title"><?php esc_html_e('How titles look', 'optiwebopz-seo-connector'); ?></h2>
    … …  
    364364        <?php elseif ($step === 5) : taler_cx_wizard_step_sitemap($ext); ?>
    365365        <?php elseif ($step === 6) : ?>
    366           <h2 id="tcx-wiz-title"><?php esc_html_e('Switch Optiwebopz SEO on', 'optiwebopz-seo-connector'); ?></h2>
     366          <h2 id="tcx-wiz-title"><?php esc_html_e('Switch OptiWebOpz SEO on', 'optiwebopz-seo-connector'); ?></h2>
    367367          <?php if ($ext !== '') : ?>
    368368            <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>
    369369          <?php else : ?>
    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>
     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>
    371371          <?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('Optiwebopz 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>
    373373        <?php elseif ($step === 7) : $linked = taler_cx_site_key() !== ''; ?>
    374374          <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. Optiwebopz 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>
    376376          <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>
    377377          <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>
    … …  
    400400      </form>
    401401      <?php if ($done === 0) : ?>
    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>
     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>
    403403        <?php taler_cx_wizard_dismiss_form(); ?>
    404404      <?php endif; ?>
  • optiwebopz-seo-connector/tags/2.4.3/includes/admin/seo-menu.php

    r3795029 r3795827  
    5757
    5858add_action('admin_menu', static function (): void {
    59     add_menu_page(__('Optiwebopz 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,
    6060        'taler_cx_page_overview', 'dashicons-chart-area', 81);
    6161    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');
    … …  
    141141        echo '<p class="tcx-banner tcx-banner-info">' . esc_html(sprintf(
    142142            /* translators: %1$s: SEO plugin name */
    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'),
     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'),
    144144            taler_cx_seo_plugin_name(taler_cx_external_seo()))) . '</p>';
    145145    }   // 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  
    138138function taler_cx_pull_message(string $code): string {
    139139    $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 fault
    141         'no_app_url'    => __('Add the Taler app address (https) in Settings → Optiwebopz SEO Connector to 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'),
    142142        'rate_limited'  => __('Taler data was asked for too often in the last hour. It will refresh automatically later.', 'optiwebopz-seo-connector'),
    143143        '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  
    238238        if ($t === '' || !in_array($t, TALER_CX_SCHEMA_TYPES, true)) {
    239239            /* 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 Optiwebopz 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))];
    241241        }
    242242        $new = $t;
    … …  
    250250        if (!in_array($c, TALER_CX_SEPARATORS, true)) {
    251251            /* 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 Optiwebopz 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))];
    253253        }
    254254        $new = $c;
    … …  
    261261                $left = array_values(array_diff(array_unique($m[0] ?? []), ['%title%', '%sitename%', '%sep%', '%page%', '%excerpt%', '%tagline%', '%year%', '%term%', '%author%', '%search%']));
    262262                /* translators: %s: variables of the other plugin */
    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))];
     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))];
    264264            }
    265265            $txt = $c;
    … …  
    292292    if ($kind === 'org_kind') {
    293293        if (in_array($v, ['Organization', 'LocalBusiness'], true)) { return ['status' => 'ok', 'new' => $v]; }
    294         return $why('review', __('the site is set up as a person; Optiwebopz 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'));
    295295    }
    296296    if ($kind === 'local_type') {
    297297        if (in_array($v, TALER_CX_LOCAL_TYPES, true)) { return ['status' => 'ok', 'new' => $v]; }
    298298        /* translators: %s: business type of the other plugin */
    299         return $why('review', sprintf(__('business type "%s" is not one Optiwebopz 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)));
    300300    }
    301301    if ($kind === 'image') {   // an attachment id, or an address in this site's media library
    … …  
    329329    $t = trim(sanitize_text_field($v));   // name: plain text; "the site title" variables mean "not set" (Taler then uses the site title too)
    330330    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; Optiwebopz 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')); }
    332332    return ['status' => 'ok', 'new' => mb_substr($t, 0, $max)];
    333333}
  • optiwebopz-seo-connector/tags/2.4.3/includes/seo/redirects.php

    r3795029 r3795827  
    318318                    return;
    319319                }
    320                 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
     320                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
    322322                exit;
    323323            }
  • optiwebopz-seo-connector/tags/2.4.3/includes/seo/sitemaps.php

    r3795029 r3795827  
    232232        $home = strtolower(untrailingslashit((string) wp_parse_url(home_url('/'), PHP_URL_PATH)));
    233233        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, 'Optiwebopz SEO');
     234            wp_safe_redirect(taler_cx_sitemap_url(), 301, 'OptiWebOpz SEO');
    235235            exit;
    236236        }
  • optiwebopz-seo-connector/tags/2.4.3/includes/seo/terms.php

    r3795029 r3795827  
    6767    ?>
    6868    <div class="form-field tcx tcx-term">
    69       <label for="tcx-term-title"><?php esc_html_e('SEO title (Optiwebopz SEO)', 'optiwebopz-seo-connector'); ?></label>
     69      <label for="tcx-term-title"><?php esc_html_e('SEO title (OptiWebOpz SEO)', 'optiwebopz-seo-connector'); ?></label>
    7070      <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 (Optiwebopz SEO)', 'optiwebopz-seo-connector'); ?></label>
     71      <label for="tcx-term-desc"><?php esc_html_e('Meta description (OptiWebOpz SEO)', 'optiwebopz-seo-connector'); ?></label>
    7272      <textarea id="tcx-term-desc" class="tcx-input" rows="2" name="taler_cx_term[_taler_meta_desc]" maxlength="400"></textarea>
    7373      <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>
    … …  
    8282    ?>
    8383    <tr class="form-field tcx tcx-term">
    84       <th scope="row"><label for="tcx-term-title"><?php esc_html_e('SEO title (Optiwebopz 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>
    8585      <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>
    8686    </tr>
    8787    <tr class="form-field tcx tcx-term">
    88       <th scope="row"><label for="tcx-term-desc"><?php esc_html_e('Meta description (Optiwebopz 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>
    8989      <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>
    9090    </tr>
  • optiwebopz-seo-connector/tags/2.4.3/optiwebopz-seo-connector.php

    r3795029 r3795827  
    44 * Plugin URI:        https://taler.optiwebopz.com/
    55 * 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.2
     6 * Version:           2.4.3
    77 * Requires at least: 6.0
    88 * Requires PHP:      8.1
    … …  
    114114        $folder = $taler_cx_other !== '' ? dirname($taler_cx_other) : 'taler-seo-connector';
    115115        /* 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; Optiwebopz SEO Connector 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>';
     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>';
    117117    };
    118118    add_action('admin_notices', $taler_cx_twice);
    … …  
    126126const TALER_CX_OLD_BASENAME = 'taler-connector/taler-connector.php';
    127127
    128 define('TALER_CX_VERSION', '2.4.2');
     128define('TALER_CX_VERSION', '2.4.3');
    129129define('TALER_CX_DB_VERSION', '6');   // 2.3.4: {prefix}taler_suggestions
    130130define('TALER_CX_NS', 'taler/v1');
  • optiwebopz-seo-connector/tags/2.4.3/readme.txt

    r3795029 r3795827  
    55Tested up to: 7.1
    66Requires PHP: 8.1
    7 Stable tag: 2.4.2
     7Stable tag: 2.4.3
    88License: GPLv2 or later
    99License URI: https://www.gnu.org/licenses/gpl-2.0.html
    … …  
    1414
    1515OptiWebOpz 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 Optiwebopz SEO in wp-admin.
     16site unless an administrator switches a feature on. Its screens are under OptiWebOpz SEO in wp-admin.
    1717
    1818Connecting the site to Taler (https://taler.optiwebopz.com/), a separate AI blog and SEO service, is optional and needs a
    … …  
    2323
    2424* SEO title and meta description for every post, page and public custom post type, with title templates and a separator
    25   (Optiwebopz SEO → Titles & schema);
     25  (OptiWebOpz SEO → Titles & schema);
    2626* canonical links, robots rules (noindex / nofollow per post, noindex rules for author, date and tag archives);
    2727* Open Graph and Twitter tags, with a default sharing image;
    … …  
    4848= Post checks and content score =
    4949
    50 * an "Optiwebopz SEO" box under the post editor: SEO title, description, focus keyword and secondary keywords, social
     50* an "OptiWebOpz SEO" box under the post editor: SEO title, description, focus keyword and secondary keywords, social
    5151  title, description and image, canonical, robots, breadcrumb title and article type, with offline checks of the post;
    5252* a content score from 0 to 100 for every published post (headings, length, sentences and paragraphs, keywords, links,
    … …  
    9393= Setup, shortcodes and tools =
    9494
    95 * an optional eight-step setup (Optiwebopz SEO → Setup); every step can be skipped;
     95* an optional eight-step setup (OptiWebOpz SEO → Setup); every step can be skipped;
    9696* shortcodes [taler_breadcrumbs] (a breadcrumb trail) and [taler_html_sitemap] (a list of posts and pages);
    9797* background work through Action Scheduler when another plugin provides it, or the WP-CLI command wp taler-cx jobs run;
    … …  
    104104* Google Search Console clicks, impressions, average position, the queries behind each post and Google's index status,
    105105  and, when Taler stores them, Google Analytics 4 visits and the most-visited pages. Read from Taler when the site is
    106   connected (Optiwebopz 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.
    107107
    108108= What runs by default =
    … …  
    110110Right after activation, with nothing switched on and no Taler account:
    111111
    112 * the Optiwebopz SEO screens in wp-admin;
     112* the OptiWebOpz SEO screens in wp-admin;
    113113* the internal link index: built by the background work after activation (see Installation), updated when a post is saved,
    114114  with a "Links" column in the wp-admin post lists;
    … …  
    117117  Open Graph / Twitter tags and one article schema.
    118118
    119 Off until you switch them on: the titles, meta tags, schema, sitemaps and post box (one switch, "Use Optiwebopz SEO on this
     119Off until you switch them on: the titles, meta tags, schema, sitemaps and post box (one switch, "Use OptiWebOpz SEO on this
    120120site", which works only while Rank Math, Yoast SEO and All in One SEO are inactive), redirects and the 404 log, IndexNow,
    121121the 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 is
     122to Taler, and each way of applying Taler's suggestions; Settings → Taler connection). While another SEO plugin is
    123123active, OptiWebOpz SEO prints nothing in the page head and Taler writes its SEO fields into that plugin.
    124124
    … …  
    129129Taler. Optional link features, each off until you switch it on: send this site's performance numbers to Taler, ask
    130130Taler to read the site, and apply Taler's suggestions for SEO titles, descriptions, focus keywords and social text
    131 (Optiwebopz SEO → Suggestions, with a change log and Undo). See "External services" below for exactly what each key
     131(OptiWebOpz SEO → Suggestions, with a change log and Undo). See "External services" below for exactly what each key
    132132allows and what is sent.
    133133
    … …  
    135135
    1361361. In WordPress: Plugins → Add New Plugin → search for "OptiWebOpz SEO" → Install Now → Activate.
    137 2. Optiwebopz SEO works on its own: open Optiwebopz SEO → Setup, or Optiwebopz SEO → Overview and switch "Use Optiwebopz SEO on this site" on
     1372. OptiWebOpz SEO works on its own: open OptiWebOpz SEO → Setup, or OptiWebOpz SEO → Overview and switch "Use OptiWebOpz SEO on this site" on
    138138   (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.
     1393. Settings → Taler connection → "Generate a site key" (shown once) — or paste a key you created in Taler.
    1401404. In Taler: Settings → Sites → this site → paste the same key as the Site key → Save → "Test key".
    141141
    142142Optional: set the key in wp-config.php instead: define('TALER_SITE_KEY', 'your-key');
    143143
    144 To see search data from Taler, also enter the Taler app address (https) in Settings → Optiwebopz SEO Connector.
     144To see search data from Taler, also enter the Taler app address (https) in Settings → Taler connection.
    145145
    146146Background work (for example building the link index or removing old 404 rows) runs through Action Scheduler when another
    … …  
    153153= Do I need a Taler account? =
    154154
    155 No, not for Optiwebopz SEO, the import and the shortcodes. Drafts from Taler, the Taler post editor, publishing from Taler and
     155No, not for OptiWebOpz SEO, the import and the shortcodes. Drafts from Taler, the Taler post editor, publishing from Taler and
    156156search data from Taler need a Taler account and a site key.
    157157
    158158= Does it replace Yoast SEO or Rank Math? =
    159159
    160 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
     160It can. Import their data first (OptiWebOpz SEO → Import; the other plugin's data is only read, never changed), deactivate the
     161other plugin, then switch "Use OptiWebOpz SEO on this site" on. While Yoast SEO, Rank Math or All in One SEO is active, OptiWebOpz SEO
    162162prints nothing in the page head, so there is never a second set of tags; Taler then writes its SEO fields into that plugin.
    163163
    164164= What data leaves my site? =
    165165
    166 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
     166Nothing until an administrator sets it up. With a site key and the Taler address set, opening OptiWebOpz SEO → Search performance or a
     167post's OptiWebOpz SEO box asks Taler for search data (details under External services). Taler itself reads and writes posts
    168168through this plugin's REST routes with the site key. If you switch IndexNow on, the addresses of changed public pages go to
    169169IndexNow. If you switch on "Send performance numbers to Taler", whole numbers counted on this site (no titles, text or
    … …  
    173173= How do I import from another SEO plugin? =
    174174
    175 Optiwebopz SEO → Import (administrators). Pick the plugin and the parts, make a preview (it changes nothing), check the conflicts
     175OptiWebOpz SEO → Import (administrators). Pick the plugin and the parts, make a preview (it changes nothing), check the conflicts
    176176and the values that need review, tick the confirm box and copy. Every value written is logged and the whole import can be
    177177undone from the same screen.
    … …  
    188188= How do I uninstall it? =
    189189
    190 Deactivate it: Optiwebopz SEO output and redirects stop at once and Taler can no longer reach the site. Delete it: its options
     190Deactivate it: OptiWebOpz SEO output and redirects stop at once and Taler can no longer reach the site. Delete it: its options
    191191and tables (snapshots, cache, redirects, 404 log, link index, import log) are removed, on every site of a multisite network.
    192192Posts and their SEO fields stay, because they are your content (the secondary keywords an import kept and the content scores
    … …  
    199199
    200200**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).
     201Settings → Taler connection, and every call from this site goes to connector-api.php at that address).
    202202
    203203From 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 Optiwebopz SEO → Search performance and in the Optiwebopz SEO box. Search Console data is read
     204index 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
    205205by Taler; the plugin holds no Google sign-in, key or token and never contacts Google:
    206206
    207 * When: only while an administrator or editor opens Optiwebopz SEO → Search performance or a post's Optiwebopz SEO box, at most once
     207* When: only while an administrator or editor opens OptiWebOpz SEO → Search performance or a post's OptiWebOpz SEO box, at most once
    208208  per page and data type every 6 to 12 hours (answers are cached; the "Ask Taler again" button asks again), and only after
    209209  a site key and the Taler address are set. Never on the public site. Disconnecting deletes the cached answers.
    … …  
    219219  tags, SEO fields, FAQ, featured image) and the list of its revisions and snapshots; list posts and drafts; change the
    220220  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 Connector always wins).
     221  and the "By author" line on Taler posts (an administrator's own choice in Settings → Taler connection always wins).
    222222* With the media key (derived from the site key): upload images to the media library and set the featured image of a
    223223  draft.
    … …  
    230230* Taler Privacy Policy: https://taler.optiwebopz.com/privacy
    231231
    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).
    233233
    234234* 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.
    235235* 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 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.
     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.
    237237
    238238**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.
     239in 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.
    242244* 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.
    244246* IndexNow shares the addresses with the participating search engines (for example Bing); Google does not take part.
    245247* IndexNow terms: https://www.indexnow.org/terms · documentation: https://www.indexnow.org/documentation
    … …  
    259261
    260262== 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.
    261266
    262267= 2.4.2 — 2026-11-09 =
  • optiwebopz-seo-connector/trunk/includes/admin.php

    r3795029 r3795827  
    4848
    4949add_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');
    5151});
    5252
    … …  
    176176    if (!function_exists('wp_add_privacy_policy_content')) { return; }
    177177    $p = [
    178         __('This site uses the Optiwebopz SEO Connector 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()),
     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()),
    180180        __('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 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 → 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.4
     181        __('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
    183183        __('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'),
    184184        __('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'),
    185185    ];
    186     wp_add_privacy_policy_content('Optiwebopz 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>'));
    187187}
    188188
    … …  
    234234    ?>
    235235    <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>
    237237      <?php if (isset($msgs[$code])) : ?>
    238238        <div class="notice notice-<?php echo esc_attr($msgs[$code][0]); ?> is-dismissible"><p><?php echo esc_html($msgs[$code][1]); ?></p></div>
    … …  
    294294          <fieldset>
    295295            <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 (Optiwebopz 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>
    297297            <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>
    298298            <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>
    … …  
    371371          <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>
    372372          <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('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>
     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>
    374374          <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>
    375375        </ul>
  • optiwebopz-seo-connector/trunk/includes/admin/metabox.php

    r3795029 r3795827  
    5151add_action('add_meta_boxes', static function (string $postType): void {
    5252    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', __('Optiwebopz 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');
    5454});
    5555
    … …  
    233233function taler_cx_analysis_schema(WP_Post $p): array {
    234234    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 (Optiwebopz 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')];
    236236    }
    237237    $none = $p->post_type === 'post' && taler_cx_box_meta_str((int) $p->ID, '_taler_schema_type') === 'none';
    … …  
    272272        <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>
    273273          <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 (Optiwebopz 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>
    275275        <?php if ($post->post_type === 'product' && function_exists('taler_cx_woo_fields')) : foreach (taler_cx_woo_fields() as $wk => $wf) : ?>
    276276        <div class="tcx-field"><label for="tcx<?php echo esc_attr(str_replace('_', '-', $wk)); ?>"><?php echo esc_html($wf[0]); ?></label>
    … …  
    282282            <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>
    283283            <?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 (Optiwebopz 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>
    285285        <?php endif; ?>
    286286        <div class="tcx-field tcx-span">
    287287          <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>
    288288          <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 (Optiwebopz 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; ?>
    290290        </div>
    291291      </div>
  • optiwebopz-seo-connector/trunk/includes/admin/page-dashboard.php

    r3795029 r3795827  
    8585    echo '<p>' . esc_html__('For the last 28 days, this screen shows:', 'optiwebopz-seo-connector') . '</p><ul class="tcx-facts">';
    8686    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 Optiwebopz 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>';
    8888    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>';
    8989    echo '<div class="tcx-actions">';
    … …  
    9292            . ($linked ? esc_html__('Taler connection settings', 'optiwebopz-seo-connector') : esc_html__('Connect to Taler', 'optiwebopz-seo-connector')) . '</a>';
    9393    } 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>';
    9595    }
    9696    if ($linked) {
    … …  
    108108        echo '<div class="wrap tcx">';
    109109        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 (Optiwebopz 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>';
    111111        return;
    112112    }
  • optiwebopz-seo-connector/trunk/includes/admin/page-import.php

    r3795029 r3795827  
    5656/** The status names shown on the screen. */
    5757function taler_cx_import_status_labels(): array {
    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')];
     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')];
    6060}
    6161
    … …  
    172172          'discarded' => ['info', __('The unfinished import was stopped. What it already copied is in the log and can be undone.', 'optiwebopz-seo-connector')],
    173173          '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. Optiwebopz 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')],
    175175          'undo_failed' => ['error', __('That import cannot be undone (it was a preview, or its log is gone).', 'optiwebopz-seo-connector')],
    176176      ]); ?>
    … …  
    182182          <div class="tcx-banner tcx-banner-info" data-state="empty">
    183183            <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 Optiwebopz 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>
    185185          </div>
    186186        <?php endif; ?>
    … …  
    205205      <?php if ($st && empty($st['done'])) : ?>
    206206        <div class="tcx-card">
    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>
     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>
    208208          <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'),
    209209              TALER_CX_IMPORT_SOURCES[$st['src']] ?? '', $parts[$st['phase']] ?? '', (int) $st['items'], (int) $st['batches'])); ?></p>
    … …  
    232232            <?php endforeach; ?>
    233233            </fieldset>
    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>
     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>
    235235            <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>
    236236            <p><button type="submit" class="button button-primary tcx-btn"><?php esc_html_e('Make a preview', 'optiwebopz-seo-connector'); ?></button></p>
    … …  
    242242        <div class="tcx-card">
    243243          <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 Optiwebopz 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'),
    245245              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>
    246246          <?php echo wp_kses(taler_cx_import_counts_html($st), taler_cx_import_allowed_html()); ?>
    … …  
    262262            <?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; ?>
    263263          <?php else : ?>
    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>
     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>
    265265          <?php endif; ?>
    266266          <?php if ($st['error_list']) : ?>
    … …  
    271271        <?php if ((int) ($st['counts']['copy'] ?? 0) + (int) ($st['counts']['overwrite'] ?? 0) > 0) : ?>
    272272        <div class="tcx-card">
    273           <h2><?php esc_html_e('3. Copy into Optiwebopz SEO', 'optiwebopz-seo-connector'); ?></h2>
     273          <h2><?php esc_html_e('3. Copy into OptiWebOpz SEO', 'optiwebopz-seo-connector'); ?></h2>
    274274          <?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; ?>
    275275          <form method="post" action="<?php echo esc_url(admin_url('admin-post.php')); ?>">
    276276            <input type="hidden" name="action" value="taler_cx_import_run">
    277277            <?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 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>
     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>
    280280          </form>
    281281        </div>
  • optiwebopz-seo-connector/trunk/includes/admin/page-links.php

    r3795029 r3795827  
    5050      <?php taler_cx_seo_header(__('Internal links', 'optiwebopz-seo-connector')); ?>
    5151      <?php taler_cx_seo_notice([
    52           'links_off' => ['warning', __('Internal links is switched off (Optiwebopz SEO → Overview).', 'optiwebopz-seo-connector')],
     52          'links_off' => ['warning', __('Internal links is switched off (OptiWebOpz SEO → Overview).', 'optiwebopz-seo-connector')],
    5353          'links_batch' => ['info', __('One batch indexed. Continue until it says finished, or let it run in the background.', 'optiwebopz-seo-connector')],
    5454          'links_done' => ['success', __('The link index is complete.', 'optiwebopz-seo-connector')],
    … …  
    5757      ]); ?>
    5858      <?php if (!$on) : ?>
    59         <p class="tcx-banner tcx-banner-info"><?php esc_html_e('Internal links is switched off (Optiwebopz 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>
    6060      </div>
    6161        <?php return; endif; ?>
  • optiwebopz-seo-connector/trunk/includes/admin/page-overview.php

    r3795029 r3795827  
    4444        'analysis' => [__('Post analysis', 'optiwebopz-seo-connector'), __('SEO fields and checks under the post editor, with Taler\'s checks on Taler posts.', 'optiwebopz-seo-connector')],
    4545        '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 Optiwebopz 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')],
    4747        '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')],
    4848        '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')],
    … …  
    5252/** 2.3.0: the one place that says Optiwebopz SEO's output is off ('basic' mode) — neutral words, Overview only. */
    5353function taler_cx_seo_off_text(): string {
    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');
     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');
    5555}
    5656
    … …  
    7777    $t['output'] = ['label' => __('Titles, meta tags, schema, sitemaps', 'optiwebopz-seo-connector'),
    7878        'value' => $mode === 'taler' ? __('On', 'optiwebopz-seo-connector') : ($mode === 'external' ? taler_cx_seo_plugin_name(taler_cx_external_seo()) : $off),
    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')),
     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')),
    8080        'url' => '', 'link' => '', 'src' => 'includes/core/modules.php:taler_cx_seo_mode'];
    8181
    … …  
    202202    ?>
    203203    <div class="wrap tcx">
    204       <?php taler_cx_seo_header(__('Optiwebopz SEO', 'optiwebopz-seo-connector')); ?>
     204      <?php taler_cx_seo_header(__('OptiWebOpz SEO', 'optiwebopz-seo-connector')); ?>
    205205      <?php taler_cx_seo_notice([
    206206          'saved' => ['success', __('Saved.', 'optiwebopz-seo-connector')],
    … …  
    210210          'indexnow_failed' => ['warning', __('IndexNow did not accept the addresses. See the last answer below.', 'optiwebopz-seo-connector')],
    211211          '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 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')],
     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')],
    214214      ]); ?>
    215215      <?php if (taler_cx_seo_mode() === 'basic') : ?>
    … …  
    237237        <input type="hidden" name="action" value="taler_cx_seo_overview">
    238238        <?php wp_nonce_field('taler_cx_seo_overview'); ?>
    239         <h2><?php esc_html_e('Use Optiwebopz SEO on this site', 'optiwebopz-seo-connector'); ?></h2>
     239        <h2><?php esc_html_e('Use OptiWebOpz SEO on this site', 'optiwebopz-seo-connector'); ?></h2>
    240240        <?php if ($ext !== '') : ?>
    241241          <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>
    … …  
    243243        <label class="tcx-switch">
    244244          <input type="checkbox" name="takeover" value="1"<?php checked(taler_cx_takeover() && $ext === ''); ?><?php disabled($ext !== ''); ?>>
    245           <span><?php esc_html_e('Optiwebopz 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>
    246246        </label>
    247247        <h2><?php esc_html_e('Modules', 'optiwebopz-seo-connector'); ?></h2>
    … …  
    288288      <div class="tcx-card">
    289289        <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. Optiwebopz 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>
    291291        <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>
    292292        <?php if (current_user_can('manage_options')) : ?>
    … …  
    302302    if (!current_user_can('manage_options')) { return; }   // 2.3.1: the Setup screen is for administrators
    303303    $text = [
    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'),
     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'),
    305305        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'),
    306306        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  
    106106      <?php taler_cx_seo_header(__('Performance', 'optiwebopz-seo-connector')); ?>
    107107      <?php taler_cx_seo_notice([
    108           'an_off' => ['info', __('Post analysis is switched off (Optiwebopz SEO → Overview).', 'optiwebopz-seo-connector')],
     108          'an_off' => ['info', __('Post analysis is switched off (OptiWebOpz SEO → Overview).', 'optiwebopz-seo-connector')],
    109109          'an_batch' => ['info', __('One batch analysed. Continue until it says finished, or let it run in the background.', 'optiwebopz-seo-connector')],
    110110          'an_done' => ['success', __('Every published post has a content score now.', 'optiwebopz-seo-connector')],
    … …  
    117117      <h2 class="tcx-h2"><?php esc_html_e('Content scores', 'optiwebopz-seo-connector'); ?></h2>
    118118      <?php if (!$scores) : ?>
    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>
     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>
    120120      <?php else : $c = taler_cx_analysis_counts(); $st = taler_cx_analysis_state(); ?>
    121121        <?php taler_cx_perf_tiles([
    … …  
    211211      <h2 class="tcx-h2"><?php esc_html_e('Not found (404) and redirects', 'optiwebopz-seo-connector'); ?></h2>
    212212      <?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 (Optiwebopz 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>
    214214      <?php else : ?>
    215215        <?php taler_cx_perf_tiles([
  • optiwebopz-seo-connector/trunk/includes/admin/page-recommendations.php

    r3795029 r3795827  
    2525      <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>
    2626      <?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 Optiwebopz 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>
    2828      </div>
    2929        <?php return; endif; ?>
  • optiwebopz-seo-connector/trunk/includes/admin/page-redirects.php

    r3795029 r3795827  
    172172      ]); ?>
    173173      <?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 (Optiwebopz 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>
    175175      <?php endif; ?>
    176176      <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  
    3939      <form class="tcx-card" method="post" action="<?php echo esc_url(admin_url('admin-post.php')); ?>">
    4040        <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 Optiwebopz 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>
    4343        <ul class="tcx-modules">
    4444          <?php foreach ($names as $slug => $label) : ?>
    … …  
    4646          <?php endforeach; ?>
    4747        </ul>
    48         <h2><?php esc_html_e('Who sees the Optiwebopz 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>
    4949        <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>
    5050        <ul class="tcx-modules">
  • optiwebopz-seo-connector/trunk/includes/admin/page-suggestions.php

    r3795029 r3795827  
    101101          'sg_dismissed' => ['success', __('Dismissed. Nothing on the post was changed.', 'optiwebopz-seo-connector')],
    102102          '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')],
    104104          'sg_stale' => ['warning', __('Not applied: the field had changed since Taler looked at it. Nothing was written.', 'optiwebopz-seo-connector')],
    105105          'sg_expired' => ['warning', __('This suggestion has expired. Nothing was written.', 'optiwebopz-seo-connector')],
    … …  
    117117        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'))));
    118118        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>'; }
    120120      ?></p>
    121121      <?php if (!taler_cx_seo_active()) : ?>
    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>
     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>
    123123      <?php endif; ?>
    124124      <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  
    220220    ?>
    221221    <h2 id="tcx-wiz-title"><?php esc_html_e('Other SEO plugins', 'optiwebopz-seo-connector'); ?></h2>
    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>
     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>
    223223    <ul class="tcx-facts">
    224224      <?php foreach (TALER_CX_IMPORT_SOURCES as $src => $name) : $d = $det[$src] ?? ['active' => false, 'any' => false, 'posts' => 0, 'terms' => 0, 'global' => false, 'redirects' => null]; ?>
    … …  
    230230    </ul>
    231231    <?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 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>
     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>
    233233    <?php endif; ?>
    234234    <?php if ($found) : ?>
    235235      <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 Optiwebopz 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>
    237237    <?php endif; ?>
    238238    <?php
    … …  
    249249      <li class="tcx-module">
    250250        <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 Optiwebopz 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>
    252252        <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>
    253253      </li>
    … …  
    265265    <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>
    266266    <?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; Optiwebopz 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>
    268268    <?php elseif (!taler_cx_seo_active()) : ?>
    269       <p class="tcx-muted"><?php esc_html_e('The sitemap starts once Optiwebopz 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>
    270270    <?php endif; ?>
    271271    <h3><?php esc_html_e('What the sitemap lists', 'optiwebopz-seo-connector'); ?></h3>
    … …  
    304304        4 => [__('Modules', 'optiwebopz-seo-connector'), $mods ? implode(', ', $mods) : __('none', 'optiwebopz-seo-connector')],
    305305        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 => [__('Optiwebopz 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')
    307307            : ($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 (Optiwebopz 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')],
    309309    ];
    310310}
    … …  
    320320    ?>
    321321    <div class="wrap tcx">
    322       <?php taler_cx_seo_header(__('Set up Optiwebopz SEO', 'optiwebopz-seo-connector')); ?>
     322      <?php taler_cx_seo_header(__('Set up OptiWebOpz SEO', 'optiwebopz-seo-connector')); ?>
    323323      <?php taler_cx_seo_notice([
    324324          'wiz_saved' => ['success', __('Saved.', 'optiwebopz-seo-connector')],
    325325          'wiz_skipped' => ['info', __('Step skipped. Nothing was changed.', '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')],
     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')],
    327327          'wiz_done' => ['success', __('Setup finished. You can change everything later under Titles & schema and Overview.', 'optiwebopz-seo-connector')],
    328328      ]); ?>
    … …  
    351351            taler_cx_field('schema_post_type', __('Schema type for posts', 'optiwebopz-seo-connector'));
    352352          ?></div>
    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>
     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>
    354354        <?php elseif ($step === 3) : ?>
    355355          <h2 id="tcx-wiz-title"><?php esc_html_e('How titles look', 'optiwebopz-seo-connector'); ?></h2>
    … …  
    364364        <?php elseif ($step === 5) : taler_cx_wizard_step_sitemap($ext); ?>
    365365        <?php elseif ($step === 6) : ?>
    366           <h2 id="tcx-wiz-title"><?php esc_html_e('Switch Optiwebopz SEO on', 'optiwebopz-seo-connector'); ?></h2>
     366          <h2 id="tcx-wiz-title"><?php esc_html_e('Switch OptiWebOpz SEO on', 'optiwebopz-seo-connector'); ?></h2>
    367367          <?php if ($ext !== '') : ?>
    368368            <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>
    369369          <?php else : ?>
    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>
     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>
    371371          <?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('Optiwebopz 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>
    373373        <?php elseif ($step === 7) : $linked = taler_cx_site_key() !== ''; ?>
    374374          <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. Optiwebopz 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>
    376376          <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>
    377377          <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>
    … …  
    400400      </form>
    401401      <?php if ($done === 0) : ?>
    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>
     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>
    403403        <?php taler_cx_wizard_dismiss_form(); ?>
    404404      <?php endif; ?>
  • optiwebopz-seo-connector/trunk/includes/admin/seo-menu.php

    r3795029 r3795827  
    5757
    5858add_action('admin_menu', static function (): void {
    59     add_menu_page(__('Optiwebopz 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,
    6060        'taler_cx_page_overview', 'dashicons-chart-area', 81);
    6161    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');
    … …  
    141141        echo '<p class="tcx-banner tcx-banner-info">' . esc_html(sprintf(
    142142            /* translators: %1$s: SEO plugin name */
    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'),
     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'),
    144144            taler_cx_seo_plugin_name(taler_cx_external_seo()))) . '</p>';
    145145    }   // 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  
    138138function taler_cx_pull_message(string $code): string {
    139139    $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 fault
    141         'no_app_url'    => __('Add the Taler app address (https) in Settings → Optiwebopz SEO Connector to 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'),
    142142        'rate_limited'  => __('Taler data was asked for too often in the last hour. It will refresh automatically later.', 'optiwebopz-seo-connector'),
    143143        'unreachable'   => __('Taler could not be reached just now.', 'optiwebopz-seo-connector'),
  • optiwebopz-seo-connector/trunk/includes/seo/import-runs.php

    r3795029 r3795827  
    238238        if ($t === '' || !in_array($t, TALER_CX_SCHEMA_TYPES, true)) {
    239239            /* 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 Optiwebopz 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))];
    241241        }
    242242        $new = $t;
    … …  
    250250        if (!in_array($c, TALER_CX_SEPARATORS, true)) {
    251251            /* 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 Optiwebopz 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))];
    253253        }
    254254        $new = $c;
    … …  
    261261                $left = array_values(array_diff(array_unique($m[0] ?? []), ['%title%', '%sitename%', '%sep%', '%page%', '%excerpt%', '%tagline%', '%year%', '%term%', '%author%', '%search%']));
    262262                /* translators: %s: variables of the other plugin */
    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))];
     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))];
    264264            }
    265265            $txt = $c;
    … …  
    292292    if ($kind === 'org_kind') {
    293293        if (in_array($v, ['Organization', 'LocalBusiness'], true)) { return ['status' => 'ok', 'new' => $v]; }
    294         return $why('review', __('the site is set up as a person; Optiwebopz 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'));
    295295    }
    296296    if ($kind === 'local_type') {
    297297        if (in_array($v, TALER_CX_LOCAL_TYPES, true)) { return ['status' => 'ok', 'new' => $v]; }
    298298        /* translators: %s: business type of the other plugin */
    299         return $why('review', sprintf(__('business type "%s" is not one Optiwebopz 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)));
    300300    }
    301301    if ($kind === 'image') {   // an attachment id, or an address in this site's media library
    … …  
    329329    $t = trim(sanitize_text_field($v));   // name: plain text; "the site title" variables mean "not set" (Taler then uses the site title too)
    330330    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; Optiwebopz 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')); }
    332332    return ['status' => 'ok', 'new' => mb_substr($t, 0, $max)];
    333333}
  • optiwebopz-seo-connector/trunk/includes/seo/redirects.php

    r3795029 r3795827  
    318318                    return;
    319319                }
    320                 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
     320                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
    322322                exit;
    323323            }
  • optiwebopz-seo-connector/trunk/includes/seo/sitemaps.php

    r3795029 r3795827  
    232232        $home = strtolower(untrailingslashit((string) wp_parse_url(home_url('/'), PHP_URL_PATH)));
    233233        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, 'Optiwebopz SEO');
     234            wp_safe_redirect(taler_cx_sitemap_url(), 301, 'OptiWebOpz SEO');
    235235            exit;
    236236        }
  • optiwebopz-seo-connector/trunk/includes/seo/terms.php

    r3795029 r3795827  
    6767    ?>
    6868    <div class="form-field tcx tcx-term">
    69       <label for="tcx-term-title"><?php esc_html_e('SEO title (Optiwebopz SEO)', 'optiwebopz-seo-connector'); ?></label>
     69      <label for="tcx-term-title"><?php esc_html_e('SEO title (OptiWebOpz SEO)', 'optiwebopz-seo-connector'); ?></label>
    7070      <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 (Optiwebopz SEO)', 'optiwebopz-seo-connector'); ?></label>
     71      <label for="tcx-term-desc"><?php esc_html_e('Meta description (OptiWebOpz SEO)', 'optiwebopz-seo-connector'); ?></label>
    7272      <textarea id="tcx-term-desc" class="tcx-input" rows="2" name="taler_cx_term[_taler_meta_desc]" maxlength="400"></textarea>
    7373      <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>
    … …  
    8282    ?>
    8383    <tr class="form-field tcx tcx-term">
    84       <th scope="row"><label for="tcx-term-title"><?php esc_html_e('SEO title (Optiwebopz 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>
    8585      <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>
    8686    </tr>
    8787    <tr class="form-field tcx tcx-term">
    88       <th scope="row"><label for="tcx-term-desc"><?php esc_html_e('Meta description (Optiwebopz 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>
    8989      <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>
    9090    </tr>
  • optiwebopz-seo-connector/trunk/optiwebopz-seo-connector.php

    r3795029 r3795827  
    44 * Plugin URI:        https://taler.optiwebopz.com/
    55 * 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.2
     6 * Version:           2.4.3
    77 * Requires at least: 6.0
    88 * Requires PHP:      8.1
    … …  
    114114        $folder = $taler_cx_other !== '' ? dirname($taler_cx_other) : 'taler-seo-connector';
    115115        /* 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; Optiwebopz SEO Connector 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>';
     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>';
    117117    };
    118118    add_action('admin_notices', $taler_cx_twice);
    … …  
    126126const TALER_CX_OLD_BASENAME = 'taler-connector/taler-connector.php';
    127127
    128 define('TALER_CX_VERSION', '2.4.2');
     128define('TALER_CX_VERSION', '2.4.3');
    129129define('TALER_CX_DB_VERSION', '6');   // 2.3.4: {prefix}taler_suggestions
    130130define('TALER_CX_NS', 'taler/v1');
  • optiwebopz-seo-connector/trunk/readme.txt

    r3795029 r3795827  
    55Tested up to: 7.1
    66Requires PHP: 8.1
    7 Stable tag: 2.4.2
     7Stable tag: 2.4.3
    88License: GPLv2 or later
    99License URI: https://www.gnu.org/licenses/gpl-2.0.html
    … …  
    1414
    1515OptiWebOpz 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 Optiwebopz SEO in wp-admin.
     16site unless an administrator switches a feature on. Its screens are under OptiWebOpz SEO in wp-admin.
    1717
    1818Connecting the site to Taler (https://taler.optiwebopz.com/), a separate AI blog and SEO service, is optional and needs a
    … …  
    2323
    2424* SEO title and meta description for every post, page and public custom post type, with title templates and a separator
    25   (Optiwebopz SEO → Titles & schema);
     25  (OptiWebOpz SEO → Titles & schema);
    2626* canonical links, robots rules (noindex / nofollow per post, noindex rules for author, date and tag archives);
    2727* Open Graph and Twitter tags, with a default sharing image;
    … …  
    4848= Post checks and content score =
    4949
    50 * an "Optiwebopz SEO" box under the post editor: SEO title, description, focus keyword and secondary keywords, social
     50* an "OptiWebOpz SEO" box under the post editor: SEO title, description, focus keyword and secondary keywords, social
    5151  title, description and image, canonical, robots, breadcrumb title and article type, with offline checks of the post;
    5252* a content score from 0 to 100 for every published post (headings, length, sentences and paragraphs, keywords, links,
    … …  
    9393= Setup, shortcodes and tools =
    9494
    95 * an optional eight-step setup (Optiwebopz SEO → Setup); every step can be skipped;
     95* an optional eight-step setup (OptiWebOpz SEO → Setup); every step can be skipped;
    9696* shortcodes [taler_breadcrumbs] (a breadcrumb trail) and [taler_html_sitemap] (a list of posts and pages);
    9797* background work through Action Scheduler when another plugin provides it, or the WP-CLI command wp taler-cx jobs run;
    … …  
    104104* Google Search Console clicks, impressions, average position, the queries behind each post and Google's index status,
    105105  and, when Taler stores them, Google Analytics 4 visits and the most-visited pages. Read from Taler when the site is
    106   connected (Optiwebopz 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.
    107107
    108108= What runs by default =
    … …  
    110110Right after activation, with nothing switched on and no Taler account:
    111111
    112 * the Optiwebopz SEO screens in wp-admin;
     112* the OptiWebOpz SEO screens in wp-admin;
    113113* the internal link index: built by the background work after activation (see Installation), updated when a post is saved,
    114114  with a "Links" column in the wp-admin post lists;
    … …  
    117117  Open Graph / Twitter tags and one article schema.
    118118
    119 Off until you switch them on: the titles, meta tags, schema, sitemaps and post box (one switch, "Use Optiwebopz SEO on this
     119Off until you switch them on: the titles, meta tags, schema, sitemaps and post box (one switch, "Use OptiWebOpz SEO on this
    120120site", which works only while Rank Math, Yoast SEO and All in One SEO are inactive), redirects and the 404 log, IndexNow,
    121121the 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 is
     122to Taler, and each way of applying Taler's suggestions; Settings → Taler connection). While another SEO plugin is
    123123active, OptiWebOpz SEO prints nothing in the page head and Taler writes its SEO fields into that plugin.
    124124
    … …  
    129129Taler. Optional link features, each off until you switch it on: send this site's performance numbers to Taler, ask
    130130Taler to read the site, and apply Taler's suggestions for SEO titles, descriptions, focus keywords and social text
    131 (Optiwebopz SEO → Suggestions, with a change log and Undo). See "External services" below for exactly what each key
     131(OptiWebOpz SEO → Suggestions, with a change log and Undo). See "External services" below for exactly what each key
    132132allows and what is sent.
    133133
    … …  
    135135
    1361361. In WordPress: Plugins → Add New Plugin → search for "OptiWebOpz SEO" → Install Now → Activate.
    137 2. Optiwebopz SEO works on its own: open Optiwebopz SEO → Setup, or Optiwebopz SEO → Overview and switch "Use Optiwebopz SEO on this site" on
     1372. OptiWebOpz SEO works on its own: open OptiWebOpz SEO → Setup, or OptiWebOpz SEO → Overview and switch "Use OptiWebOpz SEO on this site" on
    138138   (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.
     1393. Settings → Taler connection → "Generate a site key" (shown once) — or paste a key you created in Taler.
    1401404. In Taler: Settings → Sites → this site → paste the same key as the Site key → Save → "Test key".
    141141
    142142Optional: set the key in wp-config.php instead: define('TALER_SITE_KEY', 'your-key');
    143143
    144 To see search data from Taler, also enter the Taler app address (https) in Settings → Optiwebopz SEO Connector.
     144To see search data from Taler, also enter the Taler app address (https) in Settings → Taler connection.
    145145
    146146Background work (for example building the link index or removing old 404 rows) runs through Action Scheduler when another
    … …  
    153153= Do I need a Taler account? =
    154154
    155 No, not for Optiwebopz SEO, the import and the shortcodes. Drafts from Taler, the Taler post editor, publishing from Taler and
     155No, not for OptiWebOpz SEO, the import and the shortcodes. Drafts from Taler, the Taler post editor, publishing from Taler and
    156156search data from Taler need a Taler account and a site key.
    157157
    158158= Does it replace Yoast SEO or Rank Math? =
    159159
    160 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
     160It can. Import their data first (OptiWebOpz SEO → Import; the other plugin's data is only read, never changed), deactivate the
     161other plugin, then switch "Use OptiWebOpz SEO on this site" on. While Yoast SEO, Rank Math or All in One SEO is active, OptiWebOpz SEO
    162162prints nothing in the page head, so there is never a second set of tags; Taler then writes its SEO fields into that plugin.
    163163
    164164= What data leaves my site? =
    165165
    166 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
     166Nothing until an administrator sets it up. With a site key and the Taler address set, opening OptiWebOpz SEO → Search performance or a
     167post's OptiWebOpz SEO box asks Taler for search data (details under External services). Taler itself reads and writes posts
    168168through this plugin's REST routes with the site key. If you switch IndexNow on, the addresses of changed public pages go to
    169169IndexNow. If you switch on "Send performance numbers to Taler", whole numbers counted on this site (no titles, text or
    … …  
    173173= How do I import from another SEO plugin? =
    174174
    175 Optiwebopz SEO → Import (administrators). Pick the plugin and the parts, make a preview (it changes nothing), check the conflicts
     175OptiWebOpz SEO → Import (administrators). Pick the plugin and the parts, make a preview (it changes nothing), check the conflicts
    176176and the values that need review, tick the confirm box and copy. Every value written is logged and the whole import can be
    177177undone from the same screen.
    … …  
    188188= How do I uninstall it? =
    189189
    190 Deactivate it: Optiwebopz SEO output and redirects stop at once and Taler can no longer reach the site. Delete it: its options
     190Deactivate it: OptiWebOpz SEO output and redirects stop at once and Taler can no longer reach the site. Delete it: its options
    191191and tables (snapshots, cache, redirects, 404 log, link index, import log) are removed, on every site of a multisite network.
    192192Posts and their SEO fields stay, because they are your content (the secondary keywords an import kept and the content scores
    … …  
    199199
    200200**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).
     201Settings → Taler connection, and every call from this site goes to connector-api.php at that address).
    202202
    203203From 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 Optiwebopz SEO → Search performance and in the Optiwebopz SEO box. Search Console data is read
     204index 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
    205205by Taler; the plugin holds no Google sign-in, key or token and never contacts Google:
    206206
    207 * When: only while an administrator or editor opens Optiwebopz SEO → Search performance or a post's Optiwebopz SEO box, at most once
     207* When: only while an administrator or editor opens OptiWebOpz SEO → Search performance or a post's OptiWebOpz SEO box, at most once
    208208  per page and data type every 6 to 12 hours (answers are cached; the "Ask Taler again" button asks again), and only after
    209209  a site key and the Taler address are set. Never on the public site. Disconnecting deletes the cached answers.
    … …  
    219219  tags, SEO fields, FAQ, featured image) and the list of its revisions and snapshots; list posts and drafts; change the
    220220  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 Connector always wins).
     221  and the "By author" line on Taler posts (an administrator's own choice in Settings → Taler connection always wins).
    222222* With the media key (derived from the site key): upload images to the media library and set the featured image of a
    223223  draft.
    … …  
    230230* Taler Privacy Policy: https://taler.optiwebopz.com/privacy
    231231
    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).
    233233
    234234* 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.
    235235* 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 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.
     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.
    237237
    238238**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.
     239in 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.
    242244* 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.
    244246* IndexNow shares the addresses with the participating search engines (for example Bing); Google does not take part.
    245247* IndexNow terms: https://www.indexnow.org/terms · documentation: https://www.indexnow.org/documentation
    … …  
    259261
    260262== 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.
    261266
    262267= 2.4.2 — 2026-11-09 =
Note: See TracChangeset for help on using the changeset viewer.