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