Give your embedded content a serious upgrade! Syncing metadata ensures important details like dates, locations, and descriptions travel along with it.
Ready to learn how?
Let’s modify your AI Engine embedding module – I’ll walk you through it using an event from The Events Calendar:
To provide our bots with the necessary time-based context, we need to sync start and end dates.
Installation
add_action('plugins_loaded', function() { global $mwai_core; if (class_exists('MeowPro_MWAI_Embeddings') && $mwai_core->get_option( 'module_embeddings', false )) { function add_date_time_to_event_embedding($content,$postId) { // Check if the post is an event if (function_exists('tribe_get_start_date') && get_post_type($postId) === 'tribe_events') { // Fetch start and end dates using the plugin's functions or WordPress get_post_meta() $timezone = date_default_timezone_get(); $start_date = tribe_get_start_date($postId, false, 'Y-m-d H:i:s'); $end_date = tribe_get_end_date($postId, false, 'Y-m-d H:i:s'); $url = get_permalink( $postId ); // Prepare the date strings $date_string = "The link to this event is here: $url.\nThe start date of this event is: $start_date $timezone"; $date_string .= "\nThe end date of this event is: $end_date $timezone"; // Append to the content $content .= "\n\n" . $date_string; } global $mwai_core; return $mwai_core->clean_sentences( $content ); } class My_Custom_Embeddings extends MeowPro_MWAI_Embeddings { function sync_vector( $vector = null, $postId = null, $envId = null ) { global $mwai_core; global $mwai; $ref = new ReflectionClass($this); if ( $postId ) { $previousVectors = parent::get_vectors_by_refId( $postId, $envId ); if ( count( $previousVectors ) > 1) { error_log( "There are more than one vector with the same refId ({$postId}). It is not handled yet." ); return; } else if ( count( $previousVectors ) === 1) { $vector = $previousVectors[0]; } else { // It's a new vector. $post = $mwai_core->get_post( $postId ); if ( !$post ) { return; } // Prepare and return the addition of a new vector based on the provided postId. $content = add_date_time_to_event_embedding($post['content'],$postId); ############# CHANGED return parent::vectors_add( [ 'type' => 'postId', 'title' => $post['title'], 'refId' => $post['postId'], 'refChecksum' => $post['checksum'], 'envId' => !empty( $envId ) ? $envId : $ref->sync_post_envId, 'content' => $content, 'behavior' => 'context' ], 'ok' ); } } // Proceed with the original function logic if $postId is not provided. if ( is_numeric( $vector ) ) { $vector = parent::get_vector( $vector ); } // If the vector does not have a refId, it is not linked to a post, and only need to be updated. if ( empty( $vector['refId'] ) ) { return parent::update_vector( $vector ); } $matchedVectors = parent::get_vectors_by_refId( $vector['refId'], $vector['envId'] ); if ( count( $matchedVectors ) > 1 ) { // Handle multiple vectors related to the same post. error_log( "There are more than one vector with the same refId ({$vector['refId']}). It is not handled yet." ); return; } $matchedVector = $matchedVectors[0]; $post = $mwai_core->get_post( $matchedVector['refId'] ); if ( !$post ) { return; } // Continue with the deletion of the matched vector and addition of the new vector. $content = add_date_time_to_event_embedding($post['content'],$postId); ############# CHANGED if ( !$ref->force_recreate && $post['checksum'] === $matchedVector['refChecksum'] && $matchedVector['status'] === 'ok') { return $matchedVector; } parent::vectors_delete( $matchedVector['envId'], [ $matchedVector['id'] ] ); // Rewrite the content if needed. if ( $ref->rewrite_content && !empty( $ref->rewrite_prompt ) ) { global $mwai; $prompt = str_replace( '{CONTENT}', $content, $ref->rewrite_prompt ); $prompt = str_replace( '{TITLE}', $post['title'], $prompt ); $prompt = str_replace( '{URL}', get_permalink( $post['postId'] ), $prompt ); $prompt = str_replace( '{EXCERPT}', $post['excerpt'], $prompt ); $prompt = str_replace( '{LANGUAGE}', $mwai_core->get_post_language( $post['postId'] ), $prompt ); $prompt = str_replace( '{ID}', $post['postId'], $prompt ); $content = $mwai->simpleTextQuery( $prompt, [ 'scope' => 'text-rewrite' ] ); } return parent::vectors_add( [ 'type' => 'postId', 'title' => $post['title'], 'refId' => $post['postId'], 'refChecksum' => $post['checksum'], 'envId' => $envId ? $envId : $matchedVector['envId'], 'content' => $content, 'behavior' => 'context' ], 'ok' ); } } global $mwai_embeddings; $mwai_embeddings = new My_Custom_Embeddings(); } },999); add_action( 'rest_api_init', function() { global $mwai_core; if (isset($mwai_core) && $mwai_core->get_option( 'module_embeddings', false )) { global $mwai_embeddings; $mwai_embeddings = new My_Custom_Embeddings(); register_rest_route( 'mwai/v1', '/vectors/sync', array( 'methods' => 'POST', 'permission_callback' => array( $mwai_core, 'can_access_settings' ), 'callback' => array( $mwai_embeddings, 'rest_vectors_sync' ), ), true ); } },999);
With start and end dates synced, the final step is to dynamically append the current date and time to the chatbot’s instructions ($query->instructions) for each user query.
// Let's add the current date and time to the bottom of our chatbot's instructions add_filter('mwai_ai_query', function ($query) { if (!($query instanceof Meow_MWAI_Query_Text) || $query->scope != 'chatbot') { return $query; } $date_string = current_time('Y-m-d H:i:s',true); $string = "# **The current date and time is $date_string.**"; if (isset($query->assistantId) && !empty($query->assistantId)) { if (!isset($query->context) || empty($query->context)) { $query->context = $string; } else { $query->context .= "\n\n".$string; } } else { $query->instructions .= "\n\n".$string; } return $query; }, 10, 1);
Success!
Your synced events now carry essential start and end date metadata, and your chatbots are fully time-aware.
Remember, this embedding module extension is your playground – customize it with WooCommerce attributes or any other metadata you desire!
Let’s enhance your business! I can help you develop custom AI engine extensions or broader AI strategies.