includes();
add_action('wp_ajax_openai_save_assistant', [$this, 'save_assistant_callback']);
add_action('wp_ajax_openrouter_response',[$this,'openrouter_response_callback']);
add_action('wp_ajax_nopriv_openrouter_response', [$this, 'openrouter_response_callback']);
add_action('wp_ajax_qcld_openrouter_settings_option',[$this,'qcld_openrouter_settings_option_callback']);
add_action('wp_ajax_update_settings_option', [$this, 'qcld_update_settings_option_callback']);
if (is_admin() && !empty($_GET["page"]) && (($_GET["page"] == "openai-panel_dashboard") || ($_GET["page"] == "openai-panel_file") || ($_GET["page"] == "openai-panel_help"))) {
add_action('admin_enqueue_scripts', array($this, 'qcld_wb_chatbot_admin_scripts'));
}
//add_action('wp_enqueue_scripts', array($this, 'qcld_wb_chatbot_openrouter_scripts'));
add_action('admin_enqueue_scripts', array($this, 'qcld_wb_chatbot_openrouter_admin_scripts'));
}
public function qcld_wb_chatbot_openrouter_admin_scripts() {
if ( ! current_user_can( 'manage_options' ) ) {
return ;
}
wp_register_script(
'qcld-wp-chatbot-openrouter-admin-js',
QCLD_wpCHATBOT_PLUGIN_URL . 'includes/integration/openrouter/assets/js/qcld-wp-openrouter-admin.js',
array('jquery'),
QCLD_wpCHATBOT_VERSION,
true
);
// Localize the script with necessary data
wp_localize_script('qcld-wp-chatbot-openrouter-admin-js', 'qcld_gemini_admin_data', array(
'ajax_url' => admin_url('admin-ajax.php'),
'ajax_nonce' => wp_create_nonce('wp_chatbot'),
'openrouter_api_key' => get_option('qcld_openrouter_api_key'),
'openrouter_model' => get_option('qcld_openrouter_model'),
'openrouter_enabled' => get_option('qcld_openrouter_enabled'),
'qcld_openrouter_append_content' => get_option('qcld_openrouter_append_content'),
'qcld_openrouter_prepend_content' => get_option('qcld_openrouter_prepend_content')
));
wp_enqueue_script('qcld-wp-chatbot-openrouter-admin-js');
}
/**
* Define wpbot Constants.
*
* @return void
* @since 1.0.0
*/
public function includes() {
require_once( QCLD_wpCHATBOT_PLUGIN_DIR_PATH . "includes/Parsedown.php" );
require_once( QCLD_wpCHATBOT_PLUGIN_DIR_PATH . "includes/class-common-function.php" );
}
public function qcld_openrouter_settings_option_callback() {
$nonce = sanitize_text_field($_POST['nonce']);
if (!wp_verify_nonce($nonce, 'wp_chatbot')) {
wp_send_json(array('success' => false, 'msg' => esc_html__('Failed in Security check', 'chatbot')));
wp_die();
} else {
$openrouter_api_key = sanitize_text_field($_POST['openrouter_api_key']);
$openrouter_model = sanitize_text_field($_POST['openrouter_model']);
$openrouter_enabled = sanitize_text_field($_POST['openrouter_enabled']);
$qcld_openrouter_page_suggestion_enabled = sanitize_text_field($_POST['qcld_openrouter_page_suggestion_enabled']);
$opnrouter_is_context_awareness_enabled = sanitize_text_field($_POST['opnrouter_is_context_awareness_enabled']);
$qcld_openrouter_append_content = sanitize_text_field($_POST['qcld_openrouter_append_content']) ?? '';
$qcld_openrouter_prepend_content = sanitize_text_field($_POST['qcld_openrouter_prepend_content']) ?? '';
if($openrouter_api_key != '') {
update_option('qcld_openrouter_api_key', $openrouter_api_key);
}
if($openrouter_model != '') {
update_option('qcld_openrouter_model', $openrouter_model);
}
if($openrouter_enabled != '') {
update_option('qcld_openrouter_enabled', $openrouter_enabled);
}
if($openrouter_enabled == '1') {
update_option('ai_enabled', 0);
update_option('qcld_gemini_enabled', 0);
} else {
update_option('ai_enabled', 1);
update_option('qcld_gemini_enabled', 0);
}
update_option('qcld_openrouter_page_suggestion_enabled', $qcld_openrouter_page_suggestion_enabled);
update_option('opnrouter_context_awareness_enabled', $opnrouter_is_context_awareness_enabled);
$openai_post_types = array();
if (isset($_POST['openai_post_type'])) {
$raw_post_types = wp_unslash($_POST['openai_post_type']);
if (is_array($raw_post_types)) {
$openai_post_types = array_map('sanitize_text_field', $raw_post_types);
} else {
$openai_post_types = sanitize_text_field($raw_post_types);
}
}
update_option('qcld_openai_relevant_post', $openai_post_types);
update_option('qcld_openrouter_append_content', $qcld_openrouter_append_content);
update_option('qcld_openrouter_prepend_content', $qcld_openrouter_prepend_content);
}
echo wp_json_encode($openrouter_enabled);
wp_die();
}
public function openrouter_response_callback(){
$openrouter_model = get_option('qcld_openrouter_model');
$openrouter_api_key = get_option('qcld_openrouter_api_key');
$keyword = $_POST['keyword'];
$relevant_pagelink = Qcld_WPBot_Common_Functions::qcpd_relevant_pagelink($keyword);
$relevant_pagelink = array_slice($relevant_pagelink, 0, 5, true);
// Build context-aware messages with system instructions
$messages = array();
// Add system message with context if enabled
if ( get_option('opnrouter_context_awareness_enabled') == '1' ) {
$site_name = get_bloginfo('name');
$site_desc = get_bloginfo('description');
// Get current page URL and title more reliably
$current_url = '';
$page_title = '';
$page_summary = '';
// Try to get from referrer first
$ref = wp_get_referer();
if ( ! $ref && isset($_SERVER['HTTP_REFERER']) ) {
$ref = esc_url_raw( $_SERVER['HTTP_REFERER'] );
}
if ( $ref ) {
$current_url = $ref;
// Try to get post/page by URL
$post_id = url_to_postid( $ref );
if ( $post_id ) {
$page_title = get_the_title( $post_id );
$raw_content = get_post_field( 'post_content', $post_id );
$text_content = wp_strip_all_tags( $raw_content );
$page_summary = wp_trim_words( $text_content, 120, '…' );
} else {
// If not a post/page, try to extract title from URL or use current page
$parsed_url = parse_url( $ref );
if ( isset($parsed_url['path']) ) {
$path = trim($parsed_url['path'], '/');
if ( ! empty($path) ) {
// Try to get title from current page if we're on it
if ( is_singular() ) {
$page_title = get_the_title();
$raw_content = get_the_content();
$text_content = wp_strip_all_tags( $raw_content );
$page_summary = wp_trim_words( $text_content, 120, '…' );
} elseif ( is_archive() ) {
$page_title = get_the_archive_title();
} elseif ( is_search() ) {
$page_title = 'Search Results';
} elseif ( is_404() ) {
$page_title = 'Page Not Found';
}
}
}
}
} else {
// Fallback to current page info
$scheme = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? "https" : "http");
$host = isset($_SERVER['HTTP_HOST']) ? sanitize_text_field($_SERVER['HTTP_HOST']) : '';
$request_uri = isset($_SERVER['REQUEST_URI']) ? sanitize_text_field($_SERVER['REQUEST_URI']) : '';
$current_url = esc_url_raw($scheme . '://' . $host . $request_uri);
if ( is_singular() ) {
$page_title = get_the_title();
$raw_content = get_the_content();
$text_content = wp_strip_all_tags( $raw_content );
$page_summary = wp_trim_words( $text_content, 120, '…' );
} elseif ( is_archive() ) {
$page_title = get_the_archive_title();
} elseif ( is_search() ) {
$page_title = 'Search Results';
} elseif ( is_404() ) {
$page_title = 'Page Not Found';
}
}
$context_bits = array();
if ( $site_name ) { $context_bits[] = 'Site: ' . $site_name; }
if ( $site_desc ) { $context_bits[] = 'Tagline: ' . $site_desc; }
if ( $page_title ) { $context_bits[] = 'Page title: ' . $page_title; }
if ( $current_url ) { $context_bits[] = 'URL: ' . $current_url; }
if ( $page_summary ) { $context_bits[] = 'Page summary: ' . $page_summary; }
if ( ! empty( $context_bits ) ) {
$context_info = 'Context Information: ' . implode( '. ', $context_bits ) . '. Please use this context to provide more relevant and accurate responses.';
// Add system message with context
$messages[] = array(
'role' => 'system',
'content' => $context_info
);
}
}
// Add user message
$messages[] = array(
'role' => 'user',
'content' => $keyword
);
if( (get_option('page_suggestion_enabled') == '1') && count($relevant_pagelink) > 0 ){
$relevant_post_link = maybe_unserialize(get_option('qlcd_wp_chatbot_relevant_post_link_openai'));
// Avoid call to undefined function get_wpbot_locale()
$locale = ( function_exists('get_locale') ) ? get_locale() : 'en_US';
if ( isset($relevant_post_link[$locale]) && is_array($relevant_post_link[$locale]) ) {
$relevant_pagelinks = '
' . implode('', $relevant_post_link[$locale]) . '
' . implode("", $relevant_pagelink);
} elseif ( isset($relevant_post_link[$locale]) ) {
$relevant_pagelinks = '
' . $relevant_post_link[$locale] . '
' . implode("", $relevant_pagelink);
} else {
$relevant_pagelinks = '
' . implode("", $relevant_pagelink); } }else{ $relevant_pagelinks = ''; } $Qcld_Parsedown = new Qcld_Parsedown(); $data = json_encode(array( 'model' => $openrouter_model, 'messages' => $messages )); $api_url = 'https://openrouter.ai/api/v1/chat/completions'; // Use WordPress wp_remote_post for better error handling and consistency $args = array( 'body' => $data, 'headers' => array( 'Content-Type' => 'application/json', 'Authorization' => 'Bearer ' . $openrouter_api_key ), 'timeout' => 60, 'redirection' => 5, 'blocking' => true, 'httpversion' => '1.0', 'sslverify' => true, ); $result = wp_remote_post($api_url, $args); // Check for WordPress errors if (is_wp_error($result)) { $response['status'] = 'error'; $response['message'] = 'API request failed: ' . $result->get_error_message(); } else { $http_code = wp_remote_retrieve_response_code($result); $response_body = wp_remote_retrieve_body($result); if ($http_code === 200) { $msg = json_decode($response_body); if(isset($msg->choices[0]->message->content)) { $response['status'] = 'success'; $response['message'] = $Qcld_Parsedown->text($msg->choices[0]->message->content) . $relevant_pagelinks; } else { $response['status'] = 'error'; $response['message'] = 'Sorry, I encountered an error processing your AI request. Please check api key and try again later.'; } } else { $response['status'] = 'error'; $response['message'] = 'API request failed with HTTP code: ' . $http_code; } } echo wp_json_encode($response); wp_die(); } public function qcld_update_settings_option_callback(){ update_option('disable_wp_chatbot_site_search',1); update_option('enable_wp_chatbot_post_content', ''); } } /** * @return qcld_wpopenai_addon */ if(!function_exists('qcld_wpopenrouter_addons')){ function qcld_wpopenrouter_addons() { $qcld_wpopenrouter_addon = new qcld_wpopenrouter_addons(); return $qcld_wpopenrouter_addon->instance(); } } //fire off the plugin qcld_wpopenrouter_addons(); }