'; const TCOLUMN_CLOSE = ''; const LI_CLOSE = ''; const LI_START = '
  • '; const SPAM_URL_SHORTNERS = '/spam/url-shortners'; const SPAM_EXPLOIT_URLS = '/spam/exploit-urls'; const CHECKED = 'checked="checked"'; const ONE_ENTRY_PER_LINE = 'one entry per line'; public function __construct() { add_action( 'admin_enqueue_scripts', array( $this, 'admin_styles' ) ); add_action( 'wp_ajax_oc_get_summary', array( $this, 'oc_get_spam_summary' ) ); add_action( 'wp_ajax_nopriv_oc_get_summary', array( $this, 'oc_get_spam_summary' ) ); add_action( 'wp_ajax_oc_save_settings', array( $this, 'oc_save_settings' ) ); add_action( 'wp_ajax_nopriv_oc_save_settings', array( $this, 'oc_save_settings' ) ); add_action( 'wp_ajax_oc_save_advanced_settings', array( $this, 'oc_save_advanced_settings' ) ); add_action( 'wp_ajax_nopriv_oc_save_advanced_settings', array( $this, 'oc_save_advanced_settings' ) ); add_action( 'wp_ajax_oc_check_spam_diagnostics', array( $this, 'oc_check_spam_diagnostics' ) ); add_action( 'wp_ajax_nopriv_oc_check_spam_diagnostics', array( $this, 'oc_check_spam_diagnostics' ) ); add_action( 'wp_ajax_oc_clear_spam_logs', array( $this, 'oc_clear_spam_logs' ) ); add_action( 'wp_ajax_nopriv_oc_clear_spam_logs', array( $this, 'oc_clear_spam_logs' ) ); add_action( 'init', array( $this, 'ocsp_wp_load_textdomain' ), -1 ); $this->sp_protection_options = oc_get_sp_options( 'onecom_sp_protect_options' ); $this->oc_auto_clear_logs(); } // load text domain for language translation public function ocsp_wp_load_textdomain() { $current_locale = get_locale(); $locales_with_translation = array( 'da_DK', 'de_DE', 'es_ES', 'fr_FR', 'it_IT', 'pt_PT', 'nl_NL', 'sv_SE', ); // Locales fallback and load english translations [as] if selected unsupported language in WP-Admin if ( $current_locale === 'fi' ) { load_textdomain( 'onecom-sp', ONECOM_PLUGIN_PATH . '/languages/onecom-sp-fi_FI.mo' ); } elseif ( $current_locale === 'nb_NO' ) { load_textdomain( 'onecom-sp', ONECOM_PLUGIN_PATH . '/languages/onecom-sp-no_NO.mo' ); } elseif ( in_array( get_locale(), $locales_with_translation ) ) { load_plugin_textdomain( 'onecom-sp', false, ONECOM_SP_PLUGIN_SLUG . '/languages' ); } else { load_textdomain( 'onecom-sp', ONECOM_PLUGIN_PATH . '/languages/onecom-sp-en_GB.mo' ); } } /** * For enqueuing CSS & JS only on the required pages. */ public function admin_styles() { $screen = get_current_screen(); $screen_id = $screen ? $screen->id : ''; $bodylist = array( __( 'Protects the website from spam comments, spam registration, spambots, and other spammers.', 'onecom-sp' ), __( 'Customizable protection settings, spam logs, and other options.', 'onecom-sp' ), ); $popupContent = array( 'title' => sprintf( __( 'Get Spam Protection plugin with %s Managed WordPress', 'onecom-sp' ), "\n" ), 'top-desc' => __( 'Spend less time worrying about your site’s safety and more time growing your business with one.com Managed WordPress.', 'onecom-sp' ), 'footer-desc' => __( 'Managed WordPress includes other great features such as Vulnerability Monitor and Upgrade Manager', 'onecom-sp' ), 'bodylist' => $bodylist, ); if ( SCRIPT_DEBUG || SCRIPT_DEBUG == 'true' ) { $folder = ''; $extenstion = ''; } else { $folder = 'min-'; $extenstion = '.min'; } $script_path = ONECOM_SP_WP_URL . '/assets/'; wp_register_style( 'onecom_sp_admin_styles', $script_path . $folder . 'css/admin' . $extenstion . '.css', array(), ONECOM_SP_VERSION ); wp_register_script( 'onecom_sp_admin_script', $script_path . $folder . 'js/oc-sp-admin' . $extenstion . '.js', array(), ONECOM_SP_VERSION ); if ( in_array( $screen_id, $this->onecom_sp_allowed_screens() ) ) { wp_enqueue_style( 'onecom_sp_admin_styles' ); } if ( in_array( $screen_id, $this->onecom_sp_allowed_screens() ) ) { wp_enqueue_script( 'onecom_sp_admin_script' ); wp_localize_script( 'onecom_sp_admin_script', 'onespnotice', array( 'oc_notice' => __( 'All the fields can\'t be left empty at least one input is required for diagnosis.', 'onecom-sp' ), 'popupContent' => $popupContent, 'generic_validation_msg' => __( "The input doesn't match the allowed format for this field. Please check and try again.", 'onecom-sp' ), 'failed_login_validation_msg' => __( 'The number of failed login attempts must be between 1-10. The time in seconds should have a value between 10 and 900. Please check the numbers you entered and try again.', 'onecom-sp' ), ) ); } } /** * @return mixed * returns USER IP */ public function get_user_ip() { $ip = $_SERVER['REMOTE_ADDR'] ?? ''; $sp_options = $this->sp_protection_options; if ( isset( $sp_options['checks']['oc_spwhitelistip'] ) && $sp_options['checks']['oc_spwhitelistip'] == 'true' && isset( $sp_options['whitelist_ips'] ) && is_array( $sp_options['whitelist_ips'] ) && in_array( $ip, $sp_options['whitelist_ips'] ) ) { $ip = ''; } return $ip; } /** * @return mixed|null * returns user agent */ public function oc_get_user_agent() { if ( array_key_exists( 'HTTP_USER_AGENT', $_SERVER ) ) { return $_SERVER['HTTP_USER_AGENT']; } return null; } /** * @param $page_title * @param $description * This generates the header for admin pages of plugin. */ public static function sp_admin_head( $page_title, $description ) { $html = ''; $html = '

    ' . $page_title . '

    '; return $html; } /** * @return string[] * returns array of protect options */ public static function sp_protect_options() { $protect_options = array( 'oc_sp_accept', 'oc_sp_referrer', 'oc_sp_long', 'oc_sp_short', 'oc_sp_bbcode', 'oc_sp_exploit', 'oc_sp_urlshort', ); return $protect_options; } /** * @return array[] * list of screens where resources should be enqueued */ public function onecom_sp_allowed_screens(): array { return array( 'toplevel_page_onecom-wp-spam-protection', 'toplevel_page_onecom-wp-spam-protection-network', 'spam-protection_page_onecom-wp-protection-settings', 'spam-protection_page_onecom-wp-advanced-settings', 'spam-protection_page_onecom-wp-spam-logs', 'spam-protection_page_onecom-wp-spam-diagnostics', ); } /** * @param $ip * @param $email * @param null $user_agent * @param null $username * @return array|mixed * * Interacts with WP API endpoint and returns the response received */ public function sp_api_check( $ip, $email, $user_agent = null, $username = null ) { //check for whitelisted user agents $user_agent = $this->oc_get_whitelisted_useragents( $user_agent ); //check for the whitelisted users $username = $this->oc_get_whitelisted_users( $username ); $payload = array( 'user_ip' => $ip, 'user_agent' => $user_agent, 'user_email' => $email, 'username' => $username, ); $curl = curl_init(); curl_setopt_array( $curl, array( CURLOPT_URL => MIDDLEWARE_URL . '/spam/check', CURLOPT_RETURNTRANSFER => true, CURLOPT_VERBOSE => false, CURLOPT_TIMEOUT => 0, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => 'POST', CURLOPT_POSTFIELDS => json_encode( $payload ), CURLOPT_HTTPHEADER => array( 'Content-Type: text/plain', ), ) ); // silent call $response = curl_exec( $curl ); $response = json_decode( $response, true ); $err = curl_error( $curl ); // Close request to clear up some resources curl_close( $curl ); if ( $err ) { return array( 'data' => null, 'error' => __( 'Some error occurred, please reload the page and try again.', 'validator' ), 'success' => false, ); } elseif ( ! $response['success'] ) { return $response; } else { return $response['data']; } } /** * @return mixed|string * * Gets the URI of current page for logging in the spam logs */ public static function oc_get_spam_url() { // gets the module name from the URL address line $spam_url = ''; if ( isset( $_SERVER['REQUEST_URI'] ) ) { $spam_url = $_SERVER['REQUEST_URI']; } if ( empty( $spam_url ) && isset( $_SERVER['REQUEST_URI'] ) ) { $spam_url = $_SERVER['SCRIPT_NAME']; if ( isset( $_SERVER['QUERY_STRING'] ) ) { $_SERVER['REQUEST_URI'] .= '?' . $_SERVER['QUERY_STRING']; } } if ( empty( $spam_url ) ) { $spam_url = ''; } return $spam_url; } /** * @param $url * @param array $existing_options * @return array|mixed * * gets the list from WP API endpoints for exploit-urls & url-shorteners */ public static function oc_get_values_from_api( $url, $existing_options = array() ) { global $wp_version; $fetch_list = $url; $args = array( 'timeout' => 5, ); $response = wp_remote_get( $fetch_list, $args ); $get_list = array(); if ( ! is_wp_error( $response && is_array( $response ) ) ) { $body = wp_remote_retrieve_body( $response ); $body = json_decode( $body ); if ( ! empty( $body ) && $body->success ) { $get_list = $body->data; } else { error_log( print_r( $body, true ) ); } } else { $errorMessage = '(' . wp_remote_retrieve_response_code( $response ) . ') ' . wp_remote_retrieve_response_message( $response ); error_log( print_r( $errorMessage, true ) ); } if ( ! empty( $get_list ) && ! empty( $existing_options ) ) { //moved here to avoid recursion in case of restore plugin data $sp_options = oc_get_sp_options( 'onecom_sp_protect_options' ); $sp_options = array_values( array_unique( array_merge( $get_list, $existing_options ) ) ); } elseif ( ! empty( $get_list ) && empty( $existing_options ) ) { $sp_options = $get_list; } return $sp_options; } /** * callback for the ajax request of spam summary block filter */ public function oc_get_spam_summary() { $duration = $_POST['duration']; $spam_logs = oc_get_sp_options( 'onecom_sp_spam_logs' ); $sorted = $this->oc_get_sorted_list( strtotime( "-$duration" ), current_time( 'timestamp' ), $spam_logs['records'], 'summary' ); if ( is_array( $sorted ) && ! empty( $sorted ) ) { $comments = array(); $registration = array(); $failed_login = array(); $other = array(); foreach ( $sorted as $record ) { if ( strpos( $record[3], 'wp-comments-post.php' ) !== false ) { $comments[] = $record[3]; unset( $record[3] ); } elseif ( strpos( $record[3], 'action=register' ) !== false ) { $registration[] = $record[3]; unset( $record[3] ); } elseif ( strcmp( '/wp-login.php', $record[3] ) == 0 ) { $failed_login[] = $record[3]; unset( $record[3] ); } else { $other[] = $record[3]; } } $response = array( 'total_count' => count( $sorted ), 'comments_count' => count( $comments ), 'registration_count' => count( $registration ), 'failed_login' => count( $failed_login ), 'other_count' => count( $other ), ); } else { $response = array( 'total_count' => 0, 'comments_count' => 0, 'registration_count' => 0, 'failed_login' => 0, 'other_count' => 0, ); } wp_send_json_success( $response ); return false; } /** * @param $check_type * @param $check_array * @return string * * generates the table for spam diagnostics page based on check type & input array */ public function oc_generate_table( $check_type, $check_array ) { $html = ''; $class = ''; $html .= ""; $html .= ''; $html .= ''; if ( $check_type !== 'website-check' ) { if ( $check_array['status'] ) { $class = 'oc-sp-error'; } $html .= '"; $html .= ''; } else { $spam_detected = array(); $disabled_settings = array(); foreach ( $check_array as $check => $value ) { if ( ! $value['result'] ) { $result = ''; } else { $spam_detected[ $check ] = $value['result']; $result = $value['result']; } if ( $value['status'] !== 'true' ) { $status = 'oc-sp-warning'; $disabled_settings[] = $check; } else { $status = 'oc-sp-success'; } $html .= '"; } $final_result = $this->oc_get_final_dg_status( $spam_detected ); $settings_disabled = $this->oc_get_web_settings_msg( $disabled_settings ); $html .= ''; $html .= ""; } $html .= '
    ' . __( 'Check', 'onecom-sp' ) . self::THEAD_CLOSE; $html .= '' . __( 'Result', OC_SP_TEXTDOMAIN ) . self::THEAD_CLOSE; $html .= $this->oc_get_dynamic_th( $check_type ); $html .= '
    ' . __( 'one.com spam detection' ) . self::TCOLUMN_CLOSE; $html .= "' . $check_array['reason'] . '
    ' . __( $value['description'], OC_SP_TEXTDOMAIN ) . self::TCOLUMN_CLOSE; $html .= '' . $result . self::TCOLUMN_CLOSE; $html .= "
    ' . __( 'Final Result', OC_SP_TEXTDOMAIN ) . ' " . $final_result['final_result'] . " $settings_disabled
    '; $html .= $this->oc_get_table_description( $check_type ); return $html; } /** * @param $check_type * @return string * returns the table header based on the type of check */ public function oc_get_dynamic_th( $check_type ) { if ( $check_type !== 'website-check' ) { return '' . __( 'Reason', OC_SP_TEXTDOMAIN ) . self::THEAD_CLOSE; } else { return '' . __( 'Protection Setting', OC_SP_TEXTDOMAIN ) . self::THEAD_CLOSE; } } /** * @param $disabled_settings * @return string * returns final message for the protection settings column in diagnostics table */ public function oc_get_web_settings_msg( $disabled_settings ) { if ( ! empty( $disabled_settings ) ) { $settings_disabled = '

    ' . __( 'It is recommended to use default settings of plugin in case you are seeing spams not getting blocked effectively.', OC_SP_TEXTDOMAIN ) . '

    '; } else { $settings_disabled = ''; } return $settings_disabled; } /** * @param $spam_detected * @return array * returns final status for the checks column in diagnostics table */ public function oc_get_final_dg_status( $spam_detected ) { $result = array(); if ( ! empty( $spam_detected ) ) { $result['final_result'] = __( 'The details provided by you are detected as spam', OC_SP_TEXTDOMAIN ); $result['border'] = 'border-spam'; } else { $result['final_result'] = __( 'No spam Detected', OC_SP_TEXTDOMAIN ); $result['border'] = 'border-nospam'; } return $result; } /** * @return bool * auto clears spam logs stored in the wp_options table. * if the records exceed 500 or the logs are older than 30 days. */ public function oc_auto_clear_logs() { $spam_logs = oc_get_sp_options( 'onecom_sp_spam_logs' ); $spam_count = 0; $additional_info = array( 'additional_info' => json_encode( array( 'logs_cleared_by' => 'auto_cleared', 'blocked_spams' => $spam_logs['spam_count'] ?? '', ) ), ); if ( $spam_logs && isset( $spam_logs['records'] ) && ! empty( $spam_logs['records'] ) ) { $spam_count = count( $spam_logs['records'] ); $sorted = $this->oc_get_sorted_list( strtotime( '-30 days' ), current_time( 'timestamp' ), $spam_logs['records'], 'clearLog' ); } if ( $spam_count >= 500 ) { $spam_logs['records'] = array_slice( $spam_logs['records'], 500 ); $spam_logs['spam_count'] = count( $spam_logs['records'] ); } elseif ( ! empty( $sorted ) ) { foreach ( $sorted as $key => $value ) { unset( $spam_logs['records'][ $key ] ); } $spam_logs['spam_count'] = count( $spam_logs['records'] ); } else { return false; } ( class_exists( 'OCPushStats' ) ? \OCPushStats::push_stats_performance_cache( 'delete', 'setting', 'logs', ONECOM_SP_PLUGIN_SLUG, $additional_info ) : '' ); oc_save_sp_options( $spam_logs, 'onecom_sp_spam_logs' ); } /** * @param $start_date * @param $end_date * @param $unsorted_arr * @param $case * @return array * * generates a sorted array based on start & end dates. */ public function oc_get_sorted_list( $start_date, $end_date, $unsorted_arr, $case ) { $sorted = array(); if ( is_array( $unsorted_arr ) ) { if ( $case == 'clearLog' ) { foreach ( $unsorted_arr as $date => $value ) { if ( strtotime( $date ) <= $start_date ) { $sorted[ $date ] = $value; } elseif ( strtotime( $date ) > $end_date ) { break; } } } elseif ( $case == 'summary' ) { foreach ( $unsorted_arr as $date => $value ) { if ( strtotime( $date ) >= $start_date ) { $sorted[ $date ] = $value; } elseif ( strtotime( $date ) > $end_date ) { break; } } } } return $sorted; } /** * @param $check * @return string * generates the description which appears before table on spam diagnostics page. */ public function oc_get_table_description( $check ) { $desc = ''; $desc .= "

    " . __( 'The diagnostics table consists of:', OC_SP_TEXTDOMAIN ) . '

    '; $desc .= ''; } return $desc; } /** * @param $user_agent * @return mixed|string * checks for the provided useragents against the whitelisted user agents */ public function oc_get_whitelisted_useragents( $user_agent ) { if ( isset( $this->sp_protection_options['whitelist_agents'] ) && ! empty( $this->sp_protection_options['whitelist_agents'] && $this->sp_protection_options['checks']['oc_spbadusragent'] ) == 'true' ) { foreach ( $this->sp_protection_options['whitelist_agents'] as $agent ) { if ( stripos( $user_agent, $agent ) !== false ) { $user_agent = ''; break; } } } return $user_agent; } /** * @param $username * @return mixed|string * checks for the username provided against the registered and white listed user names. */ public function oc_get_whitelisted_users( $username ) { $whitelisted_users = array(); $wp_reg_users = get_users( array( 'fields' => array( 'user_login' ) ) ); foreach ( $wp_reg_users as $user ) { $whitelisted_users[] = $user->user_login; } if ( isset( $this->sp_protection_options['whitelist_usernames'] ) && ! empty( $this->sp_protection_options['whitelist_usernames'] ) && ( $this->sp_protection_options['checks']['oc_sp_whitelistuser'] == 'true' ) ) { foreach ( $this->sp_protection_options['whitelist_usernames'] as $user_name ) { $whitelisted_users[] = $user_name; } } foreach ( $whitelisted_users as $whitelisted_user ) { if ( strcasecmp( $whitelisted_user, $username ) == 0 ) { $username = ''; break; } } return $username; } /** * @param string $type * @return string * returns the submit button for settings page */ public function oc_generate_submit_button( $type = 'regular' ) { if ( $type == 'regular' ) { return ''; } elseif ( $type == 'float' ) { return ''; } else { return ''; } } public function oc_save_settings() { if ( ! empty( $_POST ) && isset( $_POST['checks']['one_sp_nonce'] ) && wp_verify_nonce( $_POST['checks']['one_sp_nonce'], 'one_sp_nonce' ) ) { $sp_options = oc_get_sp_options( 'onecom_sp_protect_options' ); unset( $_POST['action'] ); unset( $_POST['one_sp_nonce'] ); $merged_options = array_replace_recursive( $sp_options, $_POST ); unset( $merged_options['checks']['one_sp_nonce'] ); $additional_info = array( 'settings_status' => json_encode( $merged_options['checks'] ) ); oc_save_sp_options( $merged_options, 'onecom_sp_protect_options' ); ( class_exists( 'OCPushStats' ) ? \OCPushStats::push_stats_performance_cache( 'save', 'setting', 'setting', ONECOM_SP_PLUGIN_SLUG, $additional_info ) : '' ); wp_send_json_success( __( 'Protection settings updated!' ) ); return false; } wp_send_json_error(); } public function oc_save_advanced_settings() { if ( ! empty( $_POST ) && isset( $_POST['one_sp_nonce'] ) && wp_verify_nonce( $_POST['one_sp_nonce'], 'one_sp_nonce' ) ) { $sp_options = oc_get_sp_options( 'onecom_sp_protect_options' ); unset( $_POST['action'] ); unset( $_POST['one_sp_nonce'] ); $advance_options = array( 'oc_spbadusragent', 'oc_sp_urlshort', 'oc_sp_proburl', 'oc_sp_whitelistuser', 'oc_spwhitelistip', ); foreach ( $advance_options as $option ) { $option_val = 'false'; if ( array_key_exists( $option, $_POST ) ) { $option_val = $_POST[ $option ]; } $sp_options['checks'][ $option ] = $option_val; } $sp_options['whitelist_usernames'] = $this->oc_sanitise_options( 'whitelist_usernames', $_POST, 'whitelist_usernames', $sp_options ); $sp_options['whitelist_ips'] = $this->oc_sanitise_options( 'whitelist_ips', $_POST, 'whitelist_ips', $sp_options ); $sp_options['exploit-urls'] = $this->oc_sanitise_options( 'exploit_urls', $_POST, 'exploit-urls', $sp_options ); $sp_options['url-shortners'] = $this->oc_sanitise_options( 'url_shorteners', $_POST, 'url-shortners', $sp_options ); $sp_options['whitelist_agents'] = $this->oc_sanitise_options( 'whitelist_agents', $_POST, 'whitelist_agents', $sp_options ); oc_save_sp_options( $sp_options, 'onecom_sp_protect_options' ); wp_send_json_success( __( 'Advanced settings updated!' ) ); return false; } wp_send_json_error(); } public function oc_sanitise_options( $post_variable, $post_array, $option_name, $sp_options ) { if ( array_key_exists( $post_variable, $post_array ) && is_array( $post_array[ $post_variable ] ) ) { $option_list = array(); foreach ( $post_array[ $post_variable ] as $variable ) { $variable = trim( stripslashes( $variable ) ); if ( ! empty( $variable ) ) { $option_list[] = $variable; } } return $option_list; } elseif ( array_key_exists( $post_variable, $post_array ) && ! is_array( $post_array[ $post_variable ] ) ) { return array(); } elseif ( isset( $sp_options[ $option_name ] ) ) { return $sp_options[ $option_name ]; } else { return array(); } } public function oc_check_spam_diagnostics() { if ( ! empty( $_POST ) && isset( $_POST['one_sp_nonce'] ) && wp_verify_nonce( $_POST['one_sp_nonce'], 'one_sp_nonce' ) ) { $user_ip = isset( $_POST['oc_validate_ip'] ) ? $_POST['oc_validate_ip'] : ''; $user_name = isset( $_POST['oc_validate_user'] ) ? $_POST['oc_validate_user'] : ''; $user_email = isset( $_POST['oc_validate_email'] ) ? $_POST['oc_validate_email'] : ''; $user_agent = isset( $_POST['oc_validate_user_agent'] ) ? $_POST['oc_validate_user_agent'] : ''; $user_content = isset( $_POST['oc_validate_content'] ) ? $_POST['oc_validate_content'] : ''; if ( strlen( $user_email ) > 80 ) { $user_email = substr( $user_email, 0, 77 ) . '...'; } if ( strlen( $user_name ) > 80 ) { $user_name = substr( $user_name, 0, 77 ) . '...'; } $api_check = $this->sp_api_check( $user_ip, $user_email, $user_agent, '' ); $api_check_result = array(); if ( isset( $api_check['is_spam'] ) && $api_check['is_spam'] ) { $api_check_result['status'] = $api_check['is_spam']; $api_check_result['reason'] = $api_check['reason']; $table = $this->oc_generate_table( 'api-check', $api_check_result ); } elseif ( isset( $api_check['is_spam'] ) && ! $api_check['is_spam'] ) { $web = new OnecomSpWebsiteCheck(); $oc_post = array( 'email' => $user_email, 'author' => $user_name, 'comment' => $user_content, ); $webiste_check = $web->oc_sp_diagnostics( $user_ip, $oc_post ); $table = $this->oc_generate_table( 'website-check', $webiste_check ); } if ( $table && $table !== '' ) { wp_send_json_success( $table ); return false; } } wp_send_json_error(); return false; } public function oc_clear_spam_logs() { if ( isset( $_POST['one_sp_nonce'] ) && wp_verify_nonce( $_POST['one_sp_nonce'], 'one_sp_nonce' ) ) { $spam = oc_get_sp_options( 'onecom_sp_spam_logs' ); $additional_info = array( 'additional_info' => json_encode( array( 'logs_cleared_by' => 'manually_cleared', 'blocked_spams' => $spam['spam_count'] ?? '', ) ), ); ( class_exists( 'OCPushStats' ) ? \OCPushStats::push_stats_performance_cache( 'delete', 'setting', 'logs', ONECOM_SP_PLUGIN_SLUG, $additional_info ) : '' ); $spam['records'] = array(); $spam['spam_count'] = 0; oc_save_sp_options( $spam, 'onecom_sp_spam_logs' ); wp_send_json_success( '

    ' . __( 'No logs found!', OC_SP_TEXTDOMAIN ) . '

    ' ); return false; } wp_send_json_error(); } }