admin_url('admin-ajax.php'),
'nonce' => wp_create_nonce('aiit_general_nonce')
);
wp_localize_script('aiit_admin_script', 'aiit_ajax', $translation_array);
wp_enqueue_script( 'aiit_admin_script' );
}
if ('ai-image-seo-toolkit_page_ai-image-seo-toolkit-tuning' === $hook) {
wp_register_script('aiit_tuning_script', plugins_url('../js/aiit-tuning.js', __FILE__), null, true);
$translation_array = array(
'ajax_url' => admin_url('admin-ajax.php'),
'nonce' => wp_create_nonce('aiit_tuning_nonce')
);
wp_localize_script('aiit_tuning_script', 'aiit_ajax', $translation_array);
wp_enqueue_script( 'aiit_tuning_script' );
}
if ('ai-image-seo-toolkit_page_ai-image-seo-toolkit-bulk-optimization' === $hook) {
wp_register_script('aiit_bulk_script', plugins_url('../js/aiit-bulk.js', __FILE__), null, true);
$translation_array = array(
'ajax_url' => admin_url('admin-ajax.php'),
'nonce' => wp_create_nonce('aiit_bulk_nonce')
);
wp_localize_script('aiit_bulk_script', 'aiit_ajax', $translation_array);
wp_enqueue_script( 'aiit_bulk_script' );
}
if ('ai-image-seo-toolkit_page_ai-image-seo-toolkit-settings' === $hook) {
wp_register_script('aiit_settings_script', plugins_url('../js/aiit-settings.js', __FILE__), null, true);
$translation_array = array(
'ajax_url' => admin_url('admin-ajax.php'),
'nonce' => wp_create_nonce('aiit_settings_nonce')
);
wp_localize_script('aiit_settings_script', 'aiit_ajax', $translation_array);
wp_enqueue_script( 'aiit_settings_script' );
}
if ('ai-image-seo-toolkit_page_ai-image-seo-toolkit-update-pages' === $hook) {
wp_register_script('aiit_update_script', plugins_url('../js/aiit-update.js', __FILE__), null, true);
$translation_array = array(
'ajax_url' => admin_url('admin-ajax.php'),
'nonce' => wp_create_nonce('aiit_update_nonce')
);
wp_localize_script('aiit_update_script', 'aiit_ajax', $translation_array);
wp_enqueue_script( 'aiit_update_script' );
}
}
## Bulk optimize page ##
function aiit_add_admin_page() {
$menu_icon_url = 'data:image/svg+xml;base64,CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgMjAwIDIwMCI+CiAgICA8cGF0aCBmaWxsPSIjRkZGRkZGIiBkPSJtMTY0LjA3LDE2OS41OWwtMTkuMS0xMDMuNTItMTYuMTQsMi45OGMtMTAuMTMsMS44Ny0xNy42NC05LjIxLTEyLjE2LTE3LjkzbDE3LjQ3LTI3Ljc2TDk3LjAxLDAsMCwxNTQuMTlsMzcuMTMsMjMuMzYsNDguNjUtNzcuMzNjNS43NC05LjEyLDE5LjY5LTYuNDQsMjEuNjQsNC4xNWwxMy41LDczLjE4LDQzLjE0LTcuOTZaIi8+Cjwvc3ZnPgo=';
add_menu_page(
'AI Image SEO Toolkit',
'AI Image SEO Toolkit',
'manage_options',
'ai-image-seo-toolkit',
'',
$menu_icon_url
);
add_submenu_page('ai-image-seo-toolkit', 'Tuning', 'Tuning', 'manage_options', 'ai-image-seo-toolkit-tuning', 'aiit_image_seo_toolkit_tuning_page');
add_submenu_page('ai-image-seo-toolkit', 'Generate image metadata', 'Bulk generation', 'manage_options', 'ai-image-seo-toolkit-bulk-optimization', 'aiit_image_seo_toolkit_bulk_optimization_page');
add_submenu_page('ai-image-seo-toolkit', 'Update pages', 'Update content', 'manage_options', 'ai-image-seo-toolkit-update-pages', 'aiit_image_seo_toolkit_update_pages_page');
add_submenu_page('ai-image-seo-toolkit', 'Settings', 'Settings', 'manage_options', 'ai-image-seo-toolkit-settings', 'aiit_image_seo_toolkit_settings_page');
remove_submenu_page('ai-image-seo-toolkit', 'ai-image-seo-toolkit');
}
## SETTINGS PAGE
function aiit_image_seo_toolkit_settings_page() {
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
if (isset($_POST['aiit_save_settings']) && isset( $_POST['aiit_settings_keys_nonce'] ) && wp_verify_nonce( sanitize_text_field( wp_unslash($_POST['aiit_settings_keys_nonce'])), 'settings_keys' )) {
aiit_save_settings();
} else if (isset($_POST['aiit_save_setting_flags']) && isset( $_POST['aiit_settings_general_nonce'] ) && wp_verify_nonce( sanitize_text_field( wp_unslash($_POST['aiit_settings_general_nonce'])), 'settings_general' )){
aiit_save_setting_flags();
}
}
$key = aiit_k_valid();
$domain = wp_parse_url(get_home_url(), PHP_URL_HOST);
?>
Settings
An AI-powered search engine optimization WordPress plugin that streamlines image text generation by creating smart & SEO-friendly titles, ALTs, captions and descriptions.
This plugin works with OpenAI Vision API technology. Get your OpenAI API key here.
You need an OpenAI account to use the API, which is a paid service. Purchase credits on the OpenAI billing page in advance and control your costs effectively. Typically, optimizing one picture costs between $0.01 and $0.03, depending on the size of the image.
get_results("SELECT * FROM {$wpdb->prefix}aiit_processed_images ORDER BY id DESC LIMIT 100", ARRAY_A);
echo '';
echo '| ID | Image ID | Image name | Status | Reason | Created on |
';
echo '';
foreach ($log_records as $row) {
echo '';
echo '| ' . esc_html($row['id']) . ' | ';
echo '' . esc_html($row['image_id']) . ' | ';
echo '' . esc_html($row['image_name']) . ' | ';
echo '' . esc_html($row['status']) . ' | ';
echo '' . esc_html($row['reason']) . ' | ';
echo '' . esc_html($row['created_on']) . ' | ';
echo '
';
}
echo '
';
wp_die();
} */
## Settings definition ##
function aiit_settings_init() {
register_setting('aiit', 'aiit_openai_api_key');
register_setting('aiit', 'aiit_license_key');
register_setting('aiit_setting_flags', 'aiit_generate_on_upload');
register_setting('aiit_setting_flags', 'aiit_replace_on_save');
register_setting('aiit_setting_flags', 'aiit_generate_title');
register_setting('aiit_setting_flags', 'aiit_generate_caption');
register_setting('aiit_setting_flags', 'aiit_generate_description');
register_setting('aiit_setting_flags', 'aiit_force_seo_title');
register_setting('aiit_setting_flags', 'aiit_force_seo_caption');
register_setting('aiit_setting_flags', 'aiit_force_seo_alt');
aiit_tuning_settings_init();
aiit_bulk_settings_init();
aiit_update_settings_init();
aiit_log_export();
}
function aiit_tuning_settings_init() {
register_setting('aiit_tuning', 'aiit_website_type');
register_setting('aiit_tuning', 'aiit_audience');
register_setting('aiit_tuning', 'aiit_categories');
register_setting('aiit_tuning', 'aiit_language');
register_setting('aiit_tuning', 'aiit_min_width');
register_setting('aiit_tuning', 'aiit_min_height');
register_setting('aiit_prompts', 'aiit_alt_text_prompt');
register_setting('aiit_prompts', 'aiit_title_prompt');
register_setting('aiit_prompts', 'aiit_caption_prompt');
register_setting('aiit_prompts', 'aiit_description_prompt');
}
function aiit_bulk_settings_init() {
register_setting('aiit_bulk', 'aiit_limit_images');
register_setting('aiit_bulk', 'aiit_selection_criteria');
}
function aiit_update_settings_init() {
register_setting('aiit_update', 'aiit_limit_posts');
register_setting('aiit_update', 'aiit_post_type');
}
function aiit_k_valid($key = '', $force = false) {
if (!$key){
$key = get_option('aiit_license_key');
}
$validation = false;
$counter = get_transient('aiit_k_counter');
if (empty($counter) || $force == true){
$endpoint_url = 'https://fingerscrossed.dev/wp-json/fclm/v1/validate';
$version = $GLOBALS['aiit_version'];
$domain = wp_parse_url(get_home_url(), PHP_URL_HOST);
Global $wpdb;
$image_count = wp_cache_get('aiit_k_valid_image_count');
if ($image_count === false) {
$image_count = $wpdb->get_var("SELECT MAX(id) FROM {$wpdb->prefix}aiit_processed_images");
wp_cache_set('aiit_k_valid_image_count', $image_count, '', 1800);
}
$json_data = wp_json_encode(array(
"product" => "ai-image-seo-toolkit",
"domain" => $domain,
"key" => $key,
"version" => $version,
"count" => $image_count
));
$args = array(
'body' => $json_data,
'headers' => array(
'Content-Type' => 'application/json',
),
'timeout' => 15,
'redirection' => 5,
'blocking' => true,
'httpversion' => '1.0',
'sslverify' => true,
'data_format' => 'body',
);
$response = wp_remote_post($endpoint_url, $args);
if (is_wp_error($response)) {
$error_message = $response->get_error_message();
error_log('aiit_k_valid, Something went wrong: ' . print_r($response, true));
} else {
$response_code = wp_remote_retrieve_response_code($response);
if($response_code == 200){
$response_body = wp_remote_retrieve_body($response);
$data = json_decode($response_body, true);
if ($data['key'] == hash('sha256', 'fc' . $key . $domain)){
$validation = true;
} else {
error_log('aiit_k_valid, Something went wrong');
}
}
}
} else {
if (strlen($key) == 24) {
$validation = true;
} else {
error_log('aiit_k_valid, wrong key');
}
}
if ($validation === true){
$counter = empty($counter) ? 1 : $counter + 1;
set_transient('aiit_k_counter', $counter, 1800);
}
return $validation;
}
function aiit_oai_k_valid($key = '', $force = false){
if (!$key){
$key = get_option('aiit_openai_api_key');
}
$validation = false;
$counter = get_transient('aiit_oai_k_counter');
$keyLength = strlen($key);
$found = false;
if ($keyLength > 20) {
$found = true;
}
if ($found) {
if (empty($counter) || $force == true){
$api_url = 'https://api.openai.com/v1/engines';
$args = array(
'headers' => array(
'Authorization' => 'Bearer ' . $key,
'Content-Type' => 'application/json',
),
);
$response = wp_remote_get($api_url, $args);
if (!is_wp_error($response)) {
$body = wp_remote_retrieve_body($response);
$http_code = wp_remote_retrieve_response_code($response);
if ($http_code == 200) {
$validation = true;
}
} else {
// Handle the case where the request failed
$error_message = $response->get_error_message();
error_log('aiit_oai_k_valid, Something went wrong: ' . print_r($error_message, true));
}
} else {
$validation = true;
}
} else {
error_log('The AI key format is not valid.');
}
if ($validation === true){
$counter = empty($counter) ? 1 : $counter + 1;
set_transient('aiit_oai_k_counter', $counter, 1800);
}
return $validation;
}
function aiit_save_settings(){
if(isset( $_POST['aiit_settings_keys_nonce'] ) && wp_verify_nonce( sanitize_text_field( wp_unslash($_POST['aiit_settings_keys_nonce'])), 'settings_keys' )){
$keyOui = sanitize_text_field($_POST['aiit_openai_api_key']);
$key = sanitize_text_field($_POST['aiit_license_key']);
if (aiit_oai_k_valid($keyOui, true)) {
update_option('aiit_openai_api_key', $keyOui);
if (aiit_k_valid($key, true)){
delete_transient('aiit_banner_req');
update_option('aiit_license_key', $key);
update_option('aiit_generate_title', 'on');
update_option('aiit_generate_caption', 'on');
add_settings_error('ai-image-seo-toolkit-settings', 'success', 'Settings saved successfully.', 'updated');
} else if ($key != ""){
add_settings_error('ai-image-seo-toolkit-settings', 'invalid_ai_key', 'Invalid License Key provided.', 'error');
} else {
update_option('aiit_license_key', '');
update_option('aiit_generate_title', '');
update_option('aiit_generate_caption', '');
add_settings_error('ai-image-seo-toolkit-settings', 'success', 'OpenAI API Key saved successfully.', 'updated');
}
} else {
add_settings_error('ai-image-seo-toolkit-settings', 'invalid_ai_key', 'Invalid OpenAI API Key provided.', 'error');
}
} else {
add_settings_error('ai-image-seo-toolkit-settings', 'not_permitted', 'Invalid data provided.', 'error');
}
}
function aiit_save_setting_flags(){
if (isset( $_POST['aiit_settings_general_nonce'] ) && wp_verify_nonce( sanitize_text_field( wp_unslash($_POST['aiit_settings_general_nonce'])), 'settings_general' )){
if (aiit_oai_k_valid()) {
$generate = sanitize_text_field($_POST['aiit_generate_on_upload'] ?? '');
update_option('aiit_generate_on_upload', $generate);
if (aiit_k_valid()) {
$replace = sanitize_text_field($_POST['aiit_replace_on_save'] ?? '');
$generate_title = sanitize_text_field($_POST['generate_titles'] ?? '');
$generate_caption = sanitize_text_field($_POST['generate_captions'] ?? '');
$generate_description = sanitize_text_field($_POST['generate_descriptions'] ?? '');
$force_seo_title = sanitize_text_field($_POST['aiit_force_seo_title'] ?? '');
$force_seo_caption = sanitize_text_field($_POST['aiit_force_seo_caption'] ?? '');
$force_seo_alt = sanitize_text_field($_POST['aiit_force_seo_alt'] ?? '');
update_option('aiit_generate_title', $generate_title);
update_option('aiit_generate_caption', $generate_caption);
update_option('aiit_generate_description', $generate_description);
update_option('aiit_replace_on_save', $replace);
update_option('aiit_force_seo_title', $force_seo_title);
update_option('aiit_force_seo_caption', $force_seo_caption);
update_option('aiit_force_seo_alt', $force_seo_alt);
}
add_settings_error('ai-image-seo-toolkit-settings', 'success', 'Settings saved successfully.', 'updated');
} else {
add_settings_error('ai-image-seo-toolkit-settings', 'invalid_keys', 'Invalid OpenAI API or License Key provided.', 'error');
}
} else {
add_settings_error('ai-image-seo-toolkit-settings', 'not_permitted', 'Invalid data provided.', 'error');
}
}
function aiit_log_export() {
if ($_SERVER['REQUEST_METHOD'] === 'GET') {
if(isset( $_GET['n'] ) && wp_verify_nonce( sanitize_text_field( wp_unslash($_GET['n'])), 'export_xls_file')){
if (isset($_GET['page']) && sanitize_text_field($_GET['page'])=='ai-image-seo-toolkit-settings') {
if (isset($_GET['export']) && sanitize_text_field($_GET['export'])=='log') {
global $wpdb;
$limit = 1000;
$table_data = wp_cache_get('aiit_log_export_log');
if ($table_data === false) {
$table_data = $wpdb->get_results($wpdb->prepare("SELECT * FROM {$wpdb->prefix}aiit_processed_images ORDER BY id DESC LIMIT %d", $limit), ARRAY_A);
wp_cache_set('aiit_log_export_log', $table_data, '', 300);
}
if ( ! function_exists( 'WP_Filesystem' ) ) {
require_once ABSPATH . 'wp-admin/includes/file.php';
}
if ( ! WP_Filesystem() ) {
error_log('Failed to initialize the WordPress Filesystem');
return;
}
global $wp_filesystem;
$csv_data = '';
$csv_data .= implode( ',', array_keys( $table_data[0] ) ) . "\n";
foreach ( $table_data as $row ) {
$csv_data .= implode( ',', $row ) . "\n";
}
$file_name = 'table_export.csv';
$file_path = trailingslashit( WP_CONTENT_DIR ) . $file_name;
if ( ! $wp_filesystem->put_contents( $file_path, $csv_data, FS_CHMOD_FILE ) ) {
error_log('Failed to write to the file');
return;
}
header( 'Content-Type: text/csv' );
header( 'Content-Disposition: attachment; filename="' . $file_name . '"' );
header( 'Pragma: no-cache' );
header( 'Expires: 0' );
$file_contents = $wp_filesystem->get_contents( $file_path );
echo esc_html( $file_contents );
$wp_filesystem->delete( $file_path );
die();
}
}
}
}
}
function aiit_get_banner() {
$req = false;
$product = "ai-image-seo-toolkit";
if (!aiit_k_valid()){
$product .= "-free";
}
//error_log('aiit_get_banner, product: ' . print_r($product, true));
$banner = get_transient('aiit_banner_req');
//error_log('aiit_get_banner, banner: ' . print_r($banner, true));
if (empty($banner)){
$endpoint_url = 'https://fingerscrossed.dev/wp-json/fclm/v1/banner';
$domain = wp_parse_url(get_home_url(), PHP_URL_HOST);
$json_data = wp_json_encode(array(
"product" => $product,
"domain" => $domain
));
$args = array(
'body' => $json_data,
'headers' => array(
'Content-Type' => 'application/json',
),
'timeout' => 15,
'redirection' => 5,
'blocking' => true,
'httpversion' => '1.0',
'sslverify' => true,
'data_format' => 'body',
);
$response = wp_remote_post($endpoint_url, $args);
//error_log('aiit_get_banner, response: ' . print_r($response, true));
if (is_wp_error($response)) {
//something went wrong
} else {
$response_code = wp_remote_retrieve_response_code($response);
if($response_code == 200){
$req = true;
$response_body = wp_remote_retrieve_body($response);
$data = json_decode($response_body, true);
$banner_image_data = wp_remote_get($data['banner'], array('sslverify' => false));
if (!is_wp_error($banner_image_data) && wp_remote_retrieve_response_code($banner_image_data) === 200) {
$image_data = base64_encode(wp_remote_retrieve_body($banner_image_data));
// Set the transient to cache the image data for a specific duration (e.g., 1 day)
set_transient('aiit_banner', $image_data, 1800);
set_transient('aiit_banner_req', 'yes', 1800);
set_transient('aiit_banner_url', $data['url'], 1800);
set_transient('aiit_banner_alt', $data['alt'], 1800);
}
} else {
$req = true;
set_transient('aiit_banner_req', $req, 1800);
}
}
} else {
$req = true;
}
return $req;
}
function aiit_genarate_banner_html() {
$banner_req = aiit_get_banner();
error_log('aiit_get_banner, banner_req: ' . print_r($banner_req, true));
if ($banner_req === true ){
error_log('aiit_get_banner, banner_req === true: ' . print_r($banner_req, true));
$url = get_transient('aiit_banner_url');
$alt = get_transient('aiit_banner_alt');
$banner = get_transient('aiit_banner');
//error_log('aiit_get_banner, banner: ' . print_r($banner, true));
if(!empty($banner) && !empty($alt)){
echo '';
}
}
}