| @@ -82,9 +82,9 @@ | ||
| 82 | 82 | <span class="dashicons dashicons-<?php echo esc_attr($skin['dash']); ?>" style="font-size:22px;width:22px;height:22px;line-height:22px;"></span> |
| 83 | 83 | </div> |
| 84 | 84 | <div> |
| 85 | 85 | <p class="text-sm font-semibold <?php echo esc_attr($skin['title']); ?>"><?php echo esc_html($b['title']); ?></p> |
| 86 | - <p class="mt-0.5 text-sm <?php echo esc_attr($skin['body']); ?>"><?php echo esc_html($b['message']); ?></p> | |
| 86 | + <p class="mt-0.5 text-sm <?php echo esc_attr($skin['body']); ?>"><?php echo wp_kses_post($b['message']); ?></p> | |
| 87 | 87 | </div> |
| 88 | 88 | </div> |
| 89 | 89 | <a href="<?php echo esc_url($b['cta_url']); ?>" |
| 90 | 90 | <?php echo strpos($b['cta_url'], 'http') === 0 ? 'target="_blank" rel="noopener"' : ''; ?> |
| @@ -196,9 +196,9 @@ | ||
| 196 | 196 | <input type="checkbox" |
| 197 | 197 | class="ei-addons-row-check h-4 w-4 text-indigo-600 focus:ring-indigo-500 border-gray-300 rounded" |
| 198 | 198 | data-addon-id="<?php echo esc_attr($addon['id']); ?>" |
| 199 | 199 | data-addon-status="<?php echo esc_attr($status); ?>" |
| 200 | - aria-label="<?php echo esc_attr(sprintf(__('Select %s for bulk action', 'easy-invoice'), $addon['name'])); ?>"/> | |
| 200 | + aria-label="<?php /* translators: %s: addon name. */ echo esc_attr(sprintf(__('Select %s for bulk action', 'easy-invoice'), $addon['name'])); ?>"/> | |
| 201 | 201 | <?php endif; ?> |
| 202 | 202 | <div class="rounded-full border <?php echo esc_attr($plan_klass['icon']); ?> inline-flex items-center justify-center" |
| 203 | 203 | style="width:24px;height:24px;"> |
| 204 | 204 | <span class="dashicons <?php echo esc_attr($addon['icon']); ?>" |
| @@ -268,17 +268,31 @@ | ||
| 268 | 268 | <a href="<?php echo esc_url($addon['docs_url']); ?>" |
| 269 | 269 | target="_blank" |
| 270 | 270 | rel="noopener" |
| 271 | 271 | class="text-xs font-medium text-gray-500 hover:text-indigo-600" |
| 272 | - title="<?php echo esc_attr(sprintf(__('Open %s documentation', 'easy-invoice'), $addon['name'])); ?>"> | |
| 272 | + title="<?php /* translators: %s: addon name. */ echo esc_attr(sprintf(__('Open %s documentation', 'easy-invoice'), $addon['name'])); ?>"> | |
| 273 | 273 | <?php esc_html_e('Docs', 'easy-invoice'); ?> → |
| 274 | 274 | </a> |
| 275 | 275 | <?php endif; ?> |
| 276 | - <?php if (!empty($addon['settings_url'])): ?> | |
| 277 | - <a href="<?php echo esc_url($addon['settings_url']); ?>" | |
| 276 | + <?php | |
| 277 | + // Only link to a settings page the installed Pro actually | |
| 278 | + // registers: an older Pro alongside a newer free would | |
| 279 | + // otherwise send the user to a 403. | |
| 280 | + $ei_settings_url = $addon['settings_url'] ?? ''; | |
| 281 | + if ($ei_settings_url && preg_match('/[?&]page=([a-z0-9_-]+)/', $ei_settings_url, $ei_m)) { | |
| 282 | + global $admin_page_hooks, $_registered_pages; | |
| 283 | + $ei_slug = $ei_m[1]; | |
| 284 | + $ei_registered = isset($admin_page_hooks[$ei_slug]) | |
| 285 | + || (is_array($_registered_pages) && !empty(array_filter(array_keys($_registered_pages), static function ($hook) use ($ei_slug) { return false !== strpos($hook, '_page_' . $ei_slug); }))); | |
| 286 | + if (!$ei_registered) { | |
| 287 | + $ei_settings_url = ''; | |
| 288 | + } | |
| 289 | + } | |
| 290 | + if (!empty($ei_settings_url)): ?> | |
| 291 | + <a href="<?php echo esc_url($ei_settings_url); ?>" | |
| 278 | 292 | class="text-xs font-medium text-indigo-600 hover:text-indigo-800 underline-offset-2 hover:underline" |
| 279 | - title="<?php echo esc_attr(sprintf(__('Open %s settings', 'easy-invoice'), $addon['name'])); ?>"> | |
| 280 | - <?php esc_html_e('Settings', 'easy-invoice'); ?> → | |
| 293 | + title="<?php /* translators: %s: addon name. */ echo esc_attr(sprintf(__('Open %s settings', 'easy-invoice'), $addon['name'])); ?>"> | |
| 294 | + <?php echo esc_html($addon['settings_label'] ?? __('Settings', 'easy-invoice')); ?> → | |
| 281 | 295 | </a> |
| 282 | 296 | <?php endif; ?> |
| 283 | 297 | </div> |
| 284 | 298 | <?php elseif ($is_locked): ?> |
| @@ -291,9 +305,9 @@ | ||
| 291 | 305 | data-required-plan-label="<?php echo esc_attr($plan_label); ?>" |
| 292 | 306 | data-feature-name="<?php echo esc_attr($addon['name']); ?>" |
| 293 | 307 | data-feature-description="<?php echo esc_attr($addon['description']); ?>" |
| 294 | 308 | > |
| 295 | - <?php echo esc_html(sprintf(__('Upgrade to %s', 'easy-invoice'), $plan_label)); ?> | |
| 309 | + <?php /* translators: %s: plan name. */ echo esc_html(sprintf(__('Upgrade to %s', 'easy-invoice'), $plan_label)); ?> | |
| 296 | 310 | </button> |
| 297 | 311 | <a href="<?php echo esc_url($addon['docs_url']); ?>" target="_blank" rel="noopener" class="text-xs font-medium text-gray-500 hover:text-indigo-600 whitespace-nowrap"> |
| 298 | 312 | <?php esc_html_e('Learn', 'easy-invoice'); ?> → |
| 299 | 313 | </a> |