Files
wordpress-plugins/AI SEO 助手/assets/admin.js
Snowz 1ae6823bd5 feat: 新增AI SEO助手插件,支持自动生成SEO内容和导航主题适配
添加完整的AI SEO助手WordPress插件,主要功能包括:
- 集成Dify API自动生成SEO优化的标题、描述和关键词
- 支持导航主题的自定义字段适配
- 提供管理界面设置API和文章类型支持
- 包含前端SEO标签自动应用功能
- 添加详细的测试和调试功能
2025-08-13 18:52:35 +08:00

258 lines
8.4 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

jQuery(document).ready(function($) {
/**
* 初始化字符计数器
*/
function initCharCounters() {
// 标题计数器
$('#ai_seo_title').on('input', function() {
updateCounter(this, '#title-counter', 60);
updatePreview();
}).trigger('input');
// 描述计数器
$('#ai_seo_description').on('input', function() {
updateCounter(this, '#desc-counter', 160);
updatePreview();
}).trigger('input');
// 关键词计数器
$('#ai_seo_keywords').on('input', function() {
updateCounter(this, '#keywords-counter', 100);
}).trigger('input');
}
/**
* 更新字符计数器
*/
function updateCounter(input, counterSelector, maxLength) {
var length = $(input).val().length;
var counter = $(counterSelector);
var percentage = (length / maxLength) * 100;
counter.text(length + '/' + maxLength);
// 根据长度设置颜色
counter.removeClass('warning good');
if (percentage > 90) {
counter.addClass('warning');
} else if (percentage >= 70) {
counter.addClass('good');
}
}
/**
* 更新搜索结果预览
*/
function updatePreview() {
var title = $('#ai_seo_title').val() || $('#title').val() || '未设置标题';
var description = $('#ai_seo_description').val() || '暂无描述';
$('#preview-title').text(title);
$('#preview-description').text(description);
}
/**
* 生成SEO内容
*/
$('#generate-seo-btn').on('click', function() {
var button = $(this);
var postId = $('#post_ID').val();
if (!postId) {
alert('请先保存文章草稿后再生成SEO内容');
return;
}
// 显示加载状态
button.prop('disabled', true);
$('#ai-seo-loading').show();
$('.ai-seo-fields').css('opacity', '0.5');
// 发送AJAX请求
$.ajax({
url: aiSeoAjax.ajax_url,
type: 'POST',
timeout: 120000, // 设置超时时间为120秒2分钟
data: {
action: 'generate_seo_content',
post_id: postId,
nonce: aiSeoAjax.nonce
},
success: function(response) {
if (response.success && response.data) {
// 填充生成的内容
if (response.data.title) {
$('#ai_seo_title').val(response.data.title).trigger('input');
}
if (response.data.description) {
$('#ai_seo_description').val(response.data.description).trigger('input');
}
if (response.data.keywords) {
$('#ai_seo_keywords').val(response.data.keywords).trigger('input');
}
// 显示成功消息
showNotice('SEO内容生成成功', 'success');
} else {
showNotice('生成失败:' + (response.data || '未知错误'), 'error');
}
},
error: function(xhr, status, error) {
var errorMessage = '请求失败:';
if (status === 'timeout') {
errorMessage = 'AI生成超时请稍后重试。如果问题持续存在请联系管理员。';
} else if (status === 'error') {
errorMessage = '网络错误,请检查网络连接后重试。';
} else {
errorMessage += error;
}
showNotice(errorMessage, 'error');
},
complete: function() {
// 恢复界面状态
button.prop('disabled', false);
$('#ai-seo-loading').hide();
$('.ai-seo-fields').css('opacity', '1');
}
});
});
/**
* 显示通知消息
*/
function showNotice(message, type) {
var noticeClass = type === 'success' ? 'notice-success' : 'notice-error';
var notice = $('<div class="notice ' + noticeClass + ' is-dismissible"><p>' + message + '</p></div>');
$('.ai-seo-meta-box').prepend(notice);
// 自动移除通知
setTimeout(function() {
notice.fadeOut(function() {
notice.remove();
});
}, 5000);
}
/**
* 复制到剪贴板功能
*/
function addCopyButtons() {
$('.ai-seo-field').each(function() {
var field = $(this);
var input = field.find('input, textarea');
if (input.length) {
var copyBtn = $('<button type="button" class="button button-small copy-btn" title="复制到剪贴板">📋</button>');
field.find('label').append(copyBtn);
copyBtn.on('click', function(e) {
e.preventDefault();
input.select();
document.execCommand('copy');
var originalText = copyBtn.text();
copyBtn.text('✅');
setTimeout(function() {
copyBtn.text(originalText);
}, 1000);
});
}
});
}
/**
* 键盘快捷键
*/
$(document).on('keydown', function(e) {
// Ctrl+Shift+G 生成SEO内容
if (e.ctrlKey && e.shiftKey && e.keyCode === 71) {
e.preventDefault();
$('#generate-seo-btn').click();
}
});
/**
* 自动保存功能
*/
var autoSaveTimeout;
$('.ai-seo-field input, .ai-seo-field textarea').on('input', function() {
clearTimeout(autoSaveTimeout);
autoSaveTimeout = setTimeout(function() {
// 这里可以添加自动保存逻辑
console.log('Auto-saving SEO data...');
}, 2000);
});
/**
* 验证SEO内容质量
*/
function validateSeoContent() {
var title = $('#ai_seo_title').val();
var description = $('#ai_seo_description').val();
var keywords = $('#ai_seo_keywords').val();
var issues = [];
if (!title || title.length < 30) {
issues.push('标题太短建议至少30个字符');
}
if (title && title.length > 60) {
issues.push('标题太长建议不超过60个字符');
}
if (!description || description.length < 120) {
issues.push('描述太短建议至少120个字符');
}
if (description && description.length > 160) {
issues.push('描述太长建议不超过160个字符');
}
if (!keywords) {
issues.push('建议添加相关关键词');
}
return issues;
}
/**
* 显示SEO质量评分
*/
function showSeoScore() {
var issues = validateSeoContent();
var score = Math.max(0, 100 - (issues.length * 20));
var scoreHtml = '<div class="seo-score">';
scoreHtml += '<h4>SEO质量评分: <span class="score-' + (score >= 80 ? 'good' : score >= 60 ? 'ok' : 'poor') + '">' + score + '/100</span></h4>';
if (issues.length > 0) {
scoreHtml += '<ul class="seo-issues">';
issues.forEach(function(issue) {
scoreHtml += '<li>⚠️ ' + issue + '</li>';
});
scoreHtml += '</ul>';
} else {
scoreHtml += '<p class="seo-perfect">✅ SEO内容质量良好</p>';
}
scoreHtml += '</div>';
$('.seo-score').remove();
$('.ai-seo-tips').before(scoreHtml);
}
// 初始化所有功能
initCharCounters();
updatePreview();
addCopyButtons();
// 监听内容变化以更新评分
$('.ai-seo-field input, .ai-seo-field textarea').on('input', function() {
setTimeout(showSeoScore, 100);
});
// 初始评分
showSeoScore();
// 添加提示信息
$('.ai-seo-header').append('<small style="color: #666; margin-left: 10px;">快捷键: Ctrl+Shift+G</small>');
});