WordPress ajax評論回複功能實現方法

來源:互聯網
上載者:User


第一,將comments-ajax.js 及 comments-ajax.php 放在你所使用主題的檔案夾內;

comments-ajax.js

 代碼如下 複製代碼

var i = 0, got = -1, len = document.getElementsByTagName('script').length;
while ( i <= len && got == -1){
 var js_url = document.getElementsByTagName('script')[i].src,
   got = js_url.indexOf('comments-ajax.js'); i++ ;
}
var edit_mode = '1', // 再??模式 ( '1'=?; '0'=不? )
  ajax_php_url = js_url.replace('-ajax.js','-ajax.php'),
  wp_url = js_url.substr(0, js_url.indexOf('wp-content')),
  pic_sb = wp_url + 'wp-admin/images/wpspin_dark.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 = '"><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('');

jQuery(document).ready(function($) {
  $comments = $('#comments-title'); // ???檔 ID
  $cancel = $('#cancel-comment-reply-link'); cancel_text = $cancel.text();
  $submit = $('#commentform #submit'); $submit.attr('disabled', false);
  $('#comment').after( txt1 + txt2 ); $('#loading').hide(); $('#error').hide();
  $body = (window.opera) ? (document.compatMode == "CSS1Compat" ? $('html') : $('body')) : $('html,body');

/** submit */
$('#commentform').submit(function() {
  $('#loading').slideDown();
  $submit.attr('disabled', true).fadeTo('slow', 0.5);
  if ( edit ) $('#comment').after('<input type="text" name="edit_id" id="edit_id" value="' + edit + '" style="display:none;" />');

/** Ajax */
 $.ajax( {
  url: ajax_php_url,
  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($('#comment').val());
   $('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;

// comments
  if ( ! edit && $comments.length ) {
   n = parseInt($comments.text().match(/d+/));
   $comments.text($comments.text().replace( n, n + 1 ));
  }

// show comment
  new_htm = '" id="new_comm_' + num + '"></';
  new_htm = ( parent == '0' ) ? ('n<ol style="clear:both;" class="commentlist' + new_htm + 'ol>') : ('n<ul class="children' + new_htm + 'ul>');

  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 += '</span><span></span>n';

  $('#respond').before(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

/** comment-reply.dev.js */
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('comment').value = comm_array[num],
   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;
   return false;
  };

  try { t.I('comment').focus(); }
  catch(e) {}

  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;
  }
}

});// end jQ

comments-ajax.php

 代碼如下 複製代碼

<?php
/**
 * WordPress ?戎們短自u??S Ajax comments >> WordPress-jQuery-Ajax-Comments v1.3 by Willin Kan.
 * www.111cn.net
 * ?明: ???檔案是由 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 位於主??料?A,所以位置已不同

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.')); // ? exit 改?殄e?提示
}

// 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.')); // ? wp_die 改?殄e?提示
} elseif ( 'trash' == $status ) {
 do_action('comment_on_trash', $comment_post_ID);
 err(__('Invalid comment status.')); // ? exit 改?殄e?提示
} elseif ( !$status_obj->public && !$status_obj->private ) {
 do_action('comment_on_draft', $comment_post_ID);
 err(__('Invalid comment status.')); // ? exit 改?殄e?提示
} elseif ( post_password_required($comment_post_ID) ) {
 do_action('comment_on_password_protected', $comment_post_ID);
 err(__('Password Protected')); // ? exit 改?殄e?提示
} 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.')); // ? wp_die 改?殄e?提示
}

$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).') ); // ? wp_die 改?殄e?提示
 elseif ( !is_email($comment_author_email))
  err( __('Error: please enter a valid email address.') ); // ? wp_die 改?殄e?提示
}

if ( '' == $comment_content )
 err( __('Error: please type a comment.') ); // ? wp_die 改?殄e?提示

// 增加: ??提示功能
function err($ErrMsg) {
    header('HTTP/1.1 405 Method Not Allowed');
    echo $ErrMsg;
    exit;
}

// 增加: ?z查重覆??功能
$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&#8217;ve already said that!'));
}

// 增加: ?z查??太快功能
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.'));
 }
}

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

// 增加: ?z查??是否正被??, 更新或建立??
if ( $edit_id ){
$comment_id = $commentdata['comment_ID'] = $edit_id;
wp_update_comment( $commentdata );
} 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);
}

//以下是??式?? 不含 "回覆". 要用你模板的式? copy 覆?.
?>
 <li <?php comment_class(); ?> id="li-comment-<?php comment_ID(); ?>">
  <div id="comment-<?php comment_ID(); ?>">
  <div class="comment-author vcard">
   <?php echo get_avatar( $comment,$size='40',$default='<path_to_url>' ); ?>
   <?php printf( __( '<cite class="fn">%s</cite> <span class="says">says:</span>'), get_comment_author_link() ); ?>
  </div>
  <?php if ( $comment->comment_approved == '0' ) : ?>
   <em><?php _e( 'Your comment is awaiting moderation.' ); ?></em>
   <br />
   
  <?php endif; ?>

  <div class="comment-meta commentmetadata"><a href="<?php echo esc_url( get_comment_link( $comment->comment_ID ) ); ?>"><?php printf( __( '%1$s at %2$s' ), get_comment_date(),  get_comment_time() ); ?></a><?php edit_comment_link( __( '(Edit)' ), ' ' ); ?></div>

  <div class="comment-body"><?php comment_text(); ?></div>

 </div>

第二,在主題檔案夾中開啟header.php,找到:

 代碼如下 複製代碼

<?php if ( is_singular() ) wp_enqueue_script( ‘comment-reply’ ); ?>

修改為:

<?php if ( is_singular() ){ ?>
<script type=”text/javascript” src=”http://ajax.googleapis.com/ajax/libs/jquery/1.2.3/jquery.min.js”></script>
<script type=”text/javascript” src=”<?php bloginfo(‘template_directory’); ?>/comments-ajax.js”></script>
<?php } ?>

好了,就是這麼簡單。清除緩衝,重新整理。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.