Mieszasz niestandardowe typy postów i struktury przepisywania taksonomii?


30

Zasadniczo chcę uzyskać glosariusz przy użyciu niestandardowych typów postów i mam problemy z konfiguracją przepisywania w sposób, w jaki chcę. Chcę tak:

Główny adres URL glosariusza: http://example.com/glossary/

Słowniczek terminów zaczynających się na literę A : http://example.com/glossary/a/

Adres URL pojedynczego słownika: http://example.com/glossary/a/atomic/

Właściwie to osiągnąłem, korzystając z poniższego kodu, ale jestem pewien, że jest to bardzo niewygodny sposób i wiem, że to gdzieś źle działa, ponieważ podczas przeglądania stron wywoływane są niewłaściwe szablony. Z wyjątkiem http://example.com/glossary/ , gdzie archive-sumo-glossary-term.php jest wywoływany zgodnie z oczekiwaniami, pozostałe dwa po prostu aktywują index.php w moim motywie.

Oto ( functions.phpw temacie):

add_action('init', 'create_glossary');
function create_glossary()
{
    register_post_type
    (
        'sumo-glossary-term',
        array
        (
            'labels' => array
            (
                'name' => _x('Glossary Terms', 'post type general name'),
                'singular_name' => _x('Glossary Term', 'post type singular name')
                # And so on …
            ),
            'supports' => array('title', 'editor', 'thumbnail'),
            'public' => true,
            'rewrite' => array
            (
                'slug' => 'glossary',
                'with_front' => false

            ),
            'query_var' => 'glossary-term',
            'has_archive' => true
        )
    );

    register_taxonomy
    (
        'sumo-glossary-letter',
        'sumo-glossary-term',
        array
        (
            'hierarchical' => true,
            'labels' => array
            (
                'name' => _x('Letters', 'taxonomy general name'),
                'singular_name' => _x('Letter', 'taxonomy singular name')
                # And so one
            ),
            'show_ui' => true,
            'query_var' => 'glossary-letter',
            'rewrite' => false
        )
    );
}

add_filter('post_type_link', 'glossary_term_permalink', 10, 4);
function glossary_term_permalink($post_link, $post, $leavename, $sample)
{
    if ($post->post_type == 'sumo-glossary-term')
    {
        $permalink = str_replace('glossary/', 'glossary/' . $post->post_name[0] . '/', $post_link);
    }
    return $permalink;
}

add_rewrite_rule('^glossary/([^/]*)?$','index.php?glossary-letter=$matches[1]','top');
add_rewrite_rule('^glossary/([^/]*)/([^/]*)?$','index.php?glossary-term=$matches[2]','top');

Odpowiedzi:


30

Zawsze możesz zastąpić szablon, który zostanie wywołany z template_includefiltrem lub pokrewnym, ale może to ukryć głębsze problemy z niestandardowymi archiwami.

Jak rozumiem, chcesz użyć następującej struktury:

  • /glossary/powinna być stroną archiwum dla wszystkich sumo-glossary-termpostów
  • /glossary/[letter]/powinna być stroną archiwum dla postów z terminem taksonomii [letter]w sumo-glossary-lettertaksonomii
  • /glossary/[letter]/[term-name]/powinien być indywidualnym sumo-glossary-termpostem

Oznacza to, że pierwszy załaduje szablon archive-sumo-glossary-term.php, drugi załadujetaxonomy-sumo-glossary-letter.php , a trzeci załaduje single-sumo-glossary-term.php.

Osiągnąłem to w WordPress 3.2 poprzez jawne ustawienie taksonomii korekty przepisywania oraz zarówno korekty przepisywania, jak i archiwalnej dla typu postu, i żadnych innych reguł przepisywania. Ponadto najpierw zarejestrowałem taksonomię, a po niej typ postu, aby upewnić się, że priorytety są prawidłowe (w przeciwnym razie URL taki jak /glossary/f/page/2termin pagezamiast słownika zamiast strony 2 f).

add_action('init', 'create_glossary');
function create_glossary()
{

    register_taxonomy
    (
        'sumo-glossary-letter',
        array(),
        array
        (
            'hierarchical' => true,
            'labels' => array
            (
                'name' => _x('Letters', 'taxonomy general name'),
                'singular_name' => _x('Letter', 'taxonomy singular name')
                # And so one
            ),
            'show_ui' => true,
            'query_var' => 'glossary-letter',
            'rewrite' => array(
                'slug' => 'glossary',
            ),
        )
    );

    register_post_type
    (
        'sumo-glossary-term',
        array
        (
            'labels' => array
            (
                'name' => _x('Glossary Terms', 'post type general name'),
                'singular_name' => _x('Glossary Term', 'post type singular name')
                # And so on …
            ),
            'supports' => array('title', 'editor', 'thumbnail'),
            'public' => true,
            'rewrite' => array
            (
                'slug' => 'glossary/%sumo-glossary-letter%',
                'with_front' => false

            ),
            'query_var' => 'glossary-term',
            'has_archive' => 'glossary',
            'taxonomies' => array( 'sumo-glossary-letter' ),
        )
    );
}

add_filter('post_type_link', 'glossary_term_permalink', 10, 4);
function glossary_term_permalink($post_link, $post, $leavename, $sample)
{
    if ( false !== strpos( $post_link, '%sumo-glossary-letter%' ) ) {
        $glossary_letter = get_the_terms( $post->ID, 'sumo-glossary-letter' );
        $post_link = str_replace( '%sumo-glossary-letter%', array_pop( $glossary_letter )->slug, $post_link );
    }
    return $post_link;
}

Spróbuję tego jutro i zobaczę, czy to załatwi sprawę, i wrócę tutaj. Dzięki!
— maryisdead

Ok, niezupełnie do jutra… Udało się, prawie idealnie! Dziękuję Ci! To, co nie działa, jest /glossary/. Daje mi 404 ( archive-sumo-glossary-term.phpjest skonfigurowany). Jakieś pomysły? Muszę powiedzieć, że utknąłem w WP 3.0.1 i może to jest problem z wersją. Muszę to przetestować ponownie, kiedy będę mógł dokonać aktualizacji. W każdym razie w większości działa i na razie niekoniecznie potrzebuję /glossary/i po prostu przekierowuję na literę A. Jeszcze raz dziękuję!
— maryisdead

hej @maryisdead, miałem dokładnie ten sam problem i wymyśliłem dokładnie to samo rozwiązanie, ale pozostał mi dokładnie ten sam problem - jak uzyskać / glosariusz, aby przejść do szablonu archive-glossery.php? Właśnie znalazłem odpowiedź - użyj 'has_archive' => 'glossary', zamiast po has_archive => true prostu zauważyłem, że Jan ma to w swojej odpowiedzi, ale nie masz tego w swoim oryginalnym kodzie - czy zaktualizowałeś tę część? Zaczęło działać dla mnie, gdy tylko dokonałem tej zmiany
— Jeff

Hej Jeff! Tak, zaktualizowałem tę część. Właśnie sprawdziłem ponownie, nadal nie działa. Omawiana instalacja WordPress nie jest wciąż aktualna (3.0.1), więc może to wciąż jest przyczyną problemu.
— maryisdead

Ten sam problem tutaj, przy użyciu WP 3.2.1. Nadal nie ma rozwiązania?
— Richard B

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.