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');
maryisdead
źródło

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;
}
Jan Fabry
źródło
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
0

Nie korzystałem z tego osobiście, ale możesz na to spojrzeć „add_rewrite_rule”

http://codex.wordpress.org/Rewrite_API/add_rewrite_rule

nie zapomnij też zapisać permalinków po ich zmianie.

eeMZee
źródło
Właściwie używam add_rewrite_rule, po prostu przewiń mój kod na dół. :-) Jak dotąd działa dobrze, tylko w ten sposób wywoływane są niewłaściwe szablony.
maryisdead 30.06.11