Of course, AI Engine comes with built-in tools like chatbots, but it’s really just a bridge to bring AI to WordPress so you can create your own AI-powered tools. As an example, we’ll build a post widget that analyzes the current page’s content and generates an overview. You can try it right here.
The article introduces how to leverage the AI Engine and Code Engine in WordPress to create AI-powered tools, specifically focusing on a widget that analyzes page content and generates summaries. The workflow is explained in detail, highlighting the simplicity of using shortcodes and the versatility of the AI Engine API.
- — AI Engine provides built-in tools like chatbots
- — Custom shortcode creation is simple with Code Engine
- — The workflow includes fetching post content
- — analyzing it via AI
- — and generating an overview
- — The article also includes sample code and styling for easy integration into WordPress.
With these tools, users can effortlessly integrate AI functionalities into their WordPress sites.
The widget you see here has been generated at load time when opening this page with a shortcode.
For this, we only need Code Engine and AI Engine. You could also create your own shortcode manually; we’re using Code Engine for simplicity.
The workflow is simple: create a Content Snippet in Code Engine to register a shortcode, then place that shortcode on any post. When the post renders, it will run the code below. First, we fetch the post content, then use the AI Engine API to have a model analyze the content and generate an overview.
We split the output into three parts: overview, key points, and conclusion.
Next, we add HTML to define the layout, some styling to make everything look nice, and a small script to help us navigate the categories. And that’s it.
As you can see, AI Engine is only a small part of this solution—most of the code is native. You can build any AI-powered tool in a similar way. The AI Engine API is very versatile.
Below is the code we’re using, including caching, the query, markup, and styles. In a production setup, you’d likely separate these components.
global $mwai;
$page = get_post(get_the_ID());
if (!$page || !isset($page->post_content)) {
echo 'No Content.';
return;
}
// Cache key includes last modified so edits auto-bust the cache.
$modified_unix = (int) get_post_modified_time('U', true, $page); // GMT
$cache_key = 'mwai_pr_' . $page->ID . '_' . $modified_unix;
// Serve from cache if present
if (false !== ($cached = get_transient($cache_key))) {
echo $cached;
return;
}
/* ---------------- AI QUERY ---------------- */
$prompt = "<instructions>Given the content of the article, write a short overview of the article, the most important points, and a conclusion.<instructions><response>The response in JSON format should always use the following keys: overview ( string 2 - 3 sentences ), keypoints ( string separated by commas ), conclusion ( string 1 sentence ).</response> The article is: " . $page->post_content;
$res = $mwai->simpleJsonQuery($prompt);
$overview = isset($res['overview']) ? wp_kses_post($res['overview']) : '';
$keypointsS = isset($res['keypoints']) ? wp_kses_post($res['keypoints']) : '';
$conclusion = isset($res['conclusion']) ? wp_kses_post($res['conclusion']) : '';
$keypoints = array_filter(array_map('trim', explode(',', wp_strip_all_tags($keypointsS))));
$uid = esc_attr(wp_unique_id('mwai-pr-'));
/* --------------- Build HTML --------------- */
$overviewHtml = '<p>'. ( $overview !== '' ? $overview : esc_html__('No overview available.', 'mwai') ) .'</p>';
$keypointsHtml = !empty($keypoints)
? '<ul class="mwai-pr__list">'.implode('', array_map(fn($kp)=>'<li>— '.esc_html($kp).'</li>', $keypoints)).'</ul>'
: '<p>'. esc_html__('No key points provided.', 'mwai') .'</p>';
$conclusionHtml = '<p>'. ( $conclusion !== '' ? $conclusion : esc_html__('No conclusion available.', 'mwai') ) .'</p>';
$html = '<div class="mwai-pr" id="'.$uid.'"><div class="mwai-pr__wrap">';
$html .= '<div class="mwai-pr__header"><div class="mwai-pr__logo" aria-hidden="true">🤖</div><div class="mwai-pr__title">AI Summary</div></div>';
$html .= '<div class="mwai-pr__tabs" role="tablist" aria-label="AI Summary Tabs">
<button role="tab" aria-selected="true" data-panel="overview" class="mwai-pr__tab is-active">Overview</button>
<button role="tab" aria-selected="false" data-panel="keypoints" class="mwai-pr__tab">Key Points</button>
<button role="tab" aria-selected="false" data-panel="conclusion" class="mwai-pr__tab">Conclusion</button>
</div>';
$html .= '<div class="mwai-pr__panels">
<section role="tabpanel" class="mwai-pr__panel is-active" data-panel="overview">'.$overviewHtml.'</section>
<section role="tabpanel" class="mwai-pr__panel" data-panel="keypoints">'.$keypointsHtml.'</section>
<section role="tabpanel" class="mwai-pr__panel" data-panel="conclusion">'.$conclusionHtml.'</section>
</div>';
$html .= '<style>
.mwai-pr__wrap{background:#0b1220;border:1px solid #1f2937;border-radius:16px;padding:18px 20px;font-family:system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial,sans-serif}
.mwai-pr__header{display:flex;align-items:center;gap:10px;margin-bottom:12px}
.mwai-pr__logo{width:28px;height:28px;border-radius:999px;background:#0f172a;display:grid;place-items:center;box-shadow:0 1px 2px rgba(0,0,0,.35)}
.mwai-pr__title{font-weight:800;font-size:22px;color:#e5e7eb}
.mwai-pr__tabs{display:flex;gap:10px;margin:6px 0 12px}
.mwai-pr__tab{border:1px solid #374151;background:#111827;padding:8px 14px;border-radius:999px;cursor:pointer;font-weight:700;font-size:14px;color:#e5e7eb;transition:background .15s,border-color .15s,transform .05s}
.mwai-pr__tab:hover{background:#0f172a;border-color:#475569}
.mwai-pr__tab:active{transform:translateY(1px)}
.mwai-pr__tab.is-active{background:#1f2937;border-color:#64748b}
.mwai-pr__panel{display:none}
.mwai-pr__panel.is-active{display:block}
.mwai-pr__panels p{color:#e2e8f0;line-height:1.75;margin:0}
.mwai-pr__list{list-style:none;margin:0;padding:0}
.mwai-pr__list li{margin:6px 0;color:#e2e8f0;line-height:1.7}
</style>';
$html .= '<script>(function(){const r=document.getElementById("'.$uid.'");if(!r)return;const tabs=r.querySelectorAll(".mwai-pr__tab");const panels=r.querySelectorAll(".mwai-pr__panel");tabs.forEach(t=>t.addEventListener("click",()=>{const target=t.getAttribute("data-panel");tabs.forEach(tb=>{tb.classList.remove("is-active");tb.setAttribute("aria-selected","false")});t.classList.add("is-active");t.setAttribute("aria-selected","true");panels.forEach(p=>p.classList.toggle("is-active",p.getAttribute("data-panel")===target));}));})();</script>';
$html .= '</div></div>';
/* -------- Save cache for one week -------- */
set_transient($cache_key, $html, WEEK_IN_SECONDS);
echo $html;
We simply put all of this in Code Engine:

And we are done. Just reference our new widget in any post using the generated shortcode:
[code-engine id="3"]