Изменение ЧПУ для произвольного типа записей с таксономией

16 апр. 2012 г., 09:23:57
Просмотры: 35.3K
Голосов: 17

Я пытаюсь изменить URL для произвольного типа записи wr_events с одним из терминов его произвольной таксономии event_type

add_action('init', 'wr_events');

function wr_events() {

     register_taxonomy(
        'event_type',
        'wr_event',
        array(
            'label' => 'Типы',
            'singular_label' => 'Тип',
            'hierarchical' => true,
            'query_var' => true,
            'rewrite' => array('slug' => 'events'),
        )
    );

    $labels = array(
        'name' => _x('События', 'общее название типа записи'),
        'singular_name' => _x('Событие', 'единственное число названия типа записи')
    );

    $args = array(
        'labels' => $labels,
        'public' => true,
        'publicly_queryable' => true,
        'show_ui' => true,
        'query_var' => true,
        'capability_type' => 'post',
        'hierarchical' => false,
        'menu_position' => null,
        'supports' => array('title','editor','thumbnail', 'excerpt'),
        'rewrite' => array(
            //'slug' => 'event',
            'slug' => 'events/%event%',
            'with_front' => false
        ),
        'has_archive' => 'events'
    ); 

    register_post_type( 'wr_event' , $args );
    flush_rewrite_rules();
}

add_action('save_post', 'save_details');

add_filter('post_type_link', 'events_permalink_structure', 10, 4);
function events_permalink_structure($post_link, $post, $leavename, $sample)
{
    if ( false !== strpos( $post_link, '%event%' ) ) {
        $event_type_term = get_the_terms( $post->ID, 'event_type' );
        $post_link = str_replace( '%event%', array_pop( $event_type_term )->slug, $post_link );
    }
    return $post_link;
}

В моем случае термины таксономии будут "семинары" или "лекции" и т.д. url/events/lectures или url/events/workshops выводят все мои записи, связанные с этой "категорией", url/events показывает пользовательский архив для всех моих событий. -> это именно то, что мне нужно, однако единственное, что не работает - это полный URL к самой произвольной записи...

url/events/lectures/post-name - выдает ошибку 404!

Есть идеи, почему это происходит? Моя функция events_permalink_structure(), похоже, работает правильно, так как она заменяет мои постоянные ссылки именно так, как я хочу.

Я установил плагин "Rewrite Analyzer" и он показывает "Regex пустой" для wr_event.

Я также пробовал сбросить правила перезаписи, посетив настройки постоянных ссылок. Однако это не дало эффекта.

0
Все ответы на вопрос 1
3
11

Измените все ваши %event% на %event_type%. Надеюсь, это сработает для вас.

16 апр. 2012 г. 14:33:00
Комментарии

Огромное спасибо! Потрясающе! Не до конца понимаю, как это работает, но оно работает :)

mathiregister mathiregister
16 апр. 2012 г. 17:57:18

@mathiregister - это потому, что WordPress не автоматически понимает тег %event%, но он понимает, что %event_type% соответствует вашей таксономии типа события.

Stephen Harris Stephen Harris
9 мая 2012 г. 18:55:51

Теперь у меня есть пользовательский тип записи с ярлыком /catalog/, который отображает все записи, /katalog/whatever/ показывает записи в пользовательской таксономии с ярлыком whatever, а /katalog/whatever/mypost отображает отдельную запись, которая принадлежит таксономии whatever. Просто замените %event% в коде выше на название вашей пользовательской таксономии с %%

User User
16 авг. 2012 г. 22:51:51