Untitled

mail@pastecode.io avatar
unknown
plain_text
a year ago
21 kB
1
Indexable
Never
<?php
ob_start();

/**
 * Plugin Name: Meta Generator AI
 * Description: This Plugin is a useful way to automatically generate product descriptions based on the product name, which can save time and effort when creating large numbers of products.
 * Version: 1.2.4
 * Author: SJ innovation
 * Author URI: https://sjinnovation.com/
 */

add_filter('https_ssl_verify', '__return_false');

function add_my_custom_button() {
    global $post;
    if (isset($post) && 'product' === $post->post_type) { ?>
        <script>
            jQuery(document).ready(function () {
                // Append the buttons after the "Product Name" field
                jQuery('#titlediv').after('<div id="my-custom-buttons"><button id="chatgpt-generate-desc-btn">Generate Description<span class="button-info">Click this button to automatically generate a product description based on the product name.</span></button><button id="chatgpt-enter-details-btn">Enter custom description<span class="button-info">Click this button to enter a custom product description.</span></button></div>');
            });
        </script>
    <?php }
}
add_action('edit_form_after_title', 'add_my_custom_button');
function add_custom_buttons_post_new() {
    if ('post-new.php' === $GLOBALS['pagenow']) { ?>
        <style>
        .custom-buttons-container {
  position: fixed;
  top: -6px;
  right: 500px;
  z-index: 9999;
  display: flex;
  justify-content: flex-end;
  margin-top: 13px;
}

.custom-buttons-container button {
  padding: 10px 15px;
  font-size: 13px;
  cursor: pointer;
  text-align: center;
  text-decoration: none;
  outline: none;
  margin: 4px 2px;
  color: #fff;
  background-color: #115ea1;
  border: none;
  border-radius: 3px;
}

.custom-buttons-container button:hover {
  background-color: #074982;
  color: rgb(205, 162, 162);
  box-shadow: 0 12px 16px 0 rgba(0, 0, 0, 0.24), 0 17px 50px 0 rgba(0, 0, 0, 0.19);
}

.custom-buttons-container button:active {
  background-color: #115ea1;
  transform: translateY(4px);
}

        </style>
        <script>
            jQuery(document).ready(function ($) {
                var isPostNewPage = $('body').hasClass('post-new-php') && $('body').hasClass('post-type-post');

                if (isPostNewPage) {
                    var buttonsContainer = $('<div class="custom-buttons-container"></div>');
                    buttonsContainer.append('<button id="custom-button-3">Generate Description</button>');
                    buttonsContainer.append('<button id="custom-button-4">Enter Custom Description</button>');
                    $('body').prepend(buttonsContainer); // Prepend buttons to the body element
                }
            });
        </script>
    <?php }
}
add_action('admin_footer', 'add_custom_buttons_post_new');


function enqueue_chatgpt_css() {
    wp_enqueue_style('chatgpt-style', plugin_dir_url(__FILE__) . 'style.css');
}
add_action('admin_enqueue_scripts', 'enqueue_chatgpt_css');

function enqueue_chatgpt_scripts() {
    wp_enqueue_script('chatgpt-script', plugin_dir_url(__FILE__) . 'product-description-script.js', array('jquery'), '1.0.0', true);
    wp_localize_script('chatgpt-script', 'openai_product_description', array(
        'ajax_url' => admin_url('admin-ajax.php'),
    ));
}
add_action('admin_enqueue_scripts', 'enqueue_chatgpt_scripts');
// Save short description and focus keyphrase on product save
function save_short_description($post_id) {
    if (isset($_POST['short_description'])) {
        $short_desc = sanitize_textarea_field($_POST['short_description']);
        update_post_meta($post_id, '_short_description', $short_desc);
    }
    if (isset($_POST['focus_keyphrase'])) {
        $focus_keyphrase = sanitize_text_field($_POST['focus_keyphrase']);
        update_post_meta($post_id, '_focus_keyphrase', $focus_keyphrase);
    }
}
add_action('woocommerce_process_product_meta', 'save_short_description');

