Домой WordPress WordPress: Вопросы и ответы Ajax срабатывает только на первый пост на странице
5ответ(ов) в теме
DJBANDERAS
не в сети 5 лет
На сайте с 15.10.2018
Участник
Тем 31
Сообщения 108
1
03:39

Всем привет! тема, которая была поднята мной пару дней назад,

Вы не можете просматривать опубликованные ссылки

По данной теме всё получилось, всё работает. Но, случайно заметил, что публикация комментария без перезагрузки страницы происходит только к первому посту на странице, и можно ответить на комментарий без перезагрузки на любой комментарий любого поста на этой странице...
Где блин ошибка...

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 часов поиска проблемы написал сюда...

Редакции сообщения
29.10.2018 03:41DJBANDERASПричина: не указано
0
DJBANDERAS
не в сети 5 лет
На сайте с 15.10.2018
Участник
Тем 31
Сообщения 108
2
03:45

Мне кажется, у меня проблема с индефикатором поста... Как-то дополнительно поиндетефицировать посты может

0
Preci
не в сети 18 часов
На сайте с 11.11.2014
Участник
Тем 71
Сообщения 1643
3
04:06

Если браузер хром, то можно
1. открыть инструменты разработчика (пкм -> посмотреть код)
2. перейти на вкладку Network
3. Выбрать XHR и поставить галочку Preserve log (не очищать логи при обновлении страницы)

Тогда там можно будет посмотреть какой запрос отправляется на сервер и что сервер возвращает, обычно это помогает найти проблему.

Еще можно попробовать заменить

$('#commentform').submit(function(){

на
$('#commentform').submit(function(event){
event.preventDefault();

1
DJBANDERAS
не в сети 5 лет
На сайте с 15.10.2018
Участник
Тем 31
Сообщения 108
4
12:36

Preci сказал(а)
Если браузер хром, то можно
1. открыть инструменты разработчика (пкм -> посмотреть код)
2. перейти на вкладку Network
3. Выбрать XHR и поставить галочку Preserve log (не очищать логи при обновлении страницы)

Тогда там можно будет посмотреть какой запрос отправляется на сервер и что сервер возвращает, обычно это помогает найти проблему.

Еще можно попробовать заменить

$('#commentform').submit(function(){

на
$('#commentform').submit(function(event){
event.preventDefault();

Данное изменение в коде не помогло.

0
DJBANDERAS
не в сети 5 лет
На сайте с 15.10.2018
Участник
Тем 31
Сообщения 108
5
12:52

Короче, пока ищу проблему в коде, сделал как посоветовал Андрей CS

можно указать якорь, к которому страница будет прокручиваться, но блок комментария должен иметь идентификатор на который и будет ссылаться якорь.
Допустим, идентификатор блока комментария - comment-100, где 100 - идентификатор комментария в БД, то код должен быть:

function post_redirect( $location, $comment ){
    return isset($_SERVER['HTTP_REFERER'])? $_SERVER['HTTP_REFERER'].'#comment-'.$comment->comment_ID:'redirect-form.html';
}

0
Вы не имеете права на публикацию сообщений в этой теме