Вопрос или проблема
Я изменил URL для моего типа записей с:
url.com/jobs/job-name
на url.com/jobs/job-location/job-name
Проблема в том, что, поскольку это не стандартное перенаправление, WordPress не делает 301 перенаправление за вас.
Кто-нибудь знает, как я мог бы сделать 301 перенаправление для всех пользовательских записей на новый URL, учитывая, что job-location будет разным в зависимости от записи?
Спасибо!
Поскольку job-location
является переменной частью – содержание которой мы не знаем заранее – невозможно легко решить это в .htaccess перенаправлении. Однако вы могли бы сгенерировать список записей с их старыми и новыми URI и разместить эти перенаправления в .htaccess – я бы предпочел именно так, потому что тогда PHP совсем не нужен.
Если это невозможно, должно сработать следующее:
add_action('wp_loaded', 'WPSE_redirect_jobs_new_url');
function WPSE_redirect_jobs_new_url(){
// текущий запрос
$uri = $_SERVER['REQUEST_URI'];
$parts = explode("https://wordpress.stackexchange.com/", $uri);
if (substr($uri, 0, 6) !== '/jobs/' || count($parts) > 3) {
// либо URI не начинается с jobs
// либо URI уже длиннее чем /jobs/foo
// поэтому завершаем рано
return;
}
$slug = array_pop($parts);
$page = get_page_by_path($slug, OBJECT, 'MY_CPT');
if (!$page instanceof WP_Post) {
return;
}
// получить новую ссылку
$link = get_permalink($page->ID);
wp_redirect($link, 301);
exit;
});
Поскольку WordPress имеет свой собственный способ угадывания перенаправлений, важно использовать раннее действие. В моем тесте wp_loaded
было достаточно для этого. К сожалению, глобальная переменная $wp
не полностью заполнена к этому времени, поэтому я проверяю запрашиваемый URI через $_SERVER['REQUEST_URI']
вместо $wp->request
.
Это, конечно, зависит от того, настроены ли постоянные ссылки для jobs так, как вы хотите, в противном случае get_permalink()
не даст результатов, которые вы ищете.
Ответ или решение
Вопрос о массовой 301 переадресации для пользовательского типа записей в WordPress требует не только технической экспертизы, но и понимания внутренних механизмов работы системы. Давайте разберёмся, как можно легко и безболезненно перенаправить старые URL на новые.
Теория
Суть проблемы состоит в том, что вы изменили структуру URL для пользовательского типа записей, в вашем случае — для работы отслеживания вакансий (job postings). Изменение состояло в добавлении динамической части URL, связанной с географическими данными или местоположением вакансии, например, изменяя URL с url.com/jobs/job-name
на url.com/jobs/job-location/job-name
.
Пример
Допустим, у вас была вакансия с URL url.com/jobs/developer
, и в результате изменений система должна перенаправлять этот URL на url.com/jobs/new-york/developer
, где new-york
— это динамическая часть, уникальная для различных записей.
Применение
Чтобы реализовать такую массовую 301 перенаправление, нужно учитывать несколько факторов:
-
Использование PHP для динамической обработки: Это самый гибкий способ, так как позволяет учитывать динамические элементы.
-
Создание пользовательских правил в .htaccess: Это предпочтительно в случае, если все URL известны заранее, но в вашем случае возможно лишь частичное использование данного метода или создание временного списка URL для точных переадресаций.
Теперь рассмотрим предлагаемый сценарий с использованием PHP:
add_action('wp_loaded', 'redirect_old_jobs_to_new_url');
function redirect_old_jobs_to_new_url() {
// Получить текущий запрос
$uri = $_SERVER['REQUEST_URI'];
// Разбить URL, чтобы определить элементы пути
$parts = explode('/', trim($uri, '/'));
if (count($parts) < 3 || $parts[0] !== 'jobs') {
// Если URL не соответствует ожидаемой структуре, прекратить выполнение
return;
}
$job_slug = $parts[1];
// Здесь предполагается, что 'MY_CPT' заменен на фактический пользовательский тип записи
$job_post = get_page_by_path($job_slug, OBJECT, 'job');
if (!$job_post instanceof WP_Post) {
return;
}
// Получить новый URL с учетом правильной структуры
$new_link = get_permalink($job_post->ID);
// Выполнить 301 редирект
wp_redirect($new_link, 301);
exit;
}
Объяснение кода
-
Проверка структуры URL:
$_SERVER['REQUEST_URI']
используется для извлечения текущего запрашиваемого URL. Затем, используя функциюexplode()
, мы разбиваем URL на части и проверяем, соответствует ли он ожидаемой структуре (начинается с/jobs/
). -
Получение записи: Извлекается слаг (slug) вакансии из URL и используется для поиска записи через
get_page_by_path()
, предполагая, что имеется настроенная постоянная ссылка. -
Перенаправление: Если запись найдена, функция
get_permalink()
помогает получить обновленный URL (учитывая новый формат структуры). С помощью функцииwp_redirect()
осуществляется 301 редирект на новый URL.
Потенциальные улучшения
Если у вас есть дополнительная информация о логике распределения местоположений (например, они хранятся в мета-полях) или доступ к базе данных записей, вы можете более точно настраивать логику перенаправлений. Эта информация могла бы быть полезной для построения условий и улучшения точности редиректов. Кроме того, использование системного кэша (например, transient API) может помочь уменьшить нагрузку на системы при большом количестве подобных операций.
Заключение
Эта реализация позволяет пользователям динамично перенаправлять старые URL пользовательского типа записей на новые, учитывая переменные части URL. Когда количественно учитывается множество подобных перенаправлений, важно оптимизировать процесс для снижения задержек и повышения стабильности системы. Изучив подходы к настройке URL и настраиваемые перезаписи в WordPress, вы создадите устойчивую и управляемую платформу даже для сложных структур URL.