Intereting Posts
Отобразить загрузку автора и загруженный идентификатор сообщения pre_get_posts, используя числовое сравнение meta_query (из дат) WP_Query с meta_query не будет упорядочивать Отменить регистрацию нескольких скриптов с помощью функции? Как скрыть сообщение из архивов Просмотр вывода при срабатывании «Вспышка сгенерирована x символов неожиданного выхода при активации» Как предотвратить удаление учетных записей пользователей в WordPress Back-end? WP_Query не получает липкий пост вверху, когда используется в шаблоне страницы Группировка пост-типов в цикле Как удалить параметр «Показать панель инструментов»? Форумы Vanilla в качестве замены комментариев WordPress? Проверить URL-адрес запроса для шаблона Удалить текущую страницу_страницы из страницы с сообщениями в меню навигации WordPress Невозможно выполнить санитарию в настройках и скрыться в теме, не удаляя пользователя для использования «<br>», чтобы вставить разрыв строки Путь URL-адреса файла Word неверен

WordPress Ajax Login без перезагрузки страницы

В настоящее время я разрабатываю тему WordPress, где хочу, чтобы пользователь мог загружать изображения, прежде чем регистрироваться или регистрироваться на сайте.

Первоначальная проблема заключалась в том, что вы не можете загружать изображения в WordPress с помощью wp.media JavaScript wp.media если вы не являетесь зарегистрированным пользователем.

Решение, которое я создаю, на самом деле очень просто:

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

  2. Теперь сложная часть. Я хочу, чтобы WordPress идентифицировал этого пользователя при входе в систему без перезагрузки страницы, чтобы сделать эту работу я добавил функцию к действию set_logged_in_cookie , поэтому я могу получить данные $_COOKIE WordPress собирается установить этому новому зарегистрированному пользователю и получить он через вызов ajax, я затем устанавливаю эти данные cookie на локальном компьютере пользователя с помощью JavaScript.

Теперь я могу получить правильные данные для cookie (PHP работает нормально) и установить его также без проблем (JavaScript тоже хорошо работает). Если я $_COOKIE глобальный $_COOKIE после перезагрузки страницы, я получу те же самые данные, которые получаю в JavaScript-вызове JavaScript-кода JavaScript, но после того, как я установил cookie в код JavaScript, без перезагрузки и когда я пытаюсь загрузить с помощью wp.media ничего не работает, после перезагрузки страницы он работает отлично.

Любые предложения? Bellow – это мой текущий код (я оставил только соответствующий код):

  // set action to get the cookie data $this->setAction('set_logged_in_cookie', 'setCookieContents'); public function setCookieContents($logged_in_cookie, $expire, $expiration, $user_id) { $this->_cookieContents = array( 'logged_in_cookie' => $logged_in_cookie, 'expire' => $expire, 'expiration' => $expiration, 'user_id' => $user_id ); } 

  public function handleAjax( $action ) { header('Content-type: application/json'); $action = PlulzTools::getValue('todo'); $response = array( 'status' => 'ok', 'data' => array() ); switch($action) { case 'ajaxlogin' : $response['data']['cookie'] = array( 'key' => LOGGED_IN_COOKIE, 'data' => $this->_cookieContents['logged_in_cookie'] ); echo json_encode($response); break; } 

Теперь, в коде JavaScript на первом конце, получите данные и установите cookie (или, по крайней мере, попробуйте):

 jQuery.ajax({ url : Frontend.ajaxurl, type: 'POST', data: EnviarLogin, timeout: 12000 }).done(function(newresponse){ if(newresponse.status == 'ok') { // atualizando status de login logged = true; jQuery.cookie(newresponse.data.cookie.key, newresponse.data.cookie.data); } }).error(function (xhr, ajaxOptions, thrownError){ console.log(xhr); console.log('Erro! Status:' + xhr.status + '; Erro thrown: ' + thrownError, + ' Description: ' + xhr.statusText); return false; }); 

Вероятно, ваша проблема начинается с вашего обратного вызова:

 public function handleAjax( $action ) 

Чтобы отправить ошибку или успех JSON, вам просто нужно позвонить

 wp_send_json_success( array( /* Data */ ) ); wp_send_json_error( array( /* Data */ ) ); 

Ответ будет таким:

 { success : true, data : [ // Some data as key/value pairs ] } 

Обе функции внутренне вызывают wp_send_json() . Это устанавливает соответствующий header :

 @header( 'Content-Type: application/json; charset=' . get_option( 'blog_charset' ) ); 

и делает ли для вас кодирование JSON:

 echo json_encode( $response ); 

Ваш ответ на установленный фильтр Cookie не будет работать, поскольку он никогда не будет вызван. Лучше идти на один уровень вверх и использовать wp_set_auth_cookie() . Ваша user_register wpmu_new_user пользователя уже должна позволять, чтобы как один из более поздних регистрационных крючков уже имел идентификатор пользователя: user_register или wpmu_new_user должны работать в этом случае.

 add_action( 'user_register', wpse136539userRegistration' ); function wpse136539userRegistration( $id ) { $user = get_user_by( 'id', $id ); # @TODO Custom Error handling needed here if ( is_wp_error( $user ) ) return; wp_set_current_user( $id ); // Log the user in - set Cookie and let the browser remember it wp_set_auth_cookie( $id, TRUE ); // Redirect user to his admin profile page ... @TODO maybe somewhere else exit( wp_safe_redirect( user_admin_url() ) ); } 

Если вы пытаетесь сделать доступную для javascript информацию о wordpress_logged_in_HASH для javascript для установки на стороне клиента с помощью javascript (и, таким образом, избегая повторной рендеринга страницы), то я думаю, что у вас будет больше успеха в повторной архитектуре, чтобы придумать другое решение , Файл cookie wordpress_logged_in – это httponly cookie, что означает, что у вас нет доступа к нему на клиенте, и не следует подвергать его javascript, поскольку это делает его уязвимым для XSS. См. Здесь для получения дополнительной информации: http://blog.codinghorror.com/protecting-your-cookies-httponly/