Возможны ли динамические URL в WordPress
Я понимаю, что заголовок может показаться немного запутанным, но я ищу решение, которое возможно в Symfony или RoR. У меня есть страница с таким URL: http://mydomain.com/job/
. Теперь я хочу такую структуру URL: http://mydomain.com/job/php-developer/45
, http://mydomain.com/job/java-developer/46
. Параметры после /job/
динамические, и это не отдельные страницы или записи, они относятся к странице job
.
Возможно ли это в WordPress?
ОБНОВЛЕННЫЙ ВОПРОС:
Согласно ответу @Gioia я обновил свой код.
Вот мой текущий код:
add_filter('query_vars', 'add_query_vars');
function add_query_vars($aVars) {
$aVars[] = "job_title"; // Добавляем переменную job_title в запрос
$aVars[] = "job_id"; // Добавляем переменную job_id в запрос
return $aVars;
}
add_action( 'init', 'add_rules' );
function add_rules() {
// Добавляем правило перезаписи URL
add_rewrite_rule('^/job/([^/]*)/([^/]*)/?','index.php?page_id=13338&job_title=$matches[1]&job_id=$matches[2]','top');
}
Сейчас я получаю страницу 404 при попытке открыть URL http://mydomain.com/job/php-dev/45
. Но когда я пробую URL http://mydomain.com/index.php?page_id=13338&job_title=php-dev&job_id=45
, всё работает.

Не совсем уверен, что понимаю, что вы имеете в виду под параметрами, относящимися к странице вакансии, но если вы имеете в виду, что разный контент загружается на одной и той же странице с использованием JavaScript/AJAX, вы можете использовать https://github.com/browserstate/history.js/ для генерации соответствующего URL для каждого состояния. Сложно сказать больше о реализации без дополнительной информации о вашей задаче.
ОБНОВЛЕНИЕ
Я считаю, что вам следует использовать пользовательские правила перезаписи (rewrite rules). Именно это WordPress использует для создания красивых URL, и у него есть API для добавления своих правил.
Сначала вам нужно добавить теги, которые вы хотите отслеживать — в вашем случае title и job_id. На самом деле, вероятно, стоит заменить title на что-то вроде job_title, так как title может вызвать конфликт, поскольку это зарезервированное слово в WordPress.
Я использовал следующий код, который нужно добавить в functions.php вашей темы:
add_filter('query_vars', 'add_query_vars');
function add_query_vars($aVars) {
$aVars[] = "job_title";
$aVars[] = "job_id";
return $aVars;
}
Подробнее: http://codex.wordpress.org/Rewrite_API/add_rewrite_tag
Затем добавьте правило перезаписи, также в functions.php:
add_action( 'init', 'add_rules' );
function add_rules() {
add_rewrite_rule('^job/([^/]*)/([^/]*)/?','index.php?page_id=12&job_title=$matches[1]&job_id=$matches[2]','top');
}
Замените page_id на ID страницы вакансии. Подробнее: http://codex.wordpress.org/Rewrite_API/add_rewrite_rule.
После сохранения файла перейдите в Настройки → Постоянные ссылки и просто сохраните, не меняя ничего. Это гарантирует, что ваши настройки будут загружены корректно.
Вы можете установить плагин Rewrite Inspector, чтобы просмотреть все примененные правила перезаписи и убедиться, что ваше присутствует. https://wordpress.org/plugins/rewrite-rules-inspector/
Также можно установить плагин Debug Bar для проверки, какое правило перезаписи применяется к странице: https://wordpress.org/plugins/debug-bar/
Дополнительная информация о правилах перезаписи: http://www.addedbytes.com/articles/for-beginners/url-rewriting-for-beginners/
ОБНОВЛЕНИЕ 2
Чтобы получить параметры:
if (isset($wp_query->query_vars['job_title'])) {
$job_title = urldecode($wp_query->query_vars['job_title']);?>
<?php }

Моя цель — получить URL вида http://mydomain.com/job/?title=php-developer&job_id=45
, но чтобы URL был SEO-дружественным, я хочу что-то вроде http://mydomain.com/job/php-developer/45

Вы можете использовать пользовательские правила перезаписи URL:

Привет, спасибо за ответ. Я попробовал ваш код, но он возвращает ошибку 404, пожалуйста, проверьте мои изменения в вопросе выше.

Привет, я только что проверил код, и у меня он сработал. Сначала убедись, что ты изменил ID страницы, который был в коде (?page_id=12), на ID страницы с вакансиями (ID страницы можно увидеть при редактировании — это часть URL: post.php?post=6&action=edit, где 6 — это ID страницы). Также после каждого изменения не забудь зайти в настройки постоянных ссылок и сохранить изменения.

Я изменил ID страницы на свой. Если я перехожу по этому URL index.php?page_id=13338&job_title=$matches[1]&job_id=$matches[2]
, то всё работает, но с пользовательским URL — нет. Нужно ли мне добавить add_rewrite_tag
или внести изменения в .htaccess?

Просто чтобы уточнить: ты заходил в настройки постоянных ссылок и сохранял изменения?

Да, я сохранил постоянные ссылки, структура моих постоянных ссылок выглядит так: /%postname%/

Давайте продолжим обсуждение в чате.
