#php #wordpress #plugins #filter #hook
#php #wordpress #Плагины #Фильтр #крюк
Вопрос:
Я пишу плагин WordPress, в котором мне нужно ввести маяк (HTML-тег изображения) на страницу при первой загрузке страницы после входа пользователя в систему, то есть на страницу, на которую они перенаправляются. Последующие просмотры страниц той же или других страниц не должны включать этот код маяка.
Я пробовал несколько способов сделать это.
Я добавил функцию в хук wp_login. Из этой функции я попытался добавить другую функцию в хук wp_footer для вывода содержимого.
// in my class constructor
add_action('wp_login', array($this, 'login'));
public function login() {
add_action('wp_footer', array($this, 'add_beacon'));
}
Это не сработало, поэтому я попытался настроить оба подключения заранее и установить глобальную переменную для указания первой загрузки. Это не было обнаружено моей второй функцией, и ни одна из них не была константой.
// in my class constructor
add_action('wp_login', array($this, 'login'));
add_action('wp_footer', array($this, 'add_beacon'));
public function login() {
define('FIRST_RUN', true);
}
public function add_beacon() {
if (defined('FIRST_RUN')) {
// output beacon
}
}
Обе функции перехвата срабатывают корректно, но всякий раз, когда я пытаюсь сделать вывод содержимого во второй зависимой от запуска первой функции перехвата, я не получаю вывода.
Есть идеи, как я могу это сделать? Возможно, есть какой-то способ, которым я могу проверить, вообще не используя хук wp_login.
Комментарии:
1. Я также пытался использовать свойство класса. Это тоже не сработало.
2. Вы определяете константу, срок действия которой истекает после обработки кода. Для сохранения вы захотите вместо этого использовать переменную $_SESSION . В login() попробуйте: $_SESSION[‘first_run’] = true; Затем в add_beacon() используйте: if ( isset( $_SESSION[‘first_run’]) ) { // выходной маяк }
3. Я не особенно стремлюсь использовать сеанс, если мне это не нужно, поскольку сайт, над которым я работаю, работает на нескольких веб-серверах. Я мог бы написать обработчик сеанса DB, но это добавило бы нагрузки. Я не уверен в порядке загрузки хуков, но я предполагал, что wp_login будет предшествовать wp_footer. Если это так, разве любой код, который я запускаю в wp_login, не был обработан до того, как WordPress попал в wp_footer?
4.
wp_login
вероятно, срабатывает до того, как WordPress перенаправит пользователя на отдельную страницу. Эта целевая страница перенаправления срабатываетwp_footer
, и, поскольку она запускается отдельно отwp_login
, заданные вами переменные не передаются.
Ответ №1:
Попробуйте использовать cookie для каждого сеанса.
Код будет выглядеть примерно так:
function my_init() {
if ( is_user_logged_in() ) {
if (!isset($_COOKIE['beacon'])) {
//Track user code / add wp_footer action
setcookie ('beacon' 'tracked');
}
}
}
add_action('init','my_init');
(Код не тестировался.. надеюсь, вы поняли идею).
Если вас не устраивает файл cookie, вы можете сохранить последнюю страницу, загруженную пользователем, в таблице usermeta… однако вам нужно будет указать, сколько времени с момента последней загрузки страницы считается новым сеансом.
Комментарии:
1. В конце концов я выбрал такой подход, который сработал. По сути, я установил файл cookie в перехватчике wp_login, а затем проверил его и очистил в wp_footer, а также вывел маяк.