Разрабатывая недавно свои плагины WordPress, я заметил, что Chrome удаляет параметры строки запроса из URL, отображаемого в адресной строке браузера. Аналогично Firefox и другие браузеры не показывали полный URL в адресной строке, что затрудняло разработку, так как в то время я тестировал перенаправления URL с параметрами запроса.
Проблема
В частности, я работал с GET-переменными, например, примерно так URL с парой параметров:
https://example.com/wp-admin/admin.php?page=bbq_license&settings-updated=true
..продолжал возвращаться в браузере в таком виде:
https://example.com/wp-admin/admin.php?page=bbq_license
Странным было то, что на короткое время я мог видеть часть URL, которая удалялась. То есть страница загружалась с правильными параметрами, но они каким-то образом удалялись или скрывались после загрузки страницы. Я подумал, что, возможно, здесь замешан JavaScript…
Причина
После некоторого поиска дополнительной информации или подсказок, я обнаружил этот Make WordPress Ticket, предполагающий нечто подобное:
url = the canonical URL for the address
if (typeof history.replaceState === 'function') { // check html5 functionality support
data = {dummy:true};
history.replaceState(data,'',url);
}
Выяснилось, что отсутствие/удаление параметров строки запроса — это не проблема Chrome, Firefox или любого другого браузера, а скорее то, что команда WordPress внедрила намеренно. Если вы прочитаете тикет в Trac, то сможете понять причину такого решения — изменить его, чтобы URL-адреса одноразового использования не испортили ничего другого.
Так что я понимаю, к сожалению, есть некоторые реальные минусы, такие как:
- Удаление параметров нарушает функциональность страницы.
- Требуются дополнительные ресурсы и обработка для полного решения проблемы
- Требует от разработчиков дополнительных шагов во время разработки
- Пользователь не может просмотреть весь URL, что очень важно
- Может сбить с толку пользователей, которые полагаются на адресную строку.
- Изменяет общую функциональность/функциональность по умолчанию для побочных случаев.
На мой взгляд, это намеренное удаление дополнительных параметров строки запроса приносит больше вреда, чем пользы, так как разработчикам следует оставить право должным образом тестировать и реализовывать свои собственные решения по совместимости и обработке страниц. По сути, это просто ошибочное мышление типа чрезмерной инженерии, IMO. Подобно тому, как несколько лет назад Google и Firefox играли с полным удалением адресной строки (что обернулось полной катастрофой).
Итог: этого плохого решения можно (и нужно) было избежать, придерживаясь одного из золотых правил Интернета:
Не связывайтесь с URL-адресами.
Решение
К счастью, команда WordPress понимает, что удаление параметров URI не всегда желательно, и поэтому добавила крючок фильтрации для разработчиков, чтобы изменить поведение «remove-parameter» по умолчанию:
add_filter('removable_query_args', 'custom_function_name');
Этот хук позволяет нам изменять массив переменных запроса-строки, которые должны быть удалены. Вы можете узнать больше о хуке removable_query_args в каталоге хуков WordPress.
Итак, решение для тех, кто хочет НЕ удалять никакие параметры запроса, и таким образом отображать полный, оригинальный URL в адресной строке. Вот функция, которая просто работает:
function shapeSpace_enable_admin_query_params($removable_url_params) {
unset($removable_url_params);
$removable_url_params = array();
return $removable_url_params;
}
add_filter('removable_query_args', 'shapeSpace_enable_admin_query_params');
Эта простая функция перехватывает массив параметров, которые нужно удалить, и заменяет его пустым массивом. В результате ни один параметр не будет удален, а полный URL останется нетронутым.
Разрешить определенные параметры
Или, если вы хотите разрешить не все, а только определенные параметры, вышеприведенную функцию можно модифицировать следующим образом:
function shapeSpace_allow_admin_query_params($removable_url_params) {
if (($key = array_search('settings-updated', $removable_url_params)) !== false) {
unset($removable_url_params[$key]);
}
return $removable_url_params;
}
add_filter('removable_query_args', 'shapeSpace_allow_admin_query_params');
Удалить определенные параметры
И, наконец, вот пример, показывающий, как добавить собственные параметры в массив, чтобы они также были удалены (вместе с теми параметрами, которые удаляются по умолчанию):
function shapeSpace_remove_admin_query_params($removable_url_params) {
$remove_params = array('parameter-name');
return array_merge($remove_params, $removable_url_params);
}
add_filter('removable_query_args', 'shapeSpace_remove_admin_query_params');
Используя описанные выше методы, можно добавлять, удалять или восстанавливать любые и все параметры строки запроса, отображаемые в области администратора для любого URL.
Заключительные размышления
Хотя фильтр-хук полностью решает проблему, удаление части URL является отсталым способом решения проблем совместимости и других проблем, связанных с JavaScript. Но на самом деле в этом нет ничего страшного, просто хотелось задокументировать проблему для тех, кто задается вопросом, почему параметры URL удаляются на страницах в области администратора WordPress.
Также предупреждаем: Вероятно, лучший совет — использовать вышеупомянутый фильтр и методы только для разработки и тестирования. Если вы обязательно должны включить его в плагин, убедитесь, что используете условную логику, чтобы он запускался только на вашей собственной странице плагина.