Changeset 3420851
- Timestamp:
- 12/16/2025 10:14:39 AM (2 months ago)
- Location:
- ai-for-seo
- Files:
-
- 81 added
- 21 edited
-
tags/2.2.4 (added)
-
tags/2.2.4/ai-for-seo.php (added)
-
tags/2.2.4/assets (added)
-
tags/2.2.4/assets/css (added)
-
tags/2.2.4/assets/css/ai-for-seo-styles.css (added)
-
tags/2.2.4/assets/images (added)
-
tags/2.2.4/assets/images/andre-erbis-at-space-codes.webp (added)
-
tags/2.2.4/assets/images/andre-erbis-signature.png (added)
-
tags/2.2.4/assets/images/faq-screenshots (added)
-
tags/2.2.4/assets/images/faq-screenshots/screenshot-be-builder-1.jpg (added)
-
tags/2.2.4/assets/images/faq-screenshots/screenshot-elementor-1.jpg (added)
-
tags/2.2.4/assets/images/faq-screenshots/screenshot-elementor-2.jpg (added)
-
tags/2.2.4/assets/images/faq-screenshots/screenshot-page-post-1.jpg (added)
-
tags/2.2.4/assets/images/faq-screenshots/screenshot-page-post-2.jpg (added)
-
tags/2.2.4/assets/images/faq-screenshots/screenshot-page-post-3.jpg (added)
-
tags/2.2.4/assets/images/faq-screenshots/screenshot-seo-autopilot-1.jpg (added)
-
tags/2.2.4/assets/images/faq-screenshots/screenshot-seo-autopilot-2.jpg (added)
-
tags/2.2.4/assets/images/faq-screenshots/screenshot-seo-autopilot-3.jpg (added)
-
tags/2.2.4/assets/images/faq-screenshots/screenshot-yoast-1.jpg (added)
-
tags/2.2.4/assets/images/faq-screenshots/screenshot-yoast-2.jpg (added)
-
tags/2.2.4/assets/images/faq-screenshots/screenshot-yoast-3.jpg (added)
-
tags/2.2.4/assets/images/help-screenshots (added)
-
tags/2.2.4/assets/images/help-screenshots/first-steps-1.jpg (added)
-
tags/2.2.4/assets/images/help-screenshots/first-steps-2.jpg (added)
-
tags/2.2.4/assets/images/help-screenshots/first-steps-3.jpg (added)
-
tags/2.2.4/assets/images/help-screenshots/first-steps-4.jpg (added)
-
tags/2.2.4/assets/images/help-screenshots/first-steps-5.jpg (added)
-
tags/2.2.4/assets/images/help-screenshots/first-steps-6.jpg (added)
-
tags/2.2.4/assets/images/help-screenshots/first-steps-7.jpg (added)
-
tags/2.2.4/assets/images/icons (added)
-
tags/2.2.4/assets/images/icons/document-question-48x48.png (added)
-
tags/2.2.4/assets/images/logos (added)
-
tags/2.2.4/assets/images/logos/ai-for-seo-full-logo.png (added)
-
tags/2.2.4/assets/images/logos/ai-for-seo-logo-256x256.png (added)
-
tags/2.2.4/assets/images/logos/ai-for-seo-logo-32x32.png (added)
-
tags/2.2.4/assets/images/logos/ai-for-seo-logo-64x64.png (added)
-
tags/2.2.4/assets/images/logos/ai-for-seo-logo-animated-512x512.gif (added)
-
tags/2.2.4/assets/images/logos/ai-for-seo.svg (added)
-
tags/2.2.4/assets/js (added)
-
tags/2.2.4/assets/js/ai-for-seo-alt-text-injection.js (added)
-
tags/2.2.4/assets/js/ai-for-seo-scripts.js (added)
-
tags/2.2.4/changelog.txt (added)
-
tags/2.2.4/includes (added)
-
tags/2.2.4/includes/ajax (added)
-
tags/2.2.4/includes/ajax/display (added)
-
tags/2.2.4/includes/ajax/display/attachment-attributes-editor.php (added)
-
tags/2.2.4/includes/ajax/display/import-settings-preview.php (added)
-
tags/2.2.4/includes/ajax/display/metadata-editor.php (added)
-
tags/2.2.4/includes/ajax/process (added)
-
tags/2.2.4/includes/ajax/process/export-settings.php (added)
-
tags/2.2.4/includes/ajax/process/generate-attachment-attributes.php (added)
-
tags/2.2.4/includes/ajax/process/generate-metadata.php (added)
-
tags/2.2.4/includes/ajax/process/import-settings.php (added)
-
tags/2.2.4/includes/ajax/process/save-anything-categories (added)
-
tags/2.2.4/includes/ajax/process/save-anything-categories/save-attachment-attributes-editor-values.php (added)
-
tags/2.2.4/includes/ajax/process/save-anything-categories/save-environmental-variables.php (added)
-
tags/2.2.4/includes/ajax/process/save-anything-categories/save-metadata-editor-values.php (added)
-
tags/2.2.4/includes/ajax/process/save-anything-categories/save-robhub-environmental-variables.php (added)
-
tags/2.2.4/includes/ajax/process/save-anything-categories/save-settings.php (added)
-
tags/2.2.4/includes/api (added)
-
tags/2.2.4/includes/api/class-robhub-api-communicator.php (added)
-
tags/2.2.4/includes/menu-frame.php (added)
-
tags/2.2.4/includes/modal_schemas (added)
-
tags/2.2.4/includes/modal_schemas/autoload-modal-schemas.php (added)
-
tags/2.2.4/includes/modal_schemas/customize-pay-as-you-go.php (added)
-
tags/2.2.4/includes/modal_schemas/export-import-settings.php (added)
-
tags/2.2.4/includes/modal_schemas/get-more-credits.php (added)
-
tags/2.2.4/includes/modal_schemas/select-credits-pack.php (added)
-
tags/2.2.4/includes/modal_schemas/seo-autopilot.php (added)
-
tags/2.2.4/includes/modal_schemas/tos.php (added)
-
tags/2.2.4/includes/pages (added)
-
tags/2.2.4/includes/pages/account.php (added)
-
tags/2.2.4/includes/pages/content_types (added)
-
tags/2.2.4/includes/pages/content_types/attachment.php (added)
-
tags/2.2.4/includes/pages/content_types/list-filters.php (added)
-
tags/2.2.4/includes/pages/content_types/post.php (added)
-
tags/2.2.4/includes/pages/dashboard.php (added)
-
tags/2.2.4/includes/pages/help.php (added)
-
tags/2.2.4/includes/pages/settings.php (added)
-
tags/2.2.4/readme.txt (added)
-
tags/2.2.4/wpml-config.xml (added)
-
trunk/ai-for-seo.php (modified) (51 diffs)
-
trunk/assets/js/ai-for-seo-scripts.js (modified) (3 diffs)
-
trunk/changelog.txt (modified) (1 diff)
-
trunk/includes/ajax/display/attachment-attributes-editor.php (modified) (4 diffs)
-
trunk/includes/ajax/display/metadata-editor.php (modified) (6 diffs)
-
trunk/includes/ajax/process/generate-attachment-attributes.php (modified) (1 diff)
-
trunk/includes/ajax/process/import-settings.php (modified) (7 diffs)
-
trunk/includes/menu-frame.php (modified) (4 diffs)
-
trunk/includes/modal_schemas/customize-pay-as-you-go.php (modified) (6 diffs)
-
trunk/includes/modal_schemas/export-import-settings.php (modified) (2 diffs)
-
trunk/includes/modal_schemas/get-more-credits.php (modified) (17 diffs)
-
trunk/includes/modal_schemas/select-credits-pack.php (modified) (3 diffs)
-
trunk/includes/modal_schemas/seo-autopilot.php (modified) (5 diffs)
-
trunk/includes/modal_schemas/tos.php (modified) (2 diffs)
-
trunk/includes/pages/account.php (modified) (15 diffs)
-
trunk/includes/pages/content_types/attachment.php (modified) (8 diffs)
-
trunk/includes/pages/content_types/post.php (modified) (7 diffs)
-
trunk/includes/pages/dashboard.php (modified) (35 diffs)
-
trunk/includes/pages/help.php (modified) (46 diffs)
-
trunk/includes/pages/settings.php (modified) (40 diffs)
-
trunk/readme.txt (modified) (10 diffs)
Legend:
- Unmodified
- Added
- Removed
-
ai-for-seo/trunk/ai-for-seo.php
r3408847 r3420851 4 4 Plugin URI: https://aiforseo.ai 5 5 Description: One-Click SEO solution. "AI for SEO" helps your website to rank higher in Web Search results. 6 Version: 2.2. 36 Version: 2.2.4 7 7 Author: spacecodes 8 8 Author URI: https://spa.ce.codes … … 26 26 // ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ \\ 27 27 28 const AI4SEO_PLUGIN_VERSION_NUMBER = "2.2. 3";28 const AI4SEO_PLUGIN_VERSION_NUMBER = "2.2.4"; 29 29 const AI4SEO_PLUGIN_NAME = "AI for SEO"; 30 30 const AI4SEO_PLUGIN_DESCRIPTION = 'One-Click SEO solution. "AI for SEO" helps your website to rank higher in Web Search results.'; … … 110 110 return [ 111 111 [ 112 'date' => 'December 10th, 2025', 113 'version' => '2.2.4', 114 'important' => true, 115 'updates' => [ 116 'Bug Fixes & Maintenance: Fixed 5 minor bugs and implemented 3 usability improvements.', 117 ], 118 ], 119 [ 112 120 'date' => 'December 3rd, 2025', 113 121 'version' => '2.2.3', 114 122 'important' => true, 115 123 'updates' => [ 116 'Bug Fixes & Maintenance: Fixed 7 minor bugs and implemented 2 usability improvements.' 124 'Bug Fixes & Maintenance: Fixed 7 minor bugs and implemented 2 usability improvements.', 117 125 ], 118 126 ], … … 2762 2770 return array(); 2763 2771 } 2764 2772 2765 2773 $ai4seo_icon = "<img class='ai4seo-icon ai4seo-24x24-icon' src='" . esc_url(ai4seo_get_ai_for_seo_logo_url("32x32")) . "' alt='" . esc_attr(AI4SEO_PLUGIN_NAME) . "' /><span style='display: none'>" . esc_html(AI4SEO_PLUGIN_NAME) . "</span>"; 2766 2774 return array_merge($columns, [AI4SEO_PLUGIN_IDENTIFIER => $ai4seo_icon]); … … 2782 2790 2783 2791 if ($column_name == AI4SEO_PLUGIN_IDENTIFIER) { 2784 echo ai4seo_wp_kses(ai4seo_get_edit_metadata_button($post_id));2792 ai4seo_echo_wp_kses(ai4seo_get_edit_metadata_button($post_id)); 2785 2793 } 2786 2794 } … … 3415 3423 function ai4seo_get_title_attribute_value(int $attachment_id, string $setting_value, array &$cache ) { 3416 3424 $cache_key = $setting_value; 3417 3425 3418 3426 if ( isset( $cache[ $attachment_id ][ $cache_key ] ) ) { 3419 3427 return $cache[ $attachment_id ][ $cache_key ]; … … 3524 3532 */ 3525 3533 function ai4seo_apply_possible_fallbacks(int $post_id, string $metadata_identifier, array &$our_metadata, array $visited_metadata_identifiers = array()): void { 3526 if (ai4seo_prevent_loops(__FUNCTION__ )) {3534 if (ai4seo_prevent_loops(__FUNCTION__, 5, 100)) { 3527 3535 error_log('AI4SEO: Prevented infinite loop in ' . __FUNCTION__); 3528 3536 return; … … 5146 5154 * @return bool True if the loop should be prevented, false otherwise 5147 5155 */ 5148 function ai4seo_prevent_loops(string $function_name, int $max_depth = 1, int $max_calls = 99999): bool {5156 function ai4seo_prevent_loops(string $function_name, int $max_depth = 1, int $max_calls = 22222): bool { 5149 5157 static $call_counts = []; 5150 5158 … … 5156 5164 $max_calls = 1; 5157 5165 } 5158 5166 5159 5167 // Initialize call count if not exists 5160 5168 if (!isset($call_counts[$function_name])) { 5161 5169 $call_counts[$function_name] = 0; 5162 5170 } 5163 5171 5164 5172 // Increment global call count 5165 5173 $call_counts[$function_name]++; 5166 5174 5167 5175 // Check max calls 5168 5176 if ($call_counts[$function_name] > $max_calls) { … … 5174 5182 return false; 5175 5183 } 5176 5184 5177 5185 // Check recursion depth 5178 5186 $backtrace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS); 5179 5187 $depth = 0; 5180 5188 5181 5189 // Iterate through backtrace to count occurrences of the function 5182 5190 foreach ($backtrace as $trace) { … … 5185 5193 } 5186 5194 } 5187 5195 5188 5196 // The current call is included in the backtrace, so depth is at least 1. 5189 5197 // If max_depth is 1, we want to prevent ANY recursion (i.e., if depth > 1). 5190 5198 // If max_depth is 2, we allow 2 recursive call (depth 2). 5191 5199 // So we return true if depth > $max_depth 5192 5200 5193 5201 if ($depth > $max_depth) { 5194 5202 return true; 5195 5203 } 5196 5204 5197 5205 return false; 5198 5206 } … … 5823 5831 // =========================================================================================== \\ 5824 5832 5833 /** 5834 * Echoes the sanitized content using ai4seo_wp_kses. 5835 * 5836 * @param string $content The content to sanitize and echo. 5837 * @return void 5838 */ 5839 function ai4seo_echo_wp_kses(string $content): void { 5840 $allowed_html_tags_and_attributes = ai4seo_get_allowed_html_tags_and_attributes(); 5841 5842 echo wp_kses($content, $allowed_html_tags_and_attributes); 5843 } 5844 5845 // =========================================================================================== \\ 5846 5825 5847 function ai4seo_get_publicly_accessible_post_types(): array { 5826 5848 $excluded_post_types = array( … … 6800 6822 $can_get_image_size = false; 6801 6823 } 6802 6824 6803 6825 if (!$can_get_image_size) { 6804 6826 return array( … … 7274 7296 7275 7297 // Clear caches so core get_option() stays consistent. 7276 wp_cache_delete( $option_name, 'options' );7277 wp_cache_delete( 'alloptions', 'options' );7278 wp_cache_delete( 'notoptions', 'options' );7298 // wp_cache_delete( $option_name, 'options' ); 7299 // wp_cache_delete( 'alloptions', 'options' ); 7300 // wp_cache_delete( 'notoptions', 'options' ); 7279 7301 } catch (Throwable $e) { 7280 7302 return false; … … 7341 7363 7342 7364 // Clear caches so core get_option() stays consistent. 7343 wp_cache_delete( $option_name, 'options' );7344 wp_cache_delete( 'alloptions', 'options' );7345 wp_cache_delete( 'notoptions', 'options' );7365 // wp_cache_delete( $option_name, 'options' ); 7366 // wp_cache_delete( 'alloptions', 'options' ); 7367 // wp_cache_delete( 'notoptions', 'options' ); 7346 7368 7347 7369 return true; 7348 7370 } 7349 7350 7371 7351 7372 … … 8376 8397 8377 8398 $price_table = array(); 8378 8399 8379 8400 foreach ($active_meta_tags AS $this_active_meta_tag) { 8380 8401 if ($only_this_meta_tags && is_array($only_this_meta_tags) && !in_array($this_active_meta_tag, $only_this_meta_tags)) { … … 8724 8745 8725 8746 echo "<div class='ai4seo-chart-container'>"; 8726 echo "<h4>" . ai4seo_wp_kses($headline) . "</h4>"; 8747 echo "<h4>"; 8748 ai4seo_echo_wp_kses($headline); 8749 echo "</h4>"; 8727 8750 8728 8751 echo "<div class='ai4seo-half-donut-chart-container'>"; … … 8734 8757 8735 8758 echo "<div class='ai4seo-half-donut-chart-done' style='color: " . esc_attr($ai4seo_percentage_color) . ";'>"; 8736 echosprintf(8759 ai4seo_echo_wp_kses(sprintf( 8737 8760 esc_html__('%1$s/%2$s done', "ai-for-seo"), 8738 8761 esc_html($num_done), 8739 $posts_table_analysis_state !== 'completed' ? ai4seo_ wp_kses(ai4seo_get_svg_tag("gear", '', "ai4seo-spinning-icon ai4seo-gray-icon")) : esc_html($num_total)8740 ) ;8762 $posts_table_analysis_state !== 'completed' ? ai4seo_get_svg_tag("gear", '', "ai4seo-spinning-icon ai4seo-gray-icon") : esc_html($num_total) 8763 )); 8741 8764 echo "</div>"; 8742 8765 echo "</div>"; … … 8807 8830 8808 8831 echo "<div class='ai4seo-money-back-guarantee-quote'>"; 8809 echo ai4seo_wp_kses(sprintf(8832 ai4seo_echo_wp_kses(sprintf( 8810 8833 /* translators: %s is a clickable email address */ 8811 8834 __("We’re excited for you to experience *AI for SEO*. If you find a better price elsewhere, simply <a href='%s' target='_blank'>reach out</a>! We’ll match it.", "ai-for-seo"), … … 8822 8845 8823 8846 echo "<div class='ai4seo-money-back-guarantee-quote'>"; 8824 echo ai4seo_wp_kses(sprintf(8847 ai4seo_echo_wp_kses(sprintf( 8825 8848 /* translators: %s is a clickable email address */ 8826 __("During the first %u days after purchasing a subscription (Basic, Pro or Premium) or your first Credits Pack (5000 Credits or lower), if *AI for SEO* isn’t the best fit, simply <a href='%s' target='blank'>reach out</a>! We’ll happily refund %s of your money. No questions asked.", "ai-for-seo"),8849 __("During the first %u days after purchasing a subscription (Basic, Pro or Premium) or your first Credits Pack, if *AI for SEO* isn’t the best fit, simply <a href='%s' target='blank'>reach out</a>! We’ll happily refund %s of your money. No questions asked.", "ai-for-seo"), 8827 8850 AI4SEO_MONEY_BACK_GUARANTEE_DAYS, 8828 8851 esc_attr(AI4SEO_OFFICIAL_CONTACT_URL), … … 8847 8870 function ai4seo_echo_loading_icon_output() { 8848 8871 echo "<span class='ai4seo-hidden-loading-icon-holder'>"; 8849 echo ai4seo_wp_kses(ai4seo_get_svg_tag("rotate", __("Loading", "ai-for-seo"), "ai4seo-spinning-icon"));8872 ai4seo_echo_wp_kses(ai4seo_get_svg_tag("rotate", __("Loading", "ai-for-seo"), "ai4seo-spinning-icon")); 8850 8873 echo "</span>"; 8851 8874 } … … 9252 9275 echo "<li>"; 9253 9276 if ($metadata_credits_cost_per_post) { 9254 echo ai4seo_wp_kses(sprintf(9277 ai4seo_echo_wp_kses(sprintf( 9255 9278 __("Metadata per page/post/etc.: %s", "ai-for-seo"), 9256 9279 "<span class='ai4seo-credits-usage-badge'><strong>" . $metadata_credits_cost_per_post . "</strong> " … … 9259 9282 ); 9260 9283 9261 echo ai4seo_wp_kses(ai4seo_get_icon_with_tooltip_tag(sprintf(__("Your current generation setup: %s", "ai-for-seo"), esc_html(implode(", ", $active_meta_tags_names)))));9284 ai4seo_echo_wp_kses(ai4seo_get_icon_with_tooltip_tag(sprintf(__("Your current generation setup: %s", "ai-for-seo"), esc_html(implode(", ", $active_meta_tags_names))))); 9262 9285 } else { 9263 echo ai4seo_wp_kses(sprintf(9286 ai4seo_echo_wp_kses(sprintf( 9264 9287 __("No meta tags are currently active.", "ai-for-seo") 9265 9288 )); … … 9268 9291 echo "<li>"; 9269 9292 if ($attachment_attributes_credits_cost_per_attachment_post) { 9270 echo ai4seo_wp_kses(sprintf(9293 ai4seo_echo_wp_kses(sprintf( 9271 9294 __("Media attributes per image: %s", "ai-for-seo"), 9272 9295 "<span class='ai4seo-credits-usage-badge'><strong>" . $attachment_attributes_credits_cost_per_attachment_post . "</strong> " … … 9275 9298 ); 9276 9299 9277 echo ai4seo_wp_kses(ai4seo_get_icon_with_tooltip_tag(sprintf(__("Your current generation setup: %s", "ai-for-seo"), esc_html(implode(", ", $active_attachment_attribute_names)))));9300 ai4seo_echo_wp_kses(ai4seo_get_icon_with_tooltip_tag(sprintf(__("Your current generation setup: %s", "ai-for-seo"), esc_html(implode(", ", $active_attachment_attribute_names))))); 9278 9301 } else { 9279 echo ai4seo_wp_kses(sprintf(9302 ai4seo_echo_wp_kses(sprintf( 9280 9303 __("No media attributes are currently active.", "ai-for-seo") 9281 9304 )); … … 9285 9308 if ($credits_percentage <= 0) { 9286 9309 echo "<li class='ai4seo-red-message'>"; 9287 echo ai4seo_wp_kses(sprintf(9288 __("<strong>Note:</strong> Your Credits balance is insufficient to cover any additional content entry.", "ai-for-seo")9310 ai4seo_echo_wp_kses(sprintf( 9311 __("<strong>Note:</strong> Your Credits balance is insufficient to cover any additional AI generations.", "ai-for-seo") 9289 9312 )); 9290 9313 echo "</li>"; 9291 9314 } else if ($credits_percentage < 100) { 9292 9315 echo "<li class='ai4seo-red-message'>"; 9293 echo ai4seo_wp_kses(sprintf(9294 __("<strong>Note:</strong> Your Credits balance only covers approximately <strong>%s%%</strong> of the remaining entries.", "ai-for-seo"),9316 ai4seo_echo_wp_kses(sprintf( 9317 __("<strong>Note:</strong> Your Credits balance only covers approximately <strong>%s%%</strong> of the remaining pages / media files.", "ai-for-seo"), 9295 9318 esc_html($credits_percentage) 9296 9319 )); … … 9312 9335 echo "<div class='ai4seo-green-bubble ai4seo-discount-available-message'>"; 9313 9336 9314 echo ai4seo_wp_kses(ai4seo_get_svg_tag("gift", esc_attr__("Discount available!", "ai-for-seo"))) . " "; 9337 ai4seo_echo_wp_kses(ai4seo_get_svg_tag("gift", esc_attr__("Discount available!", "ai-for-seo"))); 9338 echo " "; 9315 9339 9316 9340 // with countdown … … 10431 10455 $metadata_suffixes = ai4seo_get_setting(AI4SEO_SETTING_METADATA_SUFFIXES); 10432 10456 $placeholder_replacements = ai4seo_get_metadata_placeholder_replacements($post_id); 10433 10457 10434 10458 foreach (AI4SEO_METADATA_DETAILS AS $this_metadata_identifier => $this_metadata_details) { 10435 10459 $this_to_generate = in_array($this_metadata_identifier, $generate_this_fields); … … 10571 10595 // Get the user's preference for image upload method 10572 10596 $image_upload_method = ai4seo_get_setting(AI4SEO_SETTING_IMAGE_UPLOAD_METHOD); 10573 10597 10574 10598 switch ($image_upload_method) { 10575 10599 case 'base64': 10576 10600 // User explicitly chose base64 - always encode and send image data directly 10577 10601 return true; 10578 10602 10579 10603 case 'url': 10580 10604 // User explicitly chose URL - always send the image URL 10581 10605 return false; 10582 10606 10583 10607 case 'auto': 10584 10608 default: … … 10883 10907 } 10884 10908 } 10885 10909 10886 10910 // API CALL WITH BASE64 ENCODED IMAGE 10887 10911 if ($use_base64_image) { … … 10906 10930 } 10907 10931 10908 10932 10909 10933 // === ALL GOOD -> PROCEED TO SAVE the RESULTS ============================================================ \\ 10910 10934 … … 12282 12306 continue; 12283 12307 } 12284 12308 12285 12309 foreach ( $this_rows as $this_row ) { 12286 12310 $this_post_id = absint( $this_row['post_id'] ); … … 12815 12839 if (!$active_meta_tags || count($active_meta_tags) === 0) { 12816 12840 $percentage_of_active_metadata_by_post_ids = array(); 12817 12841 12818 12842 foreach ($post_ids as $this_post_id) { 12819 12843 $percentage_of_active_metadata_by_post_ids[$this_post_id] = 100; 12820 12844 } 12821 12845 12822 12846 return $percentage_of_active_metadata_by_post_ids; 12823 12847 } … … 12826 12850 // then compare it with the total amount of active meta tags 12827 12851 $num_available_metadata_by_post_ids = ai4seo_read_num_available_metadata_by_post_ids($post_ids); 12828 12852 12829 12853 $num_active_meta_tags = count($active_meta_tags); 12830 12854 12831 12855 $percentage_of_active_metadata_by_post_ids = array(); 12832 12856 … … 14903 14927 // Reset all failed attachment attributes by clearing the option 14904 14928 ai4seo_update_option(AI4SEO_FAILED_ATTACHMENT_ATTRIBUTES_POST_IDS_OPTION_NAME, json_encode(array())); 14905 14929 14906 14930 // Refresh the generation status summary 14907 14931 ai4seo_try_start_posts_table_analysis(true); … … 14925 14949 // Get the post type from the request 14926 14950 $post_type = sanitize_text_field($_POST['post_type'] ?? ''); 14927 14951 14928 14952 if (empty($post_type)) { 14929 14953 ai4seo_send_json_error(esc_html__('Post type is required', 'ai-for-seo'), 12109825); … … 14933 14957 // Remove all failed post IDs for this post type 14934 14958 ai4seo_remove_all_post_ids_by_post_type_and_generation_status($post_type, AI4SEO_FAILED_METADATA_POST_IDS_OPTION_NAME); 14935 14959 14936 14960 // Refresh the generation status summary 14937 14961 ai4seo_try_start_posts_table_analysis(true); … … 15133 15157 15134 15158 $stripe_email = sanitize_email($_POST["stripe_email"]); 15135 15159 15136 15160 // Validate email format 15137 15161 if (!filter_var($stripe_email, FILTER_VALIDATE_EMAIL)) { … … 15391 15415 $ai4seo_start_pattern = '<div class=\'ai4seo-cards-container ai4seo-dashboard\'>'; 15392 15416 $ai4seo_start_pos = strpos($ai4seo_dashboard_content, $ai4seo_start_pattern); 15393 15417 15394 15418 if ($ai4seo_start_pos !== false) { 15395 15419 // Find the content starting from after the opening tag 15396 15420 $ai4seo_content_start = $ai4seo_start_pos + strlen($ai4seo_start_pattern); 15397 15421 $ai4seo_content = substr($ai4seo_dashboard_content, $ai4seo_content_start); 15398 15422 15399 15423 // Find the last closing div tag (which should be the matching one) 15400 15424 $ai4seo_last_div_pos = strrpos($ai4seo_content, '</div>'); 15401 15425 15402 15426 if ($ai4seo_last_div_pos !== false) { 15403 15427 $ai4seo_inner_content = substr($ai4seo_content, 0, $ai4seo_last_div_pos); … … 15495 15519 echo "<img src='" . esc_url(ai4seo_get_ai_for_seo_logo_url("full")) . "' class='ai4seo-tos-plugin-logo ai4seo-modal-headline-icon'><br>"; 15496 15520 echo "<h1>" . esc_html(__("Terms of Service", "ai-for-seo")) . "</h1>"; 15497 echo ai4seo_wp_kses(ai4seo_get_tos_toc_and_pp_accepted_time_output()) . " "; 15521 ai4seo_echo_wp_kses(ai4seo_get_tos_toc_and_pp_accepted_time_output()); 15522 echo " "; 15498 15523 echo "</center><br>"; 15499 15524 15500 15525 echo "<div class='ai4seo-tos-version-number'>" . esc_html($latest_tos_and_toc_and_pp_version) . "</div>"; 15501 echo ai4seo_wp_kses(get_tos_content());15526 ai4seo_echo_wp_kses(get_tos_content()); 15502 15527 $content = ob_get_clean(); 15503 15528 … … 16769 16794 */ 16770 16795 function ai4seo_push_notification(string $notification_index, string $message, bool $force = false, array $additional_fields = array()): bool { 16771 if (ai4seo_prevent_loops(__FUNCTION__ )) {16796 if (ai4seo_prevent_loops(__FUNCTION__, 1, 10)) { 16772 16797 error_log('AI4SEO: Prevented infinite loop in ' . __FUNCTION__); 16773 16798 return false; … … 16870 16895 * Function to auto-dismiss expired notifications and get displayable notifications 16871 16896 * @param bool $skip_num_displayable_notification_condition Whether to skip the condition that checks the number of displayable notifications to prevent loops 16897 * @param bool $refresh_unread_count Whether to refresh the unread notifications counter after auto-dismissing or deleting notifications 16872 16898 * @return array Array of notifications that should be displayed (not dismissed and not expired) 16873 16899 */ 16874 function ai4seo_get_displayable_notifications(bool $skip_num_displayable_notification_condition = false ): array {16900 function ai4seo_get_displayable_notifications(bool $skip_num_displayable_notification_condition = false, bool $refresh_unread_count = true): array { 16875 16901 if (ai4seo_prevent_loops(__FUNCTION__, 3)) { 16876 16902 error_log('AI4SEO: Prevented infinite loop in ' . __FUNCTION__); … … 16941 16967 if ($made_changes) { 16942 16968 ai4seo_update_option(AI4SEO_NOTIFICATIONS_OPTION_NAME, $notifications); 16943 ai4seo_refresh_unread_notifications_count(); 16969 16970 if ($refresh_unread_count) { 16971 ai4seo_refresh_unread_notifications_count(); 16972 } 16944 16973 } 16945 16974 … … 16991 17020 16992 17021 // the message 16993 echo ai4seo_wp_kses(ai4seo_filter_notification_message($message, $notification_index, $notification));17022 ai4seo_echo_wp_kses(ai4seo_filter_notification_message($message, $notification_index, $notification)); 16994 17023 16995 17024 // Add footer … … 16998 17027 if ($notification_buttons) { 16999 17028 echo '<div class="ai4seo-buttons-wrapper">'; 17000 echo ai4seo_wp_kses($notification_buttons);17029 ai4seo_echo_wp_kses($notification_buttons); 17001 17030 echo '</div>'; 17002 17031 } … … 17123 17152 // Show a "Customize PAYG" Button 17124 17153 if ($show_customize_payg_button) { 17125 $notification_buttons .= ai4seo_ wp_kses(ai4seo_get_button_text_link_tag("#", "sliders", esc_html__("Customize Pay-As-You-Go", "ai-for-seo"), "", "ai4seo_handle_open_customize_payg_modal();"));17154 $notification_buttons .= ai4seo_get_button_text_link_tag("#", "sliders", esc_html__("Customize Pay-As-You-Go", "ai-for-seo"), "", "ai4seo_handle_open_customize_payg_modal();"); 17126 17155 } 17127 17156 17128 17157 // Show a "Increase Budget" Button (same as customize payg) 17129 17158 if ($show_increase_payg_budget_button) { 17130 $notification_buttons .= ai4seo_ wp_kses(ai4seo_get_button_text_link_tag("#", "sliders", esc_html__("Increase Budget", "ai-for-seo"), "", "ai4seo_handle_open_customize_payg_modal();"));17159 $notification_buttons .= ai4seo_get_button_text_link_tag("#", "sliders", esc_html__("Increase Budget", "ai-for-seo"), "", "ai4seo_handle_open_customize_payg_modal();"); 17131 17160 } 17132 17161 … … 17158 17187 // Show a lost licence key button 17159 17188 if ($show_lost_licence_key_button) { 17160 $notification_buttons .= ai4seo_ wp_kses(ai4seo_get_button_text_link_tag("#", "key-slash", esc_html__("Lost your license data?", "ai-for-seo"), "", "ai4seo_open_lost_key_modal();"));17189 $notification_buttons .= ai4seo_get_button_text_link_tag("#", "key-slash", esc_html__("Lost your license data?", "ai-for-seo"), "", "ai4seo_open_lost_key_modal();"); 17161 17190 } 17162 17191 … … 17401 17430 } 17402 17431 17403 $displayable_notifications = ai4seo_get_displayable_notifications( );17432 $displayable_notifications = ai4seo_get_displayable_notifications(false, false); 17404 17433 17405 17434 $ai4seo_unread_count = 0; … … 18103 18132 /* Translators: %1$s is replaced with bold text. */ 18104 18133 $messages[] = sprintf( 18105 __("However, there is still room for improvement. <strong>AI for SEO</strong> can further assist by generating data for %s.", "ai-for-seo"),18134 __("However, there is still room for improvement. <strong>AI for SEO</strong> has found missing or problematic data in %s. Please check the statistics below and consider generating the missing data to enhance your SEO performance.", "ai-for-seo"), 18106 18135 '<strong>' . esc_html($missing_post_types_complete_string) . '</strong>' 18107 18136 ); … … 18743 18772 $html .= "<li>" . __("I will ensure that my use of the plugin complies with all applicable laws and regulations in my jurisdiction.", "ai-for-seo") . "</li>"; 18744 18773 $html .= "<li>" . sprintf(__("I understand that using certain features within the plugin will consume Credits based on the specific feature. If higher-than-expected credit consumption occurs due to user actions, whether intentional or unintentional, Credits cannot be refunded or reversed unless %s determines the user was not responsible. However, the right to a 100%% refund within the 14-day money-back guarantee period still applies under these circumstances.", "ai-for-seo"), AI4SEO_PLUGIN_AUTHOR_COMPANY_ABBREVIATION) . "</li>"; 18745 $html .= "<li>" . __("I may request a full refund within 14 days of the initial purchase if not satisfied with the plugin’s performance, as outlined in our money-back guarantee policy. This refund policy applies only to monthly and yearly renewable subscriptions and does not cover Custom Credits Packs or Pay-as-you-go purchases.", "ai-for-seo") . "</li>";18774 $html .= "<li>" . __("I may request a full refund within 14 days of the first purchase if not satisfied with the plugin’s performance, as outlined in our money-back guarantee policy. This refund policy applies only to the first purchase of either a subscription or Credits Pack. A refund for any purchases beyond the first one is excluded.", "ai-for-seo") . "</li>"; 18746 18775 $html .= "</ol>"; 18747 18776 … … 18881 18910 */ 18882 18911 function ai4seo_send_additional_tos_accept_details() { 18912 if (!ai4seo_is_user_inside_our_plugin_admin_pages()) { 18913 return; 18914 } 18915 18883 18916 // Make sure that the user is allowed to use this plugin 18884 18917 if (!ai4seo_can_manage_this_plugin()) { -
ai-for-seo/trunk/assets/js/ai-for-seo-scripts.js
r3408847 r3420851 1531 1531 if (ai4seo_exists_$($tooltip_holder)) { 1532 1532 // add tooltips functionality 1533 $tooltip_holder.hover( 1534 function (event) { 1535 let $this_tooltip_child = jQuery(this).find('.ai4seo-tooltip'); 1536 1537 if (!ai4seo_exists_$($this_tooltip_child)) { 1538 console.warn('AI for SEO: element \"$this_tooltip_child\" missing in ai4seo_init_tooltips() \u2014 cannot prepare tooltip content.'); 1539 return; 1540 } 1541 1542 ai4seo_show_tooltip($this_tooltip_child, event); 1543 }, 1544 function () { 1545 let $this_tooltip = jQuery(this).find('.ai4seo-tooltip'); 1546 1547 if (!ai4seo_exists_$($this_tooltip)) { 1548 console.warn('AI for SEO: element \"$this_tooltip\" missing in ai4seo_init_tooltips() \u2014 cannot initialize tooltip content.'); 1549 return; 1550 } 1551 1552 $this_tooltip.fadeOut(200); 1553 } 1554 ); 1555 1556 $tooltip_holder.click(function (event) { 1533 $tooltip_holder.on('mouseenter', function (event) { 1534 let $this_tooltip_child = jQuery(this).find('.ai4seo-tooltip'); 1535 1536 if (!ai4seo_exists_$($this_tooltip_child)) { 1537 console.warn('AI for SEO: element \"$this_tooltip_child\" missing in ai4seo_init_tooltips() — cannot prepare tooltip content.'); 1538 return; 1539 } 1540 1541 ai4seo_show_tooltip($this_tooltip_child, event); 1542 }); 1543 1544 $tooltip_holder.on('mouseleave', function () { 1545 let $this_tooltip = jQuery(this).find('.ai4seo-tooltip'); 1546 1547 if (!ai4seo_exists_$($this_tooltip)) { 1548 console.warn('AI for SEO: element \"$this_tooltip\" missing in ai4seo_init_tooltips() — cannot initialize tooltip content.'); 1549 return; 1550 } 1551 1552 $this_tooltip.fadeOut(200); 1553 }); 1554 1555 $tooltip_holder.on('click', function (event) { 1557 1556 event.stopPropagation(); // Prevent the event from propagating to the document 1558 1557 let $this_tooltip_child = jQuery(this).find('.ai4seo-tooltip'); … … 1578 1577 1579 1578 if (ai4seo_exists_$($tooltips)) { 1580 $tooltips. click(function (event) {1579 $tooltips.on('click', function (event) { 1581 1580 // close tooltip upon click 1582 1581 event.stopPropagation(); // Prevent the event from propagating to the document … … 1588 1587 1589 1588 // Click event on the document to close all tooltips 1590 jQuery(document). click(function (event) {1589 jQuery(document).on('click', function (event) { 1591 1590 // close tooltip upon click 1592 1591 event.stopPropagation(); // Prevent the event from propagating to the document -
ai-for-seo/trunk/changelog.txt
r3408847 r3420851 1 1 == Changelog == 2 3 = 2.2.4 = 4 * Bug Fixes & Maintenance: Fixed 5 minor bugs and implemented 3 usability improvements. 2 5 3 6 = 2.2.3 = -
ai-for-seo/trunk/includes/ajax/display/attachment-attributes-editor.php
r3395515 r3420851 100 100 echo "</div>"; 101 101 102 echo "<div class='ai4seo-modal-sub-headline'>" . ai4seo_wp_kses(sprintf(__("Manage media attributes for <b>%s</b> (#%d)", "ai-for-seo"), $ai4seo_this_post_attachment_attributes["title"], $ai4seo_this_attachment_post_id)) . "</div>"; 102 echo "<div class='ai4seo-modal-sub-headline'>"; 103 104 ai4seo_echo_wp_kses( 105 sprintf( 106 __("Manage media attributes for <b>%s</b> (#%d)", "ai-for-seo"), 107 $ai4seo_this_post_attachment_attributes["title"], 108 $ai4seo_this_attachment_post_id 109 ) 110 ); 111 112 echo "</div>"; 103 113 104 114 if (!$ai4seo_active_attachment_attributes) { 105 115 echo esc_html(__("No media attributes are active. Please activate at least one media attribute in the plugin settings to manage media attributes.", "ai-for-seo")); 106 116 echo "<br><br>"; 107 echo ai4seo_wp_kses(ai4seo_get_button_text_link_tag($ai4seo_settings_url, "gear", __("Settings", "ai-for-seo"), "ai4seo-primary-button"));117 ai4seo_echo_wp_kses(ai4seo_get_button_text_link_tag($ai4seo_settings_url, "gear", __("Settings", "ai-for-seo"), "ai4seo-primary-button")); 108 118 return; 109 119 } … … 154 164 // Icon 155 165 if (isset($ai4seo_this_attachment_attribute_details["icon"])) { 156 echo ai4seo_wp_kses(ai4seo_get_svg_tag($ai4seo_this_attachment_attribute_details["icon"], "", "ai4seo-24x24-icon ai4seo-gray-icon")) . " "; 166 ai4seo_echo_wp_kses(ai4seo_get_svg_tag($ai4seo_this_attachment_attribute_details["icon"], "", "ai4seo-24x24-icon ai4seo-gray-icon")); 167 echo " "; 157 168 } 158 169 … … 161 172 162 173 // Tooltip 163 echo ai4seo_wp_kses(ai4seo_get_icon_with_tooltip_tag($ai4seo_this_attachment_attribute_details["hint"]));174 ai4seo_echo_wp_kses(ai4seo_get_icon_with_tooltip_tag($ai4seo_this_attachment_attribute_details["hint"])); 164 175 echo "</label>"; 165 176 … … 192 203 echo "<div class='ai4seo-form-item' style='margin-top: 0; padding-top: 0;'>"; 193 204 echo "<div class='ai4seo-yellow-message' style='margin-top: 10px;'>"; 194 echo ai4seo_wp_kses(205 ai4seo_echo_wp_kses( 195 206 sprintf( 196 207 __("<strong>Note:</strong> The following media attributes are currently inactive and not shown in this editor: %s. You can activate them in the <a href='%s' target='_blank'>plugin settings</a>.", "ai-for-seo"), -
ai-for-seo/trunk/includes/ajax/display/metadata-editor.php
r3395515 r3420851 86 86 echo "</div>"; 87 87 88 echo "<div class='ai4seo-modal-sub-headline'>" . ai4seo_wp_kses(sprintf(__("Manage metadata for <b>%s</b> (#%d)", "ai-for-seo"), $ai4seo_this_post_title, $ai4seo_post_id)) . "</div>"; 88 echo "<div class='ai4seo-modal-sub-headline'>"; 89 90 ai4seo_echo_wp_kses( 91 sprintf( 92 __("Manage metadata for <b>%s</b> (#%d)", "ai-for-seo"), 93 $ai4seo_this_post_title, 94 $ai4seo_post_id 95 ) 96 ); 97 98 echo "</div>"; 89 99 90 100 if (!$ai4seo_active_meta_tags) { 91 101 echo esc_html(__("No meta tags are active. Please activate at least one meta tag in the plugin settings to manage metadata.", "ai-for-seo")); 92 102 echo "<br><br>"; 93 echo ai4seo_wp_kses(ai4seo_get_button_text_link_tag($ai4seo_settings_url, "gear", __("Settings", "ai-for-seo"), "ai4seo-primary-button"));103 ai4seo_echo_wp_kses(ai4seo_get_button_text_link_tag($ai4seo_settings_url, "gear", __("Settings", "ai-for-seo"), "ai4seo-primary-button")); 94 104 return; 95 105 } … … 128 138 echo "<label for='" . esc_attr($ai4seo_this_metadata_input_name) . "'>"; 129 139 if (isset($ai4seo_this_metadata_details["icon"])) { 130 echo ai4seo_wp_kses(ai4seo_get_svg_tag($ai4seo_this_metadata_details["icon"], "", "ai4seo-24x24-icon ai4seo-gray-icon")) . " "; 140 ai4seo_echo_wp_kses(ai4seo_get_svg_tag($ai4seo_this_metadata_details["icon"], "", "ai4seo-24x24-icon ai4seo-gray-icon")); 141 echo " "; 131 142 } 132 143 … … 134 145 135 146 // Tooltip 136 echo ai4seo_wp_kses(ai4seo_get_icon_with_tooltip_tag($ai4seo_this_metadata_details["hint"]));147 ai4seo_echo_wp_kses(ai4seo_get_icon_with_tooltip_tag($ai4seo_this_metadata_details["hint"])); 137 148 138 149 // Heads up for the focus-keyphrase: If meta-title or meta-description already got a value, … … 156 167 157 168 // tooltip 158 echo ai4seo_wp_kses(ai4seo_get_icon_with_tooltip_tag(__("Prefix and suffix are added automatically when the page is rendered. Please do not include them in this input field.", "ai-for-seo")));169 ai4seo_echo_wp_kses(ai4seo_get_icon_with_tooltip_tag(__("Prefix and suffix are added automatically when the page is rendered. Please do not include them in this input field.", "ai-for-seo"))); 159 170 echo "</span><br>"; 160 171 } … … 176 187 177 188 // tooltip 178 echo ai4seo_wp_kses(ai4seo_get_icon_with_tooltip_tag(__("Prefix and suffix are added automatically when the page is rendered. Please do not include them in this input field.", "ai-for-seo")));189 ai4seo_echo_wp_kses(ai4seo_get_icon_with_tooltip_tag(__("Prefix and suffix are added automatically when the page is rendered. Please do not include them in this input field.", "ai-for-seo"))); 179 190 echo "</span><br>"; 180 191 } … … 192 203 echo "<div class='ai4seo-form-item' style='margin-top: 0; padding-top: 0;'>"; 193 204 echo "<div class='ai4seo-yellow-message' style='margin-top: 10px;'>"; 194 echo ai4seo_wp_kses(205 ai4seo_echo_wp_kses( 195 206 sprintf( 196 207 __("<strong>Note:</strong> The following meta tags are currently inactive and not shown in this editor: %s. You can activate them in the <a href='%s' target='_blank'>plugin settings</a>.", "ai-for-seo"), -
ai-for-seo/trunk/includes/ajax/process/generate-attachment-attributes.php
r3408847 r3420851 60 60 61 61 if (!is_array($ai4seo_generation_fields) || count($ai4seo_generation_fields) === 0) { 62 ai4seo_send_json_error(esc_html__("Generation fields are invalid.", "ai-for-seo"), 1 613301025);62 ai4seo_send_json_error(esc_html__("Generation fields are invalid.", "ai-for-seo"), 1713301026); 63 63 } 64 64 -
ai-for-seo/trunk/includes/ajax/process/import-settings.php
r3395515 r3420851 211 211 if (!empty($ai4seo_invalid_settings) || $ai4seo_got_unknown_category_entries) { 212 212 echo "<div class='ai4seo-medium-gap'>"; 213 echo ai4seo_wp_kses(ai4seo_get_svg_tag("triangle-exclamation")) . " "; 213 ai4seo_echo_wp_kses(ai4seo_get_svg_tag("triangle-exclamation")); 214 echo " "; 214 215 echo esc_html__("ATTENTION: Some settings are invalid or belong to unknown categories and cannot be imported. However, the valid settings can be imported.", "ai-for-seo"); 215 216 echo "</div>"; … … 217 218 } else { 218 219 echo "<div class='ai4seo-medium-gap'>"; 219 echo ai4seo_wp_kses(ai4seo_get_svg_tag("circle-check")) . " "; 220 ai4seo_echo_wp_kses(ai4seo_get_svg_tag("circle-check")); 221 echo " "; 220 222 echo esc_html__("Your settings are up-to-date and no changes were detected.", "ai-for-seo"); 221 223 echo "</div>"; … … 223 225 } else { 224 226 echo "<div class='ai4seo-medium-gap'>"; 225 echo ai4seo_wp_kses(ai4seo_get_svg_tag("triangle-exclamation")) . " "; 227 ai4seo_echo_wp_kses(ai4seo_get_svg_tag("triangle-exclamation")); 228 echo " "; 226 229 echo esc_html__("No valid settings found for import.", "ai-for-seo"); 227 230 echo "</div>"; … … 259 262 } 260 263 261 echo "<h3 style='margin-top: 3rem;'>" . ai4seo_wp_kses($this_label) . "</h3>"; 264 echo "<h3 style='margin-top: 3rem;'>"; 265 ai4seo_echo_wp_kses($this_label); 266 echo "</h3>"; 262 267 echo "<ul>"; 263 268 … … 273 278 // invalid settings are shown with a strikethrough 274 279 if ($ai4seo_is_unknown_category || in_array($ai4seo_this_setting_name, $ai4seo_invalid_settings)) { 275 echo "<li style='text-decoration: line-through; color: red;'>- " . ai4seo_wp_kses(ai4seo_get_svg_tag("triangle-exclamation")) . " "; 280 echo "<li style='text-decoration: line-through; color: red;'>- "; 281 ai4seo_echo_wp_kses(ai4seo_get_svg_tag("triangle-exclamation")); 282 echo " "; 276 283 } else { 277 284 $ai4seo_this_got_any_valid_changes = true; … … 290 297 echo "<strong>" . esc_html($ai4seo_this_setting_name) . ":</strong> "; 291 298 echo "<span style='color: #888; text-decoration: line-through;'>"; 292 echo ai4seo_wp_kses($ai4seo_this_current_setting_value);299 ai4seo_echo_wp_kses($ai4seo_this_current_setting_value); 293 300 echo "</span> → "; 294 301 295 echo ai4seo_wp_kses($ai4seo_this_setting_new_value);;302 ai4seo_echo_wp_kses($ai4seo_this_setting_new_value); 296 303 297 304 echo "</li>"; … … 302 309 if (!$ai4seo_this_got_any_valid_changes) { 303 310 echo "<div class='ai4seo-medium-gap'>"; 304 echo ai4seo_wp_kses(ai4seo_get_svg_tag("circle-check")) . " "; 311 ai4seo_echo_wp_kses(ai4seo_get_svg_tag("circle-check")); 312 echo " "; 305 313 echo esc_html__("No changes were detected in this settings category.", "ai-for-seo"); 306 314 echo "</div>"; -
ai-for-seo/trunk/includes/menu-frame.php
r3408847 r3420851 97 97 // toggle button 98 98 echo "<button class='ai4seo-mobile-top-bar-toggle-button' onclick='ai4seo_toggle_sidebar();'>"; 99 echo ai4seo_wp_kses(ai4seo_get_svg_tag("bars-sort"));99 ai4seo_echo_wp_kses(ai4seo_get_svg_tag("bars-sort")); 100 100 echo "</button>"; 101 101 … … 155 155 156 156 echo "<a href='" . esc_url($ai4seo_this_page_url) . "' class='nav-tab ai4seo-menu-item" . ($ai4seo_this_page_is_active ? " nav-tab-active ai4seo-active-menu-item" : "") . "'>"; 157 echo ai4seo_wp_kses($ai4seo_this_menu_item_icon);157 ai4seo_echo_wp_kses($ai4seo_this_menu_item_icon); 158 158 echo "<div>"; 159 159 echo esc_html($ai4seo_this_menu_item_label); … … 165 165 // Media page 166 166 echo "<a href='" . esc_url($ai4seo_media_page_url) . "' class='nav-tab ai4seo-menu-item" . ($ai4seo_active_plugin_page == "media" ? " nav-tab-active ai4seo-active-menu-item" : "") . "'>"; 167 echo ai4seo_wp_kses(ai4seo_get_dashicon_tag_for_navigation("attachment"));167 ai4seo_echo_wp_kses(ai4seo_get_dashicon_tag_for_navigation("attachment")); 168 168 echo "<span>"; 169 169 echo esc_html(_n("Media", "Media", 2, "ai-for-seo")); … … 174 174 // Account page 175 175 echo "<a href='" . esc_url($ai4seo_account_page_url) . "' class='nav-tab ai4seo-menu-item" . ($ai4seo_active_plugin_page == "account" ? " nav-tab-active ai4seo-active-menu-item" : "") . "'>"; 176 echo ai4seo_wp_kses(ai4seo_get_svg_tag("key", "", "ai4seo-menu-item-icon"));176 ai4seo_echo_wp_kses(ai4seo_get_svg_tag("key", "", "ai4seo-menu-item-icon")); 177 177 echo "<span>"; 178 178 echo esc_html__("Account", "ai-for-seo"); -
ai-for-seo/trunk/includes/modal_schemas/customize-pay-as-you-go.php
r3408847 r3420851 91 91 $ai4seo_this_prefixed_input_id = ai4seo_get_prefixed_input_name(AI4SEO_SETTING_PAYG_STRIPE_PRICE_ID); 92 92 93 $ai4seo_this_setting_description = esc_html__("The amount of Credits that will be automatically purchased whenever your Credits balance falls below the threshold.", "ai-for-seo"); 93 $ai4seo_this_setting_description = sprintf( 94 esc_html__("The amount of Credits that will be automatically purchased whenever your Credits balance falls below the threshold of %s Credits.", "ai-for-seo"), 95 "<strong>" . esc_html(AI4SEO_PAYG_CREDITS_THRESHOLD) . "</strong>" 96 ); 94 97 95 98 echo "<div class='ai4seo-form-item'>"; … … 118 121 119 122 // Description 120 /*echo "<p class='ai4seo-form-item-description'>";121 echo ai4seo_wp_kses($ai4seo_this_setting_description);122 echo "</p>"; */123 echo "<p class='ai4seo-form-item-description'>"; 124 ai4seo_echo_wp_kses($ai4seo_this_setting_description); 125 echo "</p>"; 123 126 echo "</div>"; 124 127 echo "</div>"; … … 140 143 // Description 141 144 echo "<p class='ai4seo-form-item-description'>"; 142 echo ai4seo_wp_kses(esc_html__('Add at least the price of the selected Credits Pack and an additional 25% to account for potential taxes and fees.', 'ai-for-seo'));145 ai4seo_echo_wp_kses(esc_html__('Add at least the price of the selected Credits Pack and an additional 25% to account for potential taxes and fees.', 'ai-for-seo')); 143 146 echo "</p>"; 144 147 echo "</div>"; … … 161 164 // Description 162 165 echo "<p class='ai4seo-form-item-description'>"; 163 echo ai4seo_wp_kses(esc_html__('Add at least the price of the selected Credits Pack and an additional 25% to account for potential taxes and fees.', 'ai-for-seo'));166 ai4seo_echo_wp_kses(esc_html__('Add at least the price of the selected Credits Pack and an additional 25% to account for potential taxes and fees.', 'ai-for-seo')); 164 167 echo "</p>"; 165 168 echo "</div>"; … … 184 187 echo "</li>"; 185 188 echo "<li>"; 186 echo ai4seo_wp_kses(sprintf(189 ai4seo_echo_wp_kses(sprintf( 187 190 __("I will never spend more than %s within a <strong>24-hour period</strong>.", "ai-for-seo"), 188 191 "<strong>" . esc_html($ai4seo_used_currency_uppercase) . " <span id='ai4seo-payg-summary-daily-budget'>" . esc_html(number_format_i18n($ai4seo_payg_daily_budget, 2)) . "</span></strong>", 189 192 )); 190 echo ai4seo_wp_kses(ai4seo_get_icon_with_tooltip_tag(esc_html__("Including manually purchased Credits packs.", "ai-for-seo")));191 echo "</li>"; 192 echo "<li>"; 193 echo ai4seo_wp_kses(sprintf(193 ai4seo_echo_wp_kses(ai4seo_get_icon_with_tooltip_tag(esc_html__("Including manually purchased Credits packs.", "ai-for-seo"))); 194 echo "</li>"; 195 echo "<li>"; 196 ai4seo_echo_wp_kses(sprintf( 194 197 __("I will never spend more than %s per <strong>calendar month</strong>.", "ai-for-seo"), 195 198 "<strong>" . esc_html($ai4seo_used_currency_uppercase) . " <span id='ai4seo-payg-summary-monthly-budget'>" . esc_html(number_format_i18n($ai4seo_payg_monthly_budget, 2)) . "</span></strong>", 196 199 )); 197 echo ai4seo_wp_kses(ai4seo_get_icon_with_tooltip_tag(esc_html__("Including manually purchased Credits packs. Resets on the 1st of each month, CET – Central European Time.", "ai-for-seo")));200 ai4seo_echo_wp_kses(ai4seo_get_icon_with_tooltip_tag(esc_html__("Including manually purchased Credits packs. Resets on the 1st of each month, CET – Central European Time.", "ai-for-seo"))); 198 201 echo "</li>"; 199 202 echo "<li>"; … … 232 235 233 236 echo "<div class='ai4seo-modal-schema-footer'>"; 234 echo ai4seo_wp_kses(ai4seo_get_button_text_link_tag("#", "", esc_html__("Close", "ai-for-seo"), "ai4seo-abort-button", "ai4seo_close_modal_by_child(this)"));237 ai4seo_echo_wp_kses(ai4seo_get_button_text_link_tag("#", "", esc_html__("Close", "ai-for-seo"), "ai4seo-abort-button", "ai4seo_close_modal_by_child(this)")); 235 238 236 239 if ($ai4seo_is_payg_enabled) { 237 echo ai4seo_wp_kses(ai4seo_get_button_text_link_tag("#", "", esc_html__("Submit", "ai-for-seo"), "ai4seo-success-button", "ai4seo_handle_payg_submit(this);"));240 ai4seo_echo_wp_kses(ai4seo_get_button_text_link_tag("#", "", esc_html__("Submit", "ai-for-seo"), "ai4seo-success-button", "ai4seo_handle_payg_submit(this);")); 238 241 } else { 239 echo ai4seo_wp_kses(ai4seo_get_button_text_link_tag("#", "", esc_html__("Enable P-A-Y-G", "ai-for-seo"), "ai4seo-success-button", "ai4seo_handle_payg_submit(this);"));242 ai4seo_echo_wp_kses(ai4seo_get_button_text_link_tag("#", "", esc_html__("Enable P-A-Y-G", "ai-for-seo"), "ai4seo-success-button", "ai4seo_handle_payg_submit(this);")); 240 243 } 241 244 -
ai-for-seo/trunk/includes/modal_schemas/export-import-settings.php
r3395515 r3420851 34 34 // Headline 35 35 echo "<h2>"; 36 echo ai4seo_wp_kses(ai4seo_get_svg_tag("file-arrow-down"));36 ai4seo_echo_wp_kses(ai4seo_get_svg_tag("file-arrow-down")); 37 37 echo esc_html__("Export Settings", "ai-for-seo"); 38 38 echo "</h2>"; … … 53 53 // Headline 54 54 echo "<h2>"; 55 echo ai4seo_wp_kses(ai4seo_get_svg_tag("file-arrow-up"));55 ai4seo_echo_wp_kses(ai4seo_get_svg_tag("file-arrow-up")); 56 56 echo esc_html__("Import Settings", "ai-for-seo"); 57 57 echo "</h2>"; -
ai-for-seo/trunk/includes/modal_schemas/get-more-credits.php
r3408847 r3420851 143 143 144 144 // Upgrade button 145 echo ai4seo_wp_kses(ai4seo_get_button_text_link_tag(145 ai4seo_echo_wp_kses(ai4seo_get_button_text_link_tag( 146 146 $ai4seo_purchase_plan_url, 147 147 "list", … … 154 154 // PAID PLAN 155 155 echo "<div class='ai4seo-subscription-badge'>"; 156 echo ai4seo_wp_kses(ai4seo_get_svg_tag("circle-check", "", "ai4seo-dark-green-icon") . " ");156 ai4seo_echo_wp_kses(ai4seo_get_svg_tag("circle-check", "", "ai4seo-dark-green-icon") . " "); 157 157 echo sprintf( 158 158 esc_html__("Subscribed to %s.", "ai-for-seo"), … … 175 175 if ($ai4seo_robhub_subscription_end_timestamp > strtotime("+1 month") || $ai4seo_robhub_subscription_do_renew) { 176 176 echo "<li>"; 177 echo ai4seo_wp_kses(sprintf(177 ai4seo_echo_wp_kses(sprintf( 178 178 __("Next %s Credits on: %s.", "ai-for-seo"), 179 179 "<strong>" . esc_html(ai4seo_get_plan_credits($ai4seo_robhub_subscription_plan)) . "</strong>", … … 187 187 // infos about renewing the plan 188 188 if ($ai4seo_robhub_subscription_do_renew) { 189 echo ai4seo_wp_kses(sprintf(189 ai4seo_echo_wp_kses(sprintf( 190 190 __("Your subscription renews on: %s (%s).", "ai-for-seo"), 191 191 "<strong>" . esc_html($ai4seo_current_subscription_end_formatted_text) . "</strong>", … … 212 212 echo "</ol>"; 213 213 214 echo ai4seo_wp_kses(ai4seo_get_button_text_link_tag(AI4SEO_STRIPE_BILLING_URL, "stripe", esc_html__("Manage Subscription", "ai-for-seo"), "ai4seo-success-button", "ai4seo_track_subscription_pricing_visit();", "_blank"));214 ai4seo_echo_wp_kses(ai4seo_get_button_text_link_tag(AI4SEO_STRIPE_BILLING_URL, "stripe", esc_html__("Manage Subscription", "ai-for-seo"), "ai4seo-success-button", "ai4seo_track_subscription_pricing_visit();", "_blank")); 215 215 } 216 216 echo "</div>"; … … 245 245 echo "<strong><span class='ai4seo-red-message'>" . esc_html__("Please subscribe to a plan first to purchase a Credits Pack.", "ai-for-seo") . "</span></strong><br>"; 246 246 } else { 247 echo ai4seo_wp_kses(ai4seo_get_button_text_link_tag("#", "list", esc_html__("See options", "ai-for-seo"), "ai4seo-success-button", "ai4seo_handle_open_select_credits_pack_modal();"));247 ai4seo_echo_wp_kses(ai4seo_get_button_text_link_tag("#", "list", esc_html__("See options", "ai-for-seo"), "ai4seo-success-button", "ai4seo_handle_open_select_credits_pack_modal();")); 248 248 } 249 249 … … 287 287 // info on $ai4seo_payg_status 288 288 if ($ai4seo_is_payg_enabled) { 289 echo ai4seo_wp_kses(ai4seo_get_small_button_tag("#", "rotate", __("Refresh", "ai-for-seo"), "", "ai4seo_refresh_robhub_account(this); return false;"));289 ai4seo_echo_wp_kses(ai4seo_get_small_button_tag("#", "rotate", __("Refresh", "ai-for-seo"), "", "ai4seo_refresh_robhub_account(this); return false;")); 290 290 291 291 echo "<p>"; … … 293 293 if ($ai4seo_payg_status == 'idle' || $ai4seo_payg_status == 'payment-received') { 294 294 if ($ai4seo_robhub_credits_balance >= AI4SEO_PAYG_CREDITS_THRESHOLD) { 295 echo ai4seo_wp_kses(ai4seo_get_svg_tag("hourglass-start")) . " "; 295 ai4seo_echo_wp_kses(ai4seo_get_svg_tag("hourglass-start")); 296 echo " "; 296 297 echo "<strong>" . esc_html__("Refill threshold not reached.", "ai-for-seo") . "</strong> "; 297 298 echo sprintf( … … 300 301 ) . " "; 301 302 } else { 302 echo ai4seo_wp_kses(ai4seo_get_svg_tag("gear", "", "ai4seo-spinning-icon")) . " "; 303 ai4seo_echo_wp_kses(ai4seo_get_svg_tag("gear", "", "ai4seo-spinning-icon")); 304 echo " "; 303 305 echo "<strong>" . esc_html__("Low Credits.", "ai-for-seo") . "</strong> "; 304 306 echo sprintf( … … 308 310 } 309 311 } else if ($ai4seo_payg_status == 'processing') { 310 echo ai4seo_wp_kses(ai4seo_get_svg_tag("gear", "", "ai4seo-spinning-icon")) . " "; 312 ai4seo_echo_wp_kses(ai4seo_get_svg_tag("gear", "", "ai4seo-spinning-icon")); 313 echo " "; 311 314 echo "<strong>" . esc_html__("Refill in progress.", "ai-for-seo") . "</strong> "; 312 315 echo esc_html__("This will complete shortly.", "ai-for-seo") . " "; 313 316 } else if ($ai4seo_payg_status == 'payment-pending') { 314 echo ai4seo_wp_kses(ai4seo_get_svg_tag("hourglass-start")) . " "; 317 ai4seo_echo_wp_kses(ai4seo_get_svg_tag("hourglass-start")); 318 echo " "; 315 319 echo "<strong>" . esc_html__("Payment pending.", "ai-for-seo") . "</strong> "; 316 320 echo esc_html__("The refill will complete once the payment is confirmed. If it takes longer than an hour, check your payment method or contact support", "ai-for-seo") . " "; … … 318 322 } else if ($ai4seo_payg_status == 'payment-failed') { 319 323 echo "<span class='ai4seo-red-message'>"; 320 echo ai4seo_wp_kses(ai4seo_get_svg_tag("triangle-exclamation", "", "ai4seo-red-icon")) . " "; 324 ai4seo_echo_wp_kses(ai4seo_get_svg_tag("triangle-exclamation", "", "ai4seo-red-icon")); 325 echo " "; 321 326 echo "<strong>" . esc_html__("Refill failed.", "ai-for-seo") . "</strong> "; 322 327 echo esc_html__("Please check your payment method and try again.", "ai-for-seo") . " "; … … 324 329 } else if ($ai4seo_payg_status == 'error') { 325 330 echo "<span class='ai4seo-red-message'>"; 326 echo ai4seo_wp_kses(ai4seo_get_svg_tag("triangle-exclamation", "", "ai4seo-red-icon")) . " "; 331 ai4seo_echo_wp_kses(ai4seo_get_svg_tag("triangle-exclamation", "", "ai4seo-red-icon")); 332 echo " "; 327 333 echo "<strong>" . esc_html__("Refill failed.", "ai-for-seo") . "</strong> "; 328 334 echo esc_html__("Try again or contact support.", "ai-for-seo") . " "; … … 330 336 } else if ($ai4seo_payg_status == 'budget-limit-reached') { 331 337 echo "<span class='ai4seo-red-message'>"; 332 echo ai4seo_wp_kses(ai4seo_get_svg_tag("triangle-exclamation", "", "ai4seo-red-icon") . " ");338 ai4seo_echo_wp_kses(ai4seo_get_svg_tag("triangle-exclamation", "", "ai4seo-red-icon") . " "); 333 339 echo esc_html__("Daily or monthly budget limit reached. Increase your limit to enable further refills.", "ai-for-seo") . " "; 334 340 echo "</span>"; … … 339 345 340 346 if ($ai4seo_has_purchased_something) { 341 echo ai4seo_wp_kses(ai4seo_get_button_text_link_tag("#", "sliders", esc_html__("Customize", "ai-for-seo"), "ai4seo-success-button", "ai4seo_handle_open_customize_payg_modal();"));347 ai4seo_echo_wp_kses(ai4seo_get_button_text_link_tag("#", "sliders", esc_html__("Customize", "ai-for-seo"), "ai4seo-success-button", "ai4seo_handle_open_customize_payg_modal();")); 342 348 } else { 343 echo ai4seo_wp_kses(ai4seo_get_button_text_link_tag("#", "sliders", esc_html__("Customize", "ai-for-seo"), "ai4seo-inactive-button", "ai4seo_open_notification_modal('" . esc_js(esc_html__("Please purchase a Credits Pack or a subscription first.", "ai-for-seo")) . "');"));349 ai4seo_echo_wp_kses(ai4seo_get_button_text_link_tag("#", "sliders", esc_html__("Customize", "ai-for-seo"), "ai4seo-inactive-button", "ai4seo_open_notification_modal('" . esc_js(esc_html__("Please purchase a Credits Pack or a subscription first.", "ai-for-seo")) . "');")); 344 350 } 345 351 346 352 if ($ai4seo_is_payg_enabled) { 347 echo ai4seo_wp_kses(ai4seo_get_button_text_link_tag("#", "", esc_html__("Disable", "ai-for-seo"), "ai4seo-abort-button ai4seo-gap-left", "ai4seo_disable_payg(this);"));353 ai4seo_echo_wp_kses(ai4seo_get_button_text_link_tag("#", "", esc_html__("Disable", "ai-for-seo"), "ai4seo-abort-button ai4seo-gap-left", "ai4seo_disable_payg(this);")); 348 354 } 349 355 } else { … … 378 384 $ai4seo_free_plan_credits_amount = ai4seo_get_plan_credits("free"); 379 385 380 echo ai4seo_wp_kses(sprintf(386 ai4seo_echo_wp_kses(sprintf( 381 387 __("We provide you with <strong>%s free Credits each day</strong> if your balance falls below %s Credits. Simply keep using the plugin to receive them automatically.", "ai-for-seo"), 382 388 esc_html(AI4SEO_DAILY_FREE_CREDITS_AMOUNT), … … 386 392 echo "<br><br>"; 387 393 $ai4seo_next_free_credits_seconds_left = ai4seo_get_time_difference_in_seconds($ai4seo_next_free_credits_timestamp); 388 echo ai4seo_wp_kses(sprintf(394 ai4seo_echo_wp_kses(sprintf( 389 395 __('Next <span class="ai4seo-credits-usage-badge">+%1$s Credits</span> in <strong>%2$s</strong> if your balance falls below %3$s Credits.', 'ai-for-seo'), 390 396 esc_html(AI4SEO_DAILY_FREE_CREDITS_AMOUNT), … … 403 409 404 410 echo "<div class='ai4seo-modal-schema-footer'>"; 405 echo ai4seo_wp_kses(ai4seo_get_button_text_link_tag("#", "", esc_html__("Close", "ai-for-seo"), "ai4seo-abort-button", "ai4seo_close_modal_by_child(this)"));411 ai4seo_echo_wp_kses(ai4seo_get_button_text_link_tag("#", "", esc_html__("Close", "ai-for-seo"), "ai4seo-abort-button", "ai4seo_close_modal_by_child(this)")); 406 412 echo "</div>"; -
ai-for-seo/trunk/includes/modal_schemas/select-credits-pack.php
r3399672 r3420851 66 66 echo "<br>"; 67 67 echo esc_html__("Enter this voucher code during checkout to apply the discount: ", "ai-for-seo") . "<br>"; 68 echo ai4seo_wp_kses(ai4seo_get_voucher_code_output($ai4seo_current_discount["voucher_code"]));68 ai4seo_echo_wp_kses(ai4seo_get_voucher_code_output($ai4seo_current_discount["voucher_code"])); 69 69 } 70 70 … … 144 144 if (count($ai4seo_credits_packs) > 3) { 145 145 echo "<center>"; 146 echo ai4seo_wp_kses(ai4seo_get_small_button_tag("#", "angle-down", __("Show more options", "ai-for-seo") . " " . ai4seo_get_svg_tag("angle-down"), "ai4seo-credits-pack-show-more-options-button", "jQuery(this).parent().hide();jQuery(this).parent().next().show();"));146 ai4seo_echo_wp_kses(ai4seo_get_small_button_tag("#", "angle-down", __("Show more options", "ai-for-seo") . " " . ai4seo_get_svg_tag("angle-down"), "ai4seo-credits-pack-show-more-options-button", "jQuery(this).parent().hide();jQuery(this).parent().next().show();")); 147 147 echo "</center>"; 148 148 echo "<div style='display: none;'>"; … … 209 209 210 210 echo "<div class='ai4seo-modal-schema-footer'>"; 211 echo ai4seo_wp_kses(ai4seo_get_button_text_link_tag("#", "", esc_html__("Close", "ai-for-seo"), "ai4seo-abort-button", "ai4seo_close_modal_by_child(this)"));212 echo ai4seo_wp_kses(ai4seo_get_button_text_link_tag("#", "", esc_html__("Continue", "ai-for-seo"), "ai4seo-success-button", "ai4seo_handle_select_credits_pack(this);"));211 ai4seo_echo_wp_kses(ai4seo_get_button_text_link_tag("#", "", esc_html__("Close", "ai-for-seo"), "ai4seo-abort-button", "ai4seo_close_modal_by_child(this)")); 212 ai4seo_echo_wp_kses(ai4seo_get_button_text_link_tag("#", "", esc_html__("Continue", "ai-for-seo"), "ai4seo-success-button", "ai4seo_handle_select_credits_pack(this);")); 213 213 echo "</div>"; -
ai-for-seo/trunk/includes/modal_schemas/seo-autopilot.php
r3395515 r3420851 86 86 echo "<div class='ai4seo-generated-data-reminder-container'>"; 87 87 echo "<strong>"; 88 echo ai4seo_wp_kses(ai4seo_get_svg_tag("circle-check", "", "ai4seo-dark-green-icon")) . " "; 88 ai4seo_echo_wp_kses(ai4seo_get_svg_tag("circle-check", "", "ai4seo-dark-green-icon")); 89 echo " "; 89 90 echo esc_html($ai4seo_generated_entries_message); 90 91 echo "</strong>"; 91 echo ai4seo_wp_kses($ai4seo_remove_generated_data_sentence);92 echo ai4seo_wp_kses(ai4seo_get_icon_with_tooltip_tag($ai4seo_reset_generated_data_tooltip));92 ai4seo_echo_wp_kses($ai4seo_remove_generated_data_sentence); 93 ai4seo_echo_wp_kses(ai4seo_get_icon_with_tooltip_tag($ai4seo_reset_generated_data_tooltip)); 93 94 94 95 echo "<div id='ai4seo-remove-generated-data-action-container' class='ai4seo-remove-generated-data-action-container ai4seo-display-none'>"; 95 96 echo "<button type='button' id='ai4seo-autopilot-remove-generated-data-button' class='ai4seo-button ai4seo-lockable ai4seo-danger-button ai4seo-remove-generated-data-button' onclick='ai4seo_confirm_autopilot_remove_generated_data();'>"; 96 echo ai4seo_wp_kses(ai4seo_get_svg_tag("triangle-exclamation", "", "ai4seo-red-icon")) . " "; 97 ai4seo_echo_wp_kses(ai4seo_get_svg_tag("triangle-exclamation", "", "ai4seo-red-icon")); 98 echo " "; 97 99 echo esc_html__("Remove all AI-generated data", "ai-for-seo"); 98 100 echo "</button>"; … … 101 103 // invisible tooltip info that is used inside the confirmation modal 102 104 echo "<div id='ai4seo-autopilot-reset-generated-data-info' class='ai4seo-display-none'>"; 103 echo ai4seo_wp_kses($ai4seo_reset_generated_data_tooltip);105 ai4seo_echo_wp_kses($ai4seo_reset_generated_data_tooltip); 104 106 echo "</div>"; 105 107 echo "</div>"; 106 108 } else { 107 109 # hint to check settings first 108 echo ai4seo_wp_kses(ai4seo_get_svg_tag("triangle-exclamation", "", "ai4seo-red-icon")) . " "; 109 echo ai4seo_wp_kses(sprintf( 110 ai4seo_echo_wp_kses(ai4seo_get_svg_tag("triangle-exclamation", "", "ai4seo-red-icon")); 111 echo " "; 112 ai4seo_echo_wp_kses(sprintf( 110 113 __("Before starting the SEO Autopilot for the first time, ensure that the <a href='%s'>plugin settings</a> are configured correctly.", "ai-for-seo"), 111 114 esc_url(ai4seo_get_subpage_url("settings")) … … 137 140 138 141 echo "<div class='ai4seo-bulk-generation-modal-checkbox-container ai4seo-checkbox-container'>"; 139 echo ai4seo_wp_kses($ai4seo_this_post_type_icon);142 ai4seo_echo_wp_kses($ai4seo_this_post_type_icon); 140 143 echo "<input type='checkbox' id='ai4seo-bulk-generation-checkbox-" . esc_attr($ai4seo_this_supported_post_type) . "' name='" . esc_attr($ai4seo_this_bulk_generation_setting_name) . "[]' value='" . esc_attr($ai4seo_this_supported_post_type) . "'" . ($ai4seo_this_post_type_is_checked ? " checked" : "") . ">"; 141 144 echo "<label for='" . esc_attr($ai4seo_this_bulk_generation_setting_name) . "'>"; … … 182 185 echo esc_html__("Generate metadata for:", "ai-for-seo"); 183 186 echo " "; 184 echo ai4seo_wp_kses(ai4seo_get_icon_with_tooltip_tag(esc_html__("Choose whether to generate metadata for existing entries, newly created entries, or both. Changing this setting marks all current entries as 'existing', while any entries created afterward are considered 'new'. This distinction is refreshed each time the setting is changed, except for direct swaps between 'New entries only' and 'Existing entries only'.", "ai-for-seo")));187 ai4seo_echo_wp_kses(ai4seo_get_icon_with_tooltip_tag(esc_html__("Choose whether to generate metadata for existing entries, newly created entries, or both. Changing this setting marks all current entries as 'existing', while any entries created afterward are considered 'new'. This distinction is refreshed each time the setting is changed, except for direct swaps between 'New entries only' and 'Existing entries only'.", "ai-for-seo"))); 185 188 echo "</span> "; 186 189 echo "</label>"; … … 260 263 261 264 echo "<div class='ai4seo-modal-schema-footer'>"; 262 echo ai4seo_wp_kses(ai4seo_get_button_text_link_tag("#", "", esc_html__("Close", "ai-for-seo"), "ai4seo-abort-button", "ai4seo_close_modal_by_child(this);"));265 ai4seo_echo_wp_kses(ai4seo_get_button_text_link_tag("#", "", esc_html__("Close", "ai-for-seo"), "ai4seo-abort-button", "ai4seo_close_modal_by_child(this);")); 263 266 if ($ai4seo_is_any_bulk_generation_enabled) { 264 echo ai4seo_wp_kses(ai4seo_get_button_text_link_tag("#", "", esc_html__("Update SEO Autopilot", "ai-for-seo"), "ai4seo-success-button", "ai4seo_start_bulk_generation(this);"));267 ai4seo_echo_wp_kses(ai4seo_get_button_text_link_tag("#", "", esc_html__("Update SEO Autopilot", "ai-for-seo"), "ai4seo-success-button", "ai4seo_start_bulk_generation(this);")); 265 268 } else { 266 echo ai4seo_wp_kses(ai4seo_get_button_text_link_tag("#", "", esc_html__("Start SEO Autopilot", "ai-for-seo"), "ai4seo-success-button", "ai4seo_start_bulk_generation(this);"));269 ai4seo_echo_wp_kses(ai4seo_get_button_text_link_tag("#", "", esc_html__("Start SEO Autopilot", "ai-for-seo"), "ai4seo-success-button", "ai4seo_start_bulk_generation(this);")); 267 270 } 268 271 echo "</div>"; -
ai-for-seo/trunk/includes/modal_schemas/tos.php
r3338367 r3420851 72 72 73 73 if ($tos_content) { 74 echo ai4seo_wp_kses($tos_content);74 ai4seo_echo_wp_kses($tos_content); 75 75 } else { 76 76 echo "<p>" . esc_html__("The Terms of Service could not be loaded. Please try again later.", "ai-for-seo") . "</p>"; … … 94 94 echo "<input type='checkbox' class='ai4seo-accept-enhanced-reporting-checkbox' id='ai4seo-accept-enhanced-reporting-checkbox' name='ai4seo-accept-enhanced-reporting-checkbox' value='1'>"; 95 95 echo "<label for='ai4seo-accept-enhanced-reporting-checkbox'><strong>" . esc_html__("I agree to share extended data to support the ongoing development of the plugin. I may opt out at any time.", "ai-for-seo") . " (" . esc_html__("optional", "ai-for-seo") . ")" . "</strong></label>"; 96 echo ai4seo_wp_kses(ai4seo_get_icon_with_tooltip_tag($ai4seo_extended_data_collection_tooltip_text));96 ai4seo_echo_wp_kses(ai4seo_get_icon_with_tooltip_tag($ai4seo_extended_data_collection_tooltip_text)); 97 97 echo "</div>"; 98 98 } -
ai-for-seo/trunk/includes/pages/account.php
r3395515 r3420851 140 140 // Button to reveal license-key 141 141 echo "<div class='ai4seo-form-floating-textfield-icon-holder' onclick='jQuery(\"#ai4seo-visual-license-key-holder\").hide();jQuery(\"#ai4seo-actual-license-key-holder\").show();jQuery(this).hide();jQuery(this).next().show();'>"; 142 echo ai4seo_wp_kses(ai4seo_get_svg_tag("eye", __("Reveal License Key", "ai-for-seo")));142 ai4seo_echo_wp_kses(ai4seo_get_svg_tag("eye", __("Reveal License Key", "ai-for-seo"))); 143 143 echo "</div>"; 144 144 145 145 // Button to hide license-key 146 146 echo "<div class='ai4seo-form-floating-textfield-icon-holder ai4seo-display-none' onclick='jQuery(\"#ai4seo-visual-license-key-holder\").show();jQuery(\"#ai4seo-actual-license-key-holder\").hide();jQuery(this).hide();jQuery(this).prev().show();'>"; 147 echo ai4seo_wp_kses(ai4seo_get_svg_tag("eye-slash", __("Hide License Key", "ai-for-seo")));147 ai4seo_echo_wp_kses(ai4seo_get_svg_tag("eye-slash", __("Hide License Key", "ai-for-seo"))); 148 148 echo "</div>"; 149 149 } … … 159 159 echo "<div class='ai4seo-buttons-wrapper' style='margin-top: 0; margin-bottom: 5px;'>"; 160 160 // Button to show lost-license-instructions 161 echo ai4seo_wp_kses(ai4seo_get_button_text_link_tag("#", "key-slash", esc_html__("Lost your license data?", "ai-for-seo"), "", "ai4seo_open_lost_key_modal();"));161 ai4seo_echo_wp_kses(ai4seo_get_button_text_link_tag("#", "key-slash", esc_html__("Lost your license data?", "ai-for-seo"), "", "ai4seo_open_lost_key_modal();")); 162 162 163 163 // Button to manage subscription if user has an active subscription 164 164 if (!$ai4seo_user_is_on_free_plan) { 165 echo ai4seo_wp_kses(ai4seo_get_button_text_link_tag(AI4SEO_STRIPE_BILLING_URL, "stripe", esc_html__("Manage Subscription", "ai-for-seo"), "", "", "_blank"));165 ai4seo_echo_wp_kses(ai4seo_get_button_text_link_tag(AI4SEO_STRIPE_BILLING_URL, "stripe", esc_html__("Manage Subscription", "ai-for-seo"), "", "", "_blank")); 166 166 } 167 167 168 168 // Customize pay-as-you-go 169 169 if ($ai4seo_has_purchased_something && $ai4seo_is_robhub_account_synced) { 170 echo ai4seo_wp_kses(ai4seo_get_button_text_link_tag("#", "sliders", esc_html__("Customize Pay-As-You-Go", "ai-for-seo"), "", "ai4seo_handle_open_customize_payg_modal();"));170 ai4seo_echo_wp_kses(ai4seo_get_button_text_link_tag("#", "sliders", esc_html__("Customize Pay-As-You-Go", "ai-for-seo"), "", "ai4seo_handle_open_customize_payg_modal();")); 171 171 } 172 172 173 173 // Button to manage credits 174 174 if ($ai4seo_is_robhub_account_synced) { 175 echo ai4seo_wp_kses(ai4seo_get_button_text_link_tag("#", "arrow-up-right-from-square", esc_html__("Get more Credits", "ai-for-seo"), "", "ai4seo_open_get_more_credits_modal();"));175 ai4seo_echo_wp_kses(ai4seo_get_button_text_link_tag("#", "arrow-up-right-from-square", esc_html__("Get more Credits", "ai-for-seo"), "", "ai4seo_open_get_more_credits_modal();")); 176 176 } 177 177 echo "</div>"; … … 214 214 // Description 215 215 echo "<p class='ai4seo-form-item-description'>"; 216 echo ai4seo_wp_kses($ai4seo_this_setting_description);216 ai4seo_echo_wp_kses($ai4seo_this_setting_description); 217 217 echo "</p>"; 218 218 echo "</div>"; … … 237 237 // Description 238 238 echo "<p class='ai4seo-form-item-description'>"; 239 echo ai4seo_wp_kses($ai4seo_this_setting_description);239 ai4seo_echo_wp_kses($ai4seo_this_setting_description); 240 240 echo "</p>"; 241 241 echo "</div>"; … … 256 256 $ai4seo_this_prefixed_input_id = ai4seo_get_prefixed_input_name(AI4SEO_SETTING_INSTALLED_PLUGINS_PLUGIN_NAME); 257 257 258 $ai4seo_this_setting_description = ai4seo_wp_kses(sprintf(258 $ai4seo_this_setting_description = sprintf( 259 259 __("Here you can define the plugin name that will be shown on the <a href='%s'>installed plugins page</a> of your website.", "ai-for-seo"), 260 260 esc_url(admin_url("plugins.php")) 261 ) );261 ); 262 262 263 263 echo "<div class='ai4seo-form-item'>"; … … 269 269 // Description 270 270 echo "<p class='ai4seo-form-item-description'>"; 271 echo ai4seo_wp_kses($ai4seo_this_setting_description);271 ai4seo_echo_wp_kses($ai4seo_this_setting_description); 272 272 echo "</p>"; 273 273 echo "</div>"; … … 281 281 $ai4seo_this_prefixed_input_id = ai4seo_get_prefixed_input_name(AI4SEO_SETTING_INSTALLED_PLUGINS_PLUGIN_DESCRIPTION); 282 282 283 $ai4seo_this_setting_description = ai4seo_wp_kses(sprintf(283 $ai4seo_this_setting_description = sprintf( 284 284 __("Here you can define the plugin description that will be shown on the <a href='%s'>installed plugins page</a> of your website.", "ai-for-seo"), 285 285 esc_url(admin_url("plugins.php")) 286 ) );286 ); 287 287 288 288 echo "<div class='ai4seo-form-item'>"; … … 294 294 // Description 295 295 echo "<p class='ai4seo-form-item-description'>"; 296 echo ai4seo_wp_kses($ai4seo_this_setting_description);296 ai4seo_echo_wp_kses($ai4seo_this_setting_description); 297 297 echo "</p>"; 298 298 echo "</div>"; … … 317 317 // Description 318 318 echo "<p class='ai4seo-form-item-description'>"; 319 echo ai4seo_wp_kses($ai4seo_this_setting_description);319 ai4seo_echo_wp_kses($ai4seo_this_setting_description); 320 320 echo "</p>"; 321 321 echo "</div>"; … … 346 346 // Description 347 347 echo "<p class='ai4seo-form-item-description'>"; 348 echo ai4seo_wp_kses($ai4seo_this_setting_description);348 ai4seo_echo_wp_kses($ai4seo_this_setting_description); 349 349 echo "</p>"; 350 350 echo "</div>"; … … 369 369 // Description 370 370 echo "<p class='ai4seo-form-item-description'>"; 371 echo ai4seo_wp_kses($ai4seo_this_setting_description);371 ai4seo_echo_wp_kses($ai4seo_this_setting_description); 372 372 echo "</p>"; 373 373 echo "</div>"; … … 398 398 if (ai4seo_does_user_need_to_accept_tos_toc_and_pp(false)) { 399 399 echo "<button type='button' class='button ai4seo-button' onclick='ai4seo_open_modal_from_schema(\"tos\", {modal_css_class: \"ai4seo-tos-modal\", modal_size: \"auto\"})'>"; 400 echo ai4seo_wp_kses(ai4seo_get_svg_tag("arrow-up-right-from-square")) . " "; 400 ai4seo_echo_wp_kses(ai4seo_get_svg_tag("arrow-up-right-from-square")); 401 echo " "; 401 402 echo esc_html__("Show Terms of Service", "ai-for-seo"); 402 403 echo "</button>"; 403 404 } else { 404 405 echo "<button type='button' class='button ai4seo-button ai4seo-lockable' onclick='ai4seo_open_ajax_modal(\"ai4seo_show_terms_of_service\", {}, {modal_size: \"small\"})'>"; 405 echo ai4seo_wp_kses(ai4seo_get_svg_tag("arrow-up-right-from-square")) . " "; 406 ai4seo_echo_wp_kses(ai4seo_get_svg_tag("arrow-up-right-from-square")); 407 echo " "; 406 408 echo esc_html__("Show Terms of Service", "ai-for-seo"); 407 409 echo "</button>"; … … 411 413 $latest_tos_and_toc_and_pp_version = ai4seo_get_latest_tos_and_toc_and_pp_version(); 412 414 echo esc_html(sprintf(__("Current version: %s", "ai-for-seo"), $latest_tos_and_toc_and_pp_version)) . ".<br><br>"; 413 echo ai4seo_wp_kses(ai4seo_get_tos_toc_and_pp_accepted_time_output());415 ai4seo_echo_wp_kses(ai4seo_get_tos_toc_and_pp_accepted_time_output()); 414 416 echo "</p>"; 415 417 echo "</div>"; … … 433 435 echo "<div style='max-width: 400px;'>"; 434 436 echo "<input type='checkbox' name='" . esc_attr($ai4seo_this_prefixed_input_id) . "' class='ai4seo-single-checkbox' " . ($ai4seo_did_user_accept_enhanced_reporting ? " checked='checked'" : "") . ">"; 435 echo "<label for='" . esc_attr($ai4seo_this_prefixed_input_id) . "'>" . esc_html__("I agree to share extended data to support the ongoing development of the plugin. I may opt out at any time.", "ai-for-seo") . ai4seo_wp_kses(ai4seo_get_icon_with_tooltip_tag($extended_data_collection_tooltip_text)) . "</label>"; 437 echo "<label for='" . esc_attr($ai4seo_this_prefixed_input_id) . "'>" . esc_html__("I agree to share extended data to support the ongoing development of the plugin. I may opt out at any time.", "ai-for-seo"); 438 ai4seo_echo_wp_kses(ai4seo_get_icon_with_tooltip_tag($extended_data_collection_tooltip_text)); 439 echo "</label>"; 436 440 echo "</div>"; 437 441 … … 440 444 if (!$ai4seo_did_user_accept_enhanced_reporting && $ai4seo_enhanced_reporting_revoke_timestamp) { 441 445 $ai4seo_readable_revoked_time = ai4seo_format_unix_timestamp($ai4seo_enhanced_reporting_revoke_timestamp); 442 echo ai4seo_wp_kses(ai4seo_get_svg_tag("square-xmark", "", "ai4seo-16x16-icon ai4seo-red-icon")) . " "; 446 ai4seo_echo_wp_kses(ai4seo_get_svg_tag("square-xmark", "", "ai4seo-16x16-icon ai4seo-red-icon")); 447 echo " "; 443 448 echo sprintf(esc_html__("Revoked on %s.", "ai-for-seo"), esc_html($ai4seo_readable_revoked_time)); 444 449 } else { 445 echo ai4seo_wp_kses(ai4seo_get_enhanced_reporting_accepted_time_output());450 ai4seo_echo_wp_kses(ai4seo_get_enhanced_reporting_accepted_time_output()); 446 451 } 447 452 echo "</p>"; -
ai-for-seo/trunk/includes/pages/content_types/attachment.php
r3408847 r3420851 80 80 } 81 81 82 $ai4seo_import_nextgen_gallery_button = ai4seo_wp_kses( 83 ai4seo_get_button_text_link_tag("#", "file-export", esc_html__("Import NextGen Gallery images ($ai4seo_num_not_imported_nextgen_gallery_images)", "ai-for-seo"), 82 $ai4seo_import_nextgen_gallery_button = ai4seo_get_button_text_link_tag("#", "file-export", esc_html__("Import NextGen Gallery images ($ai4seo_num_not_imported_nextgen_gallery_images)", "ai-for-seo"), 84 83 ($ai4seo_num_not_imported_nextgen_gallery_images ? "ai4seo-success-button" : "ai4seo-inactive-button"), 85 ($ai4seo_num_not_imported_nextgen_gallery_images ? "ai4seo_import_nextgen_gallery_images(this);" : "")) 86 ); 84 ($ai4seo_num_not_imported_nextgen_gallery_images ? "ai4seo_import_nextgen_gallery_images(this);" : "")); 85 87 86 } 88 87 … … 257 256 if (isset($ai4seo_import_nextgen_gallery_button) && $ai4seo_import_nextgen_gallery_button) { 258 257 echo "<div class='ai4seo-buttons-wrapper'>"; 259 echo ai4seo_wp_kses($ai4seo_import_nextgen_gallery_button);258 ai4seo_echo_wp_kses($ai4seo_import_nextgen_gallery_button); 260 259 echo "</div>"; 261 260 } 262 261 263 echo ai4seo_wp_kses($ai4seo_filter_form_html);262 ai4seo_echo_wp_kses($ai4seo_filter_form_html); 264 263 265 264 // Stop script if no posts have been found -> show message and stop page rendering … … 291 290 if (count($ai4seo_failed_attributes_attachment_post_ids)) { 292 291 echo "<div class='ai4seo-table-title-button'>"; 293 echo ai4seo_wp_kses($ai4seo_retry_all_failed_attachment_attributes_generations_link_tag);292 ai4seo_echo_wp_kses($ai4seo_retry_all_failed_attachment_attributes_generations_link_tag); 294 293 echo "</div>"; 295 294 } … … 434 433 // execute sooner link 435 434 if ($ai4seo_next_cron_job_call_diff >= 70) { 436 echo " " . ai4seo_wp_kses($ai4seo_execute_sooner_button); 435 echo " "; 436 ai4seo_echo_wp_kses($ai4seo_execute_sooner_button); 437 437 } else { 438 echo " " . ai4seo_wp_kses($ai4seo_refresh_button); 438 echo " "; 439 ai4seo_echo_wp_kses($ai4seo_refresh_button); 439 440 } 440 441 echo "</div>"; … … 443 444 echo esc_html__("Pending", "ai-for-seo") . "... "; 444 445 echo "(" . esc_html__("I'm probably optimizing a different entry.", "ai-for-seo") . ") "; 445 echo ai4seo_wp_kses($ai4seo_refresh_button);446 ai4seo_echo_wp_kses($ai4seo_refresh_button); 446 447 echo "</div>"; 447 448 } … … 449 450 echo "<div class='ai4seo-sub-info'>"; 450 451 echo esc_html__("Processing", "ai-for-seo") . "... "; 451 echo ai4seo_wp_kses($ai4seo_refresh_button);452 ai4seo_echo_wp_kses($ai4seo_refresh_button); 452 453 echo "</div>"; 453 454 } else if ($ai4seo_is_insufficient_credits) { 454 455 echo "<div class='ai4seo-sub-info ai4seo-red-message'>"; 455 456 echo esc_html__("Insufficient Credits", "ai-for-seo") . ". "; 456 echo ai4seo_wp_kses($ai4seo_consider_purchasing_more_credits_link_tag);457 ai4seo_echo_wp_kses($ai4seo_consider_purchasing_more_credits_link_tag); 457 458 echo "</div>"; 458 459 } else if ($ai4seo_is_attachment_post_failed && $ai4seo_this_attachment_attributes_is_not_finished) { 459 460 echo "<div class='ai4seo-seo-data-not-covered-message'>"; 460 461 echo "<span>" . esc_html__("Failed to automatically fill media attributes.", "ai-for-seo") . "</span> "; 461 echo ai4seo_wp_kses(ai4seo_get_small_button_tag("#", "arrow-up-right-from-square", __("Try it manually", "ai-for-seo"), "", "ai4seo_open_attachment_attributes_editor_modal(\"" . esc_html($ai4seo_this_post_attachment_id) . "\");"));462 ai4seo_echo_wp_kses(ai4seo_get_small_button_tag("#", "arrow-up-right-from-square", __("Try it manually", "ai-for-seo"), "", "ai4seo_open_attachment_attributes_editor_modal(\"" . esc_html($ai4seo_this_post_attachment_id) . "\");")); 462 463 echo "</div>"; 463 464 } else if ($ai4seo_is_excluded_by_new_or_existing_filter && $ai4seo_this_attachment_attributes_is_not_finished) { … … 485 486 echo "<td>"; 486 487 if ($ai4seo_active_attachment_attributes) { 487 echo ai4seo_wp_kses(ai4seo_get_edit_attachment_attributes_button($ai4seo_this_post_attachment_id, $ai4seo_current_attachment_post_ids));488 ai4seo_echo_wp_kses(ai4seo_get_edit_attachment_attributes_button($ai4seo_this_post_attachment_id, $ai4seo_current_attachment_post_ids)); 488 489 } 489 490 echo "</td>"; … … 523 524 524 525 echo "<div class='ai4seo-pagination'>"; 525 echo ai4seo_wp_kses($ai4seo_pagination_links);526 ai4seo_echo_wp_kses($ai4seo_pagination_links); 526 527 echo "</div>"; 527 528 } -
ai-for-seo/trunk/includes/pages/content_types/post.php
r3408847 r3420851 229 229 // === TABLE WITH ALL POSTS ================================================================== \\ 230 230 231 echo ai4seo_wp_kses($ai4seo_filter_form_html);231 ai4seo_echo_wp_kses($ai4seo_filter_form_html); 232 232 233 233 // Stop script if no posts have been found -> show message and stop page rendering … … 260 260 if (($ai4seo_num_failed_to_fill_this_post_type || $ai4seo_current_page_failed_to_fill_post_ids)) { 261 261 echo "<div class='ai4seo-table-title-button'>"; 262 echo ai4seo_wp_kses($ai4seo_retry_all_failed_metadata_generations_link_tag);262 ai4seo_echo_wp_kses($ai4seo_retry_all_failed_metadata_generations_link_tag); 263 263 echo "</div>"; 264 264 } … … 380 380 // execute sooner link 381 381 if ($ai4seo_next_cron_job_call_diff >= 70) { 382 echo " " . ai4seo_wp_kses($ai4seo_execute_sooner_button); 382 echo " "; 383 ai4seo_echo_wp_kses($ai4seo_execute_sooner_button); 383 384 } else { 384 echo " " . ai4seo_wp_kses($ai4seo_refresh_button); 385 echo " "; 386 ai4seo_echo_wp_kses($ai4seo_refresh_button); 385 387 } 386 388 echo "</div>"; … … 389 391 echo esc_html__("Pending", "ai-for-seo") . "... "; 390 392 echo "(" . sprintf(esc_html__("I'm probably optimizing a different entry.", "ai-for-seo"), esc_html($ai4seo_post_type)). ")"; 391 echo " " . ai4seo_wp_kses($ai4seo_refresh_button); 393 echo " "; 394 ai4seo_echo_wp_kses($ai4seo_refresh_button); 392 395 echo "</div>"; 393 396 } … … 395 398 echo "<div class='ai4seo-sub-info'>"; 396 399 echo esc_html__("Processing", "ai-for-seo") . "..."; 397 echo " " . ai4seo_wp_kses($ai4seo_refresh_button); 400 echo " "; 401 ai4seo_echo_wp_kses($ai4seo_refresh_button); 398 402 echo "</div>"; 399 403 } else if ($ai4seo_is_insufficient_credits) { 400 404 echo "<div class='ai4seo-sub-info ai4seo-red-message'>"; 401 405 echo esc_html__("Insufficient Credits", "ai-for-seo") . "."; 402 echo " " . ai4seo_wp_kses($ai4seo_consider_purchasing_more_credits_link_tag); 406 echo " "; 407 ai4seo_echo_wp_kses($ai4seo_consider_purchasing_more_credits_link_tag); 403 408 echo "</div>"; 404 409 } else if ($ai4seo_this_post_is_failed_to_fill && $ai4seo_this_metadata_generation_is_not_finished) { 405 410 echo "<div class='ai4seo-seo-data-not-covered-message'>"; 406 411 echo "<span>" . esc_html__("Failed to automatically fill metadata.", "ai-for-seo") . "</span>"; 407 echo " " . ai4seo_wp_kses(ai4seo_get_small_button_tag("#", "arrow-up-right-from-square", __("Try it manually", "ai-for-seo"), "", "ai4seo_open_metadata_editor_modal(\"" . esc_js($ai4seo_this_post_id) . "\");")); 412 echo " "; 413 ai4seo_echo_wp_kses(ai4seo_get_small_button_tag("#", "arrow-up-right-from-square", __("Try it manually", "ai-for-seo"), "", "ai4seo_open_metadata_editor_modal(\"" . esc_js($ai4seo_this_post_id) . "\");")); 408 414 echo "</div>"; 409 415 } else if ($ai4seo_is_excluded_by_new_or_existing_filter && $ai4seo_this_metadata_generation_is_not_finished) { … … 436 442 // Edit-Link 437 443 if ($ai4seo_active_meta_tags) { 438 echo ai4seo_wp_kses(ai4seo_get_edit_metadata_button($ai4seo_this_post_id, $ai4seo_current_post_ids));444 ai4seo_echo_wp_kses(ai4seo_get_edit_metadata_button($ai4seo_this_post_id, $ai4seo_current_post_ids)); 439 445 } 440 446 echo "</td>"; … … 476 482 477 483 echo "<div class='ai4seo-pagination'>"; 478 echo ai4seo_wp_kses($ai4seo_pagination_links);484 ai4seo_echo_wp_kses($ai4seo_pagination_links); 479 485 echo "</div>"; 480 486 } -
ai-for-seo/trunk/includes/pages/dashboard.php
r3408847 r3420851 130 130 if ($ai4seo_posts_table_analysis_state !== 'completed') { 131 131 echo "<div class='ai4seo-dashboard-posts-table-analysis-not-completed-hint'>"; 132 echo ai4seo_wp_kses(ai4seo_get_svg_tag("gear", '', "ai4seo-spinning-icon")) . " "; 132 ai4seo_echo_wp_kses(ai4seo_get_svg_tag("gear", '', "ai4seo-spinning-icon")); 133 echo " "; 133 134 echo esc_html__("AI for SEO is currently analyzing your pages and media files. Please wait.", "ai-for-seo"); 134 135 echo "</div>"; … … 142 143 if (!$ai4seo_heavy_db_operations_disabled && $ai4seo_posts_table_analysis_state === 'completed') { 143 144 echo "<div class='ai4seo-top-right-refresh-button-wrapper'>"; 144 echo ai4seo_wp_kses(ai4seo_get_small_button_tag("#", "rotate", __("Refresh", "ai-for-seo"), "", "ai4seo_refresh_dashboard_statistics(this); return false;"));145 ai4seo_echo_wp_kses(ai4seo_get_small_button_tag("#", "rotate", __("Refresh", "ai-for-seo"), "", "ai4seo_refresh_dashboard_statistics(this); return false;")); 145 146 echo "</div>"; 146 147 } … … 248 249 if ($ai4seo_retry_all_failed_metadata_button_tags) { 249 250 foreach ($ai4seo_retry_all_failed_metadata_button_tags as $ai4seo_this_retry_button_tag) { 250 echo ai4seo_wp_kses($ai4seo_this_retry_button_tag);251 ai4seo_echo_wp_kses($ai4seo_this_retry_button_tag); 251 252 } 252 253 } 253 254 254 255 if ($ai4seo_retry_all_failed_attachment_attributes_generations_link_tag) { 255 echo ai4seo_wp_kses($ai4seo_retry_all_failed_attachment_attributes_generations_link_tag);256 ai4seo_echo_wp_kses($ai4seo_retry_all_failed_attachment_attributes_generations_link_tag); 256 257 } 257 258 … … 281 282 // refresh credits balance button 282 283 echo "<div class='ai4seo-top-right-refresh-button-wrapper'>"; 283 echo ai4seo_wp_kses(ai4seo_get_small_button_tag("#", "rotate", __("Refresh", "ai-for-seo"), "", "ai4seo_refresh_robhub_account(this); return false;"));284 ai4seo_echo_wp_kses(ai4seo_get_small_button_tag("#", "rotate", __("Refresh", "ai-for-seo"), "", "ai4seo_refresh_robhub_account(this); return false;")); 284 285 echo "</div>"; 285 286 … … 295 296 } else { 296 297 echo "<span class='ai4seo-red-message'>"; 297 echo ai4seo_wp_kses(ai4seo_get_svg_tag("triangle-exclamation", esc_html__("Failed to verify your license data. Please check your account settings.", "ai-for-seo"), "ai4seo-red-icon"));298 ai4seo_echo_wp_kses(ai4seo_get_svg_tag("triangle-exclamation", esc_html__("Failed to verify your license data. Please check your account settings.", "ai-for-seo"), "ai4seo-red-icon")); 298 299 echo esc_html__("N/A", "ai-for-seo"); 299 300 echo "</span>"; … … 305 306 if ($ai4seo_current_credits_balance < $ai4seo_free_plan_credits_amount) { 306 307 echo "<div class='ai4seo-next-free-credits-container'>"; 307 echo ai4seo_wp_kses(sprintf(308 ai4seo_echo_wp_kses(sprintf( 308 309 __('Next <span class="ai4seo-credits-usage-badge">+%1$s Credits</span> in <strong>%2$s</strong>', 'ai-for-seo'), 309 310 esc_html(AI4SEO_DAILY_FREE_CREDITS_AMOUNT), … … 317 318 esc_html($ai4seo_free_plan_credits_amount), 318 319 ); 319 echo ai4seo_wp_kses(ai4seo_get_icon_with_tooltip_tag($ai4seo_free_credits_tooltip));320 ai4seo_echo_wp_kses(ai4seo_get_icon_with_tooltip_tag($ai4seo_free_credits_tooltip)); 320 321 echo "</div>"; 321 322 } … … 334 335 // Turn Buy credits button 335 336 echo "<div class='ai4seo-buy-credits-button-container'>"; 336 echo ai4seo_wp_kses(337 ai4seo_echo_wp_kses( 337 338 ai4seo_get_button_text_link_tag("#", "arrow-up-right-from-square", esc_html__("Get more Credits", "ai-for-seo"), 338 339 ($ai4seo_current_credits_balance < AI4SEO_BLUE_GET_MORE_CREDITS_BUTTON_THRESHOLD ? "ai4seo-success-button" : ""), … … 343 344 } else { 344 345 // go to Account Settings 345 echo ai4seo_wp_kses(346 ai4seo_echo_wp_kses( 346 347 ai4seo_get_button_text_link_tag(ai4seo_get_subpage_url("account"), "key", esc_html__("Account Settings", "ai-for-seo"), "ai4seo-success-button") 347 348 ); … … 375 376 376 377 echo "<p style='text-align:center;'>"; 377 echo ai4seo_wp_kses(ai4seo_get_button_text_link_tag($ai4seo_purchase_plan_url, "circle-up", esc_html__("Secure This Offer", "ai-for-seo"), "ai4seo-success-button"));378 ai4seo_echo_wp_kses(ai4seo_get_button_text_link_tag($ai4seo_purchase_plan_url, "circle-up", esc_html__("Secure This Offer", "ai-for-seo"), "ai4seo-success-button")); 378 379 echo "</p>"; 379 380 echo "</div>"; … … 395 396 // execute sooner link 396 397 if ($ai4seo_next_cron_job_call_diff >= 70) { 397 $ai4seo_additional_sub_status_text .= " " . ai4seo_wp_kses($ai4seo_execute_sooner_button);398 $ai4seo_additional_sub_status_text .= " " . $ai4seo_execute_sooner_button; 398 399 } else { 399 $ai4seo_additional_sub_status_text .= " " . ai4seo_wp_kses($ai4seo_refresh_button);400 $ai4seo_additional_sub_status_text .= " " . $ai4seo_refresh_button; 400 401 } 401 402 … … 440 441 // triangle-exclamation on the top right corner 441 442 echo "<div class='ai4seo-bulk-generation-status-active-logo-triangle-exclamation'>"; 442 echo ai4seo_wp_kses(ai4seo_get_svg_tag("triangle-exclamation"));443 ai4seo_echo_wp_kses(ai4seo_get_svg_tag("triangle-exclamation")); 443 444 echo "</div>"; 444 445 … … 456 457 // triangle-exclamation on the top right corner 457 458 echo "<div class='ai4seo-bulk-generation-status-active-logo-triangle-exclamation'>"; 458 echo ai4seo_wp_kses(ai4seo_get_svg_tag("triangle-exclamation"));459 ai4seo_echo_wp_kses(ai4seo_get_svg_tag("triangle-exclamation")); 459 460 echo "</div>"; 460 461 … … 466 467 echo esc_html__("The last bulk generation run was longer ago than expected, which may indicate an issue with your cron job configuration. Please check your cron job settings to ensure consistent execution.", "ai-for-seo"); 467 468 if ($ai4seo_additional_sub_status_text) { 468 echo " " . ai4seo_wp_kses($ai4seo_additional_sub_status_text); 469 echo " "; 470 ai4seo_echo_wp_kses($ai4seo_additional_sub_status_text); 469 471 } 470 472 echo "</div>"; … … 485 487 // triangle-exclamation on the top right corner 486 488 #echo "<div class='ai4seo-bulk-generation-status-active-logo-triangle-exclamation'>"; 487 # echo ai4seo_wp_kses(ai4seo_get_svg_tag("triangle-exclamation"));489 # ai4seo_echo_wp_kses(ai4seo_get_svg_tag("triangle-exclamation")); 488 490 #echo "</div>"; 489 491 … … 498 500 499 501 if ($ai4seo_additional_sub_status_text) { 500 echo " " . ai4seo_wp_kses($ai4seo_additional_sub_status_text); 502 echo " "; 503 ai4seo_echo_wp_kses($ai4seo_additional_sub_status_text); 501 504 } 502 505 echo "</div>"; … … 515 518 516 519 if ($ai4seo_additional_sub_status_text) { 517 echo " " . ai4seo_wp_kses($ai4seo_additional_sub_status_text); 520 echo " "; 521 ai4seo_echo_wp_kses($ai4seo_additional_sub_status_text); 518 522 } 519 523 echo "</div>"; … … 523 527 // triangle-exclamation on the top right corner 524 528 echo "<div class='ai4seo-bulk-generation-status-active-logo-triangle-exclamation'>"; 525 echo ai4seo_wp_kses(ai4seo_get_svg_tag("triangle-exclamation"));529 ai4seo_echo_wp_kses(ai4seo_get_svg_tag("triangle-exclamation")); 526 530 echo "</div>"; 527 531 … … 534 538 535 539 if ($ai4seo_additional_sub_status_text) { 536 echo " " . ai4seo_wp_kses($ai4seo_additional_sub_status_text); 540 echo " "; 541 ai4seo_echo_wp_kses($ai4seo_additional_sub_status_text); 537 542 } 538 543 echo "</div>"; … … 546 551 if ($ai4seo_is_any_bulk_generation_enabled) { 547 552 // stop SEO Autopilot 548 echo ai4seo_wp_kses(ai4seo_get_button_text_link_tag("#", "stop-circle", esc_html__("Stop SEO Autopilot", "ai-for-seo"), "ai4seo-abort-button", "ai4seo_stop_bulk_generation(this)"));549 } 550 echo ai4seo_wp_kses(ai4seo_get_button_text_link_tag("#", "arrow-up-right-from-square", esc_html__("Set up SEO Autopilot", "ai-for-seo"), "", "ai4seo_open_modal_from_schema(\"seo-autopilot\", {modal_size: \"small\"});"));553 ai4seo_echo_wp_kses(ai4seo_get_button_text_link_tag("#", "stop-circle", esc_html__("Stop SEO Autopilot", "ai-for-seo"), "ai4seo-abort-button", "ai4seo_stop_bulk_generation(this)")); 554 } 555 ai4seo_echo_wp_kses(ai4seo_get_button_text_link_tag("#", "arrow-up-right-from-square", esc_html__("Set up SEO Autopilot", "ai-for-seo"), "", "ai4seo_open_modal_from_schema(\"seo-autopilot\", {modal_size: \"small\"});")); 551 556 echo "</div>"; 552 557 echo "</div>"; … … 572 577 echo "<div class='ai4seo-latest-activity-item'>"; 573 578 echo "<div class='ai4seo-latest-activity-item-icon'>"; 574 echo ai4seo_wp_kses($ai4seo_this_plugin_page_icon);579 ai4seo_echo_wp_kses($ai4seo_this_plugin_page_icon); 575 580 echo "</div>"; 576 581 … … 593 598 if ($ai4seo_this_latest_activity_entry_is_success) { 594 599 echo "<div class='ai4seo-green-message'>"; 595 echo ai4seo_wp_kses(ai4seo_get_svg_tag("circle-check", esc_html__("Success", "ai-for-seo"), "ai4seo-gray-icon")) . " "; 600 ai4seo_echo_wp_kses(ai4seo_get_svg_tag("circle-check", esc_html__("Success", "ai-for-seo"), "ai4seo-gray-icon")); 601 echo " "; 596 602 } else { 597 603 echo "<div class='ai4seo-red-message'>"; 598 echo ai4seo_wp_kses(ai4seo_get_svg_tag("circle-xmark", esc_html__("Error", "ai-for-seo"), "ai4seo-red-icon")) . " "; 604 ai4seo_echo_wp_kses(ai4seo_get_svg_tag("circle-xmark", esc_html__("Error", "ai-for-seo"), "ai4seo-red-icon")); 605 echo " "; 599 606 } 600 607 … … 637 644 // see post / media preview 638 645 if (isset($ai4seo_this_latest_activity_entry["url"]) && $ai4seo_this_latest_activity_entry["url"]) { 639 echo ai4seo_wp_kses(ai4seo_get_button_text_link_tag($ai4seo_this_latest_activity_entry["url"], "eye", "", "", "", "_blank"));646 ai4seo_echo_wp_kses(ai4seo_get_button_text_link_tag($ai4seo_this_latest_activity_entry["url"], "eye", "", "", "", "_blank")); 640 647 } 641 648 642 649 if (in_array(($ai4seo_this_latest_activity_entry["post_type"] ?? ""), $ai4seo_supported_attachment_post_types)) { 643 echo ai4seo_wp_kses(ai4seo_get_button_text_link_tag("#", "pen-to-square", "", "", "ai4seo_open_attachment_attributes_editor_modal(" . esc_js($ai4seo_this_latest_activity_entry["post_id"]) . ");"));650 ai4seo_echo_wp_kses(ai4seo_get_button_text_link_tag("#", "pen-to-square", "", "", "ai4seo_open_attachment_attributes_editor_modal(" . esc_js($ai4seo_this_latest_activity_entry["post_id"]) . ");")); 644 651 } else { 645 652 if (isset($ai4seo_this_latest_activity_entry["url"]) && $ai4seo_this_latest_activity_entry["url"]) { 646 653 # todo: add source code button using ajax modal, and then only showing the header of the page 647 # echo ai4seo_wp_kses(ai4seo_get_button_text_link_tag("#", "code", "", "", "ai4seo_open_view_source(\"" . esc_url($ai4seo_this_latest_activity_entry["url"]) . "\")"));654 #ai4seo_echo_wp_kses(ai4seo_get_button_text_link_tag("#", "code", "", "", "ai4seo_open_view_source(\"" . esc_url($ai4seo_this_latest_activity_entry["url"]) . "\")")); 648 655 } 649 echo ai4seo_wp_kses(ai4seo_get_button_text_link_tag("#", "pen-to-square", "", "", "ai4seo_open_metadata_editor_modal(" . esc_js($ai4seo_this_latest_activity_entry["post_id"]) . ");"));656 ai4seo_echo_wp_kses(ai4seo_get_button_text_link_tag("#", "pen-to-square", "", "", "ai4seo_open_metadata_editor_modal(" . esc_js($ai4seo_this_latest_activity_entry["post_id"]) . ");")); 650 657 } 651 658 echo "</div>"; … … 666 673 echo esc_html__("Your Personal SEO Expert", "ai-for-seo"); 667 674 echo "<div class='ai4seo-caret-down'>"; 668 echo ai4seo_wp_kses(ai4seo_get_svg_tag("caret-down"));675 ai4seo_echo_wp_kses(ai4seo_get_svg_tag("caret-down")); 669 676 echo "</div>"; 670 677 echo "<div class='ai4seo-caret-up' style='display: none;'>"; 671 echo ai4seo_wp_kses(ai4seo_get_svg_tag("caret-up"));678 ai4seo_echo_wp_kses(ai4seo_get_svg_tag("caret-up")); 672 679 echo "</div>"; 673 680 echo "</h4>"; … … 694 701 echo "<p>" . esc_html__("Hi, I'm your personal SEO expert!", "ai-for-seo") . "</p>"; 695 702 echo "<p>" . esc_html__("Whether you need help setting up the plugin, planning your SEO strategy, or want to discuss a custom approach, the AI for SEO team and I have you covered.", "ai-for-seo") . "</p>"; 696 echo "<p>" . ai4seo_wp_kses(__("Together, we’ll grow your visibility and turn your search goals into real results. Some users report an <strong>increase</strong> in reach and clicks of over <strong>1900%</strong>.", "ai-for-seo")) . "</p>"; 697 echo "<p>" . ai4seo_wp_kses(__("Ready to take your SEO to the next level? <strong>Let’s connect!</strong>", "ai-for-seo")) . "</p>"; 698 699 echo ai4seo_wp_kses(ai4seo_get_button_text_link_tag("https://aiforseo.ai/contact", "arrow-up-right-from-square", esc_html__("Contact SEO Expert now", "ai-for-seo"), "", "", "_blank")); 703 echo "<p>"; 704 ai4seo_echo_wp_kses(__("Together, we’ll grow your visibility and turn your search goals into real results. Some users report an <strong>increase</strong> in reach and clicks of over <strong>1900%</strong>.", "ai-for-seo")); 705 echo "</p>"; 706 echo "<p>"; 707 ai4seo_echo_wp_kses(__("Ready to take your SEO to the next level? <strong>Let’s connect!</strong>", "ai-for-seo")); 708 echo "</p>"; 709 710 ai4seo_echo_wp_kses(ai4seo_get_button_text_link_tag("https://aiforseo.ai/contact", "arrow-up-right-from-square", esc_html__("Contact SEO Expert now", "ai-for-seo"), "", "", "_blank")); 700 711 echo "</div>"; 701 712 echo "</div>"; … … 709 720 echo esc_html__("Guarantee", "ai-for-seo"); 710 721 echo "<div class='ai4seo-caret-down'>"; 711 echo ai4seo_wp_kses(ai4seo_get_svg_tag("caret-down"));722 ai4seo_echo_wp_kses(ai4seo_get_svg_tag("caret-down")); 712 723 echo "</div>"; 713 724 echo "<div class='ai4seo-caret-up' style='display: none;'>"; 714 echo ai4seo_wp_kses(ai4seo_get_svg_tag("caret-up"));725 ai4seo_echo_wp_kses(ai4seo_get_svg_tag("caret-up")); 715 726 echo "</div>"; 716 727 echo "</h4>"; 717 728 718 729 echo "<div style='display: none; margin-top: 1.5rem;'>"; 719 echo ai4seo_wp_kses(ai4seo_get_svg_tag("handshake", __("Guarantee", "ai-for-seo"), "ai4seo-handshake-icon")) . " "; 730 ai4seo_echo_wp_kses(ai4seo_get_svg_tag("handshake", __("Guarantee", "ai-for-seo"), "ai4seo-handshake-icon")); 731 echo " "; 720 732 # todo: hide if not applicable 721 733 if (true) { … … 732 744 echo esc_html__("Recent Plugin Updates", "ai-for-seo"); 733 745 echo "<div class='ai4seo-caret-down'>"; 734 echo ai4seo_wp_kses(ai4seo_get_svg_tag("caret-down"));746 ai4seo_echo_wp_kses(ai4seo_get_svg_tag("caret-down")); 735 747 echo "</div>"; 736 748 echo "<div class='ai4seo-caret-up' style='display: none;'>"; 737 echo ai4seo_wp_kses(ai4seo_get_svg_tag("caret-up"));749 ai4seo_echo_wp_kses(ai4seo_get_svg_tag("caret-up")); 738 750 echo "</div>"; 739 751 echo "</h4>"; … … 772 784 if ($ai4seo_this_is_first_plugin_update) { 773 785 echo "<div class='ai4seo-caret-down' style='display: none;'>"; 774 echo ai4seo_wp_kses(ai4seo_get_svg_tag("caret-down"));786 ai4seo_echo_wp_kses(ai4seo_get_svg_tag("caret-down")); 775 787 echo "</div>"; 776 788 echo "<div class='ai4seo-caret-up'>"; 777 echo ai4seo_wp_kses(ai4seo_get_svg_tag("caret-up"));789 ai4seo_echo_wp_kses(ai4seo_get_svg_tag("caret-up")); 778 790 echo "</div>"; 779 791 } else { 780 792 echo "<div class='ai4seo-caret-down'>"; 781 echo ai4seo_wp_kses(ai4seo_get_svg_tag("caret-down"));793 ai4seo_echo_wp_kses(ai4seo_get_svg_tag("caret-down")); 782 794 echo "</div>"; 783 795 echo "<div class='ai4seo-caret-up' style='display: none;'>"; 784 echo ai4seo_wp_kses(ai4seo_get_svg_tag("caret-up"));796 ai4seo_echo_wp_kses(ai4seo_get_svg_tag("caret-up")); 785 797 echo "</div>"; 786 798 } … … 808 820 echo esc_html__("Support & Feedback", "ai-for-seo"); 809 821 echo "<div class='ai4seo-caret-down'>"; 810 echo ai4seo_wp_kses(ai4seo_get_svg_tag("caret-down"));822 ai4seo_echo_wp_kses(ai4seo_get_svg_tag("caret-down")); 811 823 echo "</div>"; 812 824 echo "<div class='ai4seo-caret-up' style='display: none;'>"; 813 echo ai4seo_wp_kses(ai4seo_get_svg_tag("caret-up"));825 ai4seo_echo_wp_kses(ai4seo_get_svg_tag("caret-up")); 814 826 echo "</div>"; 815 827 echo "</h4>"; … … 819 831 // HELP SECTION 820 832 // icon 821 echo ai4seo_wp_kses(ai4seo_get_svg_tag("circle-question", __("Help section", "ai-for-seo"), "ai4seo-big-paragraph-icon")) . " "; 822 823 echo ai4seo_wp_kses(sprintf( 833 ai4seo_echo_wp_kses(ai4seo_get_svg_tag("circle-question", __("Help section", "ai-for-seo"), "ai4seo-big-paragraph-icon")); 834 echo " "; 835 836 ai4seo_echo_wp_kses(sprintf( 824 837 /* translators: %s is a clickable email address */ 825 838 __("Check our <a href='%s'>help section</a> for a detailed <a href='%s'>getting started guide</a>, our organized <a href='%s'>F.A.Q</a> or other <a href='%s'>useful links</a>.", "ai-for-seo"), … … 833 846 834 847 // button to help section 835 echo ai4seo_wp_kses(ai4seo_get_button_text_link_tag(esc_url(ai4seo_get_subpage_url("help")), "arrow-up-right-from-square", esc_html__("Go to our help section", "ai-for-seo")));848 ai4seo_echo_wp_kses(ai4seo_get_button_text_link_tag(esc_url(ai4seo_get_subpage_url("help")), "arrow-up-right-from-square", esc_html__("Go to our help section", "ai-for-seo"))); 836 849 837 850 echo "<br><br><br>"; … … 839 852 // CONTACT US 840 853 // icon 841 echo ai4seo_wp_kses(ai4seo_get_svg_tag("envelope", __("Contact us", "ai-for-seo"), "ai4seo-big-paragraph-icon")) . " "; 842 843 echo ai4seo_wp_kses(sprintf( 854 ai4seo_echo_wp_kses(ai4seo_get_svg_tag("envelope", __("Contact us", "ai-for-seo"), "ai4seo-big-paragraph-icon")); 855 echo " "; 856 857 ai4seo_echo_wp_kses(sprintf( 844 858 /* translators: %s is a clickable email address */ 845 859 __("Missing a feature, need assistance, or looking for a quote?", "ai-for-seo") . " " . … … 851 865 852 866 // button to contact us 853 echo ai4seo_wp_kses(ai4seo_get_button_text_link_tag(esc_url(AI4SEO_OFFICIAL_CONTACT_URL), "arrow-up-right-from-square", esc_html__("Contact us", "ai-for-seo"), "", "", "_blank"));867 ai4seo_echo_wp_kses(ai4seo_get_button_text_link_tag(esc_url(AI4SEO_OFFICIAL_CONTACT_URL), "arrow-up-right-from-square", esc_html__("Contact us", "ai-for-seo"), "", "", "_blank")); 854 868 855 869 echo "<br><br><br>"; … … 857 871 // RATE US 858 872 // icon 859 echo ai4seo_wp_kses(ai4seo_get_svg_tag("star", __("Rate us", "ai-for-seo"), "ai4seo-big-paragraph-icon")) . " "; 873 ai4seo_echo_wp_kses(ai4seo_get_svg_tag("star", __("Rate us", "ai-for-seo"), "ai4seo-big-paragraph-icon")); 874 echo " "; 860 875 861 876 // like our plugin rate us at AI4SEO_OFFICIAL_WORDPRESS_ORG_PAGE 862 echo ai4seo_wp_kses(sprintf(877 ai4seo_echo_wp_kses(sprintf( 863 878 __("Like our plugin and want to support us? Please <a href='%s' target='blank'>rate us</a> on WordPress.org. We appreciate your feedback!", "ai-for-seo"), 864 879 esc_url(AI4SEO_OFFICIAL_RATE_US_URL) … … 868 883 869 884 // button to rate us 870 echo ai4seo_wp_kses(ai4seo_get_button_text_link_tag(esc_url(AI4SEO_OFFICIAL_RATE_US_URL), "arrow-up-right-from-square", esc_html__("Rate us", "ai-for-seo"), "", "", "_blank"));885 ai4seo_echo_wp_kses(ai4seo_get_button_text_link_tag(esc_url(AI4SEO_OFFICIAL_RATE_US_URL), "arrow-up-right-from-square", esc_html__("Rate us", "ai-for-seo"), "", "", "_blank")); 871 886 872 887 echo "</div>"; -
ai-for-seo/trunk/includes/pages/help.php
r3408847 r3420851 156 156 // Getting started 157 157 echo "<a href='#ai4seo-getting-started-section'><div class='ai4seo-help-preview-selection' onclick='jQuery(\".ai4seo-help-content\").hide();jQuery(\"#ai4seo-help-getting-started\").css(\"display\", \"flex\");'>"; 158 echo ai4seo_wp_kses(ai4seo_get_svg_tag("rocket"));158 ai4seo_echo_wp_kses(ai4seo_get_svg_tag("rocket")); 159 159 echo "<span>" . esc_html__("Getting started", "ai-for-seo") . "</span>"; 160 160 echo "</div></a>"; … … 228 228 // Content tabes 229 229 $ai4seo_this_accordion_content .= "<p><b>7.</b> " . __("<b>Content pages</b>: Inside the plugin you will find menu items for each supported content type (i.e. Page, Post, etc.). Click on any menu item and open the metadata editor by clicking on the button on the right-hand side of an entry.", "ai-for-seo") . "</p>"; 230 $ai4seo_this_accordion_content .= "<p><b>8.</b> " . __("<b>Metadata editor</b>: After clicking on the button to open the metadata editor you will find the \"Generate all SEO\" button at the top of the editor. Click this button to generate all metadata for the selected content-entry. Additionally you will find the \"Generate with AI\"-button underneath every input-field which allows you to generate the metadata for a single metadata-input-field. After the new data has been generated you can either save the changes as generated or you can edit them if you would like to apply any changes and save afterwards.", "ai-for-seo") . "</p>";230 $ai4seo_this_accordion_content .= "<p><b>8.</b> " . __("<b>Metadata editor</b>: After clicking on the button to open the metadata editor you will find the \"Generate & Overwrite\" button at the top of the editor. Click this button to generate all metadata for the selected content-entry. Additionally you will find the \"Generate with AI\"-button underneath every input field which allows you to generate the metadata for a single metadata input field. After the new data has been generated you can either save the changes as generated or you can edit them if you would like to apply any changes and save afterwards.", "ai-for-seo") . "</p>"; 231 231 $ai4seo_this_accordion_content .= "<img src='" . esc_url(ai4seo_get_assets_images_url("help-screenshots/first-steps-5.jpg")) . "' style='width: 100%;' />"; 232 232 $ai4seo_this_accordion_content .= "<p><b>9.</b> " . __("<b>Media page</b>: After clicking on the media menu item you can open the media attribute editor by clicking on the button on the right-hand side of each media-entry.", "ai-for-seo") . "</p>"; 233 $ai4seo_this_accordion_content .= "<p><b>10.</b> " . __("<b>Media attribute editor</b>: After clicking on the button to open the media attribute editor you will find the \"Generate all SEO\" button at the top of the editor. Click this button to generate all media attributes for the selected media-entry. Additionally you will find the \"Generate with AI\"-button underneath every input-field which allows you to generate the media attributes for a single attributes-input-field. After the new data has been generated you can either save the changes as generated or you can edit them if you would like to apply any changes and save afterwards.", "ai-for-seo") . "</p>";233 $ai4seo_this_accordion_content .= "<p><b>10.</b> " . __("<b>Media attribute editor</b>: After clicking on the button to open the media attribute editor you will find the \"Generate & Overwrite\" button at the top of the editor. Click this button to generate all media attributes for the selected media entry. Additionally you will find the \"Generate with AI\"-button underneath every input field which allows you to generate the media attributes for a single attributes input field. After the new data has been generated you can either save the changes as generated or you can edit them if you would like to apply any changes and save afterwards.", "ai-for-seo") . "</p>"; 234 234 $ai4seo_this_accordion_content .= "<img src='" . esc_url(ai4seo_get_assets_images_url("help-screenshots/first-steps-6.jpg")) . "' style='width: 100%;' />"; 235 235 … … 238 238 $ai4seo_this_accordion_content .= "<p><b>11.1.</b> " . __("<b>Help -> Troubleshooting</b>: In this section you have the option to reset some or all of the plugin date. Please make sure to use these functions with CAUTION. Feel free to reach prior to using these functions if you have any questions about them.", "ai-for-seo") . "</p>"; 239 239 $ai4seo_this_accordion_content .= "<img src='" . esc_url(ai4seo_get_assets_images_url("help-screenshots/first-steps-7.jpg")) . "' style='width: 100%;' />"; 240 $ai4seo_this_accordion_content .= "<p><b>12.</b> " . __("<b>Contact us</b>: If you have any questions, suggestions, need further support or require a particularly large number of Credits, feel free to contact us via Help > Contact.", "ai-for-seo") . "</p>";241 242 echo ai4seo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("First steps", "ai-for-seo"), $ai4seo_this_accordion_content));240 $ai4seo_this_accordion_content .= "<p><b>12.</b> " . __("<b>Contact us</b>: If you have questions, suggestions, need further support or require a specific amount of credits, please contact us via Help > Contact. We typically respond within 8 hours.", "ai-for-seo") . "</p>"; 241 242 ai4seo_echo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("First steps", "ai-for-seo"), $ai4seo_this_accordion_content)); 243 243 244 244 // === How to edit specific page or post ===================================================== \\ … … 259 259 $ai4seo_this_accordion_content .= "<img src='" . esc_url(ai4seo_get_assets_images_url("faq-screenshots/screenshot-page-post-3.jpg")) . "' style='width: 100%;' />"; 260 260 261 echo ai4seo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("How to generate or edit SEO-relevant metadata for a specific page or post", "ai-for-seo"), $ai4seo_this_accordion_content));261 ai4seo_echo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("How to generate or edit SEO-relevant metadata for a specific page or post", "ai-for-seo"), $ai4seo_this_accordion_content)); 262 262 263 263 … … 276 276 $ai4seo_this_accordion_content .= "<p>" . __("<b>Alternatively,</b> you can go to the \"Media\" page within the *AI for SEO* plugin. From there, you can browse through your media-entries, and choose the ones you want to edit.", "ai-for-seo") . "</p>"; 277 277 278 echo ai4seo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("How to add alt-text, captions, titles and descriptions for media files", "ai-for-seo"), $ai4seo_this_accordion_content));278 ai4seo_echo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("How to add alt-text, captions, titles and descriptions for media files", "ai-for-seo"), $ai4seo_this_accordion_content)); 279 279 280 280 … … 293 293 $ai4seo_this_accordion_content .= "<img src='" . esc_url(ai4seo_get_assets_images_url("faq-screenshots/screenshot-seo-autopilot-3.jpg")) . "' style='width: 100%;' />"; 294 294 295 echo ai4seo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("How to activate bulk generation", "ai-for-seo"), $ai4seo_this_accordion_content));295 ai4seo_echo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("How to activate bulk generation", "ai-for-seo"), $ai4seo_this_accordion_content)); 296 296 297 297 … … 308 308 309 309 // Explanation of how credits are consumed 310 $ai4seo_this_accordion_content = "<p>" . __("Credits are consumed when the AI generates metadata for your content entries (posts, pages, products, etc.). Each generation costs Credits, depending on your settings.", "ai-for-seo") . "</p>";310 $ai4seo_this_accordion_content = "<p>" . __("Credits are used when *AI for SEO* generates metadata for your content (posts, pages, products, media files etc.). The amount of Credits required depends on the selected active meta tags and media attributes (see Settings).", "ai-for-seo") . "</p>"; 311 311 312 312 // Details on credits available with different plans … … 335 335 $ai4seo_this_accordion_content .= "<p>" . __("We offer a <strong>Pay-As-You-Go (PAYG)</strong> option which enables you to automatically refill your Credits balance with a custom number of Credits. This way you don't have to worry about purchasing new Credits or ever running out of them. The plugin will automatically purchase Credits for you as soon as you're about to run out.", "ai-for-seo") . "</p>"; 336 336 337 echo ai4seo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("How do Credits work?", "ai-for-seo"), $ai4seo_this_accordion_content));337 ai4seo_echo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("How do Credits work?", "ai-for-seo"), $ai4seo_this_accordion_content)); 338 338 339 339 … … 356 356 $ai4seo_this_accordion_content .= "<img src='" . esc_url(ai4seo_get_assets_images_url("faq-screenshots/screenshot-yoast-3.jpg")) . "' style='width: 100%;' />"; 357 357 358 echo ai4seo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("Yoast integration", "ai-for-seo"), $ai4seo_this_accordion_content));358 ai4seo_echo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("Yoast integration", "ai-for-seo"), $ai4seo_this_accordion_content)); 359 359 } 360 360 … … 373 373 $ai4seo_this_accordion_content .= "<img src='" . esc_url(ai4seo_get_assets_images_url("faq-screenshots/screenshot-elementor-2.jpg")) . "' style='width: 100%;' />"; 374 374 375 echo ai4seo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("Elementor integration", "ai-for-seo"), $ai4seo_this_accordion_content));375 ai4seo_echo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("Elementor integration", "ai-for-seo"), $ai4seo_this_accordion_content)); 376 376 } 377 377 … … 389 389 $ai4seo_this_accordion_content .= "<img src='" . esc_url(ai4seo_get_assets_images_url("faq-screenshots/screenshot-be-builder-1.jpg")) . "' style='width: 100%;' />"; 390 390 391 echo ai4seo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("Be-Builder integration", "ai-for-seo"), $ai4seo_this_accordion_content));391 ai4seo_echo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("Be-Builder integration", "ai-for-seo"), $ai4seo_this_accordion_content)); 392 392 } 393 393 echo "</div>"; … … 407 407 // Input for the search 408 408 echo "<div class='ai4seo-help-search-wrapper'>"; 409 echo ai4seo_wp_kses(ai4seo_get_svg_tag("magnifying-glass"));409 ai4seo_echo_wp_kses(ai4seo_get_svg_tag("magnifying-glass")); 410 410 echo "<input type='text' class='ai4seo-help-search' id='ai4seo-help-search' placeholder='" . esc_attr__("Search F.A.Q. (enter min.3 characters)", "ai-for-seo") . "' />"; 411 411 echo "</div>"; … … 425 425 426 426 $ai4seo_this_accordion_content = __("*AI for SEO* is compatible with all major SEO plugins. The metadata generated by *AI for SEO* can be synchronized with popular plugins such as Yoast SEO, Rank Math, SEOPress, All in One SEO, Slim SEO, SEO Simple Pack, Squirrly SEO, The SEO Framework, and Blog2Social. This ensures your metadata remains up-to-date and seamlessly integrates with your preferred SEO tool.", "ai-for-seo"); 427 echo ai4seo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("Can I use *AI for SEO* alongside another SEO plugin?", "ai-for-seo"), $ai4seo_this_accordion_content));427 ai4seo_echo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("Can I use *AI for SEO* alongside another SEO plugin?", "ai-for-seo"), $ai4seo_this_accordion_content)); 428 428 429 429 $ai4seo_this_accordion_content = __("To enable synchronization with another SEO plugin:<br><br>1. Navigate to the plugin settings and go to the 'Sync *AI for SEO* Changes': section.<br>2. Check the box next to your desired SEO plugin to activate syncing.<br><br>If you're using the SEO Autopilot (Bulk Generation) feature, make sure the relevant meta tags are enabled in the 'Overwrite Existing Metadata (SEO Autopilot Only)': section to replace outdated data within your existing SEO plugin.", "ai-for-seo"); 430 echo ai4seo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("How do I activate the synchronization with another SEO plugin?", "ai-for-seo"), $ai4seo_this_accordion_content));430 ai4seo_echo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("How do I activate the synchronization with another SEO plugin?", "ai-for-seo"), $ai4seo_this_accordion_content)); 431 431 432 432 $ai4seo_this_accordion_content = __("Providing SEO metadata helps search engines better understand your content, which can lead to higher rankings in search results. This improvement in visibility can drive more clicks, visitors, sales, and leads to your website.", "ai-for-seo"); 433 echo ai4seo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("What are the benefits of providing SEO metadata for my website?", "ai-for-seo"), $ai4seo_this_accordion_content));433 ai4seo_echo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("What are the benefits of providing SEO metadata for my website?", "ai-for-seo"), $ai4seo_this_accordion_content)); 434 434 435 435 $ai4seo_this_accordion_content = __("Go to Settings > Metadata > Include product price in metadata (available when WooCommerce is active) and choose between 'Never', 'Fixed', or 'Dynamic'. 'Never' omits pricing, 'Fixed' stores the current amount directly in the generated copy, and 'Dynamic' inserts a placeholder that is replaced with the live price during rendering.", "ai-for-seo"); 436 echo ai4seo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("How can I include WooCommerce product prices in generated metadata?", "ai-for-seo"), $ai4seo_this_accordion_content));436 ai4seo_echo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("How can I include WooCommerce product prices in generated metadata?", "ai-for-seo"), $ai4seo_this_accordion_content)); 437 437 438 438 $ai4seo_this_accordion_content = __("Add placeholders directly to the prefix or suffix fields under Settings > Metadata or Settings > Media Attributes.<br><br>Supported placeholders (case-insensitive): {WEBSITE_URL}, {WEBSITE_NAME}, {POST_ID}, {PRODUCT_NAME}, {PRODUCT_PRICE}, {FILE_NAME}, {FILE_TYPE}, {FILE_SIZE}, {IMAGE_DIMENSIONS}.<br><br>The plugin replaces them automatically when meta tags are injected or when attachment attributes are saved.", "ai-for-seo"); 439 echo ai4seo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("How can I use placeholders in metadata or media prefixes and suffixes?", "ai-for-seo"), $ai4seo_this_accordion_content));439 ai4seo_echo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("How can I use placeholders in metadata or media prefixes and suffixes?", "ai-for-seo"), $ai4seo_this_accordion_content)); 440 440 441 441 $ai4seo_this_accordion_content = __("Open *AI for SEO* > Settings and locate the \"Active Post Types\" checkboxes in the Metadata section. Uncheck any post types you want to hide. The plugin keeps their existing metadata untouched but removes them from the dashboard, menu and SEO Autopilot queues until you re-enable them.", "ai-for-seo"); 442 echo ai4seo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("How do I hide certain post types from the *AI for SEO* dashboard?", "ai-for-seo"), $ai4seo_this_accordion_content));442 ai4seo_echo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("How do I hide certain post types from the *AI for SEO* dashboard?", "ai-for-seo"), $ai4seo_this_accordion_content)); 443 443 444 444 $ai4seo_this_accordion_content = __("Including image metadata helps search engines better interpret your images, potentially boosting your rankings in image search results and the overall quality of your website. In addition, it also shows your commitment to accessibility, catering to a wider audience and complying with accessibility standards.", "ai-for-seo"); 445 echo ai4seo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("What are the benefits of providing alt text, titles, captions, and descriptions for images on my website?", "ai-for-seo"), $ai4seo_this_accordion_content));445 ai4seo_echo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("What are the benefits of providing alt text, titles, captions, and descriptions for images on my website?", "ai-for-seo"), $ai4seo_this_accordion_content)); 446 446 447 447 $ai4seo_this_accordion_content = __("If you notice that alt text is missing on images, it may be due to your theme or other plugins not properly outputting the alt text stored in the database. In such cases, you can enable the 'Alt Text Injection' setting in the plugin settings. This feature injects alt text directly at the render level, ensuring that images display the correct alt text and improving accessibility and SEO compliance.", "ai-for-seo"); 448 echo ai4seo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("What can I do if alt text is missing on images?", "ai-for-seo"), $ai4seo_this_accordion_content));448 ai4seo_echo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("What can I do if alt text is missing on images?", "ai-for-seo"), $ai4seo_this_accordion_content)); 449 449 450 450 $ai4seo_this_accordion_content = __("The 'Alt Text Injection' setting ensures that images on your website always display the correct alt text, even when your theme or other plugins fail to properly output the alt text stored in the database. When enabled, *AI for SEO* will inject alt text directly at the render level, helping to improve accessibility and SEO compliance. This setting is particularly useful if you experience issues with missing alt text on images due to theme or plugin limitations. It is enabled by default and can be found in the plugin settings.", "ai-for-seo"); 451 echo ai4seo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("What is the 'Alt Text Injection' setting and why should I use it?", "ai-for-seo"), $ai4seo_this_accordion_content));451 ai4seo_echo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("What is the 'Alt Text Injection' setting and why should I use it?", "ai-for-seo"), $ai4seo_this_accordion_content)); 452 452 453 453 $ai4seo_this_accordion_content = sprintf( … … 455 455 "<a target='_blank' href='https://developers.google.com/search/blog/2023/02/google-search-and-ai-content'>https://developers.google.com/search/blog/2023/02/google-search-and-ai-content</a>" 456 456 ); 457 echo ai4seo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("Is AI-generated SEO-content harmful to my SEO-ranking?", "ai-for-seo"), $ai4seo_this_accordion_content)); 458 459 $ai4seo_this_accordion_content = __("The plugin is optimized for maximum performance and we are not aware of any noticeable performance effects on the backend or the frontend.", "ai-for-seo"); 460 echo ai4seo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("Will *AI for SEO* slow down my website?", "ai-for-seo"), $ai4seo_this_accordion_content)); 461 462 $ai4seo_this_accordion_content = __("No, the plugin does not support Multi-Site installations. If you would like to use the plugin on a Multi-Site installation, you will need to purchase Credits for each site individually.", "ai-for-seo"); 463 echo ai4seo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("Does *AI for SEO* support Multi-Site installations?", "ai-for-seo"), $ai4seo_this_accordion_content)); 457 ai4seo_echo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("Is AI-generated SEO-content harmful to my SEO-ranking?", "ai-for-seo"), $ai4seo_this_accordion_content)); 464 458 465 459 $ai4seo_this_accordion_content = __("Yes, you can use your existing subscription and Credits Packs on another website. Simply enter the same license holder and the license key on the new website under AI for SEO > Account. You can link any number of websites together. All linked websites share the same pool of Credits and various settings. You can even export and import settings between websites using the 'Export/Import Settings' button in the plugin settings.", "ai-for-seo"); 466 echo ai4seo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("Can I use my already purchased subscription or Credits Packs on another website?", "ai-for-seo"), $ai4seo_this_accordion_content));460 ai4seo_echo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("Can I use my already purchased subscription or Credits Packs on another website?", "ai-for-seo"), $ai4seo_this_accordion_content)); 467 461 468 462 $ai4seo_this_accordion_content = sprintf( … … 470 464 esc_url(AI4SEO_OFFICIAL_CONTACT_URL) 471 465 ); 472 echo ai4seo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("Can you add feature x, y or z to the plugin?", "ai-for-seo"), $ai4seo_this_accordion_content));466 ai4seo_echo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("Can you add feature x, y or z to the plugin?", "ai-for-seo"), $ai4seo_this_accordion_content)); 473 467 474 468 $ai4seo_this_accordion_content = __("Yes, the AI tool will generate SEO-relevant data based on the content of the selected page, blog post or media file.", "ai-for-seo"); 475 echo ai4seo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("Will the AI tool automatically analyze my content?", "ai-for-seo"), $ai4seo_this_accordion_content));469 ai4seo_echo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("Will the AI tool automatically analyze my content?", "ai-for-seo"), $ai4seo_this_accordion_content)); 476 470 477 471 $ai4seo_this_accordion_content = __("We currently support Elementor, BeTheme (Muffin-Builder / Be-Builder) and the standard editor. We are working on supporting more editors.", "ai-for-seo"); 478 echo ai4seo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("What editors are supported?", "ai-for-seo"), $ai4seo_this_accordion_content));472 ai4seo_echo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("What editors are supported?", "ai-for-seo"), $ai4seo_this_accordion_content)); 479 473 480 474 $ai4seo_this_accordion_content = __("We are currently working on fixing this issue. As a workaround, we recommend saving the generated data and reloading the page before applying changes to the generated data.", "ai-for-seo"); 481 echo ai4seo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("I can't remove the AI-generated text within the Yoast SEO plugin", "ai-for-seo"), $ai4seo_this_accordion_content));475 ai4seo_echo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("I can't remove the AI-generated text within the Yoast SEO plugin", "ai-for-seo"), $ai4seo_this_accordion_content)); 482 476 483 477 $ai4seo_this_accordion_content = __("Yes, the plugin does support multi-language websites. The plugin also supports the WPML-plugin through which you can generate metadata and media attributes for all available languages separately.", "ai-for-seo"); 484 echo ai4seo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("Does *AI for SEO* support multi-language websites?", "ai-for-seo"), $ai4seo_this_accordion_content));478 ai4seo_echo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("Does *AI for SEO* support multi-language websites?", "ai-for-seo"), $ai4seo_this_accordion_content)); 485 479 486 480 $ai4seo_this_accordion_content = __("The best setup is to use a cronjob outside the WordPress cron system (external cron job, either on your own server or through a third-party service) that runs every minute. This ensures that the SEO Autopilot and scheduled tasks run smoothly without being dependent on WordPress's internal cron system, which may not execute reliably on low-traffic sites.", "ai-for-seo"); 487 echo ai4seo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("What is the recommended cron job setting for WordPress?", "ai-for-seo"), $ai4seo_this_accordion_content));481 ai4seo_echo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("What is the recommended cron job setting for WordPress?", "ai-for-seo"), $ai4seo_this_accordion_content)); 488 482 489 483 $ai4seo_this_accordion_content = __("If possible, switch to a cron job system outside the WordPress cron system (external cron job, either on your own server or through a third-party service) that runs every minute. If this is not an option and you experience slow SEO Autopilot, consider increasing the SEO Autopilot Duration setting (Settings > Troubleshooting > SEO Autopilot Duration) to allow more processing time per batch.", "ai-for-seo"); 490 echo ai4seo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("I use WordPress’s internal cron system (WP-Cron). What should I consider?", "ai-for-seo"), $ai4seo_this_accordion_content));484 ai4seo_echo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("I use WordPress’s internal cron system (WP-Cron). What should I consider?", "ai-for-seo"), $ai4seo_this_accordion_content)); 491 485 492 486 $ai4seo_this_accordion_content = __("If your external cron job runs less frequently than once per minute, we recommend increasing the <strong>SEO Autopilot Duration</strong> setting (Settings > Troubleshooting > SEO Autopilot Duration). This allows each cycle to handle more tasks at once, compensating for the lower execution frequency.", "ai-for-seo"); 493 echo ai4seo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("I use an external cron job system, but I can only run the cron job every 2+ minutes or less frequently. What should I do?", "ai-for-seo"), $ai4seo_this_accordion_content));487 ai4seo_echo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("I use an external cron job system, but I can only run the cron job every 2+ minutes or less frequently. What should I do?", "ai-for-seo"), $ai4seo_this_accordion_content)); 494 488 495 489 $ai4seo_this_accordion_content = __("By default, the SEO Autopilot skips entries with a complete set of metadata or media attributes, assuming they are optimized.", "ai-for-seo") . "<br /><br />"; … … 498 492 $ai4seo_this_accordion_content .= __('Enable "Include Complete Entries When Overwriting (SEO Autopilot Only)" in the Media Attributes section.', "ai-for-seo") . "<br />"; 499 493 $ai4seo_this_accordion_content .= __("You can find these options in the plugin settings. This will force the SEO Autopilot to overwrite all existing metadata and media attributes, even if they are already set.", "ai-for-seo"); 500 echo ai4seo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("The SEO Autopilot ignored some entries or marked them as already completed. What can I do?", "ai-for-seo"), $ai4seo_this_accordion_content));494 ai4seo_echo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("The SEO Autopilot ignored some entries or marked them as already completed. What can I do?", "ai-for-seo"), $ai4seo_this_accordion_content)); 501 495 502 496 $ai4seo_this_accordion_content = __("If you notice outdated data appearing while generating metadata or media attributes, try the following steps:", "ai-for-seo") . "<br /><br />"; … … 504 498 $ai4seo_this_accordion_content .= __("2. If the issue persists, Reset Environmental Variables – This can help resolve cases where incorrect internal values are affecting data processing.", "ai-for-seo") . "<br /><br />"; 505 499 $ai4seo_this_accordion_content .= __("You can find both options under Help > Troubleshooting > Reset Plugin.", "ai-for-seo"); 506 echo ai4seo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("I see old data in the plugin while generating metadata or media attributes. What can I do?", "ai-for-seo"), $ai4seo_this_accordion_content));500 ai4seo_echo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("I see old data in the plugin while generating metadata or media attributes. What can I do?", "ai-for-seo"), $ai4seo_this_accordion_content)); 507 501 508 502 $ai4seo_this_accordion_content = __("If you want to revert the plugin settings to their default state: Use the Reset Settings option under Help > Troubleshooting > Reset Plugin. This will restore all settings to their original values but will not delete generated metadata or media attributes.", "ai-for-seo"); 509 echo ai4seo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("How can I reset the plugin settings to their default values?", "ai-for-seo"), $ai4seo_this_accordion_content));503 ai4seo_echo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("How can I reset the plugin settings to their default values?", "ai-for-seo"), $ai4seo_this_accordion_content)); 510 504 511 505 $ai4seo_this_accordion_content = __("If you want to fully remove all generated metadata and plugin data before uninstalling:", "ai-for-seo") . "<br /><br />"; … … 513 507 $ai4seo_this_accordion_content .= __("2. Deactivate and uninstall the plugin.", "ai-for-seo") . "<br /><br />"; 514 508 $ai4seo_this_accordion_content .= __("Note: Media Attributes and synced metadata (to third-party SEO plugins) cannot be removed or undone by the reset. You will need to manually update or remove them in their respective editors.", "ai-for-seo"); 515 echo ai4seo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("I want to uninstall the plugin and remove all generated data. How can I do this?", "ai-for-seo"), $ai4seo_this_accordion_content));509 ai4seo_echo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("I want to uninstall the plugin and remove all generated data. How can I do this?", "ai-for-seo"), $ai4seo_this_accordion_content)); 516 510 517 511 $ai4seo_this_accordion_content = __("It depends on how the metadata is stored and used. If *AI for SEO* has synchronized the generated metadata with a third-party SEO plugin like Yoast SEO, Rank Math, SEOPress, or similar, then the metadata will remain even after uninstalling *AI for SEO*. You can check and enable synchronization in your *AI for SEO* settings.", "ai-for-seo") . "<br /><br />"; 518 512 $ai4seo_this_accordion_content .= __("However, if synchronization was not enabled, and *AI for SEO* was solely responsible for outputting meta tags on your site, then those tags will no longer be generated once the plugin is deactivated or uninstalled.", "ai-for-seo"); 519 echo ai4seo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("Will all the generated texts disappear if I uninstall the plugin?", "ai-for-seo"), $ai4seo_this_accordion_content));513 ai4seo_echo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("Will all the generated texts disappear if I uninstall the plugin?", "ai-for-seo"), $ai4seo_this_accordion_content)); 520 514 521 515 $ai4seo_this_accordion_content = __("If you generated metadata or media attributes with incorrect settings, follow these steps:", "ai-for-seo") . "<br /><br />"; … … 524 518 $ai4seo_this_accordion_content .= __('3. If you generated media attributes, consider enabling: "Include Complete Entries When Overwriting (SEO Autopilot Only)" in the Media Attributes section.', "ai-for-seo") . "<br />"; 525 519 $ai4seo_this_accordion_content .= __("These settings will allow the plugin to regenerate and overwrite metadata and media attributes, even for entries that were previously marked as complete.", "ai-for-seo"); 526 echo ai4seo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("I used the wrong settings for manual or bulk generation (e.g., wrong language or missing sync with other SEO plugins). What can I do?", "ai-for-seo"), $ai4seo_this_accordion_content));520 ai4seo_echo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("I used the wrong settings for manual or bulk generation (e.g., wrong language or missing sync with other SEO plugins). What can I do?", "ai-for-seo"), $ai4seo_this_accordion_content)); 527 521 528 522 $ai4seo_this_accordion_content = __("Enable \"Pause pages and media files analysis\" under Help > Troubleshooting.", "ai-for-seo"); 529 523 $ai4seo_this_accordion_content .= "<br /><br />" . __("Switch the setting off after debugging to resume normal data analysis.", "ai-for-seo"); 530 echo ai4seo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("I run into performance while pages and media files are being analyzed. How can I pause the analysis?", "ai-for-seo"), $ai4seo_this_accordion_content));524 ai4seo_echo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("I run into performance while pages and media files are being analyzed. How can I pause the analysis?", "ai-for-seo"), $ai4seo_this_accordion_content)); 531 525 532 526 $ai4seo_this_accordion_content = __("To import all images from the NextGen Gallery into *AI for SEO*, click the Import button in the Media section. Once imported, you can generate alt text, titles, captions, and descriptions for these images using the plugin. All changes will automatically sync with the NextGen Gallery plugin.", "ai-for-seo"); 533 echo ai4seo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("I use the NextGen Gallery plugin — how do I generate media attributes for my images?", "ai-for-seo"), $ai4seo_this_accordion_content));527 ai4seo_echo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("I use the NextGen Gallery plugin — how do I generate media attributes for my images?", "ai-for-seo"), $ai4seo_this_accordion_content)); 534 528 535 529 … … 542 536 $ai4seo_this_accordion_content .= __( '4. Ensure images are real <img> tags. Background images set via CSS cannot have alt text.', 'ai-for-seo' ); 543 537 544 echo ai4seo_wp_kses(538 ai4seo_echo_wp_kses( 545 539 ai4seo_get_accordion_element( 546 540 '> ' . esc_html__( 'I do not see generated alt text on the front page. What can I do?', 'ai-for-seo' ), … … 558 552 $ai4seo_this_accordion_content .= __( '4. If issues persist, clear all caches and confirm the image is a real <img> tag, not a CSS background.', 'ai-for-seo' ); 559 553 560 echo ai4seo_wp_kses(554 ai4seo_echo_wp_kses( 561 555 ai4seo_get_accordion_element( 562 556 '> ' . esc_html__( 'Generating alt text fails. Should I switch "Image Upload Method" to "Data"?', 'ai-for-seo' ), … … 566 560 567 561 $ai4seo_this_accordion_content = __( 'Yes, you can use *AI for SEO* on staging or local development sites.', 'ai-for-seo' ); 568 echo ai4seo_wp_kses(562 ai4seo_echo_wp_kses( 569 563 ai4seo_get_accordion_element( 570 564 '> ' . esc_html__( 'Can I use *AI for SEO* on a staging or local development site?', 'ai-for-seo' ), … … 585 579 586 580 $ai4seo_this_accordion_content = __("You can automate the generation of metadata by selecting the desired content type within the 'Set up SEO Autopilot' modal. This modal can be accessed by clicking the 'Set up SEO Autopilot'-button within the 'SEO Autopilot (Bulk Generation)'-section on the *AI for SEO* dashboard of your WordPress website.", "ai-for-seo"); 587 echo ai4seo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("How can I automate the process of generating metadata for my website?", "ai-for-seo"), $ai4seo_this_accordion_content));581 ai4seo_echo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("How can I automate the process of generating metadata for my website?", "ai-for-seo"), $ai4seo_this_accordion_content)); 588 582 589 583 $ai4seo_this_accordion_content = __("You can automate the generation of alt text, titles, captions, and descriptions for images by selecting 'Media files' within the 'Set up SEO Autopilot' modal. This modal can be accessed by clicking the 'Set up SEO Autopilot'-button within the 'SEO Autopilot (Bulk Generation)'-section on the *AI for SEO* dashboard of your WordPress website.", "ai-for-seo"); 590 echo ai4seo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("How can I automate the process of generating alt text, titles, captions, and descriptions for images on my website?", "ai-for-seo"), $ai4seo_this_accordion_content));584 ai4seo_echo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("How can I automate the process of generating alt text, titles, captions, and descriptions for images on my website?", "ai-for-seo"), $ai4seo_this_accordion_content)); 591 585 592 586 $ai4seo_this_accordion_content = __("Yes, simply deactivate the checkbox next to the desired content type within the 'Set up SEO Autopilot' modal. This modal can be accessed by clicking the 'Set up SEO Autopilot'-button within the 'SEO Autopilot (Bulk Generation)'-section on the *AI for SEO* dashboard of your WordPress website. If you would like to disable the automation for every content type entirely you can click the 'Stop SEO Autopilot' button within the 'SEO Autopilot (Bulk Generation)'-section on the *AI for SEO* dashboard of your WordPress website.", "ai-for-seo"); 593 echo ai4seo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("Can I turn off the automation feature after I've activated it?", "ai-for-seo"), $ai4seo_this_accordion_content));587 ai4seo_echo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("Can I turn off the automation feature after I've activated it?", "ai-for-seo"), $ai4seo_this_accordion_content)); 594 588 595 589 $ai4seo_this_accordion_content = __("Yes! You can decide exactly how the SEO Autopilot behaves. By default, the plugin automatically generates metadata and media attributes for both new and existing content. However, you can customize this behavior using three options:<br>• New and existing entries<br>• New entries only<br>• Existing entries only<br><br>You can change these settings anytime in the <strong>Set up SEO Autopilot</strong> modal. Just click the <strong>Set up SEO Autopilot</strong> button in the <strong>SEO Autopilot (Bulk Generation)</strong> section of your *AI for SEO* dashboard.", "ai-for-seo"); 596 echo ai4seo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("Does the SEO Autopilot (bulk generation) feature work for new content?", "ai-for-seo"), $ai4seo_this_accordion_content));590 ai4seo_echo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("Does the SEO Autopilot (bulk generation) feature work for new content?", "ai-for-seo"), $ai4seo_this_accordion_content)); 597 591 598 592 $ai4seo_this_accordion_content = __("Not by default. However, you can enable the 'Overwrite Existing Metadata (SEO Autopilot Only)'-option in the settings if needed.", "ai-for-seo"); 599 echo ai4seo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("Will the SEO Autopilot (bulk generation) feature affect existing data (meta-title, meta-description, etc.)?", "ai-for-seo"), $ai4seo_this_accordion_content));600 601 $ai4seo_this_accordion_content = __("Yes, in the ' Meta Tag Inclusion:'-section of the settings, you can choose to include or exclude specific meta tags from the header output generated by our plugin. This gives you full control to customize the meta tags based on your specific requirements.", "ai-for-seo");602 echo ai4seo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("Is there any way to control what meta tags are outputted?", "ai-for-seo"), $ai4seo_this_accordion_content));593 ai4seo_echo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("Will the SEO Autopilot (bulk generation) feature affect existing data (meta-title, meta-description, etc.)?", "ai-for-seo"), $ai4seo_this_accordion_content)); 594 595 $ai4seo_this_accordion_content = __("Yes, in the 'Active Meta Tags'-section of the settings, you can choose to include or exclude specific meta tags from the header output generated by our plugin. This gives you full control to customize the meta tags based on your specific requirements.", "ai-for-seo"); 596 ai4seo_echo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("Is there any way to control what meta tags are outputted?", "ai-for-seo"), $ai4seo_this_accordion_content)); 603 597 604 598 $ai4seo_this_accordion_content = __("Yes, *AI for SEO* lets you decide which media attributes (like 'alt text' or 'title') should be generated. You can configure this in the 'Active Media Attributes:' section of the settings to match your content needs. Simply select the desired attributes and the SEO Autopilot will generate the data accordingly.", "ai-for-seo"); 605 echo ai4seo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("Can I choose which media attributes the plugin should generate?", "ai-for-seo"), $ai4seo_this_accordion_content));599 ai4seo_echo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("Can I choose which media attributes the plugin should generate?", "ai-for-seo"), $ai4seo_this_accordion_content)); 606 600 607 601 $ai4seo_this_accordion_content = __("You can find the 'Retry all failed' button in any content pages (e.g. Pages, Posts or media) and on your AI for SEO dashboard. This allows you to retry all failed metadata generations with a single click, saving you time and effort. Please note that this button will only be displayed if at least one error has occurred.", "ai-for-seo"); 608 echo ai4seo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("How can I retry all failed metadata generations with just one click?", "ai-for-seo"), $ai4seo_this_accordion_content));602 ai4seo_echo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("How can I retry all failed metadata generations with just one click?", "ai-for-seo"), $ai4seo_this_accordion_content)); 609 603 610 604 $ai4seo_this_accordion_content = __("We use WordPress's internal task scheduler to manage automatic generation efficiently. This helps prevent overloading your server with too many simultaneous tasks.", "ai-for-seo") . "<br /><br />"; … … 614 608 $ai4seo_this_accordion_content .= __("You can check the *AI for SEO* dashboard to see if any generation is in progress for other items. If many items are pending, it may take longer to process them all.", "ai-for-seo") . "<br /><br />"; 615 609 $ai4seo_this_accordion_content .= __("Rest assured, the plugin will automatically generate data for all pending items over time. If you need immediate results, you can use the manual generation option for specific items.", "ai-for-seo"); 616 echo ai4seo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("Why is the automatic metadata or media attributes generation pending?", "ai-for-seo"), $ai4seo_this_accordion_content));610 ai4seo_echo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("Why is the automatic metadata or media attributes generation pending?", "ai-for-seo"), $ai4seo_this_accordion_content)); 617 611 618 612 echo "</div>"; … … 628 622 629 623 $ai4seo_this_accordion_content = __("You can navigate to the page or post you want to edit through the normal editor, using a page builder like Elementor, or by opening the page directly in the frontend.", "ai-for-seo"); 630 echo ai4seo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("How do I navigate to the page I want to edit for SEO?", "ai-for-seo"), $ai4seo_this_accordion_content));624 ai4seo_echo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("How do I navigate to the page I want to edit for SEO?", "ai-for-seo"), $ai4seo_this_accordion_content)); 631 625 632 626 $ai4seo_this_accordion_content = __("You can find the *AI for SEO* button in the top admin-bar. Clicking on this will open up the metadata editor where you can modify or generate metadata.", "ai-for-seo"); 633 echo ai4seo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("Where is the *AI for SEO* metadata editor located?", "ai-for-seo"), $ai4seo_this_accordion_content));627 ai4seo_echo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("Where is the *AI for SEO* metadata editor located?", "ai-for-seo"), $ai4seo_this_accordion_content)); 634 628 635 629 $ai4seo_this_accordion_content = __("After opening the *AI for SEO* metadata editor, you can either edit the existing metadata manually or generate new metadata using the 'Generate with AI' buttons.", "ai-for-seo"); 636 echo ai4seo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("How can I generate or edit metadata?", "ai-for-seo"), $ai4seo_this_accordion_content));630 ai4seo_echo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("How can I generate or edit metadata?", "ai-for-seo"), $ai4seo_this_accordion_content)); 637 631 638 632 $ai4seo_this_accordion_content = __("Yes, alternatively, you can go to the 'Pages' or 'Posts' page within the *AI for SEO* plugin. From there, you can browse through your pages and posts, and choose the ones you want to edit.", "ai-for-seo"); 639 echo ai4seo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("Is there an alternate way to access *AI for SEO*'s Metadata Editor?", "ai-for-seo"), $ai4seo_this_accordion_content));633 ai4seo_echo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("Is there an alternate way to access *AI for SEO*'s Metadata Editor?", "ai-for-seo"), $ai4seo_this_accordion_content)); 640 634 641 635 $ai4seo_this_accordion_content = __("1. Open the page or post you want to edit in Elementor.", "ai-for-seo") . "<br />"; 642 636 $ai4seo_this_accordion_content .= __("2. Click the settings button (cog icon) at the top of the Elementor header to reveal the page or post settings.", "ai-for-seo") . "<br />"; 643 637 $ai4seo_this_accordion_content .= __("3. In the settings section, click on the 'Show all SEO settings' button to open the *AI for SEO* metadata editor. Here, you can adjust the metadata manually or generate new metadata using AI-driven algorithms.", "ai-for-seo"); 644 echo ai4seo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("How do I edit metadata in Elementor with *AI for SEO*?", "ai-for-seo"), $ai4seo_this_accordion_content));638 ai4seo_echo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("How do I edit metadata in Elementor with *AI for SEO*?", "ai-for-seo"), $ai4seo_this_accordion_content)); 645 639 646 640 $ai4seo_this_accordion_content = __("1. Open the page or post you want to edit in BeBuilder, the page-building tool within the BeTheme framework.", "ai-for-seo") . "<br />"; 647 641 $ai4seo_this_accordion_content .= __("2. Click on the page-options-button on the left side of the BeBuilder navigation, then scroll down to the SEO section.", "ai-for-seo") . "<br />"; 648 642 $ai4seo_this_accordion_content .= __("3. Click on the 'Show all SEO settings' button within the SEO section to open the *AI for SEO* metadata editor. Here, you can access and manipulate the metadata using AI-driven algorithms.", "ai-for-seo"); 649 echo ai4seo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("How do I edit SEO settings in BeBuilder with *AI for SEO*?", "ai-for-seo"), $ai4seo_this_accordion_content));643 ai4seo_echo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("How do I edit SEO settings in BeBuilder with *AI for SEO*?", "ai-for-seo"), $ai4seo_this_accordion_content)); 650 644 651 645 // === FAQ: Cannot access plugin due to incognito mode restriction ================= \\ … … 661 655 $ai4seo_this_accordion_content .= __("3. If needed, you may enable incognito mode again after saving.", "ai-for-seo"); 662 656 663 echo ai4seo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("I cannot access the plugin due to incognito mode restriction. What can I do?", "ai-for-seo"), $ai4seo_this_accordion_content));657 ai4seo_echo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("I cannot access the plugin due to incognito mode restriction. What can I do?", "ai-for-seo"), $ai4seo_this_accordion_content)); 664 658 echo "</div>"; 665 659 … … 678 672 esc_html($ai4seo_free_plan_credits), 679 673 ); 680 echo ai4seo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("Are Credits renewed in the Free plan?", "ai-for-seo"), $ai4seo_this_accordion_content));674 ai4seo_echo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("Are Credits renewed in the Free plan?", "ai-for-seo"), $ai4seo_this_accordion_content)); 681 675 682 676 $ai4seo_this_accordion_content = __("You don't need to do anything—they'll be automatically added to your account every day if your balance falls below 100 Credits. Just make sure the plugin remains active on your website.", "ai-for-seo"); 683 echo ai4seo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("What do I need to do to receive the free daily Credits?", "ai-for-seo"), $ai4seo_this_accordion_content));677 ai4seo_echo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("What do I need to do to receive the free daily Credits?", "ai-for-seo"), $ai4seo_this_accordion_content)); 684 678 685 679 $ai4seo_this_accordion_content = __("Yes, you'll continue to receive the free daily Credits even if you're on a paid subscription if your balance falls below 100 Credits. These Credits are in addition to those included in your subscription.", "ai-for-seo"); 686 echo ai4seo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("Will I still receive the free daily Credits if I'm on a paid subscription?", "ai-for-seo"), $ai4seo_this_accordion_content));687 688 $ai4seo_this_accordion_content = __("Credits are consumed when the AI generates metadata or media attributes for your content entries. Each generation costs Credits, depending on your settings.", "ai-for-seo") . "<br /><br />";689 echo ai4seo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("How are Credits consumed in the *AI for SEO* plugin?", "ai-for-seo"), $ai4seo_this_accordion_content));680 ai4seo_echo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("Will I still receive the free daily Credits if I'm on a paid subscription?", "ai-for-seo"), $ai4seo_this_accordion_content)); 681 682 $ai4seo_this_accordion_content = __("Credits are used when *AI for SEO* generates metadata for your content (posts, pages, products, media files etc.). The amount of Credits required depends on the selected active meta tags and media attributes (see Settings).", "ai-for-seo") . "<br /><br />"; 683 ai4seo_echo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("How are Credits consumed in the *AI for SEO* plugin?", "ai-for-seo"), $ai4seo_this_accordion_content)); 690 684 691 685 $ai4seo_this_accordion_content = sprintf( … … 695 689 esc_html($ai4seo_free_plan_credits), 696 690 ); 697 echo ai4seo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("Can I try the *AI for SEO* plugin without purchasing a subscription?", "ai-for-seo"), $ai4seo_this_accordion_content));691 ai4seo_echo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("Can I try the *AI for SEO* plugin without purchasing a subscription?", "ai-for-seo"), $ai4seo_this_accordion_content)); 698 692 699 693 $ai4seo_this_accordion_content = sprintf( … … 712 706 esc_html($ai4seo_l_plan_credits), 713 707 ); 714 echo ai4seo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("How many Credits do I get with the Basic, Pro, and Premium subscriptions?", "ai-for-seo"), $ai4seo_this_accordion_content));708 ai4seo_echo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("How many Credits do I get with the Basic, Pro, and Premium subscriptions?", "ai-for-seo"), $ai4seo_this_accordion_content)); 715 709 716 710 $ai4seo_this_accordion_content = __("You should choose a subscription based on the number of Credits and additional features you need for generating SEO content:", "ai-for-seo") . "<br />"; … … 736 730 esc_html(AI4SEO_CUSTOM_PLAN_DISCOUNT) . "%", 737 731 ); 738 echo ai4seo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("How do I choose the right subscription for my needs?", "ai-for-seo"), $ai4seo_this_accordion_content));732 ai4seo_echo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("How do I choose the right subscription for my needs?", "ai-for-seo"), $ai4seo_this_accordion_content)); 739 733 740 734 // lost key content … … 746 740 "<strong>" . esc_html__("Lost your license data?", "ai-for-seo") . "</strong>", 747 741 ); 748 echo ai4seo_wp_kses(ai4seo_get_accordion_element(742 ai4seo_echo_wp_kses(ai4seo_get_accordion_element( 749 743 "> " . esc_html__("What should I do if I lose my license key?", "ai-for-seo"), 750 744 $ai4seo_this_accordion_content … … 756 750 ); 757 751 $ai4seo_this_accordion_content .= __("You'll be redirected to Stripe, our invoice partner. Please follow the instructions on the Stripe website to change or cancel your subscription.", "ai-for-seo"); 758 echo ai4seo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("How do I change or cancel my subscription?", "ai-for-seo"), $ai4seo_this_accordion_content));752 ai4seo_echo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("How do I change or cancel my subscription?", "ai-for-seo"), $ai4seo_this_accordion_content)); 759 753 760 754 $ai4seo_this_accordion_content = sprintf( … … 763 757 ); 764 758 $ai4seo_this_accordion_content .= __("You'll be redirected to Stripe, our invoice partner. Please follow the instructions on the Stripe website to change your subscription.", "ai-for-seo"); 765 echo ai4seo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("Can I upgrade or downgrade my subscription?", "ai-for-seo"), $ai4seo_this_accordion_content));759 ai4seo_echo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("Can I upgrade or downgrade my subscription?", "ai-for-seo"), $ai4seo_this_accordion_content)); 766 760 767 761 $ai4seo_this_accordion_content = __("No, any unused Credits will roll over to the next month, allowing you to fully utilize your Credits without losing them at the end of each billing cycle.", "ai-for-seo"); 768 echo ai4seo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("Do unused Credits expire at the end of the month?", "ai-for-seo"), $ai4seo_this_accordion_content));762 ai4seo_echo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("Do unused Credits expire at the end of the month?", "ai-for-seo"), $ai4seo_this_accordion_content)); 769 763 echo "</div>"; 770 764 echo "</div>"; … … 877 871 878 872 // select all button 879 echo ai4seo_wp_kses(ai4seo_get_select_all_checkbox("ai4seo-troubleshooting-reset-checkbox"));873 ai4seo_echo_wp_kses(ai4seo_get_select_all_checkbox("ai4seo-troubleshooting-reset-checkbox")); 880 874 echo "<div class='ai4seo-medium-gap'></div>"; 881 875 … … 891 885 echo "<label for='ai4seo-troubleshooting-reset-notifications'>" . esc_html__("Reset notifications", "ai-for-seo") . "</label>"; 892 886 $ai4seo_notifications_tooltip = __("Dismissed notifications will be reset and eventually reappear in the notifications section of the plugin.", "ai-for-seo"); 893 echo ai4seo_wp_kses(ai4seo_get_icon_with_tooltip_tag($ai4seo_notifications_tooltip));887 ai4seo_echo_wp_kses(ai4seo_get_icon_with_tooltip_tag($ai4seo_notifications_tooltip)); 894 888 echo "</div>"; 895 889 … … 907 901 echo "<label for='ai4seo-troubleshooting-reset-settings'>" . esc_html__("Reset plugin settings", "ai-for-seo") . "</label>"; 908 902 $ai4seo_settings_tooltip = __("<strong>This will reset all settings across the following pages:</strong><br>Settings Page, Account Page (license data will be kept), Pay-As-You-Go Settings, and Autopilot Settings.<br><br>To reset only the Settings Page, please use the \"Restore Default\" button on that page.", "ai-for-seo"); 909 echo ai4seo_wp_kses(ai4seo_get_icon_with_tooltip_tag($ai4seo_settings_tooltip));903 ai4seo_echo_wp_kses(ai4seo_get_icon_with_tooltip_tag($ai4seo_settings_tooltip)); 910 904 echo "</div>"; 911 905 … … 914 908 echo "<input type='checkbox' id='ai4seo-troubleshooting-reset-metadata' name='ai4seo-troubleshooting-reset-checkbox[]' />"; 915 909 echo "<label for='ai4seo-troubleshooting-reset-metadata'>" . esc_html__("Remove AI-generated data", "ai-for-seo") . "</label>"; 916 echo ai4seo_wp_kses(ai4seo_get_icon_with_tooltip_tag($ai4seo_reset_generated_data_tooltip));910 ai4seo_echo_wp_kses(ai4seo_get_icon_with_tooltip_tag($ai4seo_reset_generated_data_tooltip)); 917 911 echo "</div>"; 918 912 … … 921 915 // needed for extra information in the upcoming notification modal 922 916 echo "<div id='ai4seo-reset-generated-data-tooltip-text' style='display: none'>"; 923 echo ai4seo_wp_kses($ai4seo_reset_generated_data_tooltip);917 ai4seo_echo_wp_kses($ai4seo_reset_generated_data_tooltip); 924 918 echo "</div>"; 925 919 … … 947 941 948 942 echo "<p class='ai4seo-form-item-description'>"; 949 echo ai4seo_wp_kses($ai4seo_disable_heavy_db_operations_description);943 ai4seo_echo_wp_kses($ai4seo_disable_heavy_db_operations_description); 950 944 echo "</p>"; 951 945 echo "</div>"; … … 968 962 // Input for the search 969 963 echo "<div class='ai4seo-help-search-wrapper'>"; 970 echo ai4seo_wp_kses(ai4seo_get_svg_tag("magnifying-glass"));964 ai4seo_echo_wp_kses(ai4seo_get_svg_tag("magnifying-glass")); 971 965 echo "<input type='text' class='ai4seo-help-search' id='ai4seo-help-search-troubleshooting' placeholder='" . esc_attr__("Search F.A.Q. (enter min.3 characters)", "ai-for-seo") . "' />"; 972 966 echo "</div>"; … … 981 975 echo "<div class='ai4seo-faq-section-holder'>"; 982 976 $ai4seo_this_accordion_content = __("If you want to revert the plugin settings to their default state: Use the Reset Settings option under Help > Troubleshooting > Reset Plugin. This will restore all settings to their original values but will not delete generated metadata or media attributes.", "ai-for-seo"); 983 echo ai4seo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("How can I reset the plugin settings to their default values?", "ai-for-seo"), $ai4seo_this_accordion_content));977 ai4seo_echo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("How can I reset the plugin settings to their default values?", "ai-for-seo"), $ai4seo_this_accordion_content)); 984 978 985 979 $ai4seo_this_accordion_content = __("If you want to fully remove all generated metadata and plugin data before uninstalling:", "ai-for-seo") . "<br /><br />"; … … 987 981 $ai4seo_this_accordion_content .= __("2. Deactivate and uninstall the plugin.", "ai-for-seo") . "<br /><br />"; 988 982 $ai4seo_this_accordion_content .= __("Note: Media Attributes and synced metadata (to third-party SEO plugins) cannot be removed or undone by the reset. You will need to manually update or remove them in their respective editors.", "ai-for-seo"); 989 echo ai4seo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("I want to uninstall the plugin and remove all generated data. How can I do this?", "ai-for-seo"), $ai4seo_this_accordion_content));983 ai4seo_echo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("I want to uninstall the plugin and remove all generated data. How can I do this?", "ai-for-seo"), $ai4seo_this_accordion_content)); 990 984 991 985 $ai4seo_this_accordion_content = __("If you generated metadata or media attributes with incorrect settings, follow these steps:", "ai-for-seo") . "<br /><br />"; … … 994 988 $ai4seo_this_accordion_content .= __('3. If you generated media attributes, consider enabling: "Include Complete Entries When Overwriting (SEO Autopilot Only)" in the Media Attributes section.', "ai-for-seo") . "<br />"; 995 989 $ai4seo_this_accordion_content .= __("These settings will allow the plugin to regenerate and overwrite metadata and media attributes, even for entries that were previously marked as complete.", "ai-for-seo"); 996 echo ai4seo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("I used the wrong settings for manual or bulk generation (e.g., wrong language or missing sync with other SEO plugins). What can I do?", "ai-for-seo"), $ai4seo_this_accordion_content));990 ai4seo_echo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("I used the wrong settings for manual or bulk generation (e.g., wrong language or missing sync with other SEO plugins). What can I do?", "ai-for-seo"), $ai4seo_this_accordion_content)); 997 991 998 992 $ai4seo_this_accordion_content = __("Enable \"Pause pages and media files analysis\" under Help > Troubleshooting.", "ai-for-seo"); 999 993 $ai4seo_this_accordion_content .= "<br /><br />" . __("Switch the setting off after debugging to resume normal data analysis.", "ai-for-seo"); 1000 echo ai4seo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("I run into performance while pages and media files are being analyzed. How can I pause the analysis?", "ai-for-seo"), $ai4seo_this_accordion_content));994 ai4seo_echo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("I run into performance while pages and media files are being analyzed. How can I pause the analysis?", "ai-for-seo"), $ai4seo_this_accordion_content)); 1001 995 1002 996 // === FAQ: Alt Text Injection not visible ================================== \\ … … 1008 1002 $ai4seo_this_accordion_content .= __( '4. Ensure images are real <img> tags. Background images set via CSS cannot have alt text.', 'ai-for-seo' ); 1009 1003 1010 echo ai4seo_wp_kses(1004 ai4seo_echo_wp_kses( 1011 1005 ai4seo_get_accordion_element( 1012 1006 '> ' . esc_html__( 'I do not see generated alt text on the front page. What can I do?', 'ai-for-seo' ), … … 1023 1017 $ai4seo_this_accordion_content .= __( '4. If issues persist, clear all caches and confirm the image is a real <img> tag, not a CSS background.', 'ai-for-seo' ); 1024 1018 1025 echo ai4seo_wp_kses(1019 ai4seo_echo_wp_kses( 1026 1020 ai4seo_get_accordion_element( 1027 1021 '> ' . esc_html__( 'Generating alt text fails. Should I switch "Image Upload Method" to "Data"?', 'ai-for-seo' ), … … 1042 1036 $ai4seo_this_accordion_content .= __("3. If needed, you may enable incognito mode again after saving.", "ai-for-seo"); 1043 1037 1044 echo ai4seo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("I cannot access the plugin due to incognito mode restriction. What can I do?", "ai-for-seo"), $ai4seo_this_accordion_content));1038 ai4seo_echo_wp_kses(ai4seo_get_accordion_element("> " . esc_html__("I cannot access the plugin due to incognito mode restriction. What can I do?", "ai-for-seo"), $ai4seo_this_accordion_content)); 1045 1039 echo "</div>"; 1046 1040 echo "</div>"; -
ai-for-seo/trunk/includes/pages/settings.php
r3408847 r3420851 56 56 57 57 echo "<div class='ai4seo-settings-top-buttons'>"; 58 echo "<button type='button' onclick='ai4seo_open_modal_from_schema(\"export-import-settings\", {modal_size: \"small\"});' class='button ai4seo-button ai4seo-small-button'>" . ai4seo_wp_kses(ai4seo_get_svg_tag("download")) . " " . esc_html__("Export/Import", "ai-for-seo") . "</button>"; 59 echo "<button type='button' onclick='ai4seo_restore_default_settings(this);' class='button ai4seo-button ai4seo-small-button'>" . ai4seo_wp_kses(ai4seo_get_svg_tag("rotate")) . " " . esc_html__("Restore Default", "ai-for-seo") . "</button>"; 58 echo "<button type='button' onclick='ai4seo_open_modal_from_schema(\"export-import-settings\", {modal_size: \"small\"});' class='button ai4seo-button ai4seo-small-button'>"; 59 ai4seo_echo_wp_kses(ai4seo_get_svg_tag("download")); 60 echo " " . esc_html__("Export/Import", "ai-for-seo"); 61 echo "</button>"; 62 echo "<button type='button' onclick='ai4seo_restore_default_settings(this);' class='button ai4seo-button ai4seo-small-button'>"; 63 ai4seo_echo_wp_kses(ai4seo_get_svg_tag("rotate")); 64 echo " " . esc_html__("Restore Default", "ai-for-seo"); 65 echo "</button>"; 60 66 61 67 … … 68 74 echo "<input type='hidden' value='" . esc_attr($ai4seo_this_setting_input_value) . "' id='ai4seo-advanced-setting-state' name='" . esc_attr($ai4seo_this_setting_input_name) . "' />"; 69 75 echo "<div style='display: " . ($ai4seo_this_setting_input_value === "show" ? "none" : "block") . "' id='ai4seo-show-advanced-settings-container'>"; 70 echo "<button type='button' onclick='ai4seo_show_advanced_settings(true);' id='ai4seo-toggle-advanced-button' class='button ai4seo-button ai4seo-small-button'>" . ai4seo_wp_kses(ai4seo_get_svg_tag("eye")) . " " . esc_html__("Show Advanced Settings", "ai-for-seo") . "</button>"; 76 echo "<button type='button' onclick='ai4seo_show_advanced_settings(true);' id='ai4seo-toggle-advanced-button' class='button ai4seo-button ai4seo-small-button'>"; 77 ai4seo_echo_wp_kses(ai4seo_get_svg_tag("eye")); 78 echo " " . esc_html__("Show Advanced Settings", "ai-for-seo"); 79 echo "</button>"; 71 80 echo "</div>"; 72 81 echo "<div style='display: " . ($ai4seo_this_setting_input_value === "show" ? "block" : "none") . "' id='ai4seo-hide-advanced-settings-container'>"; 73 echo "<button type='button' onclick='ai4seo_hide_advanced_settings(true);' id='ai4seo-toggle-advanced-button' class='button ai4seo-button ai4seo-small-button ai4seo-advanced-settings-highlight'>" . ai4seo_wp_kses(ai4seo_get_svg_tag("eye-slash")) . " " . esc_html__("Hide Advanced Settings", "ai-for-seo") . "</button>"; 82 echo "<button type='button' onclick='ai4seo_hide_advanced_settings(true);' id='ai4seo-toggle-advanced-button' class='button ai4seo-button ai4seo-small-button ai4seo-advanced-settings-highlight'>"; 83 ai4seo_echo_wp_kses(ai4seo_get_svg_tag("eye-slash")); 84 echo " " . esc_html__("Hide Advanced Settings", "ai-for-seo"); 85 echo "</button>"; 74 86 echo "</div>"; 75 87 echo "</div>"; … … 84 96 echo "<h2>"; 85 97 echo '<i class="dashicons dashicons-admin-site ai4seo-menu-item-icon"></i>'; 86 echo esc_html__("Metadata", "ai-for-seo") ;98 echo esc_html__("Metadata", "ai-for-seo") . " <span style='font-size: small'>(" . esc_html__("for pages/posts/products etc.", "ai-for-seo") . ")</span>"; 87 99 echo "</h2>"; 88 100 … … 111 123 112 124 // add a select / un select all checkbox 113 echo ai4seo_wp_kses(ai4seo_get_select_all_checkbox($ai4seo_this_setting_input_name));125 ai4seo_echo_wp_kses(ai4seo_get_select_all_checkbox($ai4seo_this_setting_input_name)); 114 126 echo "<div class='ai4seo-medium-gap'></div>"; 115 127 … … 136 148 137 149 echo "<p class='ai4seo-form-item-description'>"; 138 echo ai4seo_wp_kses($ai4seo_this_setting_description); 139 echo "</p>"; 140 echo "</div>"; 141 echo "</div>"; 150 ai4seo_echo_wp_kses($ai4seo_this_setting_description); 151 echo "</p>"; 152 echo "</div>"; 153 echo "</div>"; 154 142 155 143 156 // === AI4SEO_SETTING_DISABLED_POST_TYPES ===================================================== \\ … … 164 177 echo "<div class='ai4seo-form-item-input-wrapper'>"; 165 178 if ($ai4seo_all_supported_post_types) { 166 echo ai4seo_wp_kses(ai4seo_get_select_all_checkbox($ai4seo_this_setting_input_name));179 ai4seo_echo_wp_kses(ai4seo_get_select_all_checkbox($ai4seo_this_setting_input_name)); 167 180 echo "<div class='ai4seo-medium-gap'></div>"; 168 181 … … 185 198 186 199 echo "<p class='ai4seo-form-item-description'>"; 187 echo ai4seo_wp_kses($ai4seo_this_setting_description);200 ai4seo_echo_wp_kses($ai4seo_this_setting_description); 188 201 echo "</p>"; 189 202 echo "</div>"; … … 215 228 echo "<div class='ai4seo-form-item-input-wrapper'>"; 216 229 echo "<select id='" . esc_attr($ai4seo_this_setting_input_name) . "' name='" . esc_attr($ai4seo_this_setting_input_name) . "'>"; 217 echo ai4seo_wp_kses(ai4seo_get_generation_language_select_options_html($ai4seo_this_setting_input_value));230 ai4seo_echo_wp_kses(ai4seo_get_generation_language_select_options_html($ai4seo_this_setting_input_value)); 218 231 echo "</select>"; 219 232 220 233 echo "<p class='ai4seo-form-item-description'>"; 221 echo ai4seo_wp_kses($ai4seo_this_setting_description);234 ai4seo_echo_wp_kses($ai4seo_this_setting_description); 222 235 echo "</p>"; 223 236 echo "</div>"; … … 295 308 echo "<label>"; 296 309 echo esc_html__("Prefix / Suffix:", "ai-for-seo") ; 297 echo ai4seo_wp_kses(ai4seo_get_icon_with_tooltip_tag($ai4seo_metadata_placeholders_tooltip));310 ai4seo_echo_wp_kses(ai4seo_get_icon_with_tooltip_tag($ai4seo_metadata_placeholders_tooltip)); 298 311 echo "</label>"; 299 312 … … 329 342 330 343 echo "<p class='ai4seo-form-item-description'>"; 331 echo ai4seo_wp_kses($ai4seo_this_setting_description);344 ai4seo_echo_wp_kses($ai4seo_this_setting_description); 332 345 echo "</p>"; 333 346 echo "</div>"; … … 375 388 // add a select / un select all checkbox 376 389 if (count($ai4seo_active_third_party_seo_plugin_details) > 1) { 377 echo ai4seo_wp_kses(ai4seo_get_select_all_checkbox($ai4seo_this_setting_input_name));390 ai4seo_echo_wp_kses(ai4seo_get_select_all_checkbox($ai4seo_this_setting_input_name)); 378 391 echo "<div class='ai4seo-medium-gap'></div>"; 379 392 } … … 396 409 } 397 410 398 echo ai4seo_wp_kses(ai4seo_get_svg_tag($ai4seo_this_third_party_seo_plugin_details["icon"], $ai4seo_this_third_party_seo_plugin_details["mame"] ?? "", $ai4seo_this_icon_css_class)) . " "; 411 ai4seo_echo_wp_kses(ai4seo_get_svg_tag($ai4seo_this_third_party_seo_plugin_details["icon"], $ai4seo_this_third_party_seo_plugin_details["mame"] ?? "", $ai4seo_this_icon_css_class)); 412 echo " "; 399 413 } 400 414 … … 406 420 407 421 echo "<p class='ai4seo-form-item-description'>"; 408 echo ai4seo_wp_kses($ai4seo_this_setting_description);422 ai4seo_echo_wp_kses($ai4seo_this_setting_description); 409 423 echo "</p>"; 410 424 } else { … … 439 453 440 454 // add a select / un select all checkbox 441 echo ai4seo_wp_kses(ai4seo_get_select_all_checkbox($ai4seo_this_setting_input_name));455 ai4seo_echo_wp_kses(ai4seo_get_select_all_checkbox($ai4seo_this_setting_input_name)); 442 456 echo "<div class='ai4seo-medium-gap'></div>"; 443 457 … … 464 478 465 479 echo "<p class='ai4seo-form-item-description'>"; 466 echo ai4seo_wp_kses($ai4seo_this_setting_description);480 ai4seo_echo_wp_kses($ai4seo_this_setting_description); 467 481 echo "</p>"; 468 482 echo "</div>"; … … 490 504 // new feature bubble # todo: remove bubble after some time 491 505 echo "<span class='ai4seo-green-bubble'>" . esc_html__("NEW", "ai-for-seo") . "</span> "; 492 echo ai4seo_wp_kses(ai4seo_get_svg_tag('woocommerce', "WooCommerce", 'ai4seo-medium-icon')) . " "; 506 ai4seo_echo_wp_kses(ai4seo_get_svg_tag('woocommerce', "WooCommerce", 'ai4seo-medium-icon')); 507 echo " "; 493 508 echo esc_html__("Include product price in metadata", "ai-for-seo") . ":"; 494 509 echo "</label>"; … … 537 552 echo "<input type='checkbox' id='" . esc_attr($ai4seo_this_setting_input_name) . "' name='" . esc_attr($ai4seo_this_setting_input_name) . "' value='1' class='ai4seo-single-checkbox'" . ($ai4seo_this_setting_input_value ? " checked='checked'" : "") . ($ai4seo_user_has_basic_plan_or_higher ? "" : " disabled='disabled'") . " /> "; 538 553 echo esc_html__("Use existing metadata as reference", "ai-for-seo"); 539 echo " " . ai4seo_wp_kses($ai4seo_plan_badge_html); 554 echo " "; 555 ai4seo_echo_wp_kses($ai4seo_plan_badge_html); 540 556 echo "<br>"; 541 557 echo "</label>"; 542 558 543 559 echo "<p class='ai4seo-form-item-description'>"; 544 echo ai4seo_wp_kses($ai4seo_this_setting_description);560 ai4seo_echo_wp_kses($ai4seo_this_setting_description); 545 561 echo "</p>"; 546 562 echo "</div>"; … … 571 587 572 588 // add a select / un select all checkbox 573 echo ai4seo_wp_kses(ai4seo_get_select_all_checkbox($ai4seo_this_setting_input_name));589 ai4seo_echo_wp_kses(ai4seo_get_select_all_checkbox($ai4seo_this_setting_input_name)); 574 590 echo "<div class='ai4seo-medium-gap'></div>"; 575 591 … … 591 607 592 608 echo "<p class='ai4seo-form-item-description'>"; 593 echo ai4seo_wp_kses($ai4seo_this_setting_description);609 ai4seo_echo_wp_kses($ai4seo_this_setting_description); 594 610 echo "</p>"; 595 611 echo "</div>"; … … 622 638 623 639 echo "<p class='ai4seo-form-item-description'>"; 624 echo ai4seo_wp_kses($ai4seo_this_setting_description);640 ai4seo_echo_wp_kses($ai4seo_this_setting_description); 625 641 echo "</p>"; 626 642 echo "</div>"; … … 650 666 echo "<p class='ai4seo-form-item-description'>"; 651 667 // Disable 'AI for SEO' Meta Tags 652 echo ai4seo_wp_kses(__("<strong>Disable:</strong> Disables all plugin meta tags. Only useful when completely syncing to other SEO plugins.", "ai-for-seo")) . "<br><br>"; 668 ai4seo_echo_wp_kses(__("<strong>Disable:</strong> Disables all plugin meta tags. Only useful when completely syncing to other SEO plugins.", "ai-for-seo")); 669 echo "<br><br>"; 653 670 654 671 // Force 'AI for SEO' Meta Tags 655 echo ai4seo_wp_kses(__("<strong>Force:</strong> Outputs plugin meta tags regardless of other plugins. May create duplicates.", "ai-for-seo")) . "<br><br>"; 672 ai4seo_echo_wp_kses(__("<strong>Force:</strong> Outputs plugin meta tags regardless of other plugins. May create duplicates.", "ai-for-seo")); 673 echo "<br><br>"; 656 674 657 675 // Replace Existing Meta Tags 658 echo ai4seo_wp_kses(__("<strong>Replace (Recommended):</strong> Replaces existing meta tags, preventing duplicates and cleaning HTML header.", "ai-for-seo")) . "<br><br>"; 676 ai4seo_echo_wp_kses(__("<strong>Replace (Recommended):</strong> Replaces existing meta tags, preventing duplicates and cleaning HTML header.", "ai-for-seo")); 677 echo "<br><br>"; 659 678 660 679 // Complement Existing Meta Tags 661 echo ai4seo_wp_kses(__("<strong>Complement:</strong> Adds missing meta tags without overwriting existing ones.", "ai-for-seo"));680 ai4seo_echo_wp_kses(__("<strong>Complement:</strong> Adds missing meta tags without overwriting existing ones.", "ai-for-seo")); 662 681 echo "</p>"; 663 682 echo "</div>"; … … 674 693 echo "<h2>"; 675 694 echo '<i class="dashicons dashicons-admin-media ai4seo-menu-item-icon"></i>'; 676 echo esc_html__("Media attributes", "ai-for-seo") ;695 echo esc_html__("Media attributes", "ai-for-seo") . " <span style='font-size: small'>(" . esc_html__("for images", "ai-for-seo") . ")</span>"; 677 696 echo "</h2>"; 678 697 … … 699 718 700 719 // add a select / un select all checkbox 701 echo ai4seo_wp_kses(ai4seo_get_select_all_checkbox($ai4seo_this_setting_input_name));720 ai4seo_echo_wp_kses(ai4seo_get_select_all_checkbox($ai4seo_this_setting_input_name)); 702 721 echo "<div class='ai4seo-medium-gap'></div>"; 703 722 … … 719 738 720 739 echo "<p class='ai4seo-form-item-description'>"; 721 echo ai4seo_wp_kses($ai4seo_this_setting_description);740 ai4seo_echo_wp_kses($ai4seo_this_setting_description); 722 741 echo "</p>"; 723 742 echo "</div>"; … … 755 774 echo "<div class='ai4seo-form-item-input-wrapper'>"; 756 775 echo "<select id='" . esc_attr($ai4seo_this_setting_input_name) . "' name='" . esc_attr($ai4seo_this_setting_input_name) . "'>"; 757 echo ai4seo_wp_kses(ai4seo_get_generation_language_select_options_html($ai4seo_this_setting_input_value));776 ai4seo_echo_wp_kses(ai4seo_get_generation_language_select_options_html($ai4seo_this_setting_input_value)); 758 777 echo "</select>"; 759 778 760 779 echo "<p class='ai4seo-form-item-description'>"; 761 echo ai4seo_wp_kses($ai4seo_this_setting_description);780 ai4seo_echo_wp_kses($ai4seo_this_setting_description); 762 781 echo "</p>"; 763 782 echo "</div>"; … … 792 811 echo "<label>"; 793 812 echo esc_html__("Prefix / Suffix:", "ai-for-seo") ; 794 echo ai4seo_wp_kses(ai4seo_get_icon_with_tooltip_tag($ai4seo_attachment_placeholders_tooltip));813 ai4seo_echo_wp_kses(ai4seo_get_icon_with_tooltip_tag($ai4seo_attachment_placeholders_tooltip)); 795 814 echo "</label>"; 796 815 … … 821 840 822 841 echo "<p class='ai4seo-form-item-description'>"; 823 echo ai4seo_wp_kses($ai4seo_this_setting_description);842 ai4seo_echo_wp_kses($ai4seo_this_setting_description); 824 843 echo "</p>"; 825 844 echo "</div>"; … … 850 869 851 870 // add a select / un select all checkbox 852 echo ai4seo_wp_kses(ai4seo_get_select_all_checkbox($ai4seo_this_setting_input_name));871 ai4seo_echo_wp_kses(ai4seo_get_select_all_checkbox($ai4seo_this_setting_input_name)); 853 872 echo "<div class='ai4seo-medium-gap'></div>"; 854 873 … … 870 889 871 890 echo "<p class='ai4seo-form-item-description'>"; 872 echo ai4seo_wp_kses($ai4seo_this_setting_description);891 ai4seo_echo_wp_kses($ai4seo_this_setting_description); 873 892 echo "</p>"; 874 893 echo "</div>"; … … 902 921 echo "<input type='checkbox' id='" . esc_attr($ai4seo_this_setting_input_name) . "' name='" . esc_attr($ai4seo_this_setting_input_name) . "' value='1' class='ai4seo-single-checkbox'" . ($ai4seo_this_setting_input_value ? " checked='checked'" : "") . ($ai4seo_user_has_basic_plan_or_higher ? "" : " disabled='disabled'") . " /> "; 903 922 echo esc_html__("Use existing media attributes as reference", "ai-for-seo"); 904 echo " " . ai4seo_wp_kses($ai4seo_plan_badge_html); 923 echo " "; 924 ai4seo_echo_wp_kses($ai4seo_plan_badge_html); 905 925 echo "<br>"; 906 926 echo "</label>"; 907 927 908 928 echo "<p class='ai4seo-form-item-description'>"; 909 echo ai4seo_wp_kses($ai4seo_this_setting_description);929 ai4seo_echo_wp_kses($ai4seo_this_setting_description); 910 930 echo "</p>"; 911 931 echo "</div>"; … … 939 959 echo "<input type='checkbox' id='" . esc_attr($ai4seo_this_setting_input_name) . "' name='" . esc_attr($ai4seo_this_setting_input_name) . "' value='1' class='ai4seo-single-checkbox'" . ($ai4seo_this_setting_input_value ? " checked='checked'" : "") . ($ai4seo_user_has_pro_plan_or_higher ? "" : " disabled='disabled'") . " /> "; 940 960 echo esc_html__("Enhanced Entity Recognition", "ai-for-seo"); 941 echo " " . ai4seo_wp_kses($ai4seo_plan_badge_html); 961 echo " "; 962 ai4seo_echo_wp_kses($ai4seo_plan_badge_html); 942 963 echo "<br>"; 943 964 echo "</label>"; 944 965 945 966 echo "<p class='ai4seo-form-item-description'>"; 946 echo ai4seo_wp_kses($ai4seo_this_setting_description);967 ai4seo_echo_wp_kses($ai4seo_this_setting_description); 947 968 echo "</p>"; 948 969 echo "</div>"; … … 976 997 echo "<input type='checkbox' id='" . esc_attr($ai4seo_this_setting_input_name) . "' name='" . esc_attr($ai4seo_this_setting_input_name) . "' value='1' class='ai4seo-single-checkbox'" . ($ai4seo_this_setting_input_value ? " checked='checked'" : "") . ($ai4seo_user_has_premium_plan_or_higher ? "" : " disabled='disabled'") . " /> "; 977 998 echo esc_html__("Enhanced Celebrity Recognition", "ai-for-seo"); 978 echo " " . ai4seo_wp_kses($ai4seo_plan_badge_html); 999 echo " "; 1000 ai4seo_echo_wp_kses($ai4seo_plan_badge_html); 979 1001 echo "<br>"; 980 1002 echo "</label>"; 981 1003 982 1004 echo "<p class='ai4seo-form-item-description'>"; 983 echo ai4seo_wp_kses($ai4seo_this_setting_description);1005 ai4seo_echo_wp_kses($ai4seo_this_setting_description); 984 1006 echo "</p>"; 985 1007 echo "</div>"; … … 1012 1034 1013 1035 echo "<p class='ai4seo-form-item-description'>"; 1014 echo ai4seo_wp_kses($ai4seo_this_setting_description);1036 ai4seo_echo_wp_kses($ai4seo_this_setting_description); 1015 1037 echo "</p>"; 1016 1038 echo "</div>"; … … 1050 1072 1051 1073 // add a select / un select all checkbox 1052 echo ai4seo_wp_kses(ai4seo_get_select_all_checkbox($ai4seo_this_setting_input_name));1074 ai4seo_echo_wp_kses(ai4seo_get_select_all_checkbox($ai4seo_this_setting_input_name)); 1053 1075 echo "<div class='ai4seo-medium-gap'></div>"; 1054 1076 … … 1074 1096 1075 1097 echo "<p class='ai4seo-form-item-description'>"; 1076 echo ai4seo_wp_kses($ai4seo_this_setting_description);1098 ai4seo_echo_wp_kses($ai4seo_this_setting_description); 1077 1099 echo "</p>"; 1078 1100 echo "</div>"; … … 1126 1148 1127 1149 echo "<p class='ai4seo-form-item-description'>"; 1128 echo ai4seo_wp_kses($ai4seo_this_setting_description);1150 ai4seo_echo_wp_kses($ai4seo_this_setting_description); 1129 1151 echo "</p>"; 1130 1152 echo "</div>"; … … 1158 1180 1159 1181 echo "<p class='ai4seo-form-item-description'>"; 1160 echo ai4seo_wp_kses($ai4seo_this_setting_description);1182 ai4seo_echo_wp_kses($ai4seo_this_setting_description); 1161 1183 echo "</p>"; 1162 1184 echo "</div>"; … … 1189 1211 1190 1212 echo "<p class='ai4seo-form-item-description'>"; 1191 echo ai4seo_wp_kses($ai4seo_this_setting_description);1213 ai4seo_echo_wp_kses($ai4seo_this_setting_description); 1192 1214 echo "</p>"; 1193 1215 echo "</div>"; … … 1224 1246 1225 1247 echo "<p class='ai4seo-form-item-description'>"; 1226 echo ai4seo_wp_kses($ai4seo_this_setting_description);1248 ai4seo_echo_wp_kses($ai4seo_this_setting_description); 1227 1249 echo "</p>"; 1228 1250 echo "</div>"; … … 1265 1287 1266 1288 echo "<p class='ai4seo-form-item-description'>"; 1267 echo ai4seo_wp_kses($ai4seo_this_setting_description);1289 ai4seo_echo_wp_kses($ai4seo_this_setting_description); 1268 1290 echo "</p>"; 1269 1291 echo "</div>"; -
ai-for-seo/trunk/readme.txt
r3408847 r3420851 5 5 Requires at least: 4.7 6 6 Tested up to: 6.8.3 7 Stable tag: 2.2. 37 Stable tag: 2.2.4 8 8 Requires PHP: 7.4 9 9 License: GPLv2 or later (or compatible) … … 19 19 Achieve better metadata and alt text results than with ChatGPT. *AI for SEO* understands your entire website and uses expertly crafted SEO prompts designed to drive real search traffic. 20 20 21 **Image SEO at scale:** Create alt text, image titles, captions, and descriptions across your library (jpg, png, gif, webp, avif). Render-level alt/title injection helps when themes don’t output attributes correctly.22 23 **Accessibility ready:** Helps meet European Accessibility Act (EAA) expectations by filling missing alt text for a more inclusive experience.21 **Image SEO at scale:** Create alt text, image titles, captions, and descriptions across your library (jpg, png, gif, webp, avif). 22 23 **Accessibility-ready:** Helps meet European Accessibility Act (EAA) requirements by automatically generating missing alt text for a more inclusive experience. 24 24 25 25 **Free for most small/medium sites:** If your balance falls below 100 Credits, we add 5 free Credits daily, so you can keep generating at no cost. 26 26 27 27 = 🚀 How to Get Started = 28 1. **Open the Dashboard:** Go to 'AI for SEO' to view coverage stats and quick actions.28 1. **Open the Dashboard:** Go to 'AI for SEO' to view statistics about your current SEO coverage. 29 29 2. **Review your content:** Open 'Pages', 'Posts', 'Products', or 'Media' and check its SEO status. 30 30 3. **Set up Autopilot:** Click 'Set up SEO Autopilot', choose content types (Pages/Posts/Products/Media), and start bulk generation. 31 4. **Get a first win (optional):** In the 'Media Library', click 'Generate with AI' on one image to create alt text instantly.31 4. **Get a first win (optional):** In the 'Media Library', click 'Generate with AI' on one image to create optimized alt text within seconds. 32 32 5. **Fine-tune manually:** Use 'Generate with AI' buttons or the top admin-bar 'AI for SEO' button to open the Metadata Editor for any page or post. 33 6. **Sync with your SEO plugin (optional):** In 'Settings' → 'Sync 'AI for SEO' Changes', select Yoast SEO, Rank Math, or SEOPressto keep fields updated.33 6. **Sync with your SEO plugin (optional):** In 'Settings' → 'Sync 'AI for SEO' Changes', select Yoast SEO, Rank Math, SEOPress or many more to keep fields updated. 34 34 35 35 For a step-by-step guide, see 'Help' → 'Getting Started' → 'First Steps'. … … 58 58 ✅ **Sync with your SEO plugin:** Keep fields updated in Yoast, Rank Math, SEOPress, and others. 59 59 ✅ **Edit where you work:** ‘Generate with AI’ in the Block Editor (Gutenberg), Media Library, Elementor, BeBuilder, and Yoast SEO. An SEO Copilot embedded in your workflow. 60 ✅ **Accessibility ready:** Helps meet European Accessibility Act (EAA) expectations by filling missing alt text.60 ✅ **Accessibility-ready:** Helps meet European Accessibility Act (EAA) requirements by automatically generating missing alt text for a more inclusive experience. 61 61 ✅ **Progress tracking:** Monitor coverage and recent activity from the dashboard. 62 62 ✅ **For agencies & teams:** White-label, incognito mode, export/import settings, multi-site support. … … 110 110 111 111 **After activation** 112 Open 'AI for SEO' in the admin menu to view coverage and click 'Set up SEO Autopilot' to start bulk generation.112 Open 'AI for SEO' in the admin menu to view your SEO coverage and click 'Set up SEO Autopilot' to start bulk generation. 113 113 114 114 … … 134 134 Yes, the AI tool will generate SEO-relevant data based on the content of the selected page, blog post or media file. 135 135 136 = Will *AI for SEO* overwrite my existing SEO fields? =136 = Will *AI for SEO* overwrite my existing metadata or media attributes? = 137 137 Not unless you enable it. By default, we don’t overwrite existing data. You can explicitly allow overwriting (and even include “complete” entries) in Settings. 138 138 … … 140 140 Yes, *AI for SEO* lets you decide which media attributes (like 'alt text' or 'title') should be generated. You can configure this in the 'Active Media Attributes:' section of the settings to match your content needs. Simply select the desired attributes and the SEO Autopilot will generate the data accordingly. 141 141 142 = Will *AI for SEO* slow down my website? =143 The plugin is optimized for maximum performance and we are not aware of any noticeable performance effects on the backend or the frontend.144 145 142 = How are Credits consumed in the *AI for SEO* plugin? = 146 Credits are consumed when the AI generates metadata or media attributes for your content entries. Each generation costs Credits, depending on your settings.143 Credits are used when *AI for SEO* generates metadata for your content (posts, pages, products, media files etc.). The amount of Credits required depends on the selected active meta tags and media attributes (see Settings). 147 144 148 145 = Do unused Credits expire at the end of the month? = … … 152 149 Yes, the free plan provides you with 100 Credits, allowing you to experiment with AI-generated SEO content without any cost. In addition, we provide you with 5 free Credits every day if your balance falls below 100 Credits. 153 150 154 = When should I choose a Subscription, Credit Packs, or P AYG? =151 = When should I choose a Subscription, Credit Packs, or Pay-As-You-Go? = 155 152 1. Choose **Subscription** if you want ongoing features and steady Credits. Subscriptions unlock advanced generation options and provide a continuous flow of Credits for new content over time. 156 153 2. Choose **Credit Packs** for one-time top-ups when you need a larger burst of generations. Credit Packs are ideal as an add-on to an active subscription when you temporarily need more Credits. 157 3. Choose **PAYG (Pay As You Go)** if you prefer automatic top-ups. When your balance drops below 100 Credits, PAYG purchases additional Credits for you. Functionally it works like a Credit Pack, but the top-up happens automatically.154 3. Choose <strong>PAYG (Pay-As-You-Go)</strong> if you prefer automatic top-ups. When your balance falls below 100 Credits, new Credits are added to your account automatically by purchasing a package you selected in advance. 158 155 159 156 = Does *AI for SEO* support multi-language websites? = … … 167 164 168 165 = What editors are supported? = 169 *AI for SEO* supports all editors and themes. For extra convenience, we've added additional “Generate with AI” buttons in Elementor, BeTheme (Muffin-Builder / Be-Builder), and the standard editor. You can generate metadata from the plugin dashboard, the metadata editor, and SEO Autopilot without apage builder.166 *AI for SEO* supports most editors and themes. For extra convenience, we've added dedicated “Generate with AI” buttons in Elementor, BeTheme (Muffin-Builder / Be-Builder), and the standard editor. You can also generate metadata directly from the plugin dashboard, the metadata editor, or SEO Autopilot without using any page builder. 170 167 171 168 = Can I link multiple sites and share credits/settings? = 172 Yes. Enter the same license owner + key under *AI for SEO* > Account on each site to link them. Linkedsites share the same credits pool, and you can export/import settings between them. Works with Multisite and staging.169 Yes. Enter the same license owner + key under *AI for SEO* > Account on each website to link them. Linked websites share the same credits pool, and you can export/import settings between them. Works with Multisite and staging. 173 170 174 171 = I’m an agency with multiple client websites. How do I set things up? = 175 172 1. We recommend setting up your agency *AI for SEO* account via a primary site (e.g., your agency site) and purchasing a subscription there. Alternatively, you can purchase directly on our website: https://aiforseo.ai/pricing 176 173 2. After purchasing a subscription, you receive your license owner and key by email and they are also visible in your *AI for SEO* Account area. 177 3. Install the *AI for SEO* plugin on each client website you manage. Go to *AI for SEO* > Account on each site.178 4. Enter the **same license owner + key** to link them to the same account. Linked sites share the same subscription and Credits pool.174 3. Install the *AI for SEO* plugin on each client website you manage. Go to *AI for SEO* > Account on each website. 175 4. Enter the **same license owner + key** to link them to the same account. Linked websites share the same subscription and Credits pool. 179 176 180 177 = Does *AI for SEO* collect or store my content? = … … 187 184 Currently, Google's stance on the use of AI or automation in content creation is generally permissive, as indicated in a Google Developers blog post from February 2023. They state that appropriate use of AI or automation is not against their guidelines. More information can be found at [https://developers.google.com/search/blog/2023/02/google-search-and-ai-content](https://developers.google.com/search/blog/2023/02/google-search-and-ai-content). 188 185 189 = Will all the generated texts disappear if I uninstall the plugin? = 190 It depends on how the metadata is stored and used. If *AI for SEO* has synchronized the generated metadata with a third-party SEO plugin like Yoast SEO, Rank Math, SEOPress, or similar, then the metadata will remain even after uninstalling *AI for SEO*. You can check and enable synchronization in your *AI for SEO* settings. 191 192 However, if synchronization was not enabled, and *AI for SEO* was solely responsible for outputting meta tags on your site, then those tags will no longer be generated once the plugin is deactivated or uninstalled. 186 = Will all the generated data disappear if I uninstall the plugin? = 187 It depends on how the metadata is stored and used. If *AI for SEO* has synchronized the generated metadata with a third-party SEO plugin like Yoast SEO, RankMath, SEOPress, or similar, then the metadata will remain even after uninstalling *AI for SEO*. You can check and enable synchronization in your *AI for SEO* settings. However, if synchronization was not enabled during generation, then those meta tags will disappear once the plugin is deactivated or uninstalled. 193 188 194 189 = Can you add feature x, y or z to the plugin? = … … 197 192 198 193 == Changelog == 194 195 = 2.2.4 = 196 * Bug Fixes & Maintenance: Fixed 5 minor bugs and implemented 3 usability improvements. 199 197 200 198 = 2.2.3 =
Note: See TracChangeset
for help on using the changeset viewer.