Mencampur jenis pos kustom dan struktur penulisan ulang taksonomi?

30

Pada dasarnya saya ingin mencapai glosarium menggunakan jenis posting khusus dan memiliki beberapa masalah pengaturan penulisan ulang seperti yang saya inginkan. Saya menginginkannya seperti itu:

URL glosarium utama: http://example.com/glossary/

Istilah glosarium dimulai dengan huruf A : http://example.com/glossary/a/

URL untuk satu istilah glosarium: http://example.com/glossary/a/atomic/

Saya benar-benar mencapai ini dengan menggunakan kode di bawah ini tetapi saya yakin itu adalah cara yang sangat canggung untuk melakukannya dan saya tahu itu tidak berfungsi di suatu tempat karena template yang salah dipanggil saat melihat halaman. Kecuali untuk http://example.com/glossary/ , di mana arsip-sumo-glossary-term.php dipanggil seperti yang diharapkan, dua lainnya hanya mengaktifkan index.php dalam tema saya.

Ini dia ( functions.phpdalam tema):

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
sumber

Jawaban:

30

Anda selalu dapat mengganti template yang akan dipanggil dengan template_includeatau filter terkait, tetapi ini mungkin menyembunyikan masalah yang lebih dalam dengan arsip khusus.

Seperti yang saya pahami, Anda ingin menggunakan struktur berikut:

  • /glossary/harus menjadi halaman arsip untuk semua sumo-glossary-termposting
  • /glossary/[letter]/harus menjadi halaman arsip untuk posting dengan istilah taksonomi [letter]dalam sumo-glossary-lettertaksonomi
  • /glossary/[letter]/[term-name]/harus merupakan sumo-glossary-termpos tersendiri

Ini berarti bahwa yang pertama akan memuat template archive-sumo-glossary-term.php, yang kedua akan memuat taxonomy-sumo-glossary-letter.php, dan yang ketiga akan memuat single-sumo-glossary-term.php.

Saya mencapai ini di WordPress 3.2 dengan secara eksplisit menetapkan siput penulisan ulang taksonomi, dan siput menulis ulang dan siput arsip untuk jenis posting, dan tidak ada aturan penulisan ulang lainnya. Juga, saya mendaftarkan taksonomi terlebih dahulu dan jenis tulisan setelahnya, untuk memastikan prioritasnya benar (jika tidak, URL seperti /glossary/f/page/2pergi ke istilah glosarium pagealih-alih halaman 2 dari surat glosarium 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
sumber
Saya akan mencobanya besok dan melihat apakah itu berhasil dan kembali ke sini. Terima kasih!
maryisdead
Ok, tidak persis sampai besok ... Ini berhasil, hampir sempurna! Terima kasih! Yang tidak berfungsi adalah /glossary/. Memberi saya 404 ( archive-sumo-glossary-term.phpsudah diatur). Ada ide? Harus mengatakan bahwa saya terjebak ke WP 3.0.1 dan itu mungkin masalah versi. Harus mengujinya lagi ketika saya dapat memutakhirkan. Lagi pula, sebagian besar itu berfungsi dan untuk saat ini saya tidak perlu /glossary/dan hanya mengarahkan kembali ke huruf A. Terima kasih lagi!
maryisdead
hey @maryisdead, saya memiliki masalah yang sama persis dan muncul dengan solusi yang sama persis, tetapi dibiarkan dengan masalah yang sama persis - bagaimana Anda mendapatkan / glosarium untuk pergi ke templat arsip-glossery.php? Saya baru saja menemukan jawabannya - gunakan 'has_archive' => 'glossary', alih-alih has_archive => true saya hanya memperhatikan bahwa Jan memiliki jawaban seperti itu dalam jawabannya, tetapi Anda tidak memilikinya dengan kode asli Anda - apakah Anda memperbarui bagian itu? Itu mulai bekerja untuk saya begitu saya membuat perubahan itu
Jeff
Hei Jeff! Ya, perbarui bagian itu. Baru diperiksa lagi, masih belum berfungsi. Instalasi WordPress yang dipermasalahkan masih belum terbaru (3.0.1) jadi mungkin itu masih merupakan akar masalahnya.
maryisdead
Masalah yang sama di sini, menggunakan WP 3.2.1. Masih belum ada solusi?
Richard B
0

Saya belum menggunakan ini secara pribadi, tetapi yang mungkin ingin Anda lihat adalah "add_rewrite_rule"

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

juga jangan lupa untuk menyimpan permalink setelah Anda mengubahnya.

eeMZee
sumber
Saya benar-benar menggunakan add_rewrite_rule, cukup gulir kode saya ke bawah. :-) Ini berfungsi dengan baik sejauh ini, hanya saja templat yang salah dipanggil dengan cara melakukannya.
maryisdead