PluginProbe
MxChat – AI Chatbot & Content Generation for WordPress / 3.1.5
MxChat – AI Chatbot & Content Generation for WordPress v3.1.5
3.2.21 3.2.20 3.2.19 3.2.18 3.2.17 3.2.16 3.2.15 3.2.14 3.2.12 3.2.13 3.2.11 3.2.10 3.2.9 3.2.8 3.2.7 3.2.6 3.2.5 3.2.4 3.2.3 3.2.2 3.2.1 2.0.3 2.0.4 2.0.5 2.0.6 All 152 releases
← All changes | includes/admin-content-page.php +23 -104 3.2.213.1.5 View file →
@@ -512,40 +512,32 @@
512 512 <label class="mxch-field-label" for="mxch-content-model"><?php esc_html_e('Content Model', 'mxchat'); ?></label>
513 513 <div class="mxch-field-control">
514 514 <select id="mxch-content-model" data-field="content_model" class="mxch-cg-select">
515 515 <?php
516 - $content_model = $options['content_model'] ?? ($options['model'] ?? 'gpt-5.6-sol');
517 - // Catalog-derived (plan ccb751): this select was the seventh
518 - // hand-maintained model map and had drifted (it still offered
519 - // a code model for content generation). It now renders from
520 - // MxChat_Model_Catalog, restricted to the providers the
521 - // generator can actually dispatch to — see
522 - // MxChat_Content_Generator::supported_content_providers().
523 - $model_groups = MxChat_Model_Catalog::settings_dropdown_groups(
524 - $content_model,
525 - MxChat_Content_Generator::supported_content_providers()
516 + $content_model = $options['content_model'] ?? ($options['model'] ?? 'gpt-5.1-chat-latest');
517 + $models = array(
518 + 'OpenAI' => array(
519 + 'gpt-5.4' => 'GPT-5.4',
520 + 'gpt-5.2' => 'GPT-5.2',
521 + 'gpt-5.1-chat-latest' => 'GPT-5.1',
522 + 'gpt-5' => 'GPT-5',
523 + ),
524 + 'Anthropic' => array(
525 + 'claude-opus-4-6' => 'Claude Opus 4.6',
526 + 'claude-sonnet-4-6' => 'Claude Sonnet 4.6',
527 + 'claude-haiku-4-5-20251001' => 'Claude Haiku 4.5',
528 + ),
529 + 'Google' => array(
530 + 'gemini-3-pro-preview' => 'Gemini 3 Pro',
531 + 'gemini-2.5-pro' => 'Gemini 2.5 Pro',
532 + ),
533 + 'xAI' => array(
534 + 'grok-4-0709' => 'Grok 4',
535 + 'grok-4-1-fast-non-reasoning' => 'Grok 4.1 Fast',
536 + 'grok-code-fast-1' => 'Grok Code Fast',
537 + ),
526 538 );
527 - // Round-trip guard: an install saved on an id the catalog no
528 - // longer lists (e.g. grok-code-fast-1) keeps its selection
529 - // rendered instead of silently snapping to the first option
530 - // on the next save.
531 - $mxch_cg_model_in_groups = false;
532 - foreach ($model_groups as $group_models) {
533 - if (array_key_exists($content_model, $group_models)) {
534 - $mxch_cg_model_in_groups = true;
535 - break;
536 - }
537 - }
538 - if (!$mxch_cg_model_in_groups && $content_model !== '') {
539 - $model_groups[__('Currently saved', 'mxchat')] = array(
540 - /* translators: %s: model id */
541 - $content_model => sprintf(__('%s — no longer offered, choose a replacement', 'mxchat'), $content_model),
542 - );
543 - }
544 - foreach ($model_groups as $group => $group_models) {
545 - if (empty($group_models)) {
546 - continue;
547 - }
539 + foreach ($models as $group => $group_models) {
548 540 echo '<optgroup label="' . esc_attr($group) . '">';
549 541 foreach ($group_models as $value => $label) {
550 542 $selected = selected($content_model, $value, false);
551 543 echo '<option value="' . esc_attr($value) . '" ' . $selected . '>' . esc_html($label) . '</option>';
@@ -564,9 +556,8 @@
564 556 <div class="mxch-field-control">
565 557 <?php $image_model = $options['content_image_model'] ?? 'gpt-image-1.5'; ?>
566 558 <select id="mxch-image-model" data-field="content_image_model" class="mxch-cg-select">
567 559 <optgroup label="<?php esc_attr_e('OpenAI', 'mxchat'); ?>">
568 - <option value="gpt-image-2" <?php selected($image_model, 'gpt-image-2'); ?>><?php esc_html_e('GPT Image 2 (Latest)', 'mxchat'); ?></option>
569 560 <option value="gpt-image-1.5" <?php selected($image_model, 'gpt-image-1.5'); ?>><?php esc_html_e('GPT Image 1.5', 'mxchat'); ?></option>
570 561 </optgroup>
571 562 <optgroup label="<?php esc_attr_e('xAI', 'mxchat'); ?>">
572 563 <option value="grok-imagine-image-pro" <?php selected($image_model, 'grok-imagine-image-pro'); ?>><?php esc_html_e('Grok Imagine Pro', 'mxchat'); ?></option>
@@ -580,32 +571,8 @@
580 571 </div>
581 572 <p class="mxch-field-description"><?php esc_html_e('Select the AI model used for generating images within your content.', 'mxchat'); ?></p>
582 573 </div>
583 574
584 - <!-- Image Quality (GPT Image only) -->
585 - <div class="mxch-field">
586 - <label class="mxch-field-label" for="mxch-image-quality"><?php esc_html_e('Image Quality', 'mxchat'); ?></label>
587 - <div class="mxch-field-control">
588 - <?php $image_quality = $options['content_image_quality'] ?? 'auto'; ?>
589 - <?php $quality_supported = (strpos($image_model, 'gpt-image') === 0); ?>
590 - <select id="mxch-image-quality" data-field="content_image_quality" class="mxch-cg-select"<?php echo $quality_supported ? '' : ' disabled'; ?>>
591 - <option value="auto" <?php selected($image_quality, 'auto'); ?>><?php esc_html_e('Auto (default)', 'mxchat'); ?></option>
592 - <option value="low" <?php selected($image_quality, 'low'); ?>><?php esc_html_e('Low (fastest, cheapest)', 'mxchat'); ?></option>
593 - <option value="medium" <?php selected($image_quality, 'medium'); ?>><?php esc_html_e('Medium', 'mxchat'); ?></option>
594 - <option value="high" <?php selected($image_quality, 'high'); ?>><?php esc_html_e('High (best, slowest)', 'mxchat'); ?></option>
595 - </select>
596 - </div>
597 - <p class="mxch-field-description"><?php esc_html_e('Quality control for OpenAI GPT Image models only. Grok Imagine and Gemini image models ignore this setting (their APIs do not expose an equivalent parameter).', 'mxchat'); ?></p>
598 - </div>
599 - <script>(function(){
600 - var m = document.getElementById('mxch-image-model');
601 - var q = document.getElementById('mxch-image-quality');
602 - if (!m || !q || q._wired) { return; } q._wired = true;
603 - function sync(){ q.disabled = (m.value || '').indexOf('gpt-image') !== 0; }
604 - m.addEventListener('change', sync);
605 - sync();
606 - })();</script>
607 -
608 575 <!-- Enable Image Generation -->
609 576 <div class="mxch-field">
610 577 <label class="mxch-toggle">
611 578 <?php $enable_images = $options['content_enable_images'] ?? 'on'; ?>
@@ -615,35 +582,8 @@
615 582 </label>
616 583 <p class="mxch-field-description"><?php esc_html_e('When enabled, AI will generate and place images throughout your content. When disabled, pages are generated with text-only layouts.', 'mxchat'); ?></p>
617 584 </div>
618 585
619 - <!-- Images per Article -->
620 - <div class="mxch-field">
621 - <label class="mxch-field-label" for="mxch-image-count"><?php esc_html_e('Images per Article', 'mxchat'); ?></label>
622 - <div class="mxch-field-control">
623 - <?php $image_count = max(1, min(5, (int) ($options['content_image_count'] ?? 3))); ?>
624 - <?php $images_on = ($options['content_enable_images'] ?? 'on') === 'on'; ?>
625 - <div class="mxch-cg-slider-row">
626 - <input type="range" min="1" max="5" step="1" value="<?php echo esc_attr($image_count); ?>"
627 - data-field="content_image_count" id="mxch-image-count" class="mxch-cg-slider"<?php echo $images_on ? '' : ' disabled'; ?>>
628 - <span id="mxch-image-count-val" class="mxch-cg-slider-value"><?php echo esc_html($image_count); ?></span>
629 - </div>
630 - </div>
631 - <p class="mxch-field-description"><?php esc_html_e('How many images to generate and place in each article (1–5). Default 3. The AI may generate fewer if the article has few sections suited to imagery.', 'mxchat'); ?></p>
632 - </div>
633 - <script>(function(){
634 - var s = document.getElementById('mxch-image-count');
635 - var v = document.getElementById('mxch-image-count-val');
636 - if (!s || !v || s._wired) { return; } s._wired = true;
637 - s.addEventListener('input', function(){ v.textContent = s.value; });
638 - var e = document.querySelector('[data-field="content_enable_images"]');
639 - if (e) {
640 - var syncCount = function(){ s.disabled = !e.checked; };
641 - e.addEventListener('change', syncCount);
642 - syncCount();
643 - }
644 - })();</script>
645 -
646 586 <!-- Internal Linking (Pro) -->
647 587 <div class="mxch-field mxch-cg-pro-field<?php echo $pro_internal_linking ? '' : ' mxch-cg-pro-locked'; ?>">
648 588 <label class="mxch-toggle">
649 589 <?php $internal_linking_val = $options['content_internal_linking'] ?? 'off'; ?>
@@ -688,29 +628,8 @@
688 628 <?php endif; ?>
689 629 <?php endif; ?>
690 630 </div>
691 631
692 - </div>
693 - </div>
694 -
695 - <!-- ── Editor Assistant (moved from Settings → Behavior, plan-f7df40) ── -->
696 - <div class="mxch-card">
697 - <div class="mxch-card-header">
698 - <h3 class="mxch-card-title">
699 - <svg class="mxch-card-title-icon" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M15 4V2"/><path d="M15 16v-2"/><path d="M8 9h2"/><path d="M20 9h2"/><path d="M17.8 11.8 19 13"/><path d="M15 9h.01"/><path d="M17.8 6.2 19 5"/><path d="m3 21 9-9"/><path d="M12.2 6.2 11 5"/></svg>
700 - <?php esc_html_e('Editor Assistant', 'mxchat'); ?>
701 - </h3>
702 - </div>
703 - <?php // mxchat-autosave-section: this toggle saves through the shared
704 - // settings transport (mxchat-admin.js + the ajax-handler's
705 - // mxchat_editor_assistant_enabled case), NOT the data-field
706 - // transport the rest of this tab uses — keep those apart. ?>
707 - <div class="mxch-card-body mxchat-autosave-section">
708 - <?php
709 - mxchat_render_field_wrapper('mxchat_editor_assistant_enabled', __('Editor Assistant', 'mxchat'), function() use ($admin_instance) {
710 - $admin_instance->mxchat_editor_assistant_toggle_callback();
711 - }, __('Add magic-wand AI writing actions (rewrite, summarize, translate, continue, fix grammar) to the WordPress block editor. Opens a sidebar in the post editor. Uses the chat AI model configured in MxChat Settings. Off by default.', 'mxchat'));
712 - ?>
713 632 </div>
714 633 </div>
715 634
716 635 <!-- ── SEO Settings ── -->