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.