Всем привет! тема, которая была поднята мной пару дней назад,
По данной теме всё получилось, всё работает. Но, случайно заметил, что публикация комментария без перезагрузки страницы происходит только к первому посту на странице, и можно ответить на комментарий без перезагрузки на любой комментарий любого поста на этой странице...
Где блин ошибка...
ajax
jQuery.extend(jQuery.fn, {
/*
* функция проверки, что длина поля не меньше 3х символов
*/
checka: function () {
if (jQuery(this).val().length < 3) {jQuery(this).addClass('error');return false} else {jQuery(this).removeClass('error');return true}
},
/*
* функция проверки правильности введенного email
*/
checke: function () {
var emailReg = /^([\w-\.]+@([\w-]+\.)+[\w-]{2,4})?$/;
var emailaddressVal = jQuery(this).val();
if (!emailReg.test(emailaddressVal) || emailaddressVal == "") {
jQuery(this).addClass('error');return false
} else {
jQuery(this).removeClass('error');return true
}
},
});
jQuery(function($){
$('#commentform').submit(function(){
// может такое случиться, что пользователь залогинен - нужно это проверить, иначе валидация не пройдет
if($("#author").length) var author = $("#author").checka();
if($("#email").length) var email = $("#email").checke();
var comment = $("#comment").checka();
// небольшое условие для того, чтобы исключить двойные нажатия на кнопку отправки
// в это условие также входит валидация полей
if (!$('#submit').hasClass('loadingform') && !$("#author").hasClass('error') && !$("#email").hasClass('error') && !$("#comment").hasClass('error')){
$.ajax({
type : 'POST',
url : 'http://' + location.host + '/wp-admin/admin-ajax.php',
data: $(this).serialize() + '&action=ajaxcomments',
beforeSend: function(xhr){
// действие при отправке формы, сразу после нажатия на кнопку #submit
$('#submit').addClass('loadingform').val('Загрузка');
},
error: function (request, status, error) {
if(status==500){
alert('Ошибка при добавлении комментария');
} else if(status=='timeout'){
alert('Ошибка: Сервер не отвечает, попробуй ещё.');
} else {
// ворпдрессовские ошибочки, не уверен, что это самый оптимальный вариант
// если знаете способ получше - поделитесь
var errormsg = request.responseText;
var string1 = errormsg.split("<p>");
var string2 = string1[1].split("</p>");
alert(string2[0]);
}
},
success: function (newComment) {
// Если уже есть какие-то комментарии
if($('.comment-list').length > 0){
// Если текущий комментарий является ответом
if($('#respond').parent().hasClass('comment')){
// Если уже есть какие-то ответы
if($('#respond').parent().children('.children').length){
$('#respond').parent().children('.children').append(newComment);
} else {
// Если нет, то добавляем <ul class="children">
newComment = '<ul class="children">'+newComment+'</ul>';
$('#respond').parent().append(newComment);
}
// закрываем форму ответа
$("#cancel-comment-reply-link").trigger("click");
} else {
// обычный коммент
$('.comment-list').append(newComment);
}
}else{
// если комментов пока ещё нет, тогда
newComment = '<ol class="comment-list">'+newComment+'</ol>';
$('#respond').before($(newComment));
}
// очищаем поле textarea
$('#comment').val('');
},
complete: function(){
// действие, после того, как комментарий был добавлен
$('#submit').removeClass('loadingform').val('Отправить');
}
});
}
return false;
});
});
Код функции
function true_add_ajax_comment(){
global $wpdb;
$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);
exit;
}
$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);
wp_die( __('Sorry, comments are closed for this item.') );
} elseif ( 'trash' == $status ) {
do_action('comment_on_trash', $comment_post_ID);
exit;
} elseif ( !$status_obj->public && !$status_obj->private ) {
do_action('comment_on_draft', $comment_post_ID);
exit;
} elseif ( post_password_required($comment_post_ID) ) {
do_action('comment_on_password_protected', $comment_post_ID);
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;
/*
* проверяем, залогинен ли пользователь
*/
$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 = get_current_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(); // start with a clean slate
kses_init_filters(); // set up the filters
}
}
} else {
if ( get_option('comment_registration') || 'private' == $status )
wp_die( 'Вы должны зарегистрироваться или войти, чтобы оставлять комментарии.' );
}
$comment_type = '';
/*
* проверяем, заполнил ли пользователь все необходимые поля
*/
if ( get_option('require_name_email') && !$user->exists() ) {
if ( 6 > strlen($comment_author_email) || '' == $comment_author )
wp_die( 'Ошибка: заполните необходимые поля (Имя, Email).' );
elseif ( !is_email($comment_author_email))
wp_die( 'Ошибка: введенный вами email некорректный.' );
}
if ( '' == trim($comment_content) || '<p><br></p>' == $comment_content )
wp_die( 'Вы забыли про комментарий.' );
/*
* добавляем новый коммент и сразу же обращаемся к нему
*/
$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');
$comment_id = wp_new_comment( $commentdata );
$comment = get_comment($comment_id);
/*
* выставляем кукисы
*/
do_action('set_comment_cookies', $comment, $user);
/*
* вложенность комментариев
*/
$comment_depth = 1;
while($comment_parent){
$comment_depth++;
$parent_comment = get_comment($comment_parent);
$comment_parent = $parent_comment->comment_parent;
}
$GLOBALS['comment'] = $comment;
$GLOBALS['comment_depth'] = $comment_depth;
/*
* ниже идет шаблон нового комментария
*/
?>
<li <?php comment_class(); ?> id="li-comment-<?php comment_ID(); ?>">
<div class="comment-body" id="comment-<?php comment_ID(); ?>">
<div class="comment-author vcard">
<?php echo get_avatar( $comment, 40 ); ?>
<cite class="fn"><?php echo get_comment_author_link(); ?></cite>
</div>
<?php if ( $comment->comment_approved == '0' ) : ?>
<em class="comment-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 в %2$s', get_comment_date(), get_comment_time() ); ?></a><?php edit_comment_link('Изменить', ' ' ); ?>
</div>
<div class="comment-content"><?php comment_text(); ?></div>
</div>
</li>
<?php
die();
}
add_action('wp_ajax_ajaxcomments', 'true_add_ajax_comment'); // wp_ajax_{значение параметра action}
add_action('wp_ajax_nopriv_ajaxcomments', 'true_add_ajax_comment'); // wp_ajax_nopriv_{значение параметра action}
После 5 часов поиска проблемы написал сюда...
Если браузер хром, то можно
1. открыть инструменты разработчика (пкм -> посмотреть код)
2. перейти на вкладку Network
3. Выбрать XHR и поставить галочку Preserve log (не очищать логи при обновлении страницы)
Тогда там можно будет посмотреть какой запрос отправляется на сервер и что сервер возвращает, обычно это помогает найти проблему.
Еще можно попробовать заменить
$('#commentform').submit(function(){
на
$('#commentform').submit(function(event){
event.preventDefault();
Preci сказал(а)
Если браузер хром, то можно
1. открыть инструменты разработчика (пкм -> посмотреть код)
2. перейти на вкладку Network
3. Выбрать XHR и поставить галочку Preserve log (не очищать логи при обновлении страницы)Тогда там можно будет посмотреть какой запрос отправляется на сервер и что сервер возвращает, обычно это помогает найти проблему.
Еще можно попробовать заменить
$('#commentform').submit(function(){
на
$('#commentform').submit(function(event){ event.preventDefault();
Данное изменение в коде не помогло.
Короче, пока ищу проблему в коде, сделал как посоветовал Андрей CS
можно указать якорь, к которому страница будет прокручиваться, но блок комментария должен иметь идентификатор на который и будет ссылаться якорь.
Допустим, идентификатор блока комментария - comment-100, где 100 - идентификатор комментария в БД, то код должен быть:function post_redirect( $location, $comment ){ return isset($_SERVER['HTTP_REFERER'])? $_SERVER['HTTP_REFERER'].'#comment-'.$comment->comment_ID:'redirect-form.html'; }