// Define global variable for generated title and focus keyphrase
$generated_title = '';
$generated_focus_keyphrase = '';
function openai_product_description_generator($post_id) {
    global $generated_title;
    $product_name = get_the_title($post_id);
    $short_description = get_post_meta($post_id, '_short_description', true);
    $description = '';

    // Generate a new description if short description exists
    if ($short_description) {
        $description = 'Introducing the ' . $product_name . '! This amazing product is perfect for anyone looking for ' . $short_description . '.';
    }
    // Generate a new description if short description is empty
    else {
        $description = 'Introducing the ' . $product_name . '! This amazing product is perfect for anyone.';
    }

    // Update the product description
    wp_update_post(array(
        'ID'           => $post_id,
        'post_content' => $description,
    ));

    // Update the Yoast SEO meta description field
    update_post_meta($post_id, '_yoast_wpseo_metadesc', $description);

    // Remove existing tags before adding new ones
    $existing_tags = wp_get_post_terms($post_id, 'product_tag', array('fields' => 'ids'));
    if (!empty($existing_tags)) {
        foreach ($existing_tags as $tag_id) {
            wp_remove_object_terms($post_id, $tag_id, 'product_tag');
        }
    }

    // Update the product tags
    $tags = str_replace('#', '', $short_description);
    $tags = explode(',', $tags);
    $tags = array_map('trim', $tags);
    $tags = array_filter($tags); // Remove empty tags
    $tags = array_unique($tags); // Remove duplicate tags

    foreach ($tags as $tag) {
        wp_set_object_terms($post_id, $tag, 'product_tag', true);
    }

    // Update the Yoast SEO focus keyphrase field
    $focus_keyphrase = implode(', ', $tags);
    update_post_meta($post_id, '_yoast_wpseo_focuskw', $focus_keyphrase);

    // Update the Yoast SEO title field
    if ($generated_title) {
        update_post_meta($post_id, '_yoast_wpseo_title', $generated_title . ' | ' . $product_name);
    } else {
        update_post_meta($post_id, '_yoast_wpseo_title', $product_name);
    }
}

add_action('wp_ajax_generate_product_description', 'generate_product_description');
add_action('wp_ajax_nopriv_generate_product_description', 'generate_product_description');

// Register the custom button actions
function register_my_custom_button_actions() {
    add_action('wp_ajax_enter_product_details', 'enter_product_details');
    add_action('wp_ajax_nopriv_enter_product_details', 'enter_product_details');
}
add_action('init', 'register_my_custom_button_actions');

// Add the custom button functionality
function enter_product_details() {
    if (isset($_POST['post_ID'])) {
        $post_id = $_POST['post_ID'];
        global $generated_title, $generated_focus_keyphrase;
        $generated_title = $_POST['generated_title'];
        $generated_focus_keyphrase = $_POST['focus_keyphrase'];
        openai_product_description_generator($post_id);
        echo 'success';
    }
    exit;
}

// Function to update the Yoast SEO slug field
function updateYoastSEOSlug($post_id) {
    $product_name = get_the_title($post_id);
    $slug = sanitize_title($product_name);
    update_post_meta($post_id, '_yoast_wpseo_slug', $slug);
}
add_action('save_post', 'updateYoastSEOSlug');

// AJAX endpoint for generating post details
add_action('wp_ajax_generate_post_details', 'generate_post_details_callback');
add_action('wp_ajax_nopriv_generate_post_details', 'generate_post_details_callback');
function generate_post_details_callback() {
    $generatedTitle = $_POST['generatedTitle'];

    // Generate the post details based on the generated title
    $postDetails = generate_post_details($generatedTitle);

    // Prepare the response
    $response = array(
        'success' => true,
        'data' => array(
            'postDetails' => $postDetails,
        ),
    );

    // Send the response
    wp_send_json_success($response);
}

// Function to generate post details (replace this with your actual implementation)
function generate_post_details($generatedTitle) {
    // Implement your logic to generate the post details based on the generated title
    // Return the generated post details
    return "Sample generated post details for title: " . $generatedTitle;
}


// Add a plugin settings page
function my_plugin_settings_page() {
    add_menu_page(
        'API Settings',
        'API Settings',
        'manage_options',
        'my-plugin-settings',
        'my_plugin_render_settings_page'
    );
}

