nanny_ogg
@nanny_ogg
My name is Masha. I'm from Russia

Как получить значение data в success?

Добрый день. Возникла проблема с передаваемыми данными в ajax.
Код запроса
function setVote(type_vote, element){
		var user_id = $(element).siblings('.current-user-id').val(),
			post_id = $(element).siblings('.current-post-id').val();

		$.ajax({
		  url: '/wp-content/themes/theme/include/profile/forms-handler.php',
		  type: 'POST',
		  dataType: 'json',
		  data: {
	            'user_id': user_id, 
	            'post_id': post_id,
	            'type_vote': type_vote,
	            'action': 'vote'
	      },
		  success: function(data) {
		    if(data.result == 'success'){
                var count = parseInt(element.find('b').html());
                element.find('b').html(count+1);
            } else {
                alert('Вы уже проголосовали');
            } 
		  },
		  error: function(xhr, textStatus, errorThrown) {
		    // console.log(data);
		  }
		});
	}
$('div.like').click(function(){
        setVote('like', $(this));
    });
     
    $('div.dislike').click(function(){
        setVote('dislike', $(this));
    });


Код обработчика
if(isset($_POST['action']) && $_POST['action'] == 'vote'){
		$section_wall_data = new sectionWall();
		$section_wall_data->setVotedUsers($_POST['post_id'], $_POST['user_id'], $_POST['type_vote']);
	}


Код метода из обработчика
function setVotedUsers($post_id, $voted_user_id, $type_vote){
		$voted_users_array = $this->getVotedUsers($post_id);
		global $wpdb;
		if (in_array($voted_user_id.'(+)', $voted_users_array)){
			$error = 'Вы уже голосовали';
		} else if(in_array($voted_user_id.'(-)', $voted_users_array)){
			$error = 'Вы уже голосовали';
		} else {
			if($type_vote == 'like'){
				$field_name = 'likes';
				$field_postfix = '(+)';
			}  
			if($type_vote == 'dislike'){
				$field_name = 'dislikes';
				$field_postfix = '(-)';
			} 
			$wpdb->query('UPDATE my_wall SET voted_users = CONCAT(voted_users, "'.$voted_user_id.$field_postfix.' ") WHERE ID = '.$post_id.'');
			$wpdb->query('UPDATE my_wall SET '.$field_name.' = '.$field_name.' +1 WHERE ID = '.$post_id.'');
		}
		if(!empty($error)){
		    echo json_encode(array('result' => 'error', 'msg' => $error));
		}else{
		    echo json_encode(array('result' => 'success'));
		}
	}


Вся беда в том, что в консоли, если посмотреть, все нормально. POST отправляет все, что надо, в ответе сервера сообщения те, которые нужны, то есть обработчик работает правильно.

Например,
JSON:
result: "error"
msg: "Вы уже голосовали".

Но в sucsess ajax запроса data не содержит этот массив, она вообще ничего не содержит. В чем тут может быть проблема, подскажите, пожалуйста
  • Вопрос задан
  • 2452 просмотра
Пригласить эксперта
Ответы на вопрос 3
А где, собственно, возвращаете данные? Добавьте return тут:
return $section_wall_data->setVotedUsers($_POST['post_id'], $_POST['user_id'], $_POST['type_vote']);

и замените им echo тут:
if(!empty($error)){
        return json_encode(array('result' => 'error', 'msg' => $error));
    }else{
        return json_encode(array('result' => 'success'));
    }

И, разве не нужно распарсить возвращаемое значение в функции success в JS?
Ответ написан
Комментировать
А какую версию jQuery вы используете? Начиная с версии 3.0 функции success(), error() и complete() удалены. Вместо этого нужно использовать done(), fail() и always().

В вашем случае будет так:
$.ajax({
    url: '/wp-content/themes/theme/include/profile/forms-handler.php',
    type: 'POST',
    dataType: 'json',
    data: {
          'user_id': user_id, 
          'post_id': post_id,
          'type_vote': type_vote,
          'action': 'vote'
    },
})
.done(function(data) {
    if(data.result == 'success'){
        var count = parseInt(element.find('b').html());
        element.find('b').html(count+1);
    } else {
        alert('Вы уже проголосовали');
    }
});
Ответ написан
nanny_ogg
@nanny_ogg Автор вопроса
My name is Masha. I'm from Russia
В общем, если у кого-то возникнет такая же проблема, моя была - в некорректной обработке вордпрессом не своего запроса ajax. Если использовать встроенный ajax, то в data все возвращается в нормальном виде
$.ajax({ cache: false,
		    url: window.wp_data.ajax_url,
		    type: 'POST',
			dataType: 'json',
			data: {
			    'action':'users_vote',
			    'user_id': user_id, 
			    'post_id': post_id,
			    'type_vote': type_vote
			}
		}).done(function (data) {
		    if(data.result == 'success'){
		        var count = parseInt(element.find('b').html());
		        element.find('b').html(count+1);
		    } else {
		        alert('Вы уже проголосовали');
		    }
		}).fail(function (jqXHR, textStatus) {
		    
		});

add_action('wp_ajax_users_vote', 'users_vote');
add_action('wp_ajax_nopriv_users_vote', 'users_vote');


function users_vote(){
	$section_wall_data = new sectionWall();
	return $section_wall_data->setVotedUsers($_POST['post_id'], $_POST['user_id'], $_POST['type_vote']);
	wp_die();
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы