Статьи

Пользовательская страница шаблона страницы на основе перезаписи URL

Вы когда-нибудь задумывались о переписывании пользовательских URL в WordPress? Здесь я имел дело с интересной проблемой. Я хотел добавить правило перезаписи на постоянную ссылку и хотел использовать собственный шаблон для этого правила перезаписи. Тем не менее, это не исчерпывающий пост о том, как сделать правила переписывания, есть очень хорошее подробное руководство по этому вопросу, если вы хотите узнать больше деталей.


  1. Добавить правило перезаписи на постоянную ссылку пользовательского типа сообщения
  2. Используйте шаблон страницы на основе правила перезаписи

Здесь у нас есть тип поста movie . Структура постоянной ссылки: movie/{movie-name} . Я хочу добавить к этому URL конечную точку для photos и videos , поэтому структура будет выглядеть как movie/{movie-name}/photos и movie/{movie-name}/videos . Как вы можете догадаться, я хочу показать все фотографии и видео на отдельной странице из этого фильма и использовать отдельный шаблон страницы для достижения этой цели.


1
2
3
4
5
6
function prefix_movie_rewrite_rule() {
    add_rewrite_rule( ‘movie/([^/]+)/photos’, ‘index.php?movie=$matches[1]&photos=yes’, ‘top’ );
    add_rewrite_rule( ‘movie/([^/]+)/videos’, ‘index.php?movie=$matches[1]&videos=yes’, ‘top’ );
}
 
add_action( ‘init’, ‘prefix_movie_rewrite_rule’ );

С помощью этой функции add_rewrite_rule мы добавляем два пользовательских правила перезаписи в URL и устанавливаем две переменные запроса для URL. Я не использую add_rewrite_endpoint потому что я не хочу добавлять эту конечную точку к каждой постоянной ссылке, которую я имею. Но только добавив это правило перезаписи, они не будут работать, и WordPress отклонит их, потому что он не распознает те переменные запроса, которые мы добавили через нашу функцию правила перезаписи. Мы должны сказать WordPress быть скромный на этих запросах.


1
2
3
4
5
6
7
8
function prefix_register_query_var( $vars ) {
    $vars[] = ‘photos’;
    $vars[] = ‘videos’;
 
    return $vars;
}
 
add_filter( ‘query_vars’, ‘prefix_register_query_var’ );

Теперь, когда мы добавили эти варианты запросов в WordPress, он распознает их, и мы можем воспользоваться ими. Но если вы перейдете по ссылке URL movie/{movie-name}/photos , вы все равно увидите, что ваши шаблоны single-movie.php или single.php позаботятся об этих URL. Если вы видите ошибку 404 для нашего пользовательского URL, не беспокойтесь, просто сохраните ваши постоянные ссылки снова.


01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
function prefix_url_rewrite_templates() {
 
    if ( get_query_var( ‘photos’ ) && is_singular( ‘movie’ ) ) {
        add_filter( ‘template_include’, function() {
            return get_template_directory() .
        });
    }
 
    if ( get_query_var( ‘videos’ ) && is_singular( ‘movie’ ) ) {
        add_filter( ‘template_include’, function() {
            return get_template_directory() .
        });
    }
}
 
add_action( ‘template_redirect’, ‘prefix_url_rewrite_templates’ );

Здесь мы говорим, что если есть запрос к photos или videos и это страница с одним movie , мы устанавливаем шаблон как single-movie-image.php и single-movie-video.php соответственно.

Таким образом, single-movie-image.php отвечает за запрос movie/{movie-name}/photos а single-movie-video.php отвечает за запрос movie/{movie-name}/videos . Просто а?

Примечание. В разделе настройки шаблона страницы мы используем анонимные функции PHP . Таким образом, этот код будет нуждаться в минимальной поддержке PHP 5.3.0 или вы можете использовать фильтры по-старому. При использовании анонимных функций следует помнить, что вы не можете отменить регистрацию фильтра или действия, как обычно. Но это простой способ связать действие / фильтр без указания имени функции.