现在说这个好像有些过时了,当然这里说的还是Willin Kan版本的,本站是用更简单的方式,这里只是记录一个Willin Kan版本的方法。并且添加了一些新功能,这个在功能上恐怕是最全面的了。
首先下载两个文件comments-ajax.js、comments-ajax.php 文件名不要改,因为js里面会抓取的。把他们放到主题根目录下然后引用即可,需要jQuery的支持。
你可以用wp_enqueue_script()来引用这个js,也可以自己添加:
<script type="text/javascript" src="<?php bloginfo('template_directory'); ?>/comments-ajax.js"></script>
引用完毕之后,为了确保你修改相关的选择器和评论列表结构后能出效果,在此前还需要进行一些准备工作:
1、确保下载的js和php文件都放在主题根目录下(当然你看懂代码的话可以放在别的地方,然后修改相对路径)
2、在comments.php里面的评论表单form标签之前添加了回复按钮标签
<div class="cancel-comment-reply"> <small><?php cancel_comment_reply_link(); ?></small> </div>
3、在comments.php里面的评论表单form标签之内添加了评论id域函数(一般在form标签里面的最后面)
<?php comment_id_fields(); ?>
准备就绪之后就可以参照js和php中的注释进行选择器的修改(由INLOJV注释,带×××符号的必须作修改)
comments-ajax.js
/**
* WordPress jQuery-Ajax-Comments v1.3 by Willin Kan.
* URI: http://kan.willin.org/?p=1271
*/
jQuery(document).ready(function($) {
ajaxComt();
});
function ajaxComt(){
var i = 0, got = -1, len = document.getElementsByTagName('script').length;// script标签的数目
while (i <= len && got == -1) { // 这个循环用来抓取patience.js所在文件夹的路径 ,这个patience.js是放在主题js文件夹下的!下面获取ajax_php的相对路径就要注意!
var js_url = document.getElementsByTagName('script')[i].src,
got = js_url.indexOf('patience.js'); // ××××××××××××××××××× 改为本js的名称
i++
}
var edit_mode = '1', // 再編輯模式 ( '1'=開; '0'=不開 )
ajax_php_url = js_url.replace('patience.js', '../comments-ajax.php'), // ××××××对应位置改为ajax php的路径 ../表示当前文件的上一级
wp_url = js_url.substr(0, js_url.indexOf('wp-content')), // 主页地址
pic_sb = wp_url + 'wp-admin/images/loading.gif', // 提交 icon
pic_no = wp_url + 'wp-admin/images/no.png', // 錯誤 icon
pic_ys = wp_url + 'wp-admin/images/yes.png', // 成功 icon
txt1 = '<div id="loading"><img src="' + pic_sb + '" style="vertical-align:middle;" alt=""/> 正在提交, 请稍后...</div>',
txt2 = '<div id="error">#</div>',
txt3 = '"><p id="edit"><img src="' + pic_ys + '" style="vertical-align:middle;" alt=""/> 提交成功',
edt1 = ', 刷新页面之前可以<a rel="nofollow" class="comment-reply-link" href="#edit" onclick=\'return addComment.moveForm("',
edt2 = ')\'>再编辑</a>',
cancel_edit = '取消编辑',
edit,
num = 1,
comm_array=[];
comm_array.push('');
$comments = $('#comments-title'); // 评论计数的ID
$cancel = $('#cancel-comment-reply-link');
cancel_text = $cancel.text();
$submit = $('#comment_form #submit'); // ×××××××××××××××××××××××××××××× 提交按钮的id或class
$submit.attr('disabled', false);
$('#c_tarea').after( txt1 + txt2 ); // ×××××××××××××××××××××××××××××××××× 这是评论表单textarea的id或class
$('#loading').hide();
$('#error').hide();
$body = (window.opera) ? (document.compatMode == "CSS1Compat" ? $('html') : $('body')) : $('html,body');
/** 评论提交 */
$('#comment_form').submit(function() { // ×××××××××× form表单的id,如果用on方法动态绑定,那么就不会受页面ajax影响
$('#loading').slideDown();
$submit.attr('disabled', true).fadeTo('slow', 0.5);
if ( edit ) $('#c_tarea').after('<input type="text" name="edit_id" id="edit_id" value="' + edit + '" style="display:none;" />'); //×××××××× 在textarea标签之后插入
$.ajax( {
url: ajax_php_url, // 这是ajax.php的路径
data: $(this).serialize(),
type: $(this).attr('method'),
// 错误提示
error: function(request) {
$('#loading').slideUp();
$('#error').slideDown().html('<img src="' + pic_no + '" style="vertical-align:middle;" alt=""/> ' + request.responseText);
setTimeout(function() {$submit.attr('disabled', false).fadeTo('slow', 1); $('#error').slideUp();}, 3000);
},
success: function(data) {
$('#loading').hide();
comm_array.push($('#c_tarea').val()); // ×××××××××××××××××××× 这个c-textarea为textarea的id
$('textarea').each(function() {this.value = ''});
var t = addComment, cancel = t.I('cancel-comment-reply-link'), temp = t.I('wp-temp-form-div'), respond = t.I(t.respondId), post = t.I('comment_post_ID').value, parent = t.I('comment_parent').value;
// 增加评论数
if ( ! edit && $comments.length ) {
n = parseInt($comments.text().match(/\d+/));
$comments.text($comments.text().replace( n, n + 1 ));
}
// 评论显示
new_htm = '" id="new_comm_' + num + '"></';
new_htm = ( parent == '0' ) ? ('\n<ol style="clear:both;" class="comment-list' + new_htm + 'ol>') : ('\n<ul class="children' + new_htm + 'ul>'); // ×××××××评论列表的class
ok_htm = '\n<span id="success_' + num + txt3;
if ( edit_mode == '1' ) {
div_ = (document.body.innerHTML.indexOf('div-comment-') == -1) ? '' : ((document.body.innerHTML.indexOf('li-comment-') == -1) ? 'div-' : '');
ok_htm = ok_htm.concat(edt1, div_, 'comment-', parent, '", "', parent, '", "respond", "', post, '", ', num, edt2);
}
ok_htm += '</p></span><span></span>\n';
if($('#comments .comment-list').length>0){ // ××××××××××××××××××××非嵌套评论时,新评论显示插入的位置(按自己的喜好修改显示位置)
$('#comments .comment-list').before(new_htm);
} else{
$('#respond').after(new_htm);
}
$('#new_comm_' + num).hide().append(data);
$('#new_comm_' + num + ' li').append(ok_htm);
$('#new_comm_' + num).fadeIn(4000);
$body.animate( { scrollTop: $('#new_comm_' + num).offset().top - 200}, 900);
countdown(); num++ ; edit = ''; $('*').remove('#edit_id');
cancel.style.display = 'none';
cancel.onclick = null;
t.I('comment_parent').value = '0';
if ( temp && respond ) {
temp.parentNode.insertBefore(respond, temp);
temp.parentNode.removeChild(temp)
}
}
}); // end Ajax
return false;
}); // end submit
/** 移动回复表单 */
addComment = {
moveForm : function(commId, parentId, respondId, postId, num) {
var t = this, div, comm = t.I(commId), respond = t.I(respondId), cancel = t.I('cancel-comment-reply-link'), parent = t.I('comment_parent'), post = t.I('comment_post_ID');
if ( edit ) exit_prev_edit();
num ? (
t.I('c_tarea').value = comm_array[num],// ××××××××××××××××××××这个为textarea的id
edit = t.I('new_comm_' + num).innerHTML.match(/(comment-)(\d+)/)[2],
$new_sucs = $('#success_' + num ), $new_sucs.hide(),
$new_comm = $('#new_comm_' + num ), $new_comm.hide(),
$cancel.text(cancel_edit)
) : $cancel.text(cancel_text);
t.respondId = respondId;
postId = postId || false;
if ( !t.I('wp-temp-form-div') ) {
div = document.createElement('div');
div.id = 'wp-temp-form-div';
div.style.display = 'none';
respond.parentNode.insertBefore(div, respond);
}
!comm ? (
temp = t.I('wp-temp-form-div'),
t.I('comment_parent').value = '0',
temp.parentNode.insertBefore(respond, temp),
temp.parentNode.removeChild(temp)
) : comm.parentNode.insertBefore(respond, comm.nextSibling);
$body.animate( { scrollTop: $('#respond').offset().top - 180 }, 400);
if ( post && postId ) post.value = postId;
parent.value = parentId;
cancel.style.display = '';
// 取消回复
cancel.onclick = function() {
if ( edit ) exit_prev_edit();
var t = addComment, temp = t.I('wp-temp-form-div'), respond = t.I(t.respondId);
t.I('comment_parent').value = '0';
if ( temp && respond ) {
temp.parentNode.insertBefore(respond, temp);
temp.parentNode.removeChild(temp);
}
this.style.display = 'none';
this.onclick = null;
$('textarea').val('');
return false;
};
/*try { t.I('comment').focus(); }
catch(e) {}*/
$('#c_tarea').focusEnd(); // ××××××××××××××××××××这个为textarea的id
return false;
},
I : function(e) {
return document.getElementById(e);
}
}; // end addComment
function exit_prev_edit() {
$new_comm.show(); $new_sucs.show();
$('textarea').each(function() {this.value = ''});
edit = '';
}
/** 重编辑等待时间 防止快速提交 */
var wait = 15, submit_val = $submit.val();
function countdown() {
if ( wait > 0 ) {
$submit.val(wait); wait--; setTimeout(countdown, 1000);
} else {
$submit.val(submit_val).attr('disabled', false).fadeTo('slow', 1);
wait = 15;
}
}
$.fn.setCursorPosition = function(position){
if(this.lengh == 0) return this;
return $(this).setSelection(position, position);
}
$.fn.setSelection = function(selectionStart, selectionEnd) {
if(this.lengh == 0) return this;
input = this[0];
if (input.createTextRange) {
var range = input.createTextRange();
range.collapse(true);
range.moveEnd('character', selectionEnd);
range.moveStart('character', selectionStart);
range.select();
} else if (input.setSelectionRange) {
input.focus();
input.setSelectionRange(selectionStart, selectionEnd);
}
return this;
}
$.fn.focusEnd = function(){
this.setCursorPosition(this.val().length);
}
}
comments-ajax.php
<?php
/**
* WordPress 內置嵌套評論專用 Ajax comments >> WordPress-jQuery-Ajax-Comments v1.3 by Willin Kan.
*
* 說明: 這個文件是由 WP 3.0 根目錄的 wp-comment-post.php 修改的, 修改的地方有注解. 當 WP 升級, 請注意可能有所不同.
*/
if ( 'POST' != $_SERVER['REQUEST_METHOD'] ) {
header('Allow: POST');
header('HTTP/1.1 405 Method Not Allowed');
header('Content-Type: text/plain');
exit;
}
/** Sets up the WordPress Environment. */
require( dirname(__FILE__) . '/../../../wp-load.php' ); // 此 comments-ajax.php 位於主題資料夾,所以位置已不同
nocache_headers();
$comment_post_ID = isset($_POST['comment_post_ID']) ? (int) $_POST['comment_post_ID'] : 0;
$post = get_post($comment_post_ID);
if ( empty($post->comment_status) ) {
do_action('comment_id_not_found', $comment_post_ID);
err(__( 'Invalid comment status.' , 'inlojv' )); // 將 exit 改為錯誤提示
}
// get_post_status() will get the parent status for attachments.
$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);
err(__('Sorry, comments are closed for this item.','inlojv')); // 將 wp_die 改為錯誤提示
} elseif ( 'trash' == $status ) {
do_action('comment_on_trash', $comment_post_ID);
err(__('Invalid comment status.','inlojv')); // 將 exit 改為錯誤提示
} elseif ( !$status_obj->public && !$status_obj->private ) {
do_action('comment_on_draft', $comment_post_ID);
err(__('Invalid comment status.','inlojv')); // 將 exit 改為錯誤提示
} elseif ( post_password_required($comment_post_ID) ) {
do_action('comment_on_password_protected', $comment_post_ID);
err(__('Password Protected','inlojv')); // 將 exit 改為錯誤提示
} 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
// If the user is logged in
$user = wp_get_current_user();
if ( $user->ID ) {
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);
if ( current_user_can('unfiltered_html') ) {
if ( wp_create_nonce('unfiltered-html-comment_' . $comment_post_ID) != $_POST['_wp_unfiltered_html_comment'] ) {
kses_remove_filters(); // start with a clean slate
kses_init_filters(); // set up the filters
}
}
} else {
if ( get_option('comment_registration') || 'private' == $status )
err(__('Sorry, you must be logged in to post a comment.','inlojv')); // 將 wp_die 改為錯誤提示
}
$comment_type = '';
if ( get_option('require_name_email') && !$user->ID ) {
if ( 6 > strlen($comment_author_email) || '' == $comment_author )
err( __('Error: please fill the required fields (name, email).','inlojv') ); // 將 wp_die 改為錯誤提示
elseif ( !is_email($comment_author_email))
err( __('Error: please enter a valid email address.','inlojv') ); // 將 wp_die 改為錯誤提示
}
if ( '' == $comment_content )
err( __('Error: please type a comment.','inlojv') ); // 將 wp_die 改為錯誤提示
// 增加: 錯誤提示功能
function err($ErrMsg) {
header('HTTP/1.1 405 Method Not Allowed');
echo $ErrMsg;
exit;
}
// 增加: 檢查重覆評論功能
$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) ) {
err(__('Duplicate comment detected; it looks as though you’ve already said that!','inlojv'));
}
// 增加: 檢查評論太快功能
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 ) {
err(__('You are posting comments too quickly. Slow down.','inlojv'));
}
}
$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');
// 增加: 檢查評論是否正被編輯, 更新或新建評論 修改版,Kan的Ajax评论任意修改漏洞
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');
$rs = $comment->comment_author_email === $new_cmt_data['comment_author_email'] && $comment->comment_author_IP === $_SERVER['REMOTE_ADDR'] && $new_timestamp - $old_timestamp < 1800;
return $rs;
}
if( $edit_id ){
$comment_id = $commentdata['comment_ID'] = $edit_id;
if( ihacklog_user_can_edit_comment($commentdata,$comment_id) ){
wp_update_comment( $commentdata );
} else {
err('You are not allowed to edit this comment!');
}
} else {
$comment_id = wp_new_comment( $commentdata );
}
$comment = get_comment($comment_id);
if ( !$user->ID ) {
$comment_cookie_lifetime = apply_filters('comment_cookie_lifetime', 30000000);
setcookie('comment_author_' . COOKIEHASH, $comment->comment_author, time() + $comment_cookie_lifetime, COOKIEPATH, COOKIE_DOMAIN);
setcookie('comment_author_email_' . COOKIEHASH, $comment->comment_author_email, time() + $comment_cookie_lifetime, COOKIEPATH, COOKIE_DOMAIN);
setcookie('comment_author_url_' . COOKIEHASH, esc_url($comment->comment_author_url), time() + $comment_cookie_lifetime, COOKIEPATH, COOKIE_DOMAIN);
}
//$location = empty($_POST['redirect_to']) ? get_comment_link($comment_id) : $_POST['redirect_to'] . '#comment-' . $comment_id; //取消原有的刷新重定向
//$location = apply_filters('comment_post_redirect', $location, $comment);
//wp_redirect($location);
$comment_depth = 1; //为评论的 class 属性准备的
$tmp_c = $comment;
while($tmp_c->comment_parent != 0){
$comment_depth++;
$tmp_c = get_comment($tmp_c->comment_parent);
}
?>
<?php
// 评论列表模板,用回调函数里面的列表函数替换,一般在functions.php里面找得到,
// 对应comments.php里面wp_list_comments('type=comment&callback=xxxxxx');内callback的函数内容
$avatar = get_avatar ( $comment->comment_author_email, 55 );
echo '<li '; comment_class(); echo ' id="comment-'.get_comment_ID().'">';
//头像
echo '<div class="cl-avatar">';
echo $avatar;
echo '</div>';
//评论主体
echo '<div class="cl-main" id="div-comment-'.get_comment_ID().'">';
//信息
echo '<div class="cl-meta">';
if ($comment->comment_type == '') {
$author_link = empty ( $comment->comment_author_url ) ? null : ' href="' . $comment->comment_author_url . '"';
$author = $comment->comment_author;
$comment_ID = get_comment_ID();
echo <<<EOF
<span class="cl-author-{$comment_ID}"><a title="{$author}" rel="external nofollow" target="_blank" class="cl-author-url"{$author_link}>{$author}</a></span>
EOF;
}
echo get_comment_time ( 'Y-n-j H:i' );
if ($comment->comment_approved !== '0'){
echo comment_reply_link( array_merge( $args, array('add_below' => 'div-comment', 'depth' => $depth, 'max_depth' => $args['max_depth'] ) ) );
echo edit_comment_link(__('( 编辑 )'),' - ','');
}
echo '</div>';
//内容
echo '<div class="cl-content" >';
echo convert_smilies(get_comment_text());
if ($comment->comment_approved == '0'){
echo '<span class="cl-approved">(您的评论需要审核后才能显示!)</span><br />';
}
echo '</div>';
echo '</div>';
?>
本站文章除注明转载/出处外,均为本站原创或翻译。若要转载但请务必注明出处,尊重他人劳动成果。
转载请注明出处链接 : https://www.inlojv.com/4125.html
