Intereting Posts
Добавление шрифтов dashicon в администратор настроек до 3.8 Проблема с навигацией на первой странице после обновления до 3.4 Создание нескольких поддоменов для нескольких сайтов из базы данных Как удалить квантовый календарь с моих сайтов? Как я могу получить имя пользователя и пароль из моей установки WordPress? Лучший медиа-лирический опыт Как добавить новую таксономию в меню администратора Удалить или Изменить <dc: creator> в Каналах Преобразование темы в дочернюю тему в сети WordPress – отображать данные массива ребенка Выделите проблемы с комментариями автора Роли и возможности в пользовательских типах сообщений Сортировка таблицы списков типов сообщений по отображаемому имени идентификатора пользователя, хранящегося в качестве значения посылки WordPress «помни меня» – как это должно работать? Многие медленные запросы post_type = 'attachment';

Расширение класса WP_User и использование этого подкласса в течение всего жизненного цикла

То, что я пытаюсь достичь, следующее: для каждого пользователя на нашем веб-сайте я хочу сделать запрос API для службы (локальный REST API, взаимодействующий с другой базой данных) один раз, а затем кэшировать результат в классе WP_User (sub) до тех пор, пока пользователь снова выйдет из системы и войдет в систему (поскольку это значение используется на каждой странице приложения один раз, так что в противном случае его нужно было бы получить один раз для каждой загрузки страницы, что очень нежелательно по производительности).

Самый элегантный способ с точки зрения разделения проблем, которые я нашел до сих пор, заключается в расширении (подклассификации) класса WP_User в соответствии с примером, приведенным в книге O'Reilly « Создание веб-приложений с помощью WordPress» Брайаном Мессенлехнером и Джейсоном Коулманом .

Пример кода можно увидеть здесь: см. Этот файл в GitHub автора .

Однако проблема заключается в том, что у нас до сих пор нет этого Student (расширяет WP_User, такой подкласс), доступный в нашем коде, нам все равно нужно создать его экземпляр следующим образом, чтобы получить один экземпляр Student для текущего пользователя:

$student = new Student($current_user->ID); 

Если мы сделаем это на странице, экземпляр будет всегда создан снова (следовательно, я имею в виду жизненный цикл в заголовке), и вызов $student->assignments кажется, никогда не кэшируется внутри самого подкласса WP_User после WP_User на новый страницы и / или перезагрузки страницы, поэтому для каждой загрузки страницы мы сталкиваемся с API и базой данных, которая, вероятно, никогда не будет работать в нашей рабочей среде с высоким трафиком.

Однако глобальная переменная $current_user внутри самого WordPress (которая является экземпляром WP_User ) создается сразу после входа в систему и затем доступна по всему приложению, насколько я понимаю. То, что я действительно хочу, – это та же самая доступность во всем приложении, но затем для моего подкласса (Student) вместо класса WP_User , но что более важно, я хочу удостовериться, что для каждого зарегистрированного пользователя поражение API выполняется только один раз ( как и для $current_user->user_login который, например, в WP_User ).

Я также изучил добавление user_meta в WP_User и проверил этот вопрос, связанный с ним, который казался частично полезным: Получает ли кеш-файл WordPress get_user_meta ()?

Однако это извлекается через wp_cache_get который представляет собой кэш объектов WordPress, в котором четко указано:

  1. Непостоянный кеш доступен только во время загрузки текущей страницы; после загрузки следующей страницы он снова будет пустым.
  2. Размер хранилища ограничен общей доступной памятью для PHP на сервере. Не храните большие наборы данных, иначе вы можете получить сообщение «Недостаточно памяти».
  3. Использование этого типа кеша имеет смысл только для операций, повторяющихся несколько раз при создании страницы.

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

Я просто думаю здесь в неправильном направлении или как это возможно в WordPress? Мне действительно нужно хорошее долгосрочное решение, которое должно выполняться в среде с высоким трафиком. Спасибо за все вход и помощь заранее!

Solutions Collecting From Web of "Расширение класса WP_User и использование этого подкласса в течение всего жизненного цикла"

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

Для этого вы должны подключиться к wp_insert_user , который является основной функцией, которая регистрирует нового пользователя. По определению эта функция вызывается только один раз для каждого нового пользователя. В конце этой функции вы увидите список user_register , в котором вы можете обратиться к API.

 add_action ('user_register','wpse185731_approach_api'); function wpse185731_approach_api ($user_id) { $userdata = get_userdata( $user_id ); if ( some condition based on $userdata) { ... approach API with $userdata, then store with: add_user_meta( $user_id, $meta_key, $meta_value, $unique ); } } 

Вероятно, вы захотите сделать это в плагине, а не в своей теме.