// Render the plugin settings page
function my_plugin_render_settings_page() {
    ?>
    <div class="wrap">
        <h1>Meta Generator Settings</h1>
        <?php settings_errors();?>//added this line of code to render error of form
        <form method="post" action="options.php">
            <?php settings_fields('my-plugin-settings-group'); ?>
            <?php do_settings_sections('my-plugin-settings'); ?>
            <?php submit_button(); ?>
        </form>
    </div>
    <?php
}

// Render the API key input field
function my_plugin_render_api_key_field() {
    $api_key = get_option('my_plugin_api_key');
    ?>
    <input type="text" name="my_plugin_api_key" id="my-plugin-api-key" value="<?php echo esc_attr($api_key); ?>" />
    <?php
}

// Render the API link input field
function my_plugin_render_api_link_field() {
    $api_link = get_option('my_plugin_api_link');
    ?>
    <input type="text" name="my_plugin_api_link" id="my-plugin-api-link" value="<?php echo esc_attr($api_link); ?>" />
    <?php
}

// Render the Full Description prompt input field
function my_plugin_render_full_description_prompt_field() {
    $fprompt = get_option('my_plugin_full_description_prompt', 'you can write a custom prompt for full description of the product');
    ?>
    <input type="text" name="my_plugin_full_description_prompt" id="my-plugin-full-description-prompt" value="<?php echo esc_attr($fprompt); ?>" />
    <?php
    echo '<br>';
 
    echo '<b> Example: </b> "Can you write a description for the mentioned product which is SEO friendly:" <br>';
    echo '<b>Note:</b> we have used the example prompt as default prompt for the full description<br>';

}

// Render the Short Description prompt input field
function my_plugin_render_short_description_prompt_field() {
    $sprompt = get_option('my_plugin_short_description_prompt', 'you write a custom prompt for short description of the product');
    ?>
    <input type="text" name="my_plugin_short_description_prompt" id="my-plugin-short-description-prompt" value="<?php echo esc_attr($sprompt); ?>" />
    <?php
    echo '<br>';
    echo '<b> Example:</b> "Can you write a description for the mentioned product which is SEO friendly:" <br>';
    echo '<b> Note: </b> we have used the example prompt as default prompt for the short description<br>';
    
}


// Render the model selection dropdown
function my_plugin_render_model_selection_field() {
    echo 'Select your API Model below. To know more about the models click on :  <a href="https://platform.openai.com/docs/models/gpt-3-5" target="_blank">Open AI Models</a>. <br>';
    echo '<br>';
    $selected_model = get_option('my_plugin_selected_model', 'text-davinci-002');
    $models = array(
        'text-davinci-002' => 'Text Davinci 002',
        'text-davinci-003' => 'Text Davinci 003',
        'gpt-3.5-turbo-16k-0613' => 'GPT-3.5 Turbo 16k 0613',
        'gpt-3.5-turbo-0613' => 'GPT-3.5 Turbo 0613',
        'gpt-3.5-turbo-16k' => 'GPT-3.5 Turbo 16k',
        'gpt-3.5-turbo' => 'GPT-3.5 Turbo',
        // Add more models as needed
    );
    
    ?>
    <select name="my_plugin_selected_model" id="my-plugin-selected-model">
        <?php foreach ($models as $model => $label) : ?>
            <option value="<?php echo esc_attr($model); ?>" <?php selected($selected_model, $model); ?>><?php echo esc_html($label); ?></option>
        <?php endforeach; ?>
    </select>
    <?php
    echo '<br>';
    echo '<br>';
    echo '<b> Note: </b> If you are not sure which model to use, then you can use the default model. <br>';  
    echo 'By default we are using ,<b>Text Davinci 002 </b> model. <br>';
}

// Render the temperature selection dropdown
function my_plugin_render_temperature_field() {
    echo 'Select your API temepreture below. To know more click on :  <a href="https://community.openai.com/t/cheat-sheet-mastering-temperature-and-top-p-in-chatgpt-api-a-few-tips-and-tricks-on-controlling-the-creativity-deterministic-output-of-prompt-responses/172683" target="_blank">Open AI Tempreture</a>. <br>'; 
    echo '<br>';
    $selected_temperature = get_option('my_plugin_selected_temperature', '0.7');
    $temperatures = array(
        '0' => '0',
        '0.1' => '0.1',
        '0.2' => '0.2',
        '0.3' => '0.3',
        '0.4' => '0.4',
        '0.5' => '0.5',
        '0.6' => '0.6',
        '0.7' => '0.7',
        '0.8' => '0.8',
        '0.9' => '0.9',
        '1' => '1',
    );
    

    ?>
    <select name="my_plugin_selected_temperature" id="my-plugin-selected-temperature">
        <?php foreach ($temperatures as $temperature => $label) : ?>
            <option value="<?php echo esc_attr($temperature); ?>" <?php selected($selected_temperature, $temperature); ?>><?php echo esc_html($label); ?></option>
        <?php endforeach; ?>
    </select>
    
    <?php
    echo '<br>';
    echo '<br>';
    echo '<b> Note: </b> If you are not sure which temperature to use, then you can use the default temperature. <br>';
    echo 'By default we are using <b>0.7</b> temperature. <br>';
    
}

// Render the settings section
function my_plugin_render_settings_section() {
    echo 'Enter your API key and link below. You can get your API key from:  <a href="https://platform.openai.com/account/api-keys" target="_blank">OpenAI Key</a>, and the Open AI Link from: <a href="https://platform.openai.com/docs/api-reference/authentication" target="_blank">Open AI Link</a>. <br>';
}

// Register plugin settings
function my_plugin_register_settings() {
    register_setting('my-plugin-settings-group', 'my_plugin_api_key', array(
        'sanitize_callback' => 'my_plugin_sanitize_api_key',
        'show_in_rest' => false, // Add this line to prevent issues with REST API
    ));

    register_setting('my-plugin-settings-group', 'my_plugin_api_link');
    register_setting('my-plugin-settings-group', 'my_plugin_api_link', array(
        'sanitize_callback' => 'my_plugin_sanitize_api_link',
    ));
    register_setting('my-plugin-settings-group', 'my_plugin_full_description_prompt', array(
        'sanitize_callback' => 'my_plugin_sanitize_full_description_prompt',
    ));
    register_setting('my-plugin-settings-group', 'my_plugin_short_description_prompt', array(
        'sanitize_callback' => 'my_plugin_sanitize_short_description_prompt',
    ));
    register_setting('my-plugin-settings-group', 'my_plugin_selected_model');
    register_setting('my-plugin-settings-group', 'my_plugin_selected_temperature');
}

// Add settings fields to the plugin settings page
function my_plugin_add_settings_fields() {
    add_settings_section('my-plugin-api-section', 'API Settings', 'my_plugin_render_settings_section', 'my-plugin-settings');
    add_settings_field('my-plugin-api-key-field', 'API Key', 'my_plugin_render_api_key_field', 'my-plugin-settings', 'my-plugin-api-section');
    add_settings_field('my-plugin-api-link-field', 'API Link', 'my_plugin_render_api_link_field', 'my-plugin-settings', 'my-plugin-api-section');
    add_settings_field('my-plugin-full-description-prompt-field', 'Full Description Prompt', 'my_plugin_render_full_description_prompt_field', 'my-plugin-settings', 'my-plugin-api-section');
    add_settings_field('my-plugin-short-description-prompt-field', 'Short Description Prompt', 'my_plugin_render_short_description_prompt_field', 'my-plugin-settings', 'my-plugin-api-section');
    add_settings_field('my-plugin-selected-model-field', 'Selected Model', 'my_plugin_render_model_selection_field', 'my-plugin-settings', 'my-plugin-api-section');
    add_settings_field('my-plugin-selected-temperature-field', 'Selected Temperature', 'my_plugin_render_temperature_field', 'my-plugin-settings', 'my-plugin-api-section');
}

// Hook into WordPress initialization
function my_plugin_init() {
    add_action('admin_menu', 'my_plugin_settings_page');
    add_action('admin_init', 'my_plugin_register_settings');
    add_action('admin_init', 'my_plugin_add_settings_fields');
    // Add a custom button to the plugin row actions
    add_filter('plugin_action_links_' . plugin_basename(__FILE__), 'my_plugin_add_custom_button');
}
add_action('init', 'my_plugin_init');

function my_plugin_add_custom_button($actions) {
    // Add your custom button to the plugin row actions
    $custom_button = '<a href="#" class="button-secondary">Custom Button</a>';
    array_push($actions, $custom_button);
    return $actions;
}






// Hook into WordPress admin_enqueue_scripts action to enqueue your script file and localize it with the API key and link
function my_plugin_enqueue_scripts() {
    wp_enqueue_script('product-description-script', plugins_url('/product-description-script.js', __FILE__), array('jquery'), '1.0', true);
    $api_key = get_option('my_plugin_api_key');
    $api_link = get_option('my_plugin_api_link');
    $full_description_prompt = get_option('my_plugin_full_description_prompt');
    $short_description_prompt = get_option('my_plugin_short_description_prompt');
    $selected_model = get_option('my_plugin_selected_model');
    $selected_temperature = get_option('my_plugin_selected_temperature');
    if ($api_key && $api_link) {
        // Return the API key and link as an inline script
        wp_add_inline_script('product-description-script', 'var my_plugin_api_key = ' . json_encode($api_key) . ';', 'before');
        wp_add_inline_script('product-description-script', 'var my_plugin_api_link = ' . json_encode($api_link) . ';', 'before');
        wp_add_inline_script('product-description-script', 'var my_plugin_full_description_prompt = ' . json_encode($full_description_prompt) . ';', 'before');
        wp_add_inline_script('product-description-script', 'var my_plugin_short_description_prompt = ' . json_encode($short_description_prompt) . ';', 'before');
        wp_add_inline_script('product-description-script', 'var my_plugin_selected_model = ' . json_encode($selected_model) . ';', 'before');
        wp_add_inline_script('product-description-script', 'var my_plugin_selected_temperature = ' . json_encode($selected_temperature) . ';', 'before');
    }

}
add_action('admin_enqueue_scripts', 'my_plugin_enqueue_scripts');

// Hook into plugin activation and deactivation
register_activation_hook(__FILE__, 'my_plugin_activate');
register_deactivation_hook(__FILE__, 'my_plugin_deactivate');

function my_plugin_activate() {
    // Perform activation actions, such as showing the settings page
    my_plugin_settings_page();
}

function my_plugin_deactivate() {
    // Perform deactivation actions, if needed
}
//Functions  to sanitize and validate form fields starts
function my_plugin_sanitize_api_key($input) {
    // Validate the API Key (e.g., check for length, format, etc.)
    if (!preg_match('/^[A-Za-z0-9\-_]+$/', $input)) {
        add_settings_error('my_plugin_api_key', 'invalid_api_key', 'Invalid API Key.');
        return get_option('my_plugin_api_key'); // Reset to previous value
    }

    // Sanitize the API Key
    $sanitized_input = sanitize_text_field($input);

    return $sanitized_input;
}
function my_plugin_sanitize_api_link($input) {
    // Validate the API Link (e.g., check for a valid URL format)
    if (!filter_var($input, FILTER_VALIDATE_URL)) {
        add_settings_error('my_plugin_api_link', 'invalid_api_link', 'Invalid API Link.');
        return get_option('my_plugin_api_link'); // Reset to previous value
    }

    // Sanitize the API Link
    $sanitized_input = esc_url_raw($input);

    return $sanitized_input;
}
function my_plugin_sanitize_full_description_prompt($input) {
    // Validate the Full Description Prompt (e.g., check for length, format, etc.)
    if (strlen($input) < 160) { // Adjust the minimum length as needed
        add_settings_error('my_plugin_full_description_prompt', 'invalid_full_description_prompt', 'Full Description Prompt is too short.');
        return get_option('my_plugin_full_description_prompt'); // Reset to previous value
    }

    // Sanitize the Full Description Prompt
    $sanitized_input = sanitize_text_field($input);

    return $sanitized_input;
}
function my_plugin_sanitize_short_description_prompt($input) {
    // Validate the Short Description Prompt (e.g., check for length, format, etc.)
    if (strlen($input) < 150) { // Adjust the minimum length as needed
        add_settings_error('my_plugin_short_description_prompt', 'invalid_short_description_prompt', 'Short Description Prompt is too short.');
        return get_option('my_plugin_short_description_prompt'); // Reset to previous value
    }

    // Sanitize the Short Description Prompt
    $sanitized_input = sanitize_text_field($input);

    return $sanitized_input;
}