Plugin Directory

Changeset 3420851


Ignore:
Timestamp:
12/16/2025 10:14:39 AM (2 months ago)
Author:
spacecodes
Message:

2.2.4

  • Bug Fixes & Maintenance: Fixed 5 minor bugs and implemented 3 usability improvements.
Location:
ai-for-seo
Files:
81 added
21 edited

Legend:

Unmodified
Added
Removed
  • ai-for-seo/trunk/ai-for-seo.php

    r3408847 r3420851  
    44Plugin URI: https://aiforseo.ai
    55Description: One-Click SEO solution. "AI for SEO" helps your website to rank higher in Web Search results.
    6 Version: 2.2.3
     6Version: 2.2.4
    77Author: spacecodes
    88Author URI: https://spa.ce.codes
     
    2626// ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ \\
    2727
    28 const AI4SEO_PLUGIN_VERSION_NUMBER = "2.2.3";
     28const AI4SEO_PLUGIN_VERSION_NUMBER = "2.2.4";
    2929const AI4SEO_PLUGIN_NAME = "AI for SEO";
    3030const AI4SEO_PLUGIN_DESCRIPTION = 'One-Click SEO solution. "AI for SEO" helps your website to rank higher in Web Search results.';
     
    110110    return [
    111111        [
     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        [
    112120            'date' => 'December 3rd, 2025',
    113121            'version' => '2.2.3',
    114122            'important' => true,
    115123            '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.',
    117125            ],
    118126        ],
     
    27622770        return array();
    27632771    }
    2764    
     2772
    27652773    $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>";
    27662774    return array_merge($columns, [AI4SEO_PLUGIN_IDENTIFIER => $ai4seo_icon]);
     
    27822790
    27832791    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));
    27852793    }
    27862794}
     
    34153423function ai4seo_get_title_attribute_value(int $attachment_id, string $setting_value, array &$cache ) {
    34163424    $cache_key = $setting_value;
    3417    
     3425
    34183426    if ( isset( $cache[ $attachment_id ][ $cache_key ] ) ) {
    34193427        return $cache[ $attachment_id ][ $cache_key ];
     
    35243532 */
    35253533function 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)) {
    35273535        error_log('AI4SEO: Prevented infinite loop in ' . __FUNCTION__);
    35283536        return;
     
    51465154 * @return bool True if the loop should be prevented, false otherwise
    51475155 */
    5148 function ai4seo_prevent_loops(string $function_name, int $max_depth = 1, int $max_calls = 99999): bool {
     5156function ai4seo_prevent_loops(string $function_name, int $max_depth = 1, int $max_calls = 22222): bool {
    51495157    static $call_counts = [];
    51505158
     
    51565164        $max_calls = 1;
    51575165    }
    5158    
     5166
    51595167    // Initialize call count if not exists
    51605168    if (!isset($call_counts[$function_name])) {
    51615169        $call_counts[$function_name] = 0;
    51625170    }
    5163    
     5171
    51645172    // Increment global call count
    51655173    $call_counts[$function_name]++;
    5166    
     5174
    51675175    // Check max calls
    51685176    if ($call_counts[$function_name] > $max_calls) {
     
    51745182        return false;
    51755183    }
    5176    
     5184
    51775185    // Check recursion depth
    51785186    $backtrace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS);
    51795187    $depth = 0;
    5180    
     5188
    51815189    // Iterate through backtrace to count occurrences of the function
    51825190    foreach ($backtrace as $trace) {
     
    51855193        }
    51865194    }
    5187    
     5195
    51885196    // The current call is included in the backtrace, so depth is at least 1.
    51895197    // If max_depth is 1, we want to prevent ANY recursion (i.e., if depth > 1).
    51905198    // If max_depth is 2, we allow 2 recursive call (depth 2).
    51915199    // So we return true if depth > $max_depth
    5192    
     5200
    51935201    if ($depth > $max_depth) {
    51945202        return true;
    51955203    }
    5196    
     5204
    51975205    return false;
    51985206}
     
    58235831// =========================================================================================== \\
    58245832
     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 */
     5839function 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
    58255847function ai4seo_get_publicly_accessible_post_types(): array {
    58265848    $excluded_post_types = array(
     
    68006822            $can_get_image_size = false;
    68016823        }
    6802        
     6824
    68036825        if (!$can_get_image_size) {
    68046826            return array(
     
    72747296
    72757297        // 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' );
    72797301    } catch (Throwable $e) {
    72807302        return false;
     
    73417363
    73427364    // 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' );
    73467368
    73477369    return true;
    73487370}
    7349 
    73507371
    73517372
     
    83768397
    83778398    $price_table = array();
    8378    
     8399
    83798400    foreach ($active_meta_tags AS $this_active_meta_tag) {
    83808401        if ($only_this_meta_tags && is_array($only_this_meta_tags) && !in_array($this_active_meta_tag, $only_this_meta_tags)) {
     
    87248745
    87258746    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>";
    87278750
    87288751        echo "<div class='ai4seo-half-donut-chart-container'>";
     
    87348757
    87358758            echo "<div class='ai4seo-half-donut-chart-done' style='color: " . esc_attr($ai4seo_percentage_color) . ";'>";
    8736                 echo sprintf(
     8759                ai4seo_echo_wp_kses(sprintf(
    87378760                    esc_html__('%1$s/%2$s done', "ai-for-seo"),
    87388761                    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                ));
    87418764            echo "</div>";
    87428765        echo "</div>";
     
    88078830
    88088831        echo "<div class='ai4seo-money-back-guarantee-quote'>";
    8809             echo ai4seo_wp_kses(sprintf(
     8832            ai4seo_echo_wp_kses(sprintf(
    88108833                /* translators: %s is a clickable email address */
    88118834                __("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"),
     
    88228845
    88238846        echo "<div class='ai4seo-money-back-guarantee-quote'>";
    8824             echo ai4seo_wp_kses(sprintf(
     8847            ai4seo_echo_wp_kses(sprintf(
    88258848                /* 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"),
    88278850                AI4SEO_MONEY_BACK_GUARANTEE_DAYS,
    88288851                esc_attr(AI4SEO_OFFICIAL_CONTACT_URL),
     
    88478870function ai4seo_echo_loading_icon_output() {
    88488871    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"));
    88508873    echo "</span>";
    88518874}
     
    92529275        echo "<li>";
    92539276            if ($metadata_credits_cost_per_post) {
    9254                 echo ai4seo_wp_kses(sprintf(
     9277                ai4seo_echo_wp_kses(sprintf(
    92559278                    __("Metadata per page/post/etc.: %s", "ai-for-seo"),
    92569279                    "<span class='ai4seo-credits-usage-badge'><strong>" . $metadata_credits_cost_per_post . "</strong> "
     
    92599282                );
    92609283
    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)))));
    92629285            } else {
    9263                 echo ai4seo_wp_kses(sprintf(
     9286                ai4seo_echo_wp_kses(sprintf(
    92649287                    __("No meta tags are currently active.", "ai-for-seo")
    92659288                ));
     
    92689291        echo "<li>";
    92699292            if ($attachment_attributes_credits_cost_per_attachment_post) {
    9270                 echo ai4seo_wp_kses(sprintf(
     9293                ai4seo_echo_wp_kses(sprintf(
    92719294                    __("Media attributes per image: %s", "ai-for-seo"),
    92729295                    "<span class='ai4seo-credits-usage-badge'><strong>" . $attachment_attributes_credits_cost_per_attachment_post . "</strong> "
     
    92759298                );
    92769299
    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)))));
    92789301            } else {
    9279                 echo ai4seo_wp_kses(sprintf(
     9302                ai4seo_echo_wp_kses(sprintf(
    92809303                    __("No media attributes are currently active.", "ai-for-seo")
    92819304                ));
     
    92859308        if ($credits_percentage <= 0) {
    92869309            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")
    92899312                ));
    92909313            echo "</li>";
    92919314        } else if ($credits_percentage < 100) {
    92929315            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"),
    92959318                    esc_html($credits_percentage)
    92969319                ));
     
    93129335    echo "<div class='ai4seo-green-bubble ai4seo-discount-available-message'>";
    93139336
    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 " ";
    93159339
    93169340        // with countdown
     
    1043110455    $metadata_suffixes = ai4seo_get_setting(AI4SEO_SETTING_METADATA_SUFFIXES);
    1043210456    $placeholder_replacements = ai4seo_get_metadata_placeholder_replacements($post_id);
    10433    
     10457
    1043410458    foreach (AI4SEO_METADATA_DETAILS AS $this_metadata_identifier => $this_metadata_details) {
    1043510459        $this_to_generate = in_array($this_metadata_identifier, $generate_this_fields);
     
    1057110595    // Get the user's preference for image upload method
    1057210596    $image_upload_method = ai4seo_get_setting(AI4SEO_SETTING_IMAGE_UPLOAD_METHOD);
    10573    
     10597
    1057410598    switch ($image_upload_method) {
    1057510599        case 'base64':
    1057610600            // User explicitly chose base64 - always encode and send image data directly
    1057710601            return true;
    10578            
     10602
    1057910603        case 'url':
    1058010604            // User explicitly chose URL - always send the image URL
    1058110605            return false;
    10582            
     10606
    1058310607        case 'auto':
    1058410608        default:
     
    1088310907        }
    1088410908    }
    10885    
     10909
    1088610910    // API CALL WITH BASE64 ENCODED IMAGE
    1088710911    if ($use_base64_image) {
     
    1090610930    }
    1090710931
    10908    
     10932
    1090910933    // === ALL GOOD -> PROCEED TO SAVE the RESULTS ============================================================ \\
    1091010934
     
    1228212306            continue;
    1228312307        }
    12284        
     12308
    1228512309        foreach ( $this_rows as $this_row ) {
    1228612310            $this_post_id            = absint( $this_row['post_id'] );
     
    1281512839    if (!$active_meta_tags || count($active_meta_tags) === 0) {
    1281612840        $percentage_of_active_metadata_by_post_ids = array();
    12817        
     12841
    1281812842        foreach ($post_ids as $this_post_id) {
    1281912843            $percentage_of_active_metadata_by_post_ids[$this_post_id] = 100;
    1282012844        }
    12821        
     12845
    1282212846        return $percentage_of_active_metadata_by_post_ids;
    1282312847    }
     
    1282612850    // then compare it with the total amount of active meta tags
    1282712851    $num_available_metadata_by_post_ids = ai4seo_read_num_available_metadata_by_post_ids($post_ids);
    12828    
     12852
    1282912853    $num_active_meta_tags = count($active_meta_tags);
    12830    
     12854
    1283112855    $percentage_of_active_metadata_by_post_ids = array();
    1283212856
     
    1490314927    // Reset all failed attachment attributes by clearing the option
    1490414928    ai4seo_update_option(AI4SEO_FAILED_ATTACHMENT_ATTRIBUTES_POST_IDS_OPTION_NAME, json_encode(array()));
    14905    
     14929
    1490614930    // Refresh the generation status summary
    1490714931    ai4seo_try_start_posts_table_analysis(true);
     
    1492514949    // Get the post type from the request
    1492614950    $post_type = sanitize_text_field($_POST['post_type'] ?? '');
    14927    
     14951
    1492814952    if (empty($post_type)) {
    1492914953        ai4seo_send_json_error(esc_html__('Post type is required', 'ai-for-seo'), 12109825);
     
    1493314957    // Remove all failed post IDs for this post type
    1493414958    ai4seo_remove_all_post_ids_by_post_type_and_generation_status($post_type, AI4SEO_FAILED_METADATA_POST_IDS_OPTION_NAME);
    14935    
     14959
    1493614960    // Refresh the generation status summary
    1493714961    ai4seo_try_start_posts_table_analysis(true);
     
    1513315157
    1513415158    $stripe_email = sanitize_email($_POST["stripe_email"]);
    15135    
     15159
    1513615160    // Validate email format
    1513715161    if (!filter_var($stripe_email, FILTER_VALIDATE_EMAIL)) {
     
    1539115415    $ai4seo_start_pattern = '<div class=\'ai4seo-cards-container ai4seo-dashboard\'>';
    1539215416    $ai4seo_start_pos = strpos($ai4seo_dashboard_content, $ai4seo_start_pattern);
    15393    
     15417
    1539415418    if ($ai4seo_start_pos !== false) {
    1539515419        // Find the content starting from after the opening tag
    1539615420        $ai4seo_content_start = $ai4seo_start_pos + strlen($ai4seo_start_pattern);
    1539715421        $ai4seo_content = substr($ai4seo_dashboard_content, $ai4seo_content_start);
    15398        
     15422
    1539915423        // Find the last closing div tag (which should be the matching one)
    1540015424        $ai4seo_last_div_pos = strrpos($ai4seo_content, '</div>');
    15401        
     15425
    1540215426        if ($ai4seo_last_div_pos !== false) {
    1540315427            $ai4seo_inner_content = substr($ai4seo_content, 0, $ai4seo_last_div_pos);
     
    1549515519        echo "<img src='" . esc_url(ai4seo_get_ai_for_seo_logo_url("full")) . "' class='ai4seo-tos-plugin-logo ai4seo-modal-headline-icon'><br>";
    1549615520            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 " ";
    1549815523    echo "</center><br>";
    1549915524
    1550015525    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());
    1550215527    $content = ob_get_clean();
    1550315528
     
    1676916794 */
    1677016795function 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)) {
    1677216797        error_log('AI4SEO: Prevented infinite loop in ' . __FUNCTION__);
    1677316798        return false;
     
    1687016895 * Function to auto-dismiss expired notifications and get displayable notifications
    1687116896 * @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
    1687216898 * @return array Array of notifications that should be displayed (not dismissed and not expired)
    1687316899 */
    16874 function ai4seo_get_displayable_notifications(bool $skip_num_displayable_notification_condition = false): array {
     16900function ai4seo_get_displayable_notifications(bool $skip_num_displayable_notification_condition = false, bool $refresh_unread_count = true): array {
    1687516901    if (ai4seo_prevent_loops(__FUNCTION__, 3)) {
    1687616902        error_log('AI4SEO: Prevented infinite loop in ' . __FUNCTION__);
     
    1694116967    if ($made_changes) {
    1694216968        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        }
    1694416973    }
    1694516974
     
    1699117020
    1699217021        // 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));
    1699417023
    1699517024        // Add footer
     
    1699817027        if ($notification_buttons) {
    1699917028            echo '<div class="ai4seo-buttons-wrapper">';
    17000                 echo ai4seo_wp_kses($notification_buttons);
     17029                ai4seo_echo_wp_kses($notification_buttons);
    1700117030            echo '</div>';
    1700217031        }
     
    1712317152    // Show a "Customize PAYG" Button
    1712417153    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();");
    1712617155    }
    1712717156
    1712817157    // Show a "Increase Budget" Button (same as customize payg)
    1712917158    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();");
    1713117160    }
    1713217161
     
    1715817187    // Show a lost licence key button
    1715917188    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();");
    1716117190    }
    1716217191
     
    1740117430    }
    1740217431
    17403     $displayable_notifications = ai4seo_get_displayable_notifications();
     17432    $displayable_notifications = ai4seo_get_displayable_notifications(false, false);
    1740417433
    1740517434    $ai4seo_unread_count = 0;
     
    1810318132        /* Translators: %1$s is replaced with bold text. */
    1810418133        $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"),
    1810618135            '<strong>' . esc_html($missing_post_types_complete_string) . '</strong>'
    1810718136        );
     
    1874318772        $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>";
    1874418773        $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>";
    1874618775    $html .= "</ol>";
    1874718776
     
    1888118910 */
    1888218911function ai4seo_send_additional_tos_accept_details() {
     18912    if (!ai4seo_is_user_inside_our_plugin_admin_pages()) {
     18913        return;
     18914    }
     18915
    1888318916    // Make sure that the user is allowed to use this plugin
    1888418917    if (!ai4seo_can_manage_this_plugin()) {
  • ai-for-seo/trunk/assets/js/ai-for-seo-scripts.js

    r3408847 r3420851  
    15311531    if (ai4seo_exists_$($tooltip_holder)) {
    15321532        // 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) {
    15571556            event.stopPropagation(); // Prevent the event from propagating to the document
    15581557            let $this_tooltip_child = jQuery(this).find('.ai4seo-tooltip');
     
    15781577
    15791578    if (ai4seo_exists_$($tooltips)) {
    1580         $tooltips.click(function (event) {
     1579        $tooltips.on('click', function (event) {
    15811580            // close tooltip upon click
    15821581            event.stopPropagation(); // Prevent the event from propagating to the document
     
    15881587
    15891588        // Click event on the document to close all tooltips
    1590         jQuery(document).click(function (event) {
     1589        jQuery(document).on('click', function (event) {
    15911590            // close tooltip upon click
    15921591            event.stopPropagation(); // Prevent the event from propagating to the document
  • ai-for-seo/trunk/changelog.txt

    r3408847 r3420851  
    11== Changelog ==
     2
     3= 2.2.4 =
     4* Bug Fixes & Maintenance: Fixed 5 minor bugs and implemented 3 usability improvements.
    25
    36= 2.2.3 =
  • ai-for-seo/trunk/includes/ajax/display/attachment-attributes-editor.php

    r3395515 r3420851  
    100100echo "</div>";
    101101
    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>";
     102echo "<div class='ai4seo-modal-sub-headline'>";
     103
     104ai4seo_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
     112echo "</div>";
    103113
    104114if (!$ai4seo_active_attachment_attributes) {
    105115    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"));
    106116    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"));
    108118    return;
    109119}
     
    154164                // Icon
    155165                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 " ";
    157168                }
    158169
     
    161172
    162173                // 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"]));
    164175            echo "</label>";
    165176
     
    192203        echo "<div class='ai4seo-form-item' style='margin-top: 0; padding-top: 0;'>";
    193204            echo "<div class='ai4seo-yellow-message' style='margin-top: 10px;'>";
    194                 echo ai4seo_wp_kses(
     205                ai4seo_echo_wp_kses(
    195206                    sprintf(
    196207                        __("<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  
    8686echo "</div>";
    8787
    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>";
     88echo "<div class='ai4seo-modal-sub-headline'>";
     89
     90ai4seo_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
     98echo "</div>";
    8999
    90100if (!$ai4seo_active_meta_tags) {
    91101    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"));
    92102    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"));
    94104    return;
    95105}
     
    128138            echo "<label for='" . esc_attr($ai4seo_this_metadata_input_name) . "'>";
    129139                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 " ";
    131142                }
    132143
     
    134145
    135146                // 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"]));
    137148
    138149                // Heads up for the focus-keyphrase: If meta-title or meta-description already got a value,
     
    156167
    157168                        // 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")));
    159170                    echo "</span><br>";
    160171                }
     
    176187
    177188                        // 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")));
    179190                    echo "</span><br>";
    180191                }
     
    192203        echo "<div class='ai4seo-form-item' style='margin-top: 0; padding-top: 0;'>";
    193204            echo "<div class='ai4seo-yellow-message' style='margin-top: 10px;'>";
    194                 echo ai4seo_wp_kses(
     205                ai4seo_echo_wp_kses(
    195206                    sprintf(
    196207                        __("<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  
    6060
    6161if (!is_array($ai4seo_generation_fields) || count($ai4seo_generation_fields) === 0) {
    62     ai4seo_send_json_error(esc_html__("Generation fields are invalid.", "ai-for-seo"), 1613301025);
     62    ai4seo_send_json_error(esc_html__("Generation fields are invalid.", "ai-for-seo"), 1713301026);
    6363}
    6464
  • ai-for-seo/trunk/includes/ajax/process/import-settings.php

    r3395515 r3420851  
    211211            if (!empty($ai4seo_invalid_settings) || $ai4seo_got_unknown_category_entries) {
    212212                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 " ";
    214215                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");
    215216                echo "</div>";
     
    217218        } else {
    218219            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 " ";
    220222                echo esc_html__("Your settings are up-to-date and no changes were detected.", "ai-for-seo");
    221223            echo "</div>";
     
    223225    } else {
    224226        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 " ";
    226229            echo esc_html__("No valid settings found for import.", "ai-for-seo");
    227230        echo "</div>";
     
    259262        }
    260263
    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>";
    262267        echo "<ul>";
    263268
     
    273278            // invalid settings are shown with a strikethrough
    274279            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 " ";
    276283            } else {
    277284                $ai4seo_this_got_any_valid_changes = true;
     
    290297            echo "<strong>" . esc_html($ai4seo_this_setting_name) . ":</strong> ";
    291298            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);
    293300            echo "</span> → ";
    294301
    295             echo ai4seo_wp_kses($ai4seo_this_setting_new_value);;
     302            ai4seo_echo_wp_kses($ai4seo_this_setting_new_value);
    296303
    297304            echo "</li>";
     
    302309        if (!$ai4seo_this_got_any_valid_changes) {
    303310            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 " ";
    305313            echo esc_html__("No changes were detected in this settings category.", "ai-for-seo");
    306314            echo "</div>";
  • ai-for-seo/trunk/includes/menu-frame.php

    r3408847 r3420851  
    9797    // toggle button
    9898    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"));
    100100    echo "</button>";
    101101
     
    155155
    156156                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);
    158158                    echo "<div>";
    159159                        echo esc_html($ai4seo_this_menu_item_label);
     
    165165                // Media page
    166166                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"));
    168168                    echo "<span>";
    169169                        echo esc_html(_n("Media", "Media", 2, "ai-for-seo"));
     
    174174            // Account page
    175175            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"));
    177177                echo "<span>";
    178178                    echo esc_html__("Account", "ai-for-seo");
  • ai-for-seo/trunk/includes/modal_schemas/customize-pay-as-you-go.php

    r3408847 r3420851  
    9191            $ai4seo_this_prefixed_input_id = ai4seo_get_prefixed_input_name(AI4SEO_SETTING_PAYG_STRIPE_PRICE_ID);
    9292
    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            );
    9497
    9598            echo "<div class='ai4seo-form-item'>";
     
    118121
    119122                    // 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>";
    123126                echo "</div>";
    124127            echo "</div>";
     
    140143                    // Description
    141144                    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'));
    143146                    echo "</p>";
    144147                echo "</div>";
     
    161164                    // Description
    162165                    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'));
    164167                    echo "</p>";
    165168                echo "</div>";
     
    184187                echo "</li>";
    185188                echo "<li>";
    186                     echo ai4seo_wp_kses(sprintf(
     189                    ai4seo_echo_wp_kses(sprintf(
    187190                        __("I will never spend more than %s within a <strong>24-hour period</strong>.", "ai-for-seo"),
    188191                        "<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>",
    189192                    ));
    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(
    194197                        __("I will never spend more than %s per <strong>calendar month</strong>.", "ai-for-seo"),
    195198                        "<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>",
    196199                    ));
    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")));
    198201                echo "</li>";
    199202                echo "<li>";
     
    232235
    233236echo "<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)"));
    235238
    236239    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);"));
    238241    } 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);"));
    240243    }
    241244
  • ai-for-seo/trunk/includes/modal_schemas/export-import-settings.php

    r3395515 r3420851  
    3434        // Headline
    3535        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"));
    3737            echo esc_html__("Export Settings", "ai-for-seo");
    3838        echo "</h2>";
     
    5353        // Headline
    5454        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"));
    5656            echo esc_html__("Import Settings", "ai-for-seo");
    5757        echo "</h2>";
  • ai-for-seo/trunk/includes/modal_schemas/get-more-credits.php

    r3408847 r3420851  
    143143
    144144                // Upgrade button
    145                 echo ai4seo_wp_kses(ai4seo_get_button_text_link_tag(
     145                ai4seo_echo_wp_kses(ai4seo_get_button_text_link_tag(
    146146                    $ai4seo_purchase_plan_url,
    147147                    "list",
     
    154154                // PAID PLAN
    155155                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") . " ");
    157157                    echo sprintf(
    158158                        esc_html__("Subscribed to %s.", "ai-for-seo"),
     
    175175                        if ($ai4seo_robhub_subscription_end_timestamp > strtotime("+1 month") || $ai4seo_robhub_subscription_do_renew) {
    176176                            echo "<li>";
    177                                 echo ai4seo_wp_kses(sprintf(
     177                                ai4seo_echo_wp_kses(sprintf(
    178178                                    __("Next %s Credits on: %s.", "ai-for-seo"),
    179179                                    "<strong>" . esc_html(ai4seo_get_plan_credits($ai4seo_robhub_subscription_plan)) . "</strong>",
     
    187187                        // infos about renewing the plan
    188188                        if ($ai4seo_robhub_subscription_do_renew) {
    189                                 echo ai4seo_wp_kses(sprintf(
     189                                ai4seo_echo_wp_kses(sprintf(
    190190                                    __("Your subscription renews on: %s (%s).", "ai-for-seo"),
    191191                                    "<strong>" . esc_html($ai4seo_current_subscription_end_formatted_text) . "</strong>",
     
    212212                echo "</ol>";
    213213
    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"));
    215215            }
    216216        echo "</div>";
     
    245245                    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>";
    246246                } 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();"));
    248248                }
    249249
     
    287287                    // info on $ai4seo_payg_status
    288288                    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;"));
    290290
    291291                        echo "<p>";
     
    293293                        if ($ai4seo_payg_status == 'idle' || $ai4seo_payg_status == 'payment-received') {
    294294                            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 " ";
    296297                                echo "<strong>" . esc_html__("Refill threshold not reached.", "ai-for-seo") . "</strong> ";
    297298                                echo sprintf(
     
    300301                                    ) . " ";
    301302                            } 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 " ";
    303305                                echo "<strong>" . esc_html__("Low Credits.", "ai-for-seo") . "</strong> ";
    304306                                echo sprintf(
     
    308310                            }
    309311                        } 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 " ";
    311314                                echo "<strong>" . esc_html__("Refill in progress.", "ai-for-seo") . "</strong> ";
    312315                                echo esc_html__("This will complete shortly.", "ai-for-seo") . " ";
    313316                        } 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 " ";
    315319                                echo "<strong>" . esc_html__("Payment pending.", "ai-for-seo") . "</strong> ";
    316320                                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") . " ";
     
    318322                        } else if ($ai4seo_payg_status == 'payment-failed') {
    319323                                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 " ";
    321326                                    echo "<strong>" . esc_html__("Refill failed.", "ai-for-seo") . "</strong> ";
    322327                                    echo esc_html__("Please check your payment method and try again.", "ai-for-seo") . " ";
     
    324329                        } else if ($ai4seo_payg_status == 'error') {
    325330                                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 " ";
    327333                                    echo "<strong>" . esc_html__("Refill failed.", "ai-for-seo") . "</strong> ";
    328334                                    echo esc_html__("Try again or contact support.", "ai-for-seo") . " ";
     
    330336                        } else if ($ai4seo_payg_status == 'budget-limit-reached') {
    331337                            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") . " ");
    333339                                echo esc_html__("Daily or monthly budget limit reached. Increase your limit to enable further refills.", "ai-for-seo") . " ";
    334340                            echo "</span>";
     
    339345
    340346                    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();"));
    342348                    } 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")) . "');"));
    344350                    }
    345351
    346352                    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);"));
    348354                    }
    349355                } else {
     
    378384                $ai4seo_free_plan_credits_amount = ai4seo_get_plan_credits("free");
    379385
    380                 echo ai4seo_wp_kses(sprintf(
     386                ai4seo_echo_wp_kses(sprintf(
    381387                    __("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"),
    382388                    esc_html(AI4SEO_DAILY_FREE_CREDITS_AMOUNT),
     
    386392                echo "<br><br>";
    387393                $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(
    389395                    __('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'),
    390396                    esc_html(AI4SEO_DAILY_FREE_CREDITS_AMOUNT),
     
    403409
    404410echo "<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)"));
    406412echo "</div>";
  • ai-for-seo/trunk/includes/modal_schemas/select-credits-pack.php

    r3399672 r3420851  
    6666        echo "<br>";
    6767        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"]));
    6969    }
    7070
     
    144144                if (count($ai4seo_credits_packs) > 3) {
    145145                    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();"));
    147147                    echo "</center>";
    148148                    echo "<div style='display: none;'>";
     
    209209
    210210echo "<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);"));
    213213echo "</div>";
  • ai-for-seo/trunk/includes/modal_schemas/seo-autopilot.php

    r3395515 r3420851  
    8686        echo "<div class='ai4seo-generated-data-reminder-container'>";
    8787            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 " ";
    8990                echo esc_html($ai4seo_generated_entries_message);
    9091            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));
    9394
    9495            echo "<div id='ai4seo-remove-generated-data-action-container' class='ai4seo-remove-generated-data-action-container ai4seo-display-none'>";
    9596                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 " ";
    9799                    echo esc_html__("Remove all AI-generated data", "ai-for-seo");
    98100                echo "</button>";
     
    101103            // invisible tooltip info that is used inside the confirmation modal
    102104            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);
    104106            echo "</div>";
    105107        echo "</div>";
    106108    } else {
    107109        # 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(
    110113            __("Before starting the SEO Autopilot for the first time, ensure that the <a href='%s'>plugin settings</a> are configured correctly.", "ai-for-seo"),
    111114            esc_url(ai4seo_get_subpage_url("settings"))
     
    137140
    138141            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);
    140143                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" : "") . ">";
    141144                echo "<label for='" . esc_attr($ai4seo_this_bulk_generation_setting_name) . "'>";
     
    182185                        echo esc_html__("Generate metadata for:", "ai-for-seo");
    183186                        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")));
    185188                    echo "</span> ";
    186189                echo "</label>";
     
    260263
    261264echo "<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);"));
    263266    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);"));
    265268    } 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);"));
    267270    }
    268271echo "</div>";
  • ai-for-seo/trunk/includes/modal_schemas/tos.php

    r3338367 r3420851  
    7272
    7373        if ($tos_content) {
    74             echo ai4seo_wp_kses($tos_content);
     74            ai4seo_echo_wp_kses($tos_content);
    7575        } else {
    7676            echo "<p>" . esc_html__("The Terms of Service could not be loaded. Please try again later.", "ai-for-seo") . "</p>";
     
    9494                echo "<input type='checkbox' class='ai4seo-accept-enhanced-reporting-checkbox' id='ai4seo-accept-enhanced-reporting-checkbox' name='ai4seo-accept-enhanced-reporting-checkbox' value='1'>";
    9595                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));
    9797            echo "</div>";
    9898        }
  • ai-for-seo/trunk/includes/pages/account.php

    r3395515 r3420851  
    140140                    // Button to reveal license-key
    141141                    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")));
    143143                    echo "</div>";
    144144
    145145                    // Button to hide license-key
    146146                    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")));
    148148                    echo "</div>";
    149149                }
     
    159159            echo "<div class='ai4seo-buttons-wrapper' style='margin-top: 0; margin-bottom: 5px;'>";
    160160                // 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();"));
    162162
    163163                // Button to manage subscription if user has an active subscription
    164164                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"));
    166166                }
    167167
    168168                // Customize pay-as-you-go
    169169                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();"));
    171171                }
    172172
    173173                // Button to manage credits
    174174                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();"));
    176176                }
    177177            echo "</div>";
     
    214214                // Description
    215215                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);
    217217                echo "</p>";
    218218            echo "</div>";
     
    237237                // Description
    238238                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);
    240240                echo "</p>";
    241241            echo "</div>";
     
    256256            $ai4seo_this_prefixed_input_id = ai4seo_get_prefixed_input_name(AI4SEO_SETTING_INSTALLED_PLUGINS_PLUGIN_NAME);
    257257
    258             $ai4seo_this_setting_description = ai4seo_wp_kses(sprintf(
     258            $ai4seo_this_setting_description = sprintf(
    259259                __("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"),
    260260                esc_url(admin_url("plugins.php"))
    261             ));
     261            );
    262262
    263263            echo "<div class='ai4seo-form-item'>";
     
    269269                    // Description
    270270                    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);
    272272                    echo "</p>";
    273273                echo "</div>";
     
    281281            $ai4seo_this_prefixed_input_id = ai4seo_get_prefixed_input_name(AI4SEO_SETTING_INSTALLED_PLUGINS_PLUGIN_DESCRIPTION);
    282282
    283             $ai4seo_this_setting_description = ai4seo_wp_kses(sprintf(
     283            $ai4seo_this_setting_description = sprintf(
    284284                __("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"),
    285285                esc_url(admin_url("plugins.php"))
    286             ));
     286            );
    287287
    288288            echo "<div class='ai4seo-form-item'>";
     
    294294                    // Description
    295295                    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);
    297297                    echo "</p>";
    298298                echo "</div>";
     
    317317                    // Description
    318318                    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);
    320320                    echo "</p>";
    321321                echo "</div>";
     
    346346                        // Description
    347347                        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);
    349349                        echo "</p>";
    350350                    echo "</div>";
     
    369369                        // Description
    370370                        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);
    372372                        echo "</p>";
    373373                    echo "</div>";
     
    398398                if (ai4seo_does_user_need_to_accept_tos_toc_and_pp(false)) {
    399399                    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 " ";
    401402                        echo esc_html__("Show Terms of Service", "ai-for-seo");
    402403                    echo "</button>";
    403404                } else {
    404405                    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 " ";
    406408                        echo esc_html__("Show Terms of Service", "ai-for-seo");
    407409                    echo "</button>";
     
    411413                    $latest_tos_and_toc_and_pp_version = ai4seo_get_latest_tos_and_toc_and_pp_version();
    412414                    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());
    414416                echo "</p>";
    415417            echo "</div>";
     
    433435                echo "<div style='max-width: 400px;'>";
    434436                    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>";
    436440                echo "</div>";
    437441
     
    440444                    if (!$ai4seo_did_user_accept_enhanced_reporting && $ai4seo_enhanced_reporting_revoke_timestamp) {
    441445                        $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 " ";
    443448                        echo sprintf(esc_html__("Revoked on %s.", "ai-for-seo"), esc_html($ai4seo_readable_revoked_time));
    444449                    } 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());
    446451                    }
    447452                echo "</p>";
  • ai-for-seo/trunk/includes/pages/content_types/attachment.php

    r3408847 r3420851  
    8080    }
    8181
    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"),
    8483            ($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
    8786}
    8887
     
    257256if (isset($ai4seo_import_nextgen_gallery_button) && $ai4seo_import_nextgen_gallery_button) {
    258257    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);
    260259    echo "</div>";
    261260}
    262261
    263 echo ai4seo_wp_kses($ai4seo_filter_form_html);
     262ai4seo_echo_wp_kses($ai4seo_filter_form_html);
    264263
    265264// Stop script if no posts have been found -> show message and stop page rendering
     
    291290            if (count($ai4seo_failed_attributes_attachment_post_ids)) {
    292291                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);
    294293                echo "</div>";
    295294            }
     
    434433                                // execute sooner link
    435434                                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);
    437437                                } else {
    438                                     echo " " . ai4seo_wp_kses($ai4seo_refresh_button);
     438                                    echo " ";
     439                                    ai4seo_echo_wp_kses($ai4seo_refresh_button);
    439440                                }
    440441                            echo "</div>";
     
    443444                                echo esc_html__("Pending", "ai-for-seo") . "... ";
    444445                                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);
    446447                            echo "</div>";
    447448                        }
     
    449450                        echo "<div class='ai4seo-sub-info'>";
    450451                            echo esc_html__("Processing", "ai-for-seo") . "... ";
    451                             echo ai4seo_wp_kses($ai4seo_refresh_button);
     452                            ai4seo_echo_wp_kses($ai4seo_refresh_button);
    452453                        echo "</div>";
    453454                    } else if ($ai4seo_is_insufficient_credits) {
    454455                        echo "<div class='ai4seo-sub-info ai4seo-red-message'>";
    455456                            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);
    457458                        echo "</div>";
    458459                    } else if ($ai4seo_is_attachment_post_failed && $ai4seo_this_attachment_attributes_is_not_finished) {
    459460                        echo "<div class='ai4seo-seo-data-not-covered-message'>";
    460461                            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) . "\");"));
    462463                        echo "</div>";
    463464                    } else if ($ai4seo_is_excluded_by_new_or_existing_filter && $ai4seo_this_attachment_attributes_is_not_finished) {
     
    485486            echo "<td>";
    486487                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));
    488489                }
    489490            echo "</td>";
     
    523524
    524525    echo "<div class='ai4seo-pagination'>";
    525         echo ai4seo_wp_kses($ai4seo_pagination_links);
     526        ai4seo_echo_wp_kses($ai4seo_pagination_links);
    526527    echo "</div>";
    527528}
  • ai-for-seo/trunk/includes/pages/content_types/post.php

    r3408847 r3420851  
    229229// === TABLE WITH ALL POSTS ================================================================== \\
    230230
    231 echo ai4seo_wp_kses($ai4seo_filter_form_html);
     231ai4seo_echo_wp_kses($ai4seo_filter_form_html);
    232232
    233233// Stop script if no posts have been found -> show message and stop page rendering
     
    260260            if (($ai4seo_num_failed_to_fill_this_post_type || $ai4seo_current_page_failed_to_fill_post_ids)) {
    261261                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);
    263263                echo "</div>";
    264264            }
     
    380380                                // execute sooner link
    381381                                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);
    383384                                } else {
    384                                     echo " " . ai4seo_wp_kses($ai4seo_refresh_button);
     385                                    echo " ";
     386                                    ai4seo_echo_wp_kses($ai4seo_refresh_button);
    385387                                }
    386388                            echo "</div>";
     
    389391                                echo esc_html__("Pending", "ai-for-seo") . "... ";
    390392                                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);
    392395                            echo "</div>";
    393396                        }
     
    395398                        echo "<div class='ai4seo-sub-info'>";
    396399                            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);
    398402                        echo "</div>";
    399403                    } else if ($ai4seo_is_insufficient_credits) {
    400404                        echo "<div class='ai4seo-sub-info ai4seo-red-message'>";
    401405                            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);
    403408                        echo "</div>";
    404409                    } else if ($ai4seo_this_post_is_failed_to_fill && $ai4seo_this_metadata_generation_is_not_finished) {
    405410                        echo "<div class='ai4seo-seo-data-not-covered-message'>";
    406411                            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) . "\");"));
    408414                        echo "</div>";
    409415                    } else if ($ai4seo_is_excluded_by_new_or_existing_filter && $ai4seo_this_metadata_generation_is_not_finished) {
     
    436442                // Edit-Link
    437443                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));
    439445                }
    440446            echo "</td>";
     
    476482
    477483    echo "<div class='ai4seo-pagination'>";
    478         echo ai4seo_wp_kses($ai4seo_pagination_links);
     484        ai4seo_echo_wp_kses($ai4seo_pagination_links);
    479485    echo "</div>";
    480486}
  • ai-for-seo/trunk/includes/pages/dashboard.php

    r3408847 r3420851  
    130130            if ($ai4seo_posts_table_analysis_state !== 'completed') {
    131131                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 " ";
    133134                    echo esc_html__("AI for SEO is currently analyzing your pages and media files. Please wait.", "ai-for-seo");
    134135                echo "</div>";
     
    142143            if (!$ai4seo_heavy_db_operations_disabled && $ai4seo_posts_table_analysis_state === 'completed') {
    143144                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;"));
    145146                echo "</div>";
    146147            }
     
    248249                    if ($ai4seo_retry_all_failed_metadata_button_tags) {
    249250                        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);
    251252                        }
    252253                    }
    253254
    254255                    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);
    256257                    }
    257258
     
    281282        // refresh credits balance button
    282283        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;"));
    284285        echo "</div>";
    285286
     
    295296                } else {
    296297                    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"));
    298299                        echo esc_html__("N/A", "ai-for-seo");
    299300                    echo "</span>";
     
    305306        if ($ai4seo_current_credits_balance < $ai4seo_free_plan_credits_amount) {
    306307            echo "<div class='ai4seo-next-free-credits-container'>";
    307                 echo ai4seo_wp_kses(sprintf(
     308                ai4seo_echo_wp_kses(sprintf(
    308309                    __('Next <span class="ai4seo-credits-usage-badge">+%1$s Credits</span> in <strong>%2$s</strong>', 'ai-for-seo'),
    309310                    esc_html(AI4SEO_DAILY_FREE_CREDITS_AMOUNT),
     
    317318                    esc_html($ai4seo_free_plan_credits_amount),
    318319                );
    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));
    320321            echo "</div>";
    321322        }
     
    334335                // Turn Buy credits button
    335336                echo "<div class='ai4seo-buy-credits-button-container'>";
    336                     echo ai4seo_wp_kses(
     337                    ai4seo_echo_wp_kses(
    337338                        ai4seo_get_button_text_link_tag("#", "arrow-up-right-from-square", esc_html__("Get more Credits", "ai-for-seo"),
    338339                            ($ai4seo_current_credits_balance < AI4SEO_BLUE_GET_MORE_CREDITS_BUTTON_THRESHOLD ? "ai4seo-success-button" : ""),
     
    343344            } else {
    344345                // go to Account Settings
    345                 echo ai4seo_wp_kses(
     346                ai4seo_echo_wp_kses(
    346347                    ai4seo_get_button_text_link_tag(ai4seo_get_subpage_url("account"), "key", esc_html__("Account Settings", "ai-for-seo"), "ai4seo-success-button")
    347348                );
     
    375376
    376377        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"));
    378379        echo "</p>";
    379380        echo "</div>";
     
    395396        // execute sooner link
    396397        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;
    398399        } else {
    399             $ai4seo_additional_sub_status_text .= " " . ai4seo_wp_kses($ai4seo_refresh_button);
     400            $ai4seo_additional_sub_status_text .= " " . $ai4seo_refresh_button;
    400401        }
    401402
     
    440441                    // triangle-exclamation on the top right corner
    441442                    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"));
    443444                    echo "</div>";
    444445
     
    456457                    // triangle-exclamation on the top right corner
    457458                    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"));
    459460                    echo "</div>";
    460461
     
    466467                        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");
    467468                        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);
    469471                        }
    470472                    echo "</div>";
     
    485487                    // triangle-exclamation on the top right corner
    486488                    #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"));
    488490                    #echo "</div>";
    489491
     
    498500
    499501                    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);
    501504                    }
    502505                    echo "</div>";
     
    515518
    516519                    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);
    518522                    }
    519523                    echo "</div>";
     
    523527                    // triangle-exclamation on the top right corner
    524528                    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"));
    526530                    echo "</div>";
    527531
     
    534538
    535539                    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);
    537542                    }
    538543                    echo "</div>";
     
    546551                    if ($ai4seo_is_any_bulk_generation_enabled) {
    547552                        // 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\"});"));
    551556                echo "</div>";
    552557            echo "</div>";
     
    572577                echo "<div class='ai4seo-latest-activity-item'>";
    573578                    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);
    575580                    echo "</div>";
    576581
     
    593598                        if ($ai4seo_this_latest_activity_entry_is_success) {
    594599                            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 " ";
    596602                        } else {
    597603                            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 " ";
    599606                        }
    600607
     
    637644                        // see post / media preview
    638645                        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"));
    640647                        }
    641648
    642649                        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"]) . ");"));
    644651                        } else {
    645652                            if (isset($ai4seo_this_latest_activity_entry["url"]) && $ai4seo_this_latest_activity_entry["url"]) {
    646653                                # 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"]) . "\")"));
    648655                            }
    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"]) . ");"));
    650657                        }
    651658                    echo "</div>";
     
    666673            echo esc_html__("Your Personal SEO Expert", "ai-for-seo");
    667674            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"));
    669676            echo "</div>";
    670677            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"));
    672679            echo "</div>";
    673680        echo "</h4>";
     
    694701                echo "<p>" . esc_html__("Hi, I'm your personal SEO expert!", "ai-for-seo") . "</p>";
    695702                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"));
    700711            echo "</div>";
    701712        echo "</div>";
     
    709720            echo esc_html__("Guarantee", "ai-for-seo");
    710721            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"));
    712723            echo "</div>";
    713724            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"));
    715726            echo "</div>";
    716727        echo "</h4>";
    717728
    718729        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 " ";
    720732            # todo: hide if not applicable
    721733            if (true) {
     
    732744            echo esc_html__("Recent Plugin Updates", "ai-for-seo");
    733745            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"));
    735747            echo "</div>";
    736748            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"));
    738750            echo "</div>";
    739751        echo "</h4>";
     
    772784                    if ($ai4seo_this_is_first_plugin_update) {
    773785                        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"));
    775787                        echo "</div>";
    776788                        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"));
    778790                        echo "</div>";
    779791                    } else {
    780792                        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"));
    782794                        echo "</div>";
    783795                        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"));
    785797                        echo "</div>";
    786798                    }
     
    808820            echo esc_html__("Support & Feedback", "ai-for-seo");
    809821            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"));
    811823            echo "</div>";
    812824            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"));
    814826            echo "</div>";
    815827        echo "</h4>";
     
    819831            // HELP SECTION
    820832            // 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(
    824837                /* translators: %s is a clickable email address */
    825838                __("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"),
     
    833846
    834847            // 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")));
    836849
    837850            echo "<br><br><br>";
     
    839852            // CONTACT US
    840853            // 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(
    844858                /* translators: %s is a clickable email address */
    845859                __("Missing a feature, need assistance, or looking for a quote?", "ai-for-seo") . " " .
     
    851865
    852866            // 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"));
    854868
    855869            echo "<br><br><br>";
     
    857871            // RATE US
    858872            // 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 " ";
    860875
    861876            //  like our plugin rate us at AI4SEO_OFFICIAL_WORDPRESS_ORG_PAGE
    862             echo ai4seo_wp_kses(sprintf(
     877            ai4seo_echo_wp_kses(sprintf(
    863878                __("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"),
    864879                esc_url(AI4SEO_OFFICIAL_RATE_US_URL)
     
    868883
    869884            // 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"));
    871886
    872887        echo "</div>";
  • ai-for-seo/trunk/includes/pages/help.php

    r3408847 r3420851  
    156156    // Getting started
    157157    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"));
    159159        echo "<span>" . esc_html__("Getting started", "ai-for-seo") . "</span>";
    160160    echo "</div></a>";
     
    228228    // Content tabes
    229229    $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>";
    231231    $ai4seo_this_accordion_content .= "<img src='" . esc_url(ai4seo_get_assets_images_url("help-screenshots/first-steps-5.jpg")) . "' style='width: 100%;' />";
    232232    $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>";
    234234    $ai4seo_this_accordion_content .= "<img src='" . esc_url(ai4seo_get_assets_images_url("help-screenshots/first-steps-6.jpg")) . "' style='width: 100%;' />";
    235235
     
    238238    $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>";
    239239    $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));
    243243
    244244    // === How to edit specific page or post ===================================================== \\
     
    259259    $ai4seo_this_accordion_content .= "<img src='" . esc_url(ai4seo_get_assets_images_url("faq-screenshots/screenshot-page-post-3.jpg")) . "' style='width: 100%;' />";
    260260
    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));
    262262
    263263
     
    276276    $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>";
    277277
    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));
    279279
    280280
     
    293293    $ai4seo_this_accordion_content .= "<img src='" . esc_url(ai4seo_get_assets_images_url("faq-screenshots/screenshot-seo-autopilot-3.jpg")) . "' style='width: 100%;' />";
    294294
    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));
    296296
    297297
     
    308308
    309309    // 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>";
    311311
    312312    // Details on credits available with different plans
     
    335335    $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>";
    336336
    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));
    338338
    339339
     
    356356        $ai4seo_this_accordion_content .= "<img src='" . esc_url(ai4seo_get_assets_images_url("faq-screenshots/screenshot-yoast-3.jpg")) . "' style='width: 100%;' />";
    357357
    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));
    359359    }
    360360
     
    373373        $ai4seo_this_accordion_content .= "<img src='" . esc_url(ai4seo_get_assets_images_url("faq-screenshots/screenshot-elementor-2.jpg")) . "' style='width: 100%;' />";
    374374
    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));
    376376    }
    377377
     
    389389        $ai4seo_this_accordion_content .= "<img src='" . esc_url(ai4seo_get_assets_images_url("faq-screenshots/screenshot-be-builder-1.jpg")) . "' style='width: 100%;' />";
    390390
    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));
    392392    }
    393393echo "</div>";
     
    407407    // Input for the search
    408408    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"));
    410410        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") . "' />";
    411411    echo "</div>";
     
    425425
    426426        $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));
    428428
    429429        $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));
    431431
    432432        $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));
    434434
    435435        $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));
    437437
    438438        $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));
    440440
    441441        $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));
    443443
    444444        $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));
    446446
    447447        $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));
    449449
    450450        $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));
    452452
    453453        $ai4seo_this_accordion_content = sprintf(
     
    455455            "<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>"
    456456        );
    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));
    464458
    465459        $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));
    467461
    468462        $ai4seo_this_accordion_content = sprintf(
     
    470464            esc_url(AI4SEO_OFFICIAL_CONTACT_URL)
    471465        );
    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));
    473467
    474468        $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));
    476470
    477471        $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));
    479473
    480474        $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));
    482476
    483477        $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));
    485479
    486480        $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));
    488482
    489483        $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));
    491485
    492486        $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));
    494488
    495489        $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 />";
     
    498492        $ai4seo_this_accordion_content .= __('Enable "Include Complete Entries When Overwriting (SEO Autopilot Only)" in the Media Attributes section.', "ai-for-seo") . "<br />";
    499493        $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));
    501495
    502496        $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 />";
     
    504498        $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 />";
    505499        $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));
    507501
    508502        $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));
    510504
    511505        $ai4seo_this_accordion_content = __("If you want to fully remove all generated metadata and plugin data before uninstalling:", "ai-for-seo") . "<br /><br />";
     
    513507        $ai4seo_this_accordion_content .= __("2. Deactivate and uninstall the plugin.", "ai-for-seo") . "<br /><br />";
    514508        $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));
    516510
    517511        $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 />";
    518512        $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));
    520514
    521515        $ai4seo_this_accordion_content = __("If you generated metadata or media attributes with incorrect settings, follow these steps:", "ai-for-seo") . "<br /><br />";
     
    524518        $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 />";
    525519        $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));
    527521
    528522        $ai4seo_this_accordion_content  = __("Enable \"Pause pages and media files analysis\" under Help > Troubleshooting.", "ai-for-seo");
    529523        $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));
    531525
    532526        $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));
    534528
    535529
     
    542536        $ai4seo_this_accordion_content .= __( '4. Ensure images are real <img> tags. Background images set via CSS cannot have alt text.', 'ai-for-seo' );
    543537
    544         echo ai4seo_wp_kses(
     538        ai4seo_echo_wp_kses(
    545539            ai4seo_get_accordion_element(
    546540                '> ' . esc_html__( 'I do not see generated alt text on the front page. What can I do?', 'ai-for-seo' ),
     
    558552        $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' );
    559553
    560         echo ai4seo_wp_kses(
     554        ai4seo_echo_wp_kses(
    561555            ai4seo_get_accordion_element(
    562556                '> ' . esc_html__( 'Generating alt text fails. Should I switch "Image Upload Method" to "Data"?', 'ai-for-seo' ),
     
    566560
    567561        $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(
    569563            ai4seo_get_accordion_element(
    570564                '> ' . esc_html__( 'Can I use *AI for SEO* on a staging or local development site?', 'ai-for-seo' ),
     
    585579
    586580        $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));
    588582
    589583        $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));
    591585
    592586        $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));
    594588
    595589        $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));
    597591
    598592        $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));
    603597
    604598        $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));
    606600
    607601        $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));
    609603
    610604        $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 />";
     
    614608        $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 />";
    615609        $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));
    617611
    618612    echo "</div>";
     
    628622
    629623        $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));
    631625
    632626        $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));
    634628
    635629        $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));
    637631
    638632        $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));
    640634
    641635        $ai4seo_this_accordion_content = __("1. Open the page or post you want to edit in Elementor.", "ai-for-seo") . "<br />";
    642636        $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 />";
    643637        $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));
    645639
    646640        $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 />";
    647641        $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 />";
    648642        $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));
    650644
    651645        // === FAQ: Cannot access plugin due to incognito mode restriction ================= \\
     
    661655        $ai4seo_this_accordion_content .= __("3. If needed, you may enable incognito mode again after saving.", "ai-for-seo");
    662656
    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));
    664658    echo "</div>";
    665659
     
    678672            esc_html($ai4seo_free_plan_credits),
    679673        );
    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));
    681675
    682676        $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));
    684678
    685679        $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));
    690684
    691685        $ai4seo_this_accordion_content = sprintf(
     
    695689            esc_html($ai4seo_free_plan_credits),
    696690        );
    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));
    698692
    699693        $ai4seo_this_accordion_content = sprintf(
     
    712706            esc_html($ai4seo_l_plan_credits),
    713707        );
    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));
    715709
    716710        $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 />";
     
    736730            esc_html(AI4SEO_CUSTOM_PLAN_DISCOUNT) . "%",
    737731        );
    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));
    739733
    740734        // lost key content
     
    746740            "<strong>" . esc_html__("Lost your license data?", "ai-for-seo") . "</strong>",
    747741        );
    748         echo ai4seo_wp_kses(ai4seo_get_accordion_element(
     742        ai4seo_echo_wp_kses(ai4seo_get_accordion_element(
    749743            "> " . esc_html__("What should I do if I lose my license key?", "ai-for-seo"),
    750744            $ai4seo_this_accordion_content
     
    756750        );
    757751        $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));
    759753
    760754        $ai4seo_this_accordion_content = sprintf(
     
    763757        );
    764758        $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));
    766760
    767761        $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));
    769763    echo "</div>";
    770764echo "</div>";
     
    877871
    878872                    // 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"));
    880874                    echo "<div class='ai4seo-medium-gap'></div>";
    881875
     
    891885                        echo "<label for='ai4seo-troubleshooting-reset-notifications'>" . esc_html__("Reset notifications", "ai-for-seo") . "</label>";
    892886                        $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));
    894888                    echo "</div>";
    895889
     
    907901                        echo "<label for='ai4seo-troubleshooting-reset-settings'>" . esc_html__("Reset plugin settings", "ai-for-seo") . "</label>";
    908902                        $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));
    910904                    echo "</div>";
    911905
     
    914908                        echo "<input type='checkbox' id='ai4seo-troubleshooting-reset-metadata' name='ai4seo-troubleshooting-reset-checkbox[]' />";
    915909                        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));
    917911                    echo "</div>";
    918912
     
    921915                    // needed for extra information in the upcoming notification modal
    922916                    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);
    924918                    echo "</div>";
    925919
     
    947941
    948942                    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);
    950944                    echo "</p>";
    951945                echo "</div>";
     
    968962    // Input for the search
    969963    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"));
    971965        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") . "' />";
    972966    echo "</div>";
     
    981975    echo "<div class='ai4seo-faq-section-holder'>";
    982976        $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));
    984978
    985979        $ai4seo_this_accordion_content = __("If you want to fully remove all generated metadata and plugin data before uninstalling:", "ai-for-seo") . "<br /><br />";
     
    987981        $ai4seo_this_accordion_content .= __("2. Deactivate and uninstall the plugin.", "ai-for-seo") . "<br /><br />";
    988982        $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));
    990984
    991985        $ai4seo_this_accordion_content = __("If you generated metadata or media attributes with incorrect settings, follow these steps:", "ai-for-seo") . "<br /><br />";
     
    994988        $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 />";
    995989        $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));
    997991
    998992        $ai4seo_this_accordion_content  = __("Enable \"Pause pages and media files analysis\" under Help > Troubleshooting.", "ai-for-seo");
    999993        $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));
    1001995
    1002996        // === FAQ: Alt Text Injection not visible ================================== \\
     
    10081002        $ai4seo_this_accordion_content .= __( '4. Ensure images are real <img> tags. Background images set via CSS cannot have alt text.', 'ai-for-seo' );
    10091003
    1010         echo ai4seo_wp_kses(
     1004        ai4seo_echo_wp_kses(
    10111005            ai4seo_get_accordion_element(
    10121006                '> ' . esc_html__( 'I do not see generated alt text on the front page. What can I do?', 'ai-for-seo' ),
     
    10231017        $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' );
    10241018
    1025         echo ai4seo_wp_kses(
     1019        ai4seo_echo_wp_kses(
    10261020            ai4seo_get_accordion_element(
    10271021                '> ' . esc_html__( 'Generating alt text fails. Should I switch "Image Upload Method" to "Data"?', 'ai-for-seo' ),
     
    10421036        $ai4seo_this_accordion_content .= __("3. If needed, you may enable incognito mode again after saving.", "ai-for-seo");
    10431037
    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));
    10451039    echo "</div>";
    10461040echo "</div>";
  • ai-for-seo/trunk/includes/pages/settings.php

    r3408847 r3420851  
    5656
    5757    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>";
    6066
    6167
     
    6874        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) . "' />";
    6975        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>";
    7180        echo "</div>";
    7281        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>";
    7486        echo "</div>";
    7587    echo "</div>";
     
    8496        echo "<h2>";
    8597            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>";
    8799        echo "</h2>";
    88100
     
    111123
    112124                // 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));
    114126                echo "<div class='ai4seo-medium-gap'></div>";
    115127
     
    136148
    137149                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
    142155
    143156        // === AI4SEO_SETTING_DISABLED_POST_TYPES ===================================================== \\
     
    164177            echo "<div class='ai4seo-form-item-input-wrapper'>";
    165178                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));
    167180                    echo "<div class='ai4seo-medium-gap'></div>";
    168181
     
    185198
    186199                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);
    188201                echo "</p>";
    189202            echo "</div>";
     
    215228            echo "<div class='ai4seo-form-item-input-wrapper'>";
    216229                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));
    218231                echo "</select>";
    219232
    220233                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);
    222235                echo "</p>";
    223236            echo "</div>";
     
    295308            echo "<label>";
    296309                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));
    298311            echo "</label>";
    299312
     
    329342
    330343                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);
    332345                echo "</p>";
    333346            echo "</div>";
     
    375388                    // add a select / un select all checkbox
    376389                    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));
    378391                        echo "<div class='ai4seo-medium-gap'></div>";
    379392                    }
     
    396409                                }
    397410
    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 " ";
    399413                            }
    400414
     
    406420
    407421                    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);
    409423                    echo "</p>";
    410424                } else {
     
    439453
    440454                    // 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));
    442456                    echo "<div class='ai4seo-medium-gap'></div>";
    443457
     
    464478
    465479                    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);
    467481                    echo "</p>";
    468482                echo "</div>";
     
    490504                    // new feature bubble # todo: remove bubble after some time
    491505                    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 " ";
    493508                    echo esc_html__("Include product price in metadata", "ai-for-seo") . ":";
    494509                echo "</label>";
     
    537552                    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'") . " /> ";
    538553                    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);
    540556                    echo "<br>";
    541557                echo "</label>";
    542558
    543559                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);
    545561                echo "</p>";
    546562            echo "</div>";
     
    571587
    572588                // 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));
    574590                echo "<div class='ai4seo-medium-gap'></div>";
    575591
     
    591607
    592608                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);
    594610                echo "</p>";
    595611            echo "</div>";
     
    622638
    623639                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);
    625641                echo "</p>";
    626642            echo "</div>";
     
    650666                echo "<p class='ai4seo-form-item-description'>";
    651667                    // 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>";
    653670
    654671                    // 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>";
    656674
    657675                    // 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>";
    659678
    660679                    // 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"));
    662681                echo "</p>";
    663682            echo "</div>";
     
    674693        echo "<h2>";
    675694        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>";
    677696        echo "</h2>";
    678697
     
    699718
    700719                // 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));
    702721                echo "<div class='ai4seo-medium-gap'></div>";
    703722
     
    719738
    720739                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);
    722741                echo "</p>";
    723742            echo "</div>";
     
    755774            echo "<div class='ai4seo-form-item-input-wrapper'>";
    756775                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));
    758777                echo "</select>";
    759778
    760779                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);
    762781                echo "</p>";
    763782            echo "</div>";
     
    792811            echo "<label>";
    793812                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));
    795814            echo "</label>";
    796815
     
    821840
    822841                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);
    824843                echo "</p>";
    825844            echo "</div>";
     
    850869
    851870                // 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));
    853872                echo "<div class='ai4seo-medium-gap'></div>";
    854873
     
    870889
    871890                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);
    873892                echo "</p>";
    874893            echo "</div>";
     
    902921                    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'") . " /> ";
    903922                    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);
    905925                    echo "<br>";
    906926                echo "</label>";
    907927
    908928                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);
    910930                echo "</p>";
    911931            echo "</div>";
     
    939959                    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'") . " /> ";
    940960                    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);
    942963                    echo "<br>";
    943964                echo "</label>";
    944965
    945966                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);
    947968                echo "</p>";
    948969            echo "</div>";
     
    976997                    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'") . " /> ";
    977998                    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);
    9791001                    echo "<br>";
    9801002                echo "</label>";
    9811003
    9821004                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);
    9841006                echo "</p>";
    9851007            echo "</div>";
     
    10121034
    10131035                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);
    10151037                echo "</p>";
    10161038            echo "</div>";
     
    10501072
    10511073                // 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));
    10531075                echo "<div class='ai4seo-medium-gap'></div>";
    10541076
     
    10741096
    10751097                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);
    10771099                echo "</p>";
    10781100            echo "</div>";
     
    11261148
    11271149                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);
    11291151                echo "</p>";
    11301152            echo "</div>";
     
    11581180
    11591181                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);
    11611183                echo "</p>";
    11621184            echo "</div>";
     
    11891211
    11901212                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);
    11921214                echo "</p>";
    11931215            echo "</div>";
     
    12241246
    12251247                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);
    12271249                echo "</p>";
    12281250            echo "</div>";
     
    12651287
    12661288                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);
    12681290                echo "</p>";
    12691291            echo "</div>";
  • ai-for-seo/trunk/readme.txt

    r3408847 r3420851  
    55Requires at least: 4.7
    66Tested up to: 6.8.3
    7 Stable tag: 2.2.3
     7Stable tag: 2.2.4
    88Requires PHP: 7.4
    99License: GPLv2 or later (or compatible)
     
    1919Achieve 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.
    2020
    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.
    2424
    2525**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.
    2626
    2727= 🚀 How to Get Started =
    28 1. **Open the Dashboard:** Go to 'AI for SEO' to view coverage stats and quick actions.
     281. **Open the Dashboard:** Go to 'AI for SEO' to view statistics about your current SEO coverage.
    29292. **Review your content:** Open 'Pages', 'Posts', 'Products', or 'Media' and check its SEO status.
    30303. **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.
     314. **Get a first win (optional):** In the 'Media Library', click 'Generate with AI' on one image to create optimized alt text within seconds.
    32325. **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 SEOPress to keep fields updated.
     336. **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.
    3434
    3535For a step-by-step guide, see 'Help' → 'Getting Started' → 'First Steps'.
     
    5858✅ **Sync with your SEO plugin:** Keep fields updated in Yoast, Rank Math, SEOPress, and others.
    5959✅ **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.
    6161✅ **Progress tracking:** Monitor coverage and recent activity from the dashboard.
    6262✅ **For agencies & teams:** White-label, incognito mode, export/import settings, multi-site support.
     
    110110
    111111**After activation**
    112 Open 'AI for SEO' in the admin menu to view coverage and click 'Set up SEO Autopilot' to start bulk generation.
     112Open 'AI for SEO' in the admin menu to view your SEO coverage and click 'Set up SEO Autopilot' to start bulk generation.
    113113
    114114
     
    134134Yes, the AI tool will generate SEO-relevant data based on the content of the selected page, blog post or media file.
    135135
    136 = Will *AI for SEO* overwrite my existing SEO fields? =
     136= Will *AI for SEO* overwrite my existing metadata or media attributes? =
    137137Not unless you enable it. By default, we don’t overwrite existing data. You can explicitly allow overwriting (and even include “complete” entries) in Settings.
    138138
     
    140140Yes, *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.
    141141
    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 
    145142= 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.
     143Credits 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).
    147144
    148145= Do unused Credits expire at the end of the month? =
     
    152149Yes, 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.
    153150
    154 = When should I choose a Subscription, Credit Packs, or PAYG? =
     151= When should I choose a Subscription, Credit Packs, or Pay-As-You-Go? =
    1551521. 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.
    1561532. 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.
     1543. 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.
    158155
    159156= Does *AI for SEO* support multi-language websites? =
     
    167164
    168165= 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 a page 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.
    170167
    171168= 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. Linked sites share the same credits pool, and you can export/import settings between them. Works with Multisite and staging.
     169Yes. 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.
    173170
    174171= I’m an agency with multiple client websites. How do I set things up? =
    1751721. 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
    1761732. 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.
     1743. Install the *AI for SEO* plugin on each client website you manage. Go to *AI for SEO* > Account on each website.
     1754. Enter the **same license owner + key** to link them to the same account. Linked websites share the same subscription and Credits pool.
    179176
    180177= Does *AI for SEO* collect or store my content? =
     
    187184Currently, 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).
    188185
    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? =
     187It 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.
    193188
    194189= Can you add feature x, y or z to the plugin? =
     
    197192
    198193== Changelog ==
     194
     195= 2.2.4 =
     196* Bug Fixes & Maintenance: Fixed 5 minor bugs and implemented 3 usability improvements.
    199197
    200198= 2.2.3 =
Note: See TracChangeset for help on using the changeset viewer.