Как создать пользовательские URL-маршруты?
У меня есть очень своеобразное требование, надеюсь, я смогу объяснить его, не будучи слишком запутанным. Я создал шаблон страницы, где я перечисляю некоторые свойства, которые я получаю из внешнего XML-файла, пока никаких проблем, скажем, URL-адрес такой:
http://www.example.com/properties/
У каждого свойства есть ссылка, которая должна перенаправить пользователя на страницу "Одно свойство", на которой отображается дополнительная информация о нем. Мне было интересно, есть ли способ сделать ссылку такой:
http://www.example.com/properties/123
Где 123
будет идентификатор объекта недвижимости. Так что, если у меня есть URL-адрес, например properties/some_id
Я хочу иметь возможность загружать файл представления (например, файлы single.php
или page.php
), но с учетом этого условия URL.
Возможно ли это?
2 answers
Добавьте это в свою тему functions.php, или поместите его в плагин.
add_action( 'init', 'wpse26388_rewrites_init' );
function wpse26388_rewrites_init(){
add_rewrite_rule(
'properties/([0-9]+)/?$',
'index.php?pagename=properties&property_id=$matches[1]',
'top' );
}
add_filter( 'query_vars', 'wpse26388_query_vars' );
function wpse26388_query_vars( $query_vars ){
$query_vars[] = 'property_id';
return $query_vars;
}
Это добавляет правило перезаписи, которое направляет запросы в /properties/
с любой комбинацией чисел, следующих за именем страницы properties
, с установленным параметром запроса var property_id
. Просто обязательно посетите страницу настроек постоянных ссылок и сохраните, чтобы удалить правила перезаписи, чтобы это новое правило было включено.
В вашем шаблоне page-properties.php
get_query_var('property_id')
вернет идентификатор свойства, если он был установлен, если это не так, то покажет значение по умолчанию страница свойств.
Другой способ сделать это:
add_action('init', function() {
add_rewrite_rule( '^properties/([0-9]+)/?',
'index.php?pagename=properties&property_id=$matches[1]',
'top' );
}, 10, 0);
add_action('init', function() {
add_rewrite_tag( '%property_id%', '([^&]+)' );
}, 10, 0);