使用 $wpdb->prepare() 函数:在执行 SQL 查询时,使用 $wpdb->prepare() 函数来处理参数。
使用 get_var() 方法:在执行 SQL 查询时,使用 $wpdb->get_var() 方法来获取单个值,而不是使用 $wpdb->get_results() 方法并手动处理结果
使用 $wpdb->prepare() 函数可以防止 SQL 注入,而使用 get_var() 方法可以更直接地获取单个值
同时修复了,接收前端ajax参数这里,我们填写了文章名字后不进行提示的问题。
/**
* 发表文章时禁止与已存在的标题相重复
* Modify from Plugin: Duplicate Title Validate
* Description: This plugin helps to not allow publishing duplicate titles.
* Author: Hasan Movahed
* Reviser: WPBOM
* Version: 1.1
* Author URI: http://www.wallfa.com
* Reviser URI: https://wpbom.com/
* Edit URI: https://wpbom.com/
*/
// 发表文章页面,前端抓取标题并使用AJAX发送请求
add_action('admin_print_footer_scripts', 'duplicate_titles_enqueue_scripts', 100);
function duplicate_titles_enqueue_scripts() {
?>
<script>
jQuery(function ($) {
function checkTitleAjax(title, id, post_type) {
var data = {
action: 'title_checks',
post_title: title,
post_type: post_type,
post_id: id
};
$.post(ajaxurl, data, function (response) {
$('#message').remove();
$('#poststuff').prepend('<div id="message" class="updated below-h2 fade"><p>' + response + '</p></div>');
});
}
$('#title').change(function () {
var title = $('#title').val();
var id = $('#post_ID').val();
var post_type = $('#post_type').val();
checkTitleAjax(title, id, post_type);
});
});
</script>
<?php
}
// 接收前端ajax参数
add_action('wp_ajax_title_checks', 'duplicate_title_checks_callback');
function duplicate_title_checks_callback()
{
global $wpdb;
$title = $_POST['post_title'];
$post_id = $_POST['post_id'];
$post_type = $_POST['post_type'];
$results = $wpdb->get_var(
$wpdb->prepare(
"SELECT COUNT(*) FROM $wpdb->posts WHERE post_status = 'publish' AND post_type = %s AND post_title = %s AND ID != %d",
$post_type,
$title,
$post_id
)
);
if ($results) {
echo "<span style='color:red'>" . __('此标题已存在,请换一个标题!', '') . " </span>";
} else {
echo '<span style="color:green">' . __('恭喜,此标题未与其他文章标题重复!', '') . '</span>';
}
die();
}
// 检测后端标题并且避免同名文章更新草稿
add_action('publish_post', 'duplicate_titles_wallfa_bc');
function duplicate_titles_wallfa_bc($post)
{
global $wpdb;
$title = $_POST['post_title'];
$post_id = $post;
$results = $wpdb->get_var(
$wpdb->prepare(
"SELECT COUNT(*) FROM $wpdb->posts WHERE post_status = 'publish' AND post_type = 'post' AND post_title = %s AND ID != %d",
$title,
$post_id
)
);
if ($results) {
wp_update_post(array(
'ID' => $post,
'post_status' => 'draft'
));
wp_redirect(add_query_arg(array('message' => '10', 'wallfaerror' => '1'), get_edit_post_link($post, 'url')));
exit;
}
}
// 文章提交更新后的提示
add_action('admin_notices', 'not_published_error_notice');
function not_published_error_notice()
{
if (isset($_GET['wallfaerror']) && $_GET['wallfaerror'] == 1) {
?>
<div class="updated">
<p style='color:red'><?php _e('貌似已经存在相同标题的文章,若您使用了文章别名作为固定链接,则可以通过修改本文的固定链接来使标题不再重复!', '') ?></p>
</div>
<?php
}
}
// 禁用自动保存
add_action('wp_print_scripts', 'disable_autosave');
function disable_autosave()
{
wp_deregister_script('autosave');
}
