Динамические URL в WordPress - PullRequest
       7

Динамические URL в WordPress

0 голосов
/ 04 марта 2019

Фон

Я создаю каталог курсов для школы и пытаюсь создать дружественные, динамические URL-адреса.Он имеет три пользовательских типа сообщений:

  • каталог.
  • курс.Этот тип сообщения содержит название, номер курса и описание курса.
  • раздел.Этот тип записи содержит стоимость, даты и время начала и окончания и т. Д. Раздел является экземпляром курса;например, может быть две секции рисования для начинающих, одна в четверг утром и одна в понедельник вечером, и преподаются двумя разными преподавателями.

Между курсом и курсом существует связь один-ко-многимраздел.При просмотре раздела отображаются название курса, номер курса и описание курса родительского курса.Он также отображает стоимость этого раздела, даты и время начала и окончания и т. Д.

Текущий URL-адрес раздела:

http://website.org/section/section-slug/

Мне бы хотелосьбыть таким:

http://website.org/class/spring-2019/drawing-for-beginners/01/

... где «класс» - это «виртуальная» папка / синтетический префикс ... где «весна-2019» соответствует «каталогу»пользовательский тип сообщения ... где "рисунок для начинающих" соответствует слаг для родительского "курса" пользовательского типа сообщения ... где "01" соответствует разделу курса.

WordPress долженотобразить тип сообщения раздела, соответствующий этим критериям.

Research

Я довольно много читал об API перезаписи и API конечных точек.Лучшая статья, которую я смог найти по теме, наиболее близкой к тому, что я пытаюсь сделать, это эта .К сожалению, пример кода на странице не сработал для меня, что привело к «ошибке слишком много перенаправлений».Я могу предоставить более подробную информацию о том, какая именно часть не работала, при желании.Я также прочитал эту статью о создании плагинов WordPress , но она не охватывает динамические поиски.

Что я пытаюсь выполнить

http://website.org/class/spring-2019/drawing-for-beginners/01/

Когда виртуальный URL-адрес передается в WordPress, мне нужно, чтобы система выполнила запрос для поиска раздела с номером «01», который принадлежит каталогу «весна-2019» и чей родительКонечно, есть кусок "рисования для начинающих".Этот запрос не является проблемой, это все хуки, которые нужно вызвать, чтобы выполнить этот код и вернуть правильный шаблон (для страницы раздела).Я не уверен, нужно ли мне создавать конечную точку или я могу просто добавить правила перезаписи.

Может ли кто-нибудь предложить какое-нибудь руководство?

-

Как"бонус", я также пытаюсь сделать это:

http://website.org/class/spring-2019/drawing-for-beginners/01/faculty_name

... где "faculty_name" является динамическим и представляет собой имя человека, преподающего этот раздел (и соответствуетк пользовательскому типу записи "faculty").

http://website.org/class/spring-2019/drawing-for-beginners/01/gallery

... где "gallery" - статическое имя и показывает пользовательский тип записи галереи.

Ответы [ 2 ]

0 голосов
/ 05 марта 2019

После долгих исследований я нашел ответ на свой вопрос.Вот так.

Это способ создания действительно динамических URL / слагов в WordPress.URL не соответствуют странице.Вместо этого части слага используются для поиска идентификатора поста, а затем соответственно отображают его.

Шаг 1: Добавьте правило перезаписи

function pce_rewrite_rules ( ) {
  add_rewrite_rule ( '^class/([^/]*)/([^/]*)/([^/]*)/?', 'index.php?post_type=section&catalog_name=$matches[1]&course_name=$matches[2]&section_no=$matches[3]','top' ) ;
add_action ( 'init', 'pce_rewrite_rules', 10, 0 ) ;

Шаг 2: Зарегистрируйте запроспеременные

function pce_register_query_vars ( $vars ) {
    $vars[] = 'course_name';
    $vars[] = 'catalog_name';
    $vars[] = 'section_no';

    return $vars;
}
add_filter ( 'query_vars', 'pce_register_query_vars' );

Шаг 3: Изменить запрос WP

Используйте pre_get_posts для изменения основного запроса.Но вы должны принудительно установить некоторые переменные в запросе, чтобы WordPress загрузил нужный вам шаблон.Чтобы найти переменные, которые мне нужно было установить вручную, я использовал плагин WP (Query Monitor) для проверки содержимого запроса WP, и я использовал var_dump для типа сообщения, которое я хотел «скопировать».

function pce_dynamic_section_lookup ( $wp ) {

    if ( is_admin() || ! $wp->is_main_query() ){
        return;
    }

    if ( $wp->is_main_query() ) {
        // Only defined if we're looking at a "fake" URL.
        // Example: http://pce.local/class/spring-2019/handmade-books/01/
        if ( get_query_var ('course_name' ) ) {
            // These are some of the variables I needed to set manually.
            $wp->query_vars['post_type'] = 'section' ;
            $wp->query_vars['is_single'] = true ;
            $wp->query_vars['is_singular'] = true;
            $wp->query_vars['is_archive'] = false;

            $course_name = get_query_var ('course_name' ) ;
            $catalog_name = get_query_var ('catalog_name' ) ;
            $section_no = get_query_var ('section_no' ) ;

            // More code is here to look up the post ID I need.

            // Set the post ID here. This makes the magic happen.
            $wp->query_vars['p'] = $post_id ;

            // This also makes the magic happen. It forces the template I need to be selected.
            $wp->is_single = true ;
            $wp->is_singular = true ;
            $wp->is_archive = false ;
            $wp->is_post_type_archive = false ;
        }
    }
}
add_action ( 'pre_get_posts', 'pce_dynamic_section_lookup', 0, 2 ) ;

У меня было сообщение с этим оригинальным URL:

http://pce.local/section/handmade-books-01/

И теперь я могу загрузить его по этому URL (и он загружает это,он не пересылает его):

http://pce.local/class/spring-2019/handmade-books/01/

Мне нужно было сделать это, потому что в будущих каталогах будет добавлено несколько разделов, и я хотел, чтобы URL-адреса были дружественными.Летом, если класс будет предложен, он будет ...

http://pce.local/class/summer-2019/handmade-books/01/

Вместо ...

http://pce.local/section/handmade-books-01-2/

или какой-нибудь слизень, который назначает WordPress.Наличие только пары разделов не имеет большого значения, но в будущем их будет несколько.

0 голосов
/ 04 марта 2019

Если бы я хорошо понял, это могло бы вам помочь.Я не уверен, как у вас сложились отношения, но я добавлю код, который я обычно использую.И допустим, что каталог-курс также имеет отношения.

function add_rewrite_rules( $wp_rewrite )
{

    $section_rules = array(
        'class/(.+?)/?$' => 'index.php?post_type=post&name='. $wp_rewrite->preg_index(1),
    );

    $wp_rewrite->rules = $section_rules + $wp_rewrite->rules;
}
add_action('generate_rewrite_rules', 'add_rewrite_rules'); 

function change_section_links($post_link, $id=0){

    $courses = new WP_Query( array(
        'post_type' => 'course',
        'post__in' => get_post_meta( $catalog_id, '_course', true ),
    ) );

    if ( $courses-> have_posts() ) { while ( $courses->have_posts() ) {
          $courses->the_post();
          $catalog_name = get_the_title();  
        }

    $sections = new WP_Query( array(
        'post_type' => 'section',
        'post__in' => get_post_meta( $course_id, '_section', true ),
    ) );

        if ( $sections-> have_posts() ) { while ( $sections->have_posts() ) {
                  $sections->the_post();
                  $course_name = get_the_title();  
            }

    $post = get_post($id);

    if( is_object($post) && $post->post_type == 'section'){
        return home_url('/class/'. $catalog_name. '/'. $course_name. '/'. $post->post_name.'/');
    }

    return $post_link;
}
add_filter('post_link', 'change_section_links', 1, 3);

Я надеюсь, что это поможет вам.Если это не так, скажите мне, как у вас сложились отношения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...