Всем привет! тема, которая была поднята мной пару дней назад,
По данной теме всё получилось, всё работает. Но, случайно заметил, что публикация комментария без перезагрузки страницы происходит только к первому посту на странице, и можно ответить на комментарий без перезагрузки на любой комментарий любого поста на этой странице...
Где блин ошибка...
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'; }