使用 $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'); }