现在说这个好像有些过时了,当然这里说的还是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