本文的附件来自于Fatesinger,但原文的附件已失联无法下载,还好我的主题还存留该文件,于是转载大发原文的部份内容,同时提供原来的附件文件,本文主要目的为技术文章和附件收藏,因为不知那天大发的博客完全“消失”,前几天就曾经出现无法访问。
首先说下使用ajax提交评论的好处,提升交互体验就不谈了,最重要的是可以防止垃圾评论,所以我们建议所有Wordpress用户来使用这个方法提交评论。要知道一般垃圾评论都是通过表单机器人提交的,如果使用了ajax评论提交我们就可以禁用wordpress的表单提交,也就是删除或者清空wp根目录下的wp-comment-post.php这个文件。
当然你可能会说我可以使用akismet插件啊,是的,你完全可以,但是这个插件一来会拖慢评论提交的速度,二来会在数据库中的commentmeta中插入大量的无用数据,所以强烈建议使用ajax评论提交。
此方法的优点:
- 防止垃圾评论
- 增强交互体验
- 使用wordpress自带的admin-ajax.php进行数据提交
- 支持评论修改,同时消除了匿名用户可篡改任意评论内容。
具体教程:
等待以及错误提示的小样式,请放在主题的CSS文件尾处。
#loading{padding:5px 0}
#loading img{margin-right:5px;vertical-align: middle;}
#error{padding:5px 0;color:#cc0000}
.ajax-notice {color: #FF6600;font-size: 12px;}
把以下代码加入到你的主题functions.php中,最后面的评论输出部分,找到你自己的评论回调函数,替换成你自己的。
//Ajax comments提交
//载入jquery库
//wp_enqueue_script( 'jquerylib', get_template_directory_uri() . '/js/jquery-1.10.2.min.js' , array(), '1.10.2', false);
wp_enqueue_script( 'base', get_template_directory_uri() . '/js/base.js', array(), '1.00', true);
wp_localize_script('base', 'ajax', array(
'ajax_url' => admin_url('admin-ajax.php'),
));
/*ajax comment submit*/
add_action('wp_ajax_nopriv_ajax_comment', 'ajax_comment');
add_action('wp_ajax_ajax_comment', 'ajax_comment');
function ajax_comment(){
global $wpdb;
//nocache_headers();
$comment_post_ID = isset($_POST['comment_post_ID']) ? (int) $_POST['comment_post_ID'] : 0;
$post = get_post($comment_post_ID);
$post_author = $post->post_author;
if ( empty($post->comment_status) ) {
do_action('comment_id_not_found', $comment_post_ID);
ajax_comment_err('Invalid comment status.');
}
$status = get_post_status($post);
$status_obj = get_post_status_object($status);
if ( !comments_open($comment_post_ID) ) {
do_action('comment_closed', $comment_post_ID);
ajax_comment_err('Sorry, comments are closed for this item.');
} elseif ( 'trash' == $status ) {
do_action('comment_on_trash', $comment_post_ID);
ajax_comment_err('Invalid comment status.');
} elseif ( !$status_obj->public && !$status_obj->private ) {
do_action('comment_on_draft', $comment_post_ID);
ajax_comment_err('Invalid comment status.');
} elseif ( post_password_required($comment_post_ID) ) {
do_action('comment_on_password_protected', $comment_post_ID);
ajax_comment_err('Password Protected');
} else {
do_action('pre_comment_on_post', $comment_post_ID);
}
$comment_author = ( isset($_POST['author']) ) ? trim(strip_tags($_POST['author'])) : null;
$comment_author_email = ( isset($_POST['email']) ) ? trim($_POST['email']) : null;
$comment_author_url = ( isset($_POST['url']) ) ? trim($_POST['url']) : null;
$comment_content = ( isset($_POST['comment']) ) ? trim($_POST['comment']) : null;
$edit_id = ( isset($_POST['edit_id']) ) ? $_POST['edit_id'] : null; // 提取 edit_id
$user = wp_get_current_user();
if ( $user->exists() ) {
if ( empty( $user->display_name ) )
$user->display_name=$user->user_login;
$comment_author = $wpdb->escape($user->display_name);
$comment_author_email = $wpdb->escape($user->user_email);
$comment_author_url = $wpdb->escape($user->user_url);
$user_ID = $wpdb->escape($user->ID);
if ( current_user_can('unfiltered_html') ) {
if ( wp_create_nonce('unfiltered-html-comment_' . $comment_post_ID) != $_POST['_wp_unfiltered_html_comment'] ) {
kses_remove_filters();
kses_init_filters();
}
}
} else {
if ( get_option('comment_registration') || 'private' == $status )
ajax_comment_err('Sorry, you must be logged in to post a comment.');
}
$comment_type = '';
if ( get_option('require_name_email') && !$user->exists() ) {
if ( 6 > strlen($comment_author_email) || '' == $comment_author )
ajax_comment_err( 'Error: please fill the required fields (name, email).' );
elseif ( !is_email($comment_author_email))
ajax_comment_err( 'Error: please enter a valid email address.' );
}
if ( '' == $comment_content )
ajax_comment_err( 'Error: please type a comment.' );
$dupe = "SELECT comment_ID FROM $wpdb->comments WHERE comment_post_ID = '$comment_post_ID' AND ( comment_author = '$comment_author' ";
if ( $comment_author_email ) $dupe .= "OR comment_author_email = '$comment_author_email' ";
$dupe .= ") AND comment_content = '$comment_content' LIMIT 1";
if ( $wpdb->get_var($dupe) ) {
ajax_comment_err('Duplicate comment detected; it looks as though you’ve already said that!');
}
if ( $lasttime = $wpdb->get_var( $wpdb->prepare("SELECT comment_date_gmt FROM $wpdb->comments WHERE comment_author = %s ORDER BY comment_date DESC LIMIT 1", $comment_author) ) ) {
$time_lastcomment = mysql2date('U', $lasttime, false);
$time_newcomment = mysql2date('U', current_time('mysql', 1), false);
$flood_die = apply_filters('comment_flood_filter', false, $time_lastcomment, $time_newcomment);
if ( $flood_die ) {
ajax_comment_err('You are posting comments too quickly. Slow down.');
}
}
$comment_parent = isset($_POST['comment_parent']) ? absint($_POST['comment_parent']) : 0;
$commentdata = compact('comment_post_ID', 'comment_author', 'comment_author_email', 'comment_author_url', 'comment_content', 'comment_type', 'comment_parent', 'user_ID');
if ( $edit_id )
{
$comment_id = $commentdata['comment_ID'] = $edit_id;
if( ihacklog_user_can_edit_comment($commentdata,$comment_id) )
{
wp_update_comment( $commentdata );
}
else
{
ajax_comment_err( 'Cheatin’ uh?' );
}
}
else
{
$comment_id = wp_new_comment( $commentdata );
}
$comment = get_comment($comment_id);
do_action('set_comment_cookies', $comment, $user);
$comment_depth = 1;
$tmp_c = $comment;
while($tmp_c->comment_parent != 0){
$comment_depth++;
$tmp_c = get_comment($tmp_c->comment_parent);
}
$GLOBALS['comment'] = $comment;
?>
<li <?php comment_class(); ?> id="li-comment-<?php comment_ID(); ?>">
<article id="comment-<?php comment_ID(); ?>" class="comment">
<header class="comment-meta comment-author vcard">
<?php
echo get_avatar( $comment, 44 );
printf( '<cite><b class="fn">%1$s</b> %2$s</cite>',
get_comment_author_link(),
// If current post author is also comment author, make it known visually.
( $comment->user_id === $post->post_author ) ? '<span>' . __( 'Post author', 'twentytwelve' ) . '</span>' : ''
);
printf( '<a href="%1$s"><time datetime="%2$s">%3$s</time></a>',
esc_url( get_comment_link( $comment->comment_ID ) ),
get_comment_time( 'c' ),
/* translators: 1: date, 2: time */
sprintf( __( '%1$s at %2$s', 'twentytwelve' ), get_comment_date(), get_comment_time() )
);
?>
</header><!-- .comment-meta -->
<?php if ( '0' == $comment->comment_approved ) : ?>
<p class="comment-awaiting-moderation"><?php _e( 'Your comment is awaiting moderation.', 'twentytwelve' ); ?></p>
<?php endif; ?>
<section class="comment-content comment">
<?php comment_text(); ?>
<?php edit_comment_link( __( 'Edit', 'twentytwelve' ), '<p class="edit-link">', '</p>' ); ?>
</section><!-- .comment-content -->
</article><!-- #comment-## -->
<?php die();
}
function ajax_comment_err($a) {
header('HTTP/1.0 500 Internal Server Error');
header('Content-Type: text/plain;charset=UTF-8');
echo $a;
exit;
}
function ihacklog_user_can_edit_comment($new_cmt_data,$comment_ID = 0) {
if(current_user_can('edit_comment', $comment_ID)) {
return true;
}
$comment = get_comment( $comment_ID );
$old_timestamp = strtotime( $comment->comment_date);
$new_timestamp = current_time('timestamp');
// 不用get_comment_author_email($comment_ID) , get_comment_author_IP($comment_ID)
$rs = $comment->comment_author_email === $new_cmt_data['comment_author_email']
&& $comment->comment_author_IP === $_SERVER['REMOTE_ADDR']
&& $new_timestamp - $old_timestamp < 3600;
return $rs;
}
请点击这里下载JS文件:js文件
js文件放到主题目录的js文件夹下,需要jq1.7版本以上,你可以使用不同方法来加载jquery库,强烈建议使用wp的wp_enqueue_script方法来加载js。
我也来折腾折腾
有没有什么办法,不关闭昵称和邮箱的情况下,能匿名评论,(不要插件)
这个在后台可以设置,评论设置那里。
正在考虑使用该效果,特来看一下
测试一下看看
怎么会没有效果呢?
不太会用。。。
还是自带的官方主题最好看。
是的,换来换去最后还是用回这个官方主题。
最后面的评论输出部分 这个是哪部分?
我的小站,垃圾评论目前还看不上,哈哈。
他那又有更新的ajax提交评论了。。。
你真是折腾狂人啊。http://louishan.com/articles/hostinger-free-host.html 这个也可以折腾了
不想再建站了,也不想再折腾了,不过刚才去看了一下这个免费的主机,速度还是不错的。值得推荐。
真心能折腾,话说你手上不少主题吧?
折腾过的主题不少,但总是不满意,修改了最后又被删掉。
唉,虽然很想也试用一下,但是真心懒得折腾了,哈哈哈
生命在于运动,快感来自折腾,呵呵。
嘻嘻,我又用回Twenty Twelve有主题了,不要找我要主题文件,直接查看本人的CSS文件既可。