Aturan Penulisan Ulang WordPress untuk Jenis Pos Kustom dan Taksonomi

9

Saya telah menemukan tempat ini menjadi sumber informasi yang baik di masa lalu melalui banyak Googling untuk masalah yang saya hadapi. Pertanyaan saya berkaitan dengan aturan penulisan ulang verbose yang digunakan WordPress.

Saya telah menyiapkan jenis pos kustom yang disebut proyek , dan saya telah mendaftarkan taksonomi kustom yang disebut proyek . Semuanya berfungsi dengan baik kecuali untuk opsi penulisan ulang siput karena berakhir dengan konflik - kemungkinan besar karena aturan penulisan ulang.

Pada dasarnya ini adalah struktur yang ingin saya capai:

  • example.com/work/%taxonomy%/%post_name%/ (untuk posting)
  • example.com/work/%taxonomy%/ (daftar posting milik istilah taksonomi tertentu)
  • example.com/work/ (buka halaman-work.php yang mencakup taxonomy.php untuk mendaftar semua tulisan yang terkait dengan taksonomi itu)

Berikut adalah kode yang saya miliki sejauh ini, tetapi saya perlu bantuan menulis aturan WP_Rewrite karena ini adalah bit yang saya sedikit bingung.

$labels = array(
    'name' => _x('Projects', 'post type general name'),
    'singular_name' => _x('Project', 'post type singular name'),
    'add_new' => _x('Add New', 'project item'),
    'add_new_item' => __('Add New Project'),
    'edit_item' => __('Edit Project'),
    'new_item' => __('New Project'),
    'view_item' => __('View Project'),
    'search_items' => __('Search Projects'),
    'not_found' =>  __('Nothing found'),
    'not_found_in_trash' => __('Nothing found in Trash'),
    'parent_item_colon' => ''
);

$args = array(
    'labels' => $labels,
    'public' => true,
    'publicly_queryable' => true,
    'hierarchical' => true,
    'rewrite' => array('slug'=>'work', 'with_front'=>false),
    'show_ui' => true,
    '_builtin' => false, // It's a custom post type, not built in!
    'capability_type' => 'post',
    'query_var' => "project", // This goes to the WP_Query schema
    'menu_position' => null,
    'supports' => array('title','editor','thumbnail', 'comments', 'author', 'excerpt')
);

register_post_type('project' , $args);

// Showcase Taxonomy
register_taxonomy('projects', array('project'), array(
    'public' => true,
    'hierarchical' => true,
    'label' => 'Project Categories', 
    'singular_label' => 'Project Category',
    'query_var' => true,
    'rewrite' => array('slug'=>'work', 'with_front'=>false, 'hierarchical'=>true)
    )
);

Terima kasih banyak atas bantuanmu! :-)

matt_d_rat
sumber
@ChristopherDavis Terima kasih, saya akan melihat lebih dalam lagi dan melihat bagaimana saya maju.
matt_d_rat
1
Saya pikir pertanyaan ini dapat dijawab dengan melihat Mencampur jenis pos kustom dan struktur penulisan ulang taksonomi? Jika pertanyaan itu tidak membantu Anda, harap edit pertanyaan ini untuk menunjukkan perbedaannya.
Jan Fabry

Jawaban:

1

Semoga ini bisa menyelesaikan masalah Anda

function my_custom_post_type() {
$labels = array(
    'name' => _x('Projects', 'post type general name'),
    'singular_name' => _x('Project', 'post type singular name'),
    'add_new' => _x('Add New', 'project item'),
    'add_new_item' => __('Add New Project'),
    'edit_item' => __('Edit Project'),
    'new_item' => __('New Project'),
    'view_item' => __('View Project'),
    'search_items' => __('Search Projects'),
    'not_found' =>  __('Nothing found'),
    'not_found_in_trash' => __('Nothing found in Trash'),
    'parent_item_colon' => '',
    'menu_name' => 'Projects' 
);

$args = array(
    'labels' => $labels,
    'public' => true,
    'publicly_queryable' => true,
        'hierarchical' => false,
        'has_archive' => true,
    'rewrite' => array('slug'=>'work', 'with_front'=>false),
    'show_ui' => true,
    '_builtin' => false, // It's a custom post type, not built in!
    'capability_type' => 'post',
        'query_var' => true, // This goes to the WP_Query schema
    'menu_position' => null,
    'supports' => array('title','editor','thumbnail', 'comments', 'author', 'excerpt')
);

register_post_type( 'work' , $args );

}
function my_custom_taxonomies() {

    $labels = array(
        'name' => __( 'Taxonomy', 'taxonomy general name' ),
        'singular_name' => __( 'Taxonomy', 'taxonomy singular name' ),
        'search_items' =>  __( 'Search Taxonomy' ),
        'all_items' => __( 'All Taxonomy' ),
        'parent_item' => __( 'Parent Taxonomy' ),
        'parent_item_colon' => __( 'Parent Taxonomy:' ),
        'edit_item' => __( 'Edit Taxonomy' ), 
        'update_item' => __( 'Update Taxonomy' ),
        'add_new_item' => __( 'Add New Taxonomy' ),
        'new_item_name' => __( 'New Taxonomy Name' ),
        'menu_name' => __( 'Taxonomy' ),
    );  

    register_taxonomy( 'taxonomy', array('work'), array (
                    'labels' => $labels,
                    'hierarchical' =>false,
                    'show_ui' => true,
                    'rewrite' => array( 'slug' => 'work/taxonomy'),
                    'query_var' => true,
                    'show_in_nav_menus' => true,
                    'public' => true,
            ));
}

add_action('init', 'my_custom_post_type', 0);
add_action('init', 'my_custom_taxonomies', 10);

yang perlu Anda buat adalah archive-work.php (arsip jenis posting Anda) dan taxonomy.php yang akan digunakan untuk menampilkan arsip taksonomi khusus Anda.

kreativitas tidak sensitif
sumber
jangan lupa untuk mengubah "taksonomi" untuk nama taksonomi Anda sendiri. Jangan gunakan nilai yang sama dengan post_type Anda. coba gunakan kategori untuk percobaan pertama. kerja / kategori, register_taxonomy ('kategori, array (' pekerjaan '), array (......
nonsensecreativity
1

Saya memiliki masalah yang sama dan setelah banyak berjuang saya berakhir dengan solusi ini.
Cukup tambahkan ini ke kode Anda

global $wp_rewrite;
$wp_rewrite->flush_rules(); 

function my_custom_post_type() {
    $labels = array(
        'name' => _x('Projects', 'post type general name'),
        'singular_name' => _x('Project', 'post type singular name'),
        'add_new' => _x('Add New', 'project item'),
        'add_new_item' => __('Add New Project'),
        'edit_item' => __('Edit Project'),
        'new_item' => __('New Project'),
        'view_item' => __('View Project'),
        'search_items' => __('Search Projects'),
        'not_found' =>  __('Nothing found'),
        'not_found_in_trash' => __('Nothing found in Trash'),
        'parent_item_colon' => '',
        'menu_name' => 'Projects' 
    );

    $args = array(
        'labels' => $labels,
        'public' => true,
        'publicly_queryable' => true,
            'hierarchical' => false,
            'has_archive' => true,
        'rewrite' => array('slug'=>'work', 'with_front'=>false),
        'show_ui' => true,
        '_builtin' => false, // It's a custom post type, not built in!
        'capability_type' => 'post',
            'query_var' => true, // This goes to the WP_Query schema
        'menu_position' => null,
        'supports' => array('title','editor','thumbnail', 'comments', 'author', 'excerpt')
    );

    register_post_type( 'work' , $args );

    global $wp_rewrite;   
    $wp_rewrite->flush_rules();    // this should help 
}
Dipesh KC
sumber
5
$ wp_rewrite-> flush_rules () jangan dijalankan sesering itu, seharusnya hanya dijalankan dengan kait aktivasi atau deaktivasi atau sesedikit mungkin. Dikatakan demikian di sini: codex.wordpress.org/Rewrite_API/flush_rules JUGA memiliki fungsi yang hampir sama dengan yang ini: codex.wordpress.org/Function_Reference/flush_rewrite_rules
Jared
Pada catatan lain, ini adalah bagaimana saya mencapainya: pastebin.com/k7QvxKLi
Jared
@ Jared Terima kasih telah menunjuk, tapi saya tidak tahu cara untuk menemani ini ketika ini terintegrasi dalam tema kami (yaitu tidak melalui plugin). Tolong sarankan.
Dipesh KC
Kode akan masuk dalam functions.phpkasus itu. Kode untuk sebuah plugin dan sebuah tema persis sama, satu-satunya perbedaan adalah dalam tema itu selalu masuk functions.phpatau file yang disertakan dalamfunctions.php
Jared
2
Saya sarankan menggunakan after_switch_themehook, ini baru 3.3 (IIRC).
Cristian
0

Penjelasan lebih rinci ada di pos lain , tetapi inilah bagian dasar yang perlu Anda tambahkan:

  1. Daftarkan taksonomi dan cpt Anda seperti yang Anda lakukan. Pastikan siput penulisan ulang Anda untuk taksinya adalah "basename" dan siput penulisan ulang untuk cpt adalah "basename /% tax_name%".

  2. Katakan pada wordpress apa yang harus dilakukan dengan "% tax_name%" seperti ini:

    function filter_post_type_link($link, $post)
    {
    if ($post->post_type != 'custom_post_type_name')
        return $link;
    
    if ($cats = get_the_terms($post->ID, 'taxonomy_name'))
    {
        $link = str_replace('%taxonomy_name%',array_pop($cats)->term_id, link); // see custom function defined below
    }
    return $link;
    }
    add_filter('post_type_link', 'filter_post_type_link', 10, 2);
Jeff
sumber