'omni-moderation-latest', 'input' => array( array( 'type' => 'image_url', 'image_url' => array('url' => $image_url), ), ), ); $args = array( 'headers' => array( 'Content-Type' => 'application/json', 'Authorization' => 'Bearer ' . $api_key, ), 'body' => wp_json_encode($data), 'timeout' => 60, ); $response = wp_remote_post($endpoint, $args); if (is_wp_error($response)) { // For graceful failure, return an empty array return array('error' => $response->get_error_message()); } $body = wp_remote_retrieve_body($response); $result = json_decode($body, true); if (isset($result['results'][0])) { return $result['results'][0]; } else { // Invalid response; return an empty array return array(); } } // Display admin notice if an upload was flagged and removed add_action('admin_notices', 'oai_flagged_upload_admin_notice'); function oai_flagged_upload_admin_notice() { if ($message = get_transient('oai_flagged_upload_notice')) { echo '

' . esc_html($message) . '

'; } } /** * Comments Moderation */ // Moderate comments before saving add_filter('preprocess_comment', 'oai_moderate_comment'); function oai_moderate_comment($commentdata) { $api_key = get_option('oai_api_key'); if (!$api_key) { return $commentdata; // If API key not set, let the comment pass } $comment_content = $commentdata['comment_content']; // Moderate the comment text $result = oai_moderate_text($comment_content); if (isset($result['error'])) { // Handle error (optional: log the error) // For graceful failure, let the comment pass return $commentdata; } // Store the moderation result in a global variable indexed by comment content hash $hash = md5($comment_content); global $oai_moderation_results; $oai_moderation_results[$hash] = $result; return $commentdata; } // Set the comment approval status based on moderation result add_filter('pre_comment_approved', 'oai_set_comment_approval_status', 10, 2); function oai_set_comment_approval_status($approved, $commentdata) { $api_key = get_option('oai_api_key'); if (!$api_key) { return $approved; // Let the comment pass if API key not set } $comment_content = $commentdata['comment_content']; $hash = md5($comment_content); global $oai_moderation_results; if (isset($oai_moderation_results[$hash])) { $result = $oai_moderation_results[$hash]; if ($result['flagged']) { // Set comment to unapproved return '0'; // Unapproved } } return $approved; } // Save the moderation result after the comment is inserted add_action('comment_post', 'oai_save_comment_moderation_meta', 10, 2); function oai_save_comment_moderation_meta($comment_ID, $comment_approved) { $comment = get_comment($comment_ID); $comment_content = $comment->comment_content; $hash = md5($comment_content); global $oai_moderation_results; if (isset($oai_moderation_results[$hash])) { $result = $oai_moderation_results[$hash]; update_comment_meta($comment_ID, '_oai_moderation_result', $result); update_comment_meta($comment_ID, '_oai_moderation_flagged', $result['flagged'] ? 'pending' : 'ok'); // Remove from global variable unset($oai_moderation_results[$hash]); } } function oai_moderate_text($text) { $api_key = get_option('oai_api_key'); if (!$api_key) { // API key not set; skip moderation return array(); // Return an empty array indicating no moderation } $endpoint = 'https://api.openai.com/v1/moderations'; $data = array( 'model' => 'omni-moderation-latest', 'input' => array( array( 'type' => 'text', 'text' => $text, ), ), ); $args = array( 'headers' => array( 'Content-Type' => 'application/json', 'Authorization' => 'Bearer ' . $api_key, ), 'body' => wp_json_encode($data), 'timeout' => 60, ); $response = wp_remote_post($endpoint, $args); if (is_wp_error($response)) { // For graceful failure, return an empty array return array('error' => $response->get_error_message()); } $body = wp_remote_retrieve_body($response); $result = json_decode($body, true); if (isset($result['results'][0])) { return $result['results'][0]; } else { // Invalid response; return an empty array return array(); } } /** * Anonymizer Functionality */ // Hook into 'wp_handle_upload_prefilter' to anonymize filenames if enabled add_filter('wp_handle_upload_prefilter', 'oai_anonymize_filename'); function oai_anonymize_filename($file) { // Check if anonymizer is enabled $anonymizer_enabled = get_option('oai_enable_anonymizer', false); if (!$anonymizer_enabled) { return $file; } // Get the file extension $file_info = pathinfo($file['name']); $extension = isset($file_info['extension']) ? '.' . strtolower($file_info['extension']) : ''; // Generate a unique 10-digit filename $new_filename = oai_generate_unique_filename($extension); // Replace the original filename with the new anonymized filename $file['name'] = $new_filename; return $file; } function oai_generate_unique_filename($extension) { $upload_dir = wp_upload_dir(); $base_dir = trailingslashit($upload_dir['basedir']); do { // Generate a random number between 0000000000 and 9999999999 $random_number = str_pad(mt_rand(0, 9999999999), 10, '0', STR_PAD_LEFT); $new_filename = $random_number . $extension; $file_path = $base_dir . $new_filename; } while (file_exists($file_path)); return $new_filename; } /** * Admin Columns for Media and Comments */ // Add a custom column to the media library add_filter('manage_media_columns', 'oai_add_media_column'); function oai_add_media_column($columns) { $columns['oai_moderation'] = __('Moderation', 'antisocial-safety'); return $columns; } add_action('manage_media_custom_column', 'oai_media_column_content', 10, 2); function oai_media_column_content($column_name, $post_ID) { if ($column_name == 'oai_moderation') { $moderation_result = get_post_meta($post_ID, '_oai_moderation_result', true); $flagged = get_post_meta($post_ID, '_oai_moderation_flagged', true); if ($flagged) { echo '' . __('Flagged', 'antisocial-safety') . ''; } else { echo '' . __('OK', 'antisocial-safety') . ''; } } } // Add a custom column to the comments list add_filter('manage_edit-comments_columns', 'oai_add_comments_column'); function oai_add_comments_column($columns) { $columns['oai_moderation'] = __('Moderation', 'antisocial-safety'); return $columns; } add_action('manage_comments_custom_column', 'oai_comments_column_content', 10, 2); function oai_comments_column_content($column_name, $comment_ID) { if ($column_name == 'oai_moderation') { $flagged = get_comment_meta($comment_ID, '_oai_moderation_flagged', true); if ($flagged === 'pending') { echo '' . __('Pending Approval', 'antisocial-safety') . ''; } elseif ($flagged === 'flagged') { echo '' . __('Flagged', 'antisocial-safety') . ''; } else { echo '' . __('OK', 'antisocial-safety') . ''; } } } /** * Display Moderation Details in Admin Screens */ // Add moderation info to the attachment edit screen add_filter('attachment_fields_to_edit', 'oai_attachment_fields', 10, 2); function oai_attachment_fields($form_fields, $post) { $api_key = get_option('oai_api_key'); if (!$api_key) { // API key not set; do not display moderation fields return $form_fields; } $flagged = get_post_meta($post->ID, '_oai_moderation_flagged', true); $moderation_result = get_post_meta($post->ID, '_oai_moderation_result', true); if ($flagged) { $form_fields['oai_moderation'] = array( 'label' => __('OpenAI Moderation', 'antisocial-safety'), 'input' => 'html', 'html' => '' . __('This attachment was flagged by OpenAI Moderation and has been removed.', 'antisocial-safety') . '', 'helps' => __('Flagged content is blocked from being served to users.', 'antisocial-safety'), ); } else { $form_fields['oai_moderation'] = array( 'label' => __('OpenAI Moderation', 'antisocial-safety'), 'input' => 'html', 'html' => '' . __('This attachment passed OpenAI Moderation.', 'antisocial-safety') . '', ); } if ($moderation_result) { $form_fields['oai_moderation_result'] = array( 'label' => __('Moderation Details', 'antisocial-safety'), 'input' => 'html', 'html' => '
' . esc_html(print_r($moderation_result, true)) . '
', ); } return $form_fields; } // Add a meta box to the comment edit screen for moderation details add_action('add_meta_boxes_comment', 'oai_add_comment_meta_box'); function oai_add_comment_meta_box() { add_meta_box( 'oai_comment_moderation', __('OpenAI Moderation Details', 'antisocial-safety'), 'oai_comment_moderation_meta_box', 'comment', 'normal', 'high' ); } function oai_comment_moderation_meta_box($comment) { $api_key = get_option('oai_api_key'); if (!$api_key) { // API key not set; do not display moderation details return; } $moderation_result = get_comment_meta($comment->comment_ID, '_oai_moderation_result', true); $flagged = get_comment_meta($comment->comment_ID, '_oai_moderation_flagged', true); if ($flagged) { echo '

' . __('Status:', 'antisocial-safety') . ' '; if ($flagged === 'pending') { echo '' . __('Pending Approval', 'antisocial-safety') . ''; } elseif ($flagged === 'flagged') { echo '' . __('Flagged', 'antisocial-safety') . ''; } echo '

'; if ($moderation_result) { echo '

' . __('Moderation Details', 'antisocial-safety') . '

'; echo '
' . esc_html(print_r($moderation_result, true)) . '
'; } } else { echo '

' . __('This comment passed OpenAI Moderation.', 'antisocial-safety') . '

'; } } /** * Settings Page */ // Add settings page under Settings menu add_action('admin_menu', 'oai_add_admin_menu'); function oai_add_admin_menu() { add_options_page( __('OpenAI Moderation', 'antisocial-safety'), __('OpenAI Moderation', 'antisocial-safety'), 'manage_options', 'openai-moderation', 'oai_options_page' ); } function oai_options_page() { ?>

' . esc_html__('Enter your OpenAI API key to enable moderation. You can also toggle the filename anonymizer below.', 'antisocial-safety') . '

'; } function oai_api_key_render() { $api_key = get_option('oai_api_key'); ?> /> id !== 'settings_page_openai-moderation') { return; } $api_key = get_option('oai_api_key'); if (!$api_key) { echo '

' . __('OpenAI API key is not set. Moderation features are disabled until you enter a valid API key.', 'antisocial-safety') . '

'; } }