PluginProbe
Search Atlas SEO – OTTO AI SEO Automation for WordPress / trunk
Search Atlas SEO – OTTO AI SEO Automation for WordPress vtrunk
2.7.1 2.7.2 2.7.0 2.6.26 2.6.25 2.6.24 2.6.23 2.6.22 2.6.21 2.6.20 2.6.19 2.6.18 2.6.17 2.6.16 2.6.15 2.6.14 2.6.13 2.6.12 2.6.11 2.6.10 2.6.9 2.6.8 2.6.7 2.6.6 2.6.5 All 141 releases
← All changes | includes/class-metasync-settings-fields.php +141 -68 2.6.26 → trunk View file →
@@ -46,9 +46,23 @@
46 46 // Accordion / Section helpers
47 47 // ────────────────────────────────────────────────────────────────
48 48
49 49 public function get_accordion_sections_config() {
50 - return array(
50 + // Consent switch for writing into other SEO plugins. Loaded here rather
51 + // than through the committed classmap so a stale autoload map can never
52 + // make the switch — and with it the user's only way to stop those
53 + // writes — silently disappear from the page.
54 + require_once plugin_dir_path(dirname(__FILE__)) . 'admin/class-metasync-seo-sync-settings.php';
55 +
56 + $sections = array(
57 + 'analytics' => array(
58 + 'title' => 'Usage Data & Product Improvement',
59 + 'description' => 'Choose whether to share limited usage data to help improve MetaSync',
60 + 'icon' => 'chart-bar',
61 + 'priority' => 70,
62 + 'default_open' => false,
63 + 'render_callback' => array($this, 'render_analytics_section'),
64 + ),
51 65 'connection' => array(
52 66 'title' => 'Connection & Authentication',
53 67 'description' => 'Manage your API connection and authentication settings',
54 68 'icon' => 'admin-network',
@@ -68,11 +82,9 @@
68 82 'fields' => array(
69 83 'otto_pixel_uuid',
70 84 'otto_disable_on_loggedin',
71 85 'otto_disable_preview_button',
72 - 'otto_wp_rocket_compat',
73 - 'otto_sg_optimizer_compat',
74 - 'bookingpress_session_compat',
86 + 'seo_priority',
75 87 )
76 88 ),
77 89 'edge_cache' => array(
78 90 'title' => 'Edge Cache / CDN',
@@ -81,8 +93,16 @@
81 93 'priority' => 22,
82 94 'default_open' => false,
83 95 'render_callback' => array('Metasync_Edge_Cache_Settings', 'render'),
84 96 ),
97 + 'seo_plugin_sync' => array(
98 + 'title' => 'Sync to Other SEO Plugins',
99 + 'description' => 'Control whether ' . Metasync::get_whitelabel_otto_name() . '\'s SEO values are written into Yoast, Rank Math or All in One SEO',
100 + 'icon' => 'update',
101 + 'priority' => 23,
102 + 'default_open' => false,
103 + 'render_callback' => array('Metasync_Seo_Sync_Settings', 'render'),
104 + ),
85 105 'bot_detection' => array(
86 106 'title' => 'Bot Detection & Filtering',
87 107 'description' => 'Manage bot traffic and reduce unnecessary API calls',
88 108 'icon' => 'filter',
@@ -122,8 +142,9 @@
122 142 'disable_redirection_metabox',
123 143 'disable_canonical_metabox',
124 144 'disable_social_opengraph_metabox',
125 145 'disable_schema_markup_metabox',
146 + 'disable_language_alternates_metabox',
126 147 'disable_seo_metabox',
127 148 'open_external_links'
128 149 )
129 150 ),
@@ -164,13 +185,22 @@
164 185 'fields' => array(
165 186 'permalink_structure',
166 187 'hide_dashboard_framework',
167 188 'show_admin_bar_status',
168 - 'enable_auto_updates',
169 189 'import_external_data'
170 190 )
171 191 )
172 192 );
193 +
194 + // Hidden only when there is nothing to say: no SEO plugin installed, the
195 + // switch off, and no saved originals. It is never hidden by the
196 + // access-control or whitelabel flags that can conceal Advanced Settings
197 + // — a switch that rewrites another plugin's data must stay reachable.
198 + if (!Metasync_Seo_Sync_Settings::should_display()) {
199 + unset($sections['seo_plugin_sync']);
200 + }
201 +
202 + return $sections;
173 203 }
174 204
175 205 public function get_advanced_accordion_config() {
176 206 $config = array();
@@ -195,8 +225,17 @@
195 225 'default_open' => false,
196 226 'render_callback' => array($this->admin_instance, 'render_debug_mode_section')
197 227 );
198 228
229 + $config['headless_mode'] = array(
230 + 'title' => 'Headless Mode',
231 + 'description' => 'Connect WordPress content to a separate public frontend',
232 + 'icon' => 'admin-site-alt3',
233 + 'priority' => 29,
234 + 'default_open' => false,
235 + 'render_callback' => array(Metasync_Settings_Registration::instance(), 'render_headless_mode_section')
236 + );
237 +
199 238 $config['error_logs'] = array(
200 239 'title' => 'Error Logs',
201 240 'description' => 'View and manage error logs to troubleshoot issues',
202 241 'icon' => 'warning',
@@ -269,9 +308,9 @@
269 308 $content_state = $is_open ? 'open' : 'closed';
270 309
271 310 echo '<div class="metasync-accordion-section" data-section="' . esc_attr($section_key) . '">';
272 311
273 - echo '<div class="metasync-accordion-header" role="button" tabindex="0" aria-expanded="' . $aria_expanded . '" aria-controls="' . $section_id . '">';
312 + echo '<div class="metasync-accordion-header" role="button" tabindex="0" aria-expanded="' . esc_attr($aria_expanded) . '" aria-controls="' . esc_attr($section_id) . '">';
274 313 echo '<div class="metasync-accordion-title">';
275 314 echo '<span class="metasync-accordion-icon"><span class="dashicons dashicons-' . esc_attr($section_data['icon']) . '"></span></span>';
276 315 echo '<div class="metasync-accordion-text">';
277 316 echo '<h3>' . esc_html($section_data['title']) . '</h3>';
@@ -282,9 +321,9 @@
282 321 echo '<span class="toggle-icon">▼</span>';
283 322 echo '</button>';
284 323 echo '</div>';
285 324
286 - echo '<div class="metasync-accordion-content" id="' . $section_id . '" data-state="' . $content_state . '">';
325 + echo '<div class="metasync-accordion-content" id="' . esc_attr($section_id) . '" data-state="' . esc_attr($content_state) . '">';
287 326
288 327 if (isset($section_data['render_callback']) && is_callable($section_data['render_callback'])) {
289 328 call_user_func($section_data['render_callback']);
290 329 }
@@ -306,9 +345,8 @@
306 345 </h4>
307 346 <p style="color: var(--dashboard-text-secondary); margin: 0 0 12px 0;">This action will permanently delete:</p>
308 347 <ul style="color: var(--dashboard-text-secondary); margin: 0 0 12px 20px; line-height: 1.8;">
309 348 <li>All API keys and authentication tokens</li>
310 - <li>White label branding settings</li>
311 349 <li>Plugin configuration and preferences</li>
312 350 <li>Instant indexing settings</li>
313 351 <li>Media optimization settings and cache</li>
314 352 <li>Code minification settings</li>
@@ -313,9 +351,9 @@
313 351 <li>Media optimization settings and cache</li>
314 352 <li>Code minification settings</li>
315 353 <li>All cached data and crawl information</li>
316 354 </ul>
317 - <p style="color: var(--dashboard-warning, #f59e0b); margin: 0; font-weight: 600;">You will need to reconfigure the plugin completely after this reset.</p>
355 + <p style="color: var(--dashboard-warning, #f59e0b); margin: 0; font-weight: 600;">You will need to reconfigure the plugin's operational settings after this reset.</p>
318 356 </div>
319 357 <form method="post" action="" onsubmit="return confirmClearSettings(event)">
320 358 <?php wp_nonce_field('metasync_clear_all_settings_nonce', 'clear_all_settings_nonce'); ?>
321 359 <input type="hidden" name="clear_all_settings" value="yes" />
@@ -355,9 +393,9 @@
355 393 if (!firstConfirm) {
356 394 return false;
357 395 }
358 396
359 - var secondConfirm = confirm("🚨 FINAL WARNING 🚨\n\nThis will delete:\n• All API keys and authentication tokens\n• White label branding settings\n• Plugin configuration and preferences\n• Instant indexing settings\n• Media optimization settings and cache\n• Code minification settings\n• All cached data\n\nYou will need to reconfigure the entire plugin from scratch.\n\nType 'DELETE' in the next prompt to confirm.");
397 + var secondConfirm = confirm("🚨 FINAL WARNING 🚨\n\nThis will delete:\n• All API keys and authentication tokens\n• Plugin configuration and preferences\n• Instant indexing settings\n• Media optimization settings and cache\n• Code minification settings\n• All cached data\n\nYou will need to reconfigure the plugin's operational settings from scratch.\n\nType 'DELETE' in the next prompt to confirm.");
360 398 if (!secondConfirm) {
361 399 return false;
362 400 }
363 401
@@ -378,14 +416,18 @@
378 416 if (!function_exists('google_index_direct')) {
379 417 if (file_exists(plugin_dir_path(dirname(__FILE__)) . 'google-index/google-index-init.php')) {
380 418 require_once plugin_dir_path(dirname(__FILE__)) . 'google-index/google-index-init.php';
381 419 } else {
382 - error_log('MetaSync Google Index: google-index-init.php not found at ' . plugin_dir_path(dirname(__FILE__)) . 'google-index/google-index-init.php');
420 + error_log('MetaSync Google Index: google-index-init.php not found at ' . plugin_dir_path(dirname(__FILE__)) . 'google-index/google-index-init.php'); // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_error_log -- genuine failure path, bounded, no secrets
383 421 return;
384 422 }
385 423 }
386 424
387 425 $google_index = google_index_direct();
426 + if (!$google_index) {
427 + // Nothing to render against, and calling through would be fatal.
428 + return;
429 + }
388 430 $service_info = $google_index->get_service_account_info();
389 431 $is_configured = !isset($service_info['error']);
390 432
391 433 $saved_json_display = $is_configured ? $google_index->get_redacted_config_json() : '';
@@ -664,9 +706,9 @@
664 706 <p style="color: var(--dashboard-text-secondary); margin: 0 0 20px 0;">
665 707 Select which user roles can see and access this plugin's menu, settings, and options in the WordPress admin area.
666 708 </p>
667 709
668 - <form method="post" action="<?php echo admin_url('admin.php?page=' . Metasync_Admin::$page_slug . '&tab=advanced'); ?>" id="plugin-access-roles-form">
710 + <form method="post" action="<?php echo esc_url(admin_url('admin.php?page=' . Metasync_Admin::$page_slug . '&tab=advanced')); ?>" id="plugin-access-roles-form">
669 711 <?php wp_nonce_field('metasync_plugin_access_roles_nonce', 'plugin_access_roles_nonce'); ?>
670 712 <input type="hidden" name="save_plugin_access_roles" value="yes" />
671 713
672 714 <div class="metasync-role-selector-container" style="background: var(--dashboard-card-bg-alt, rgba(255,255,255,0.05)); border: 1px solid var(--dashboard-border); border-radius: 8px; padding: 16px; max-height: 300px; overflow-y: auto;">
@@ -784,9 +826,9 @@
784 826
785 827 public function can_change_memory_limit() {
786 828 $current_limit = ini_get('memory_limit');
787 829
788 - $test_result = @ini_set('memory_limit', $current_limit);
830 + $test_result = @ini_set('memory_limit', $current_limit); // phpcs:ignore Squiz.PHP.DiscouragedFunctions.Discouraged -- runtime PHP setting with no WordPress API
789 831
790 832 return $test_result !== false;
791 833 }
792 834
@@ -838,9 +880,9 @@
838 880 }
839 881
840 882 $memory_limit_mb = $this->get_execution_setting('max_memory_limit');
841 883
842 - $result = @ini_set('memory_limit', $memory_limit_mb . 'M');
884 + $result = @ini_set('memory_limit', $memory_limit_mb . 'M'); // phpcs:ignore Squiz.PHP.DiscouragedFunctions.Discouraged -- runtime PHP setting with no WordPress API
843 885
844 886 return $result !== false;
845 887 }
846 888
@@ -1092,8 +1134,9 @@
1092 1134 'apikey' => sprintf('Auto-generated authentication token used for secure API communication between your WordPress site and %s services. You can refresh this token if needed for security purposes.', $plugin_name),
1093 1135 'otto_pixel_uuid' => sprintf('Your unique %s tracking pixel identifier. This UUID is used to track %s modifications and analytics on your website pages.', $otto_name, $otto_name),
1094 1136 'otto_disable_on_loggedin' => sprintf('Disable %s modifications when you are logged in to WordPress. This allows you to see and edit the original content without %s\'s enhancements during editing sessions.', $otto_name, $otto_name),
1095 1137 'otto_disable_preview_button' => sprintf('Hide the %s frontend toolbar that displays the status indicator, preview button, and debug button. Enable this for a cleaner frontend experience.', $otto_name),
1138 + 'seo_priority' => sprintf('Choose which value appears first on a page when both your custom SEO value (title, description or focus keyword, edited on the post/page screen) and an approved %s suggestion are available. This changes what visitors see; it does not delete or overwrite saved values.', $otto_name),
1096 1139 'otto_wp_rocket_compat' => sprintf('WP Rocket Compatibility Mode: Controls how %s interacts with WP Rocket. "Auto" (recommended) allows both to work together by avoiding DONOTCACHEPAGE constant unless necessary for Brizy pages or SG Optimizer conflicts. This ensures WP Rocket\'s JavaScript delay and optimization features continue working.', $otto_name),
1097 1140 'otto_sg_optimizer_compat' => sprintf('SiteGround Optimizer Compatibility Mode: Controls how %s renders on SiteGround hosting. "Auto" (recommended) uses the internal HTTP fetch, which protects themes that defer inline CSS to the footer (e.g. Divi). "Buffer Mode" renders in-process with no internal fetch — faster on sites whose pages can never be host-cached, for example when a plugin starts a PHP session on every request (BookingPress sessions are removed automatically, so this does not apply to them).', $otto_name),
1098 1141 'bookingpress_session_compat' => 'BookingPress Session Compatibility: Controls whether MetaSync removes the PHP session BookingPress starts on every public page, so hosts such as SiteGround can page-cache the site again.',
1099 1142 'otto_disable_for_bots' => sprintf('Enable bot detection to automatically skip %s processing for search engine crawlers, SEO tools, and other bots. This reduces unnecessary API calls and improves performance.', $otto_name),
@@ -1105,8 +1148,9 @@
1105 1148 'disable_redirection_metabox' => 'Hide the Redirection meta box and stop redirects configured through it from running. Rules added by hand on the Redirections screen keep working. Saved redirects are kept and resume if you re-enable this.',
1106 1149 'disable_canonical_metabox' => sprintf('Hide the Canonical meta box and stop %1$s emitting or overriding the canonical URL on every render path. WordPress core and third-party canonicals are left in place. Saved values are kept and restored if you re-enable this.', Metasync::get_effective_plugin_name('MetaSync')),
1107 1150 'disable_social_opengraph_metabox' => sprintf('Hide the Social Media & Open Graph meta box and stop %1$s emitting any Open Graph, Twitter or article tags. Tags from another SEO plugin are left in place. Saved values are kept and restored if you re-enable this.', Metasync::get_effective_plugin_name('MetaSync')),
1108 1151 'disable_schema_markup_metabox' => sprintf('Hide the Schema Markup meta box and stop %1$s emitting any JSON-LD, including the site-wide Local SEO markup and OTTO structured data. Breadcrumb markup has its own setting. Saved values are kept and restored if you re-enable this.', Metasync::get_effective_plugin_name('MetaSync')),
1152 + 'disable_language_alternates_metabox' => sprintf('Hide the Language Alternates (hreflang) panel in the block editor and stop %1$s emitting any hreflang tags on the front end, including the auto-detected WPML entries. While disabled, %1$s does not manage or override this data — another SEO plugin, or WPML itself, is free to handle it. Saved values are kept and restored if you re-enable this.', Metasync::get_effective_plugin_name('MetaSync')),
1109 1153 'disable_seo_metabox' => 'Hide the SEO Title & Meta Description meta box from post and page edit screens. This removes the Classic editor SEO fields (the Gutenberg sidebar is unaffected).',
1110 1154 'open_external_links' => sprintf('Automatically add target="_blank" attribute to external links appearing in your posts, pages, and other post types when rendered by %s.', $otto_name),
1111 1155 'content_genius_sync_roles' => 'Select which WordPress user roles should be synchronized with Content Genius. This determines which users will have their profiles and permissions synced for content collaboration.',
1112 1156 'permalink_structure' => sprintf('Displays your current WordPress permalink structure. %s works best with pretty permalinks (not "Plain"). If you see a warning, visit Settings > Permalinks to change your structure.', $plugin_name),
@@ -1111,9 +1155,8 @@
1111 1155 'content_genius_sync_roles' => 'Select which WordPress user roles should be synchronized with Content Genius. This determines which users will have their profiles and permissions synced for content collaboration.',
1112 1156 'permalink_structure' => sprintf('Displays your current WordPress permalink structure. %s works best with pretty permalinks (not "Plain"). If you see a warning, visit Settings > Permalinks to change your structure.', $plugin_name),
1113 1157 'hide_dashboard_framework' => sprintf('Hide the main %s dashboard from the WordPress admin menu. This is useful if you want to reduce menu clutter but still keep the plugin active.', $plugin_name),
1114 1158 'show_admin_bar_status' => sprintf('Display the %s status indicator in the WordPress admin bar at the top of your screen. This provides quick visibility of plugin status and key metrics.', $plugin_name),
1115 - 'enable_auto_updates' => sprintf('Allow WordPress to automatically update the %s plugin when new versions are released. Recommended for security patches, but you may prefer manual updates for major versions.', $plugin_name),
1116 1159 'import_external_data' => sprintf('Import your existing SEO settings and metadata from other popular SEO plugins like Yoast, Rank Math, or All in One SEO. This makes migration to %s seamless without losing your SEO data.', $plugin_name),
1117 1160 'import_seo_metadata' => sprintf('Migrate your existing SEO titles and meta descriptions from Yoast, Rank Math, or All in One SEO. This one-click import preserves your search rankings by copying your optimized meta data to %s, even if the source plugin is deactivated.', $plugin_name),
1118 1161 'default_page_builder' => 'Choose how Content Genius stores synced articles. "Gutenberg" works with all themes and page builders. Selecting a specific builder converts content to that builder\'s widget format, which inherits the builder\'s global typography and layout styles.',
1119 1162 'og_image_dimensions' => 'Adds your share image\'s width, height, and file type to the Open Graph tags so Facebook, LinkedIn, and others render your preview instantly at the right size instead of guessing. Leave on unless another plugin already outputs these.',
@@ -1124,8 +1167,35 @@
1124 1167 'twitter_image_alt' => 'Adds descriptive alt text to the image shown when your page is shared on X/Twitter, improving accessibility for screen-reader users. Uses your saved alt text or the image\'s own alt attribute.'
1125 1168 );
1126 1169 }
1127 1170
1171 + public function render_analytics_section() {
1172 + $enabled = get_option('metasync_analytics_opt_in', 'no') === 'yes';
1173 + $plugin_name = Metasync::get_effective_plugin_name();
1174 + /* translators: %s: Plugin name. */
1175 + $heading = sprintf(__('Help improve %s', 'metasync'), $plugin_name);
1176 + /* translators: %s: Plugin name. */
1177 + $intro = sprintf(__('Allow %s to collect limited usage analytics. This helps us understand which features are used, improve the product, and identify problems.', 'metasync'), $plugin_name);
1178 + /* translators: %s: Plugin name. */
1179 + $toggle_label = sprintf(__('Share usage data with %s', 'metasync'), $plugin_name);
1180 + ?>
1181 + <div class="metasync-analytics-consent-card">
1182 + <div class="metasync-analytics-consent-copy">
1183 + <h3><?php echo esc_html($heading); ?></h3>
1184 + <p><?php echo esc_html($intro); ?></p>
1185 + <p class="description"><?php esc_html_e('We collect limited technical information such as your site URL, plugin version, WordPress and PHP versions, user role, and feature usage. We do not collect passwords, API keys, customer content, names, or email addresses.', 'metasync'); ?></p>
1186 + </div>
1187 + <label class="metasync-consent-switch" for="metasync_analytics_opt_in">
1188 + <input type="hidden" name="metasync_analytics_opt_in" value="no" />
1189 + <input type="checkbox" id="metasync_analytics_opt_in" name="metasync_analytics_opt_in" value="yes" <?php checked($enabled); ?> />
1190 + <span class="metasync-consent-slider" aria-hidden="true"></span>
1191 + <span class="screen-reader-text"><?php echo esc_html($toggle_label); ?></span>
1192 + </label>
1193 + <span class="metasync-consent-status" aria-live="polite" data-enabled-label="<?php esc_attr_e('Enabled', 'metasync'); ?>" data-disabled-label="<?php esc_attr_e('Off', 'metasync'); ?>"><?php echo $enabled ? esc_html__('Enabled', 'metasync') : esc_html__('Off', 'metasync'); ?></span>
1194 + </div>
1195 + <?php
1196 + }
1197 +
1128 1198 public function get_field_section($field_id) {
1129 1199 $sections = $this->get_accordion_sections_config();
1130 1200
1131 1201 foreach ($sections as $section_key => $section_data) {
@@ -1159,9 +1229,9 @@
1159 1229 $content_state = $is_open ? 'open' : 'closed';
1160 1230
1161 1231 echo '<div class="metasync-accordion-section" data-section="' . esc_attr($section_key) . '">';
1162 1232
1163 - echo '<div class="metasync-accordion-header" role="button" tabindex="0" aria-expanded="' . $aria_expanded . '" aria-controls="' . $section_id . '">';
1233 + echo '<div class="metasync-accordion-header" role="button" tabindex="0" aria-expanded="' . esc_attr($aria_expanded) . '" aria-controls="' . esc_attr($section_id) . '">';
1164 1234 echo '<div class="metasync-accordion-title">';
1165 1235 echo '<span class="metasync-accordion-icon"><span class="dashicons dashicons-' . esc_attr($section_data['icon']) . '"></span></span>';
1166 1236 echo '<div class="metasync-accordion-text">';
1167 1237 echo '<h3>' . esc_html($section_data['title']) . '</h3>';
@@ -1172,9 +1242,9 @@
1172 1242 echo '<span class="toggle-icon">▼</span>';
1173 1243 echo '</button>';
1174 1244 echo '</div>';
1175 1245
1176 - echo '<div class="metasync-accordion-content" id="' . $section_id . '" data-state="' . $content_state . '">';
1246 + echo '<div class="metasync-accordion-content" id="' . esc_attr($section_id) . '" data-state="' . esc_attr($content_state) . '">';
1177 1247
1178 1248 if (isset($section_data['render_callback']) && is_callable($section_data['render_callback'])) {
1179 1249 call_user_func($section_data['render_callback']);
1180 1250 } elseif (isset($section_data['fields']) && is_array($section_data['fields'])) {
@@ -1189,9 +1259,9 @@
1189 1259 echo '<tr>';
1190 1260 echo '<th scope="row">';
1191 1261 if (!empty($field['title'])) {
1192 1262 echo '<div class="metasync-field-label-wrapper">';
1193 - echo '<label for="' . esc_attr($field['id']) . '">' . $field['title'] . '</label>';
1263 + echo '<label for="' . esc_attr($field['id']) . '">' . esc_html($field['title']) . '</label>';
1194 1264
1195 1265 if (isset($tooltips[$field_id])) {
1196 1266 echo '<button type="button" class="metasync-tooltip-trigger" data-tooltip-id="' . esc_attr($field_id) . '" aria-label="More information">';
1197 1267 echo '<svg class="metasync-info-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">';
@@ -1246,9 +1316,9 @@
1246 1316 echo '<tr>';
1247 1317 echo '<th scope="row">';
1248 1318 if (!empty($field['title'])) {
1249 1319 echo '<div class="metasync-field-label-wrapper">';
1250 - echo '<label for="' . esc_attr($field['id']) . '">' . $field['title'] . '</label>';
1320 + echo '<label for="' . esc_attr($field['id']) . '">' . esc_html($field['title']) . '</label>';
1251 1321 if (isset($llms_tooltips[$field['id']])) {
1252 1322 Metasync::render_tooltip_icon($field['id'], $llms_tooltips[$field['id']]);
1253 1323 }
1254 1324 echo '</div>';
@@ -1302,32 +1372,32 @@
1302 1372 $display_value = $current_token;
1303 1373 $status_message = 'Plugin Auth Token is active and ready for authentication.';
1304 1374 $refresh_help = 'Click refresh to generate a new token and update the heartbeat API.';
1305 1375 } else {
1306 - $display_value = 'Auto-generated when connecting to ' . esc_html(Metasync::get_effective_plugin_name());
1307 - $status_message = 'Plugin Auth Token will be automatically generated when you click "Connect to ' . esc_html(Metasync::get_effective_plugin_name()) . '".';
1376 + $display_value = 'Auto-generated when connecting to ' . Metasync::get_effective_plugin_name();
1377 + $status_message = 'Plugin Auth Token will be automatically generated when you click "Connect to ' . Metasync::get_effective_plugin_name() . '".';
1308 1378 $refresh_help = 'You can also manually generate a token by clicking refresh.';
1309 1379 }
1310 1380
1311 1381 printf('<div class="metasync-auth-token-row">');
1312 1382 printf(
1313 - '<input type="text" id="apikey" name="' . Metasync_Admin::option_key . '[general][apikey]" value="%s" size="40" class="regular-text" readonly="readonly" />',
1383 + '<input type="text" id="apikey" name="' . esc_attr(Metasync_Admin::option_key) . '[general][apikey]" value="%s" size="40" class="regular-text" readonly="readonly" />',
1314 1384 esc_attr($display_value)
1315 1385 );
1316 1386 printf('<button type="button" id="refresh-plugin-auth-token" class="button button-secondary metasync-refresh-token-btn"><span class="dashicons dashicons-controls-repeat"></span> Refresh Token</button>');
1317 1387 printf('</div>');
1318 - printf('<p class="description">%s %s</p>', $status_message, $refresh_help);
1388 + printf('<p class="description">%s %s</p>', esc_html($status_message), esc_html($refresh_help));
1319 1389 }
1320 1390
1321 1391 public function linkgraph_token_callback()
1322 1392 {
1323 1393 printf(
1324 - '<input type="text" id="linkgraph_token" name="' . Metasync_Admin::option_key . '[general][linkgraph_token]" value="%s" size="25" readonly="readonly" />',
1394 + '<input type="text" id="linkgraph_token" name="' . esc_attr(Metasync_Admin::option_key) . '[general][linkgraph_token]" value="%s" size="25" readonly="readonly" />',
1325 1395 isset(Metasync::get_option('general')['linkgraph_token']) ? esc_attr(Metasync::get_option('general')['linkgraph_token']) : ''
1326 1396 );
1327 1397
1328 1398 printf(
1329 - '<input type="text" id="linkgraph_customer_id" name="' . Metasync_Admin::option_key . '[general][linkgraph_customer_id]" value="%s" size="25" readonly="readonly" />',
1399 + '<input type="text" id="linkgraph_customer_id" name="' . esc_attr(Metasync_Admin::option_key) . '[general][linkgraph_customer_id]" value="%s" size="25" readonly="readonly" />',
1330 1400 isset(Metasync::get_option('general')['linkgraph_customer_id']) ? esc_attr(Metasync::get_option('general')['linkgraph_customer_id']) : ''
1331 1401 );
1332 1402
1333 1403 ?>
@@ -1452,9 +1522,9 @@
1452 1522 printf('• The authentication window will open in a popup - please allow popups<br/>');
1453 1523 printf('• The process typically takes 15-30 seconds to complete<br/>');
1454 1524 printf('• Your API key will be stored securely and shown masked below<br/>');
1455 1525 printf('• If you encounter issues, try disabling ad blockers temporarily<br/>');
1456 - printf('• Contact <a href="mailto:%s">%s</a> if you need assistance', Metasync::SUPPORT_EMAIL, Metasync::SUPPORT_EMAIL);
1526 + printf('• Contact <a href="mailto:%s">%s</a> if you need assistance', esc_attr(Metasync::SUPPORT_EMAIL), esc_html(Metasync::SUPPORT_EMAIL));
1457 1527 printf('</div>');
1458 1528 printf('</details>');
1459 1529 printf('</div>');
1460 1530
@@ -1501,14 +1571,17 @@
1501 1571 printf('</p>');
1502 1572
1503 1573 printf('</div>');
1504 1574
1575 + // The OTTO Pixel UUID is shown once, by the read-only Settings-API
1576 + // field in the OTTO Server-Side Rendering section; do not repeat it here.
1577 +
1505 1578 if( isset(Metasync::get_option('general')['searchatlas_api_key'])&&Metasync::get_option('general')['searchatlas_api_key']!=''){
1506 1579 $timestamp = @Metasync::get_option('general')['send_auth_token_timestamp'];
1507 1580 printf(
1508 1581 '<p id="sendAuthTokenTimestamp" class="descriptionValue">%s (%s)</p>',
1509 1582 esc_attr($timestamp),
1510 - $this->time_elapsed_string($timestamp)
1583 + esc_html($this->time_elapsed_string($timestamp))
1511 1584 );
1512 1585
1513 1586
1514 1587 }
@@ -1516,9 +1589,9 @@
1516 1589
1517 1590 public function bing_site_verification_callback()
1518 1591 {
1519 1592 printf(
1520 - '<input type="text" id="bing_site_verification" name="' . Metasync_Admin::option_key . '[searchengines][bing_site_verification]" value="%s" size="50" />',
1593 + '<input type="text" id="bing_site_verification" name="' . esc_attr(Metasync_Admin::option_key) . '[searchengines][bing_site_verification]" value="%s" size="50" />',
1521 1594 isset(Metasync::get_option('searchengines')['bing_site_verification']) ? esc_attr(Metasync::get_option('searchengines')['bing_site_verification']) : ''
1522 1595 );
1523 1596
1524 1597 printf(' <br> <span class="description"> Enter Bing Webmaster Tools verification code: </span> ');
@@ -1527,9 +1600,9 @@
1527 1600
1528 1601 public function yandex_site_verification_callback()
1529 1602 {
1530 1603 printf(
1531 - '<input type="text" id="yandex_site_verification" name="' . Metasync_Admin::option_key . '[searchengines][yandex_site_verification]" value="%s" size="50" />',
1604 + '<input type="text" id="yandex_site_verification" name="' . esc_attr(Metasync_Admin::option_key) . '[searchengines][yandex_site_verification]" value="%s" size="50" />',
1532 1605 isset(Metasync::get_option('searchengines')['yandex_site_verification']) ? esc_attr(Metasync::get_option('searchengines')['yandex_site_verification']) : ''
1533 1606 );
1534 1607
1535 1608 printf(' <br> <span class="description"> Enter Yandex verification code: </span>');
@@ -1538,9 +1611,9 @@
1538 1611
1539 1612 public function google_site_verification_callback()
1540 1613 {
1541 1614 printf(
1542 - '<input type="text" id="google_site_verification" name="' . Metasync_Admin::option_key . '[searchengines][google_site_verification]" value="%s" size="50" />',
1615 + '<input type="text" id="google_site_verification" name="' . esc_attr(Metasync_Admin::option_key) . '[searchengines][google_site_verification]" value="%s" size="50" />',
1543 1616 isset(Metasync::get_option('searchengines')['google_site_verification']) ? esc_attr(Metasync::get_option('searchengines')['google_site_verification']) : ''
1544 1617 );
1545 1618
1546 1619 printf(' <br> <span class="description"> Enter Google Search Console verification code: </span>');
@@ -1549,9 +1622,9 @@
1549 1622
1550 1623 public function pinterest_site_verification_callback()
1551 1624 {
1552 1625 printf(
1553 - '<input type="text" id="pinterest_site_verification" name="' . Metasync_Admin::option_key . '[searchengines][pinterest_site_verification]" value="%s" size="50" />',
1626 + '<input type="text" id="pinterest_site_verification" name="' . esc_attr(Metasync_Admin::option_key) . '[searchengines][pinterest_site_verification]" value="%s" size="50" />',
1554 1627 isset(Metasync::get_option('searchengines')['pinterest_site_verification']) ? esc_attr(Metasync::get_option('searchengines')['pinterest_site_verification']) : ''
1555 1628 );
1556 1629
1557 1630 printf(' <br> <span class="description"> Enter Pinterest verification code: </span>');
@@ -1580,10 +1653,10 @@
1580 1653
1581 1654 public function local_seo_name_callback()
1582 1655 {
1583 1656 printf(
1584 - '<input type="text" id="local_seo_name" name="' . Metasync_Admin::option_key . '[localseo][local_seo_name]" value="%s" size="50" />',
1585 - isset(Metasync::get_option('localseo')['local_seo_name']) ? esc_attr(Metasync::get_option('localseo')['local_seo_name']) : get_bloginfo()
1657 + '<input type="text" id="local_seo_name" name="' . esc_attr(Metasync_Admin::option_key) . '[localseo][local_seo_name]" value="%s" size="50" />',
1658 + isset(Metasync::get_option('localseo')['local_seo_name']) ? esc_attr(Metasync::get_option('localseo')['local_seo_name']) : esc_attr(get_bloginfo())
1586 1659 );
1587 1660
1588 1661 printf(' <br> <span class="description"> Your name or company name </span>');
1589 1662 }
@@ -1599,9 +1672,9 @@
1599 1672 // would otherwise survive every subsequent Save Settings.
1600 1673 $local_seo_logo = metasync_repair_scheme_prefixed_media_id($local_seo_logo);
1601 1674
1602 1675 printf(
1603 - '<input type="hidden" id="local_seo_logo" name="' . Metasync_Admin::option_key . '[localseo][local_seo_logo]" value="%s" size="50" />',
1676 + '<input type="hidden" id="local_seo_logo" name="' . esc_attr(Metasync_Admin::option_key) . '[localseo][local_seo_logo]" value="%s" size="50" />',
1604 1677 esc_attr((string) $local_seo_logo)
1605 1678 );
1606 1679
1607 1680 printf(' <br> <input class="button-secondary no-loading" type="button" id="logo_upload_button" value="Add or Upload File">');
@@ -1623,9 +1696,9 @@
1623 1696 $logo_url ? '' : ' style="display:none"'
1624 1697 );
1625 1698
1626 1699 $button_type = $logo_url ? 'button' : 'hidden';
1627 - printf('<input type="%s" class="button-secondary no-loading metasync-logo-remove-btn" id="local_seo_logo_close_btn" value="X">', $button_type);
1700 + printf('<input type="%s" class="button-secondary no-loading metasync-logo-remove-btn" id="local_seo_logo_close_btn" value="X">', esc_attr($button_type));
1628 1701 printf('</span>');
1629 1702 }
1630 1703
1631 1704 /**
@@ -1663,10 +1736,10 @@
1663 1736
1664 1737 public function local_seo_url_callback()
1665 1738 {
1666 1739 printf(
1667 - '<input type="text" id="local_seo_url" name="' . Metasync_Admin::option_key . '[localseo][local_seo_url]" value="%s" size="50" />',
1668 - isset(Metasync::get_option('localseo')['local_seo_url']) ? esc_attr(Metasync::get_option('localseo')['local_seo_url']) : home_url()
1740 + '<input type="text" id="local_seo_url" name="' . esc_attr(Metasync_Admin::option_key) . '[localseo][local_seo_url]" value="%s" size="50" />',
1741 + isset(Metasync::get_option('localseo')['local_seo_url']) ? esc_attr(Metasync::get_option('localseo')['local_seo_url']) : esc_attr(home_url())
1669 1742 );
1670 1743
1671 1744 printf(' <br> <span class="description"> URL of the item. </span>');
1672 1745 }
@@ -1673,9 +1746,9 @@
1673 1746
1674 1747 public function local_seo_email_callback()
1675 1748 {
1676 1749 printf(
1677 - '<input type="text" id="local_seo_email" name="' . Metasync_Admin::option_key . '[localseo][local_seo_email]" value="%s" size="50" />',
1750 + '<input type="text" id="local_seo_email" name="' . esc_attr(Metasync_Admin::option_key) . '[localseo][local_seo_email]" value="%s" size="50" />',
1678 1751 isset(Metasync::get_option('localseo')['local_seo_email']) ? esc_attr(Metasync::get_option('localseo')['local_seo_email']) : ''
1679 1752 );
1680 1753
1681 1754 printf(' <br> <span class="description"> Search engines display your email address. </span>');
@@ -1683,9 +1756,9 @@
1683 1756
1684 1757 public function local_seo_phone_callback()
1685 1758 {
1686 1759 printf(
1687 - '<input type="text" id="local_seo_phone" name="' . Metasync_Admin::option_key . '[localseo][local_seo_phone]" value="%s" size="50" />',
1760 + '<input type="text" id="local_seo_phone" name="' . esc_attr(Metasync_Admin::option_key) . '[localseo][local_seo_phone]" value="%s" size="50" />',
1688 1761 isset(Metasync::get_option('localseo')['local_seo_phone']) ? esc_attr(Metasync::get_option('localseo')['local_seo_phone']) : ''
1689 1762 );
1690 1763
1691 1764 printf(' <br> <span class="description"> Search engines may prominently display your contact phone number for mobile users. </span>');
@@ -1693,29 +1766,29 @@
1693 1766
1694 1767 public function local_seo_address_callback()
1695 1768 {
1696 1769 printf(
1697 - '<input type="text" id="local_seo_address_street" name="' . Metasync_Admin::option_key . '[localseo][address][street]" value="%s" size="50" placeholder="Street Address"/> <br>',
1770 + '<input type="text" id="local_seo_address_street" name="' . esc_attr(Metasync_Admin::option_key) . '[localseo][address][street]" value="%s" size="50" placeholder="Street Address"/> <br>',
1698 1771 isset(Metasync::get_option('localseo')['address']['street']) ? esc_attr(Metasync::get_option('localseo')['address']['street']) : ''
1699 1772 );
1700 1773
1701 1774 printf(
1702 - '<input type="text" id="local_seo_address_locality" name="' . Metasync_Admin::option_key . '[localseo][address][locality]" value="%s" size="50" placeholder="Locality"/> <br>',
1775 + '<input type="text" id="local_seo_address_locality" name="' . esc_attr(Metasync_Admin::option_key) . '[localseo][address][locality]" value="%s" size="50" placeholder="Locality"/> <br>',
1703 1776 isset(Metasync::get_option('localseo')['address']['locality']) ? esc_attr(Metasync::get_option('localseo')['address']['locality']) : ''
1704 1777 );
1705 1778
1706 1779 printf(
1707 - '<input type="text" id="local_seo_address_region" name="' . Metasync_Admin::option_key . '[localseo][address][region]" value="%s" size="50" placeholder="Region"/> <br>',
1780 + '<input type="text" id="local_seo_address_region" name="' . esc_attr(Metasync_Admin::option_key) . '[localseo][address][region]" value="%s" size="50" placeholder="Region"/> <br>',
1708 1781 isset(Metasync::get_option('localseo')['address']['region']) ? esc_attr(Metasync::get_option('localseo')['address']['region']) : ''
1709 1782 );
1710 1783
1711 1784 printf(
1712 - '<input type="text" id="local_seo_address_postalcode" name="' . Metasync_Admin::option_key . '[localseo][address][postalcode]" value="%s" size="50" placeholder="Postal Code"/> <br>',
1785 + '<input type="text" id="local_seo_address_postalcode" name="' . esc_attr(Metasync_Admin::option_key) . '[localseo][address][postalcode]" value="%s" size="50" placeholder="Postal Code"/> <br>',
1713 1786 isset(Metasync::get_option('localseo')['address']['postalcode']) ? esc_attr(Metasync::get_option('localseo')['address']['postalcode']) : ''
1714 1787 );
1715 1788
1716 1789 printf(
1717 - '<input type="text" id="local_seo_address_country" name="' . Metasync_Admin::option_key . '[localseo][address][country]" value="%s" size="50" placeholder="Country"/> <br>',
1790 + '<input type="text" id="local_seo_address_country" name="' . esc_attr(Metasync_Admin::option_key) . '[localseo][address][country]" value="%s" size="50" placeholder="Country"/> <br>',
1718 1791 isset(Metasync::get_option('localseo')['address']['country']) ? esc_attr(Metasync::get_option('localseo')['address']['country']) : ''
1719 1792 );
1720 1793 }
1721 1794
@@ -1730,9 +1803,9 @@
1730 1803 <select name="<?php echo esc_attr(Metasync_Admin::option_key . '[localseo][local_seo_business_type]') ?>">
1731 1804 <option value='0'>Select Business Type</option>
1732 1805 <?php
1733 1806 foreach ($types as $type) {
1734 - printf('<option value="%s" %s >%s</option>', $type, selected($type, esc_attr($business_type)), $type);
1807 + printf('<option value="%s" %s >%s</option>', esc_attr($type), selected($type, $business_type, false), esc_html($type));
1735 1808 }
1736 1809 ?>
1737 1810 </select>
1738 1811 <?php
@@ -1756,9 +1829,9 @@
1756 1829 <li>
1757 1830 <select name="<?php echo esc_attr(Metasync_Admin::option_key . '[localseo][days][]') ?>">
1758 1831 <?php
1759 1832 foreach ($days_name as $name) {
1760 - printf('<option value="%s" %s >%s</option>', $name, selected(esc_attr($name), esc_attr($day_name)), esc_attr($name));
1833 + printf('<option value="%s" %s >%s</option>', esc_attr($name), selected($name, $day_name, false), esc_html($name));
1761 1834 }
1762 1835 ?>
1763 1836 </select>
1764 1837 <input type="text" name="<?php echo esc_attr(Metasync_Admin::option_key . '[localseo][times][]') ?>" value="<?php echo esc_attr($day_time) ?>">
@@ -1837,9 +1910,9 @@
1837 1910
1838 1911 public function local_seo_price_range_callback()
1839 1912 {
1840 1913 printf(
1841 - '<input type="text" id="local_seo_price_range" name="' . Metasync_Admin::option_key . '[localseo][local_seo_price_range]" value="%s" size="50" />',
1914 + '<input type="text" id="local_seo_price_range" name="' . esc_attr(Metasync_Admin::option_key) . '[localseo][local_seo_price_range]" value="%s" size="50" />',
1842 1915 isset(Metasync::get_option('localseo')['local_seo_price_range']) ? esc_attr(Metasync::get_option('localseo')['local_seo_price_range']) : ''
1843 1916 );
1844 1917 printf(' <br> <span class="description"> The price range of the business, for example $$$. </span>');
1845 1918 }
@@ -1852,9 +1925,9 @@
1852 1925 <?php
1853 1926 $about_page = Metasync::get_option('localseo')['local_seo_about_page'] ?? '';
1854 1927 $pages = get_pages();
1855 1928 foreach ($pages as $page) {
1856 - printf('<option value="%s" %s >%s</option>', $page->ID, selected($page->ID, esc_attr($about_page)), $page->post_title);
1929 + printf('<option value="%s" %s >%s</option>', absint($page->ID), selected($page->ID, $about_page, false), esc_html($page->post_title));
1857 1930 }
1858 1931 ?>
1859 1932 </select>
1860 1933 <?php
@@ -1869,9 +1942,9 @@
1869 1942 <?php
1870 1943 $contact_page = Metasync::get_option('localseo')['local_seo_contact_page'] ?? '';
1871 1944 $pages = get_pages();
1872 1945 foreach ($pages as $page) {
1873 - printf('<option value="%s" %s >%s</option>', $page->ID, selected($page->ID, esc_attr($contact_page)), $page->post_title);
1946 + printf('<option value="%s" %s >%s</option>', absint($page->ID), selected($page->ID, $contact_page, false), esc_html($page->post_title));
1874 1947 }
1875 1948 ?>
1876 1949 </select>
1877 1950 <?php
@@ -1880,9 +1953,9 @@
1880 1953
1881 1954 public function local_seo_map_key_callback()
1882 1955 {
1883 1956 printf(
1884 - '<input type="text" id="local_seo_map_key" name="' . Metasync_Admin::option_key . '[localseo][local_seo_map_key]" value="%s" size="50" />',
1957 + '<input type="text" id="local_seo_map_key" name="' . esc_attr(Metasync_Admin::option_key) . '[localseo][local_seo_map_key]" value="%s" size="50" />',
1885 1958 isset(Metasync::get_option('localseo')['local_seo_map_key']) ? esc_attr(Metasync::get_option('localseo')['local_seo_map_key']) : ''
1886 1959 );
1887 1960
1888 1961 printf(' <br> <span class="description"> An API Key is required to display embedded Google Maps on your site. </span>');
@@ -1890,9 +1963,9 @@
1890 1963
1891 1964 public function local_seo_geo_coordinates_callback()
1892 1965 {
1893 1966 printf(
1894 - '<input type="text" id="local_seo_geo_coordinates" name="' . Metasync_Admin::option_key . '[localseo][local_seo_geo_coordinates]" value="%s" size="50" />',
1967 + '<input type="text" id="local_seo_geo_coordinates" name="' . esc_attr(Metasync_Admin::option_key) . '[localseo][local_seo_geo_coordinates]" value="%s" size="50" />',
1895 1968 isset(Metasync::get_option('localseo')['local_seo_geo_coordinates']) ? esc_attr(Metasync::get_option('localseo')['local_seo_geo_coordinates']) : ''
1896 1969 );
1897 1970
1898 1971 printf(' <br> <span class="description"> Latitude and longitude values separated by comma. </span>');
@@ -1900,9 +1973,9 @@
1900 1973
1901 1974 public function header_snippets_callback()
1902 1975 {
1903 1976 printf(
1904 - '<textarea class="wide-text" id="header_snippets" rows="8" name="' . Metasync_Admin::option_key . '[codesnippets][header_snippet]" >%s</textarea>',
1977 + '<textarea class="wide-text" id="header_snippets" rows="8" name="' . esc_attr(Metasync_Admin::option_key) . '[codesnippets][header_snippet]" >%s</textarea>',
1905 1978 isset(Metasync::get_option('codesnippets')['header_snippet']) ? esc_attr(Metasync::get_option('codesnippets')['header_snippet']) : ''
1906 1979 );
1907 1980 }
1908 1981
@@ -1908,9 +1981,9 @@
1908 1981
1909 1982 public function footer_snippets_callback()
1910 1983 {
1911 1984 printf(
1912 - '<textarea class="wide-text" id="footer_snippets" rows="8" name="' . Metasync_Admin::option_key . '[codesnippets][footer_snippet]" >%s</textarea>',
1985 + '<textarea class="wide-text" id="footer_snippets" rows="8" name="' . esc_attr(Metasync_Admin::option_key) . '[codesnippets][footer_snippet]" >%s</textarea>',
1913 1986 isset(Metasync::get_option('codesnippets')['footer_snippet']) ? esc_attr(Metasync::get_option('codesnippets')['footer_snippet']) : ''
1914 1987 );
1915 1988 }
1916 1989
@@ -2047,9 +2120,9 @@
2047 2120
2048 2121 public function global_open_graph_meta_callback()
2049 2122 {
2050 2123 printf(
2051 - '<input type="checkbox" name="' . Metasync_Admin::option_key . '[common_meta_settings][open_graph_meta_tags]" value="true" %s />',
2124 + '<input type="checkbox" name="' . esc_attr(Metasync_Admin::option_key) . '[common_meta_settings][open_graph_meta_tags]" value="true" %s />',
2052 2125 isset(Metasync::get_option('common_meta_settings')['open_graph_meta_tags']) && Metasync::get_option('common_meta_settings')['open_graph_meta_tags'] == 'true' ? 'checked' : ''
2053 2126 );
2054 2127 printf(' <br> <span class="description"> Automatically add the Open Graph meta tags in a page or post.</span>');
2055 2128 }
@@ -2056,9 +2129,9 @@
2056 2129
2057 2130 public function global_facebook_meta_callback()
2058 2131 {
2059 2132 printf(
2060 - '<input type="checkbox" name="' . Metasync_Admin::option_key . '[common_meta_settings][facebook_meta_tags]" value="true" %s />',
2133 + '<input type="checkbox" name="' . esc_attr(Metasync_Admin::option_key) . '[common_meta_settings][facebook_meta_tags]" value="true" %s />',
2061 2134 isset(Metasync::get_option('common_meta_settings')['facebook_meta_tags']) && Metasync::get_option('common_meta_settings')['facebook_meta_tags'] == 'true' ? 'checked' : ''
2062 2135 );
2063 2136 printf(' <br> <span class="description"> Automatically add the Facebook meta tags in a page or post.</span>');
2064 2137 }
@@ -2065,9 +2138,9 @@
2065 2138
2066 2139 public function global_twitter_meta_callback()
2067 2140 {
2068 2141 printf(
2069 - '<input type="checkbox" name="' . Metasync_Admin::option_key . '[common_meta_settings][twitter_meta_tags]" value="true" %s />',
2142 + '<input type="checkbox" name="' . esc_attr(Metasync_Admin::option_key) . '[common_meta_settings][twitter_meta_tags]" value="true" %s />',
2070 2143 isset(Metasync::get_option('common_meta_settings')['twitter_meta_tags']) && Metasync::get_option('common_meta_settings')['twitter_meta_tags'] == 'true' ? 'checked' : ''
2071 2144 );
2072 2145 printf(' <br> <span class="description"> Automatically add the Twitter meta tags in a page or post.</span>');
2073 2146 }
@@ -2075,9 +2148,9 @@
2075 2148 public function og_image_dimensions_callback()
2076 2149 {
2077 2150 $val = Metasync::get_option('common_meta_settings')['og_image_dimensions'] ?? 'true';
2078 2151 printf(
2079 - '<input type="checkbox" name="' . Metasync_Admin::option_key . '[common_meta_settings][og_image_dimensions]" value="true" %s />',
2152 + '<input type="checkbox" name="' . esc_attr(Metasync_Admin::option_key) . '[common_meta_settings][og_image_dimensions]" value="true" %s />',
2080 2153 $val === 'true' ? 'checked' : ''
2081 2154 );
2082 2155 printf('<span class="description"> Output og:image:width, og:image:height, and og:image:type when OG image metadata is available.</span>');
2083 2156 }
@@ -2085,9 +2158,9 @@
2085 2158 public function article_timestamps_callback()
2086 2159 {
2087 2160 $val = Metasync::get_option('common_meta_settings')['article_timestamps'] ?? 'true';
2088 2161 printf(
2089 - '<input type="checkbox" name="' . Metasync_Admin::option_key . '[common_meta_settings][article_timestamps]" value="true" %s />',
2162 + '<input type="checkbox" name="' . esc_attr(Metasync_Admin::option_key) . '[common_meta_settings][article_timestamps]" value="true" %s />',
2090 2163 $val === 'true' ? 'checked' : ''
2091 2164 );
2092 2165 printf('<span class="description"> Output article:published_time and article:modified_time from the post publish and modified dates (ISO 8601).</span>');
2093 2166 }
@@ -2095,9 +2168,9 @@
2095 2168 public function article_author_callback()
2096 2169 {
2097 2170 $val = Metasync::get_option('common_meta_settings')['article_author'] ?? 'true';
2098 2171 printf(
2099 - '<input type="checkbox" name="' . Metasync_Admin::option_key . '[common_meta_settings][article_author]" value="true" %s />',
2172 + '<input type="checkbox" name="' . esc_attr(Metasync_Admin::option_key) . '[common_meta_settings][article_author]" value="true" %s />',
2100 2173 $val === 'true' ? 'checked' : ''
2101 2174 );
2102 2175 printf('<span class="description"> Output article:author using the post author website URL or archive URL (overridable per-post via _metasync_og_article_author meta).</span>');
2103 2176 }
@@ -2105,9 +2178,9 @@
2105 2178 public function article_section_callback()
2106 2179 {
2107 2180 $val = Metasync::get_option('common_meta_settings')['article_section'] ?? 'true';
2108 2181 printf(
2109 - '<input type="checkbox" name="' . Metasync_Admin::option_key . '[common_meta_settings][article_section]" value="true" %s />',
2182 + '<input type="checkbox" name="' . esc_attr(Metasync_Admin::option_key) . '[common_meta_settings][article_section]" value="true" %s />',
2110 2183 $val === 'true' ? 'checked' : ''
2111 2184 );
2112 2185 printf('<span class="description"> Output article:section from the primary category (falls back to first category).</span>');
2113 2186 }
@@ -2115,9 +2188,9 @@
2115 2188 public function article_tags_callback()
2116 2189 {
2117 2190 $val = Metasync::get_option('common_meta_settings')['article_tags'] ?? 'true';
2118 2191 printf(
2119 - '<input type="checkbox" name="' . Metasync_Admin::option_key . '[common_meta_settings][article_tags]" value="true" %s />',
2192 + '<input type="checkbox" name="' . esc_attr(Metasync_Admin::option_key) . '[common_meta_settings][article_tags]" value="true" %s />',
2120 2193 $val === 'true' ? 'checked' : ''
2121 2194 );
2122 2195 printf('<span class="description"> Output one article:tag meta tag per WordPress post tag.</span>');
2123 2196 }
@@ -2125,9 +2198,9 @@
2125 2198 public function twitter_image_alt_callback()
2126 2199 {
2127 2200 $val = Metasync::get_option('common_meta_settings')['twitter_image_alt'] ?? 'true';
2128 2201 printf(
2129 - '<input type="checkbox" name="' . Metasync_Admin::option_key . '[common_meta_settings][twitter_image_alt]" value="true" %s />',
2202 + '<input type="checkbox" name="' . esc_attr(Metasync_Admin::option_key) . '[common_meta_settings][twitter_image_alt]" value="true" %s />',
2130 2203 $val === 'true' ? 'checked' : ''
2131 2204 );
2132 2205 printf('<span class="description"> Output twitter:image:alt using the stored alt text or the OG image attachment alt attribute.</span>');
2133 2206 }
@@ -2134,9 +2207,9 @@
2134 2207
2135 2208 public function facebook_page_url_callback()
2136 2209 {
2137 2210 $facebook_page_url = Metasync::get_option('social_meta')['facebook_page_url'] ?? '';
2138 - printf('<input type="text" name="' . Metasync_Admin::option_key . '[social_meta][facebook_page_url]" value="%s" size="50" />', esc_attr($facebook_page_url));
2211 + printf('<input type="text" name="' . esc_attr(Metasync_Admin::option_key) . '[social_meta][facebook_page_url]" value="%s" size="50" />', esc_attr($facebook_page_url));
2139 2212 printf('<br><span class="description"> Enter your Facebook page URL. eg: <code>https://www.facebook.com/MetaSync/</code> </span>');
2140 2213 }
2141 2214
2142 2215 public function facebook_authorship_callback()
@@ -2141,9 +2214,9 @@
2141 2214
2142 2215 public function facebook_authorship_callback()
2143 2216 {
2144 2217 $facebook_authorship = Metasync::get_option('social_meta')['facebook_authorship'] ?? '';
2145 - printf('<input type="text" name="' . Metasync_Admin::option_key . '[social_meta][facebook_authorship]" value="%s" size="50" />', esc_attr($facebook_authorship));
2218 + printf('<input type="text" name="' . esc_attr(Metasync_Admin::option_key) . '[social_meta][facebook_authorship]" value="%s" size="50" />', esc_attr($facebook_authorship));
2146 2219 printf('<br><span class="description"> Enter Facebook profile URL to show Facebook Authorship when your articles are being shared on Facebook. eg: <code>https://www.facebook.com/shahrukh/</code> </span>');
2147 2220 }
2148 2221
2149 2222 public function facebook_admin_callback()
@@ -2148,9 +2221,9 @@
2148 2221
2149 2222 public function facebook_admin_callback()
2150 2223 {
2151 2224 $facebook_admin = Metasync::get_option('social_meta')['facebook_admin'] ?? '';
2152 - printf('<input type="text" name="' . Metasync_Admin::option_key . '[social_meta][facebook_admin]" value="%s" size="50" />', esc_attr($facebook_admin));
2225 + printf('<input type="text" name="' . esc_attr(Metasync_Admin::option_key) . '[social_meta][facebook_admin]" value="%s" size="50" />', esc_attr($facebook_admin));
2153 2226 printf(' <br> <span class="description"> Enter numeric user ID of Facebook. </span>');
2154 2227 }
2155 2228
2156 2229 public function facebook_app_callback()
@@ -2155,9 +2228,9 @@
2155 2228
2156 2229 public function facebook_app_callback()
2157 2230 {
2158 2231 $facebook_app = Metasync::get_option('social_meta')['facebook_app'] ?? '';
2159 - printf('<input type="text" name="' . Metasync_Admin::option_key . '[social_meta][facebook_app]" value="%s" size="50" />', esc_attr($facebook_app));
2232 + printf('<input type="text" name="' . esc_attr(Metasync_Admin::option_key) . '[social_meta][facebook_app]" value="%s" size="50" />', esc_attr($facebook_app));
2160 2233 printf(' <br> <span class="description"> Enter numeric app ID of Facebook </span>');
2161 2234 }
2162 2235
2163 2236 public function facebook_secret_callback()
@@ -2162,9 +2235,9 @@
2162 2235
2163 2236 public function facebook_secret_callback()
2164 2237 {
2165 2238 $facebook_secret = Metasync::get_option('social_meta')['facebook_secret'] ?? '';
2166 - printf('<input type="text" name="' . Metasync_Admin::option_key . '[social_meta][facebook_secret]" value="%s" size="50" />', esc_attr($facebook_secret));
2239 + printf('<input type="text" name="' . esc_attr(Metasync_Admin::option_key) . '[social_meta][facebook_secret]" value="%s" size="50" />', esc_attr($facebook_secret));
2167 2240 printf(' <br> <span class="description"> Enter alphanumeric access token from Facebook. </span>');
2168 2241 }
2169 2242
2170 2243 public function twitter_username_callback()
@@ -2169,9 +2242,9 @@
2169 2242
2170 2243 public function twitter_username_callback()
2171 2244 {
2172 2245 $twitter_username = Metasync::get_option('social_meta')['twitter_username'] ?? '';
2173 - printf('<input type="text" name="' . Metasync_Admin::option_key . '[social_meta][twitter_username]" value="%s" size="50" />', esc_attr($twitter_username));
2246 + printf('<input type="text" name="' . esc_attr(Metasync_Admin::option_key) . '[social_meta][twitter_username]" value="%s" size="50" />', esc_attr($twitter_username));
2174 2247 printf(' <br> <span class="description"> Twitter username of the author to add <code>twitter:creator</code> tag to post. eg: <code>MetaSync</code> </span>');
2175 2248 }
2176 2249
2177 2250 public static function get_business_types()