Jenis pos kustom, taksonomi, dan tautan permanen

62

Ini membuat saya gila dan saya yakin itu sederhana tetapi tidak ada yang saya cari muncul dengan struktur sederhana (semuanya sangat kompleks).

Saya memiliki jenis pos kustom product_listingdan taksonomi ubahsuaian product_cat(yang hierarkis dan harus memiliki kategori seperti).

Saya hanya ingin URL saya terlihat seperti ini:

mysite.com/products/category1/product-name1 
mysite.com/products/category2/product-name2

Tapi untuk kehidupan saya, apa pun yang saya lakukan, saya mendapatkan masalah yang ditakuti. Halaman berfungsi dengan baik dan Pos berfungsi dengan baik tetapi pos kustom saya tidak berfungsi dengan benar. Mereka muncul sebagai:

mysite.com/products/product-name1
mysite.com/products/product-name2

Yang sebenarnya berhasil ! Hanya saja saya ingin melihat taksonomi khusus saya di sana plus saya ingin dapat mengakses taxonomy.phptemplat yang telah saya siapkan dengan masuk ke:

mysite.com/products/category1/
mysite.com/products/category2/

Tidak ada siput saya yang sama, saya juga tidak menginginkannya. Ini adalah jenis tulisan dan bagian taksonomi dari functions.phpfile saya :

///// CUSTOM POST TYPES /////

// register the new post type
register_post_type( 'product_listing', array( 
    'labels'                 => array(
        'name'               => __( 'Products' ),
        'singular_name'      => __( 'Product' ),
        'add_new'            => __( 'Add New' ),
        'add_new_item'       => __( 'Create New Product' ),
        'edit'               => __( 'Edit' ),
        'edit_item'          => __( 'Edit Product' ),
        'new_item'           => __( 'New Product' ),
        'view'               => __( 'View Products' ),
        'view_item'          => __( 'View Product' ),
        'search_items'       => __( 'Search Products' ),
        'not_found'          => __( 'No products found' ),
        'not_found_in_trash' => __( 'No products found in trash' ),
        'parent'             => __( 'Parent Product' ),
    ),
    'description'           => __( 'This is where you can create new products on your site.' ),
    'public'                => true,
    'show_ui'               => true,
    'capability_type'       => 'post',
    'publicly_queryable'    => true,
    'exclude_from_search'   => false,
    'menu_position'         => 2,
    'menu_icon'             => get_stylesheet_directory_uri() . '/images/tag_orange.png',
    'hierarchical'          => true,
    '_builtin'              => false, // It's a custom post type, not built in!
    'rewrite'               => array( 'slug' => 'products', 'with_front' => true ),
    'query_var'             => true,
    'supports'              => array( 'title', 'editor', 'author', 'thumbnail', 'excerpt', 'trackbacks', 'custom-fields', 'comments', 'revisions' ),
) );


//hook into the init action and call create_book_taxonomies when it fires
add_action( 'init', 'create_product_taxonomies', 0 );
//add_action('admin_init', 'flush_rewrite_rules');

//create two taxonomies, genres and writers for the post type "book"
function create_product_taxonomies() {
    // Add new taxonomy, make it hierarchical (like categories)
    $labels = array(
        'name'              => _x( 'Categories', 'taxonomy general name' ),
        'singular_name'     => _x( 'Category', 'taxonomy singular name' ),
        'search_items'      =>  __( 'Search Categories' ),
        'all_items'         => __( 'All Categories' ),
        'parent_item'       => __( 'Parent Categories' ),
        'parent_item_colon' => __( 'Parent Categories:' ),
        'edit_item'         => __( 'Edit Category' ), 
        'update_item'       => __( 'Update Category' ),
        'add_new_item'      => __( 'Add New Category' ),
        'new_item_name'     => __( 'New Category Name' ),
        'menu_name'         => __( 'Category' ),
    );  

    register_taxonomy( 'product_cat', array( 'product_listing' ), array(
        'hierarchical'  => true,
        'labels'        => $labels,
        'show_ui'       => true,
        'query_var'     => true,
        //'rewrite'     => true,
        'rewrite'       => array( 'slug' => '%category%', 'with_front' => true ),
    ) );

    // Add new taxonomy, NOT hierarchical (like tags)
    $labels = array(
        'name'                       => _x( 'Scents', 'taxonomy general name' ),
        'singular_name'              => _x( 'Scent', 'taxonomy singular name' ),
        'search_items'               =>  __( 'Search Scents' ),
        'popular_items'              => __( 'Popular Scents' ),
        'all_items'                  => __( 'All Scents' ),
        'parent_item'                => null,
        'parent_item_colon'          => null,
        'edit_item'                  => __( 'Edit Scent' ), 
        'update_item'                => __( 'Update Scent' ),
        'add_new_item'               => __( 'Add New Scent' ),
        'new_item_name'              => __( 'New Scent Name' ),
        'separate_items_with_commas' => __( 'Separate scents with commas' ),
        'add_or_remove_items'        => __( 'Add or remove scents' ),
        'choose_from_most_used'      => __( 'Choose from the most used scents' ),
        'menu_name'                  => __( 'Scents' ),
    ); 

    register_taxonomy( 'scent', 'product_listing', array(
        'hierarchical'  => false,
        'labels'        => $labels,
        'show_ui'       => true,
        'query_var'     => true,
        //'rewrite'     => array( 'slug' => 'scents' ),
    ) );
}

Saya juga punya taksonomi khusus lain scentsyang idealnya saya ingin memiliki semacam url ramah tetapi saya lebih terbuka tentang ini. Saya mungkin ingin mengakses daftar semua aroma dengan pergi ke mysite.com/products/scentstetapi mereka tidak harus spesifik kategori.

Adakah yang bisa membantu saya?

RodeoRamsey
sumber

Jawaban:

63

Ubah slugargumen tipe posting Anda menjadi products/%product_cat%, dan slugargumen taksonomi Anda menjadi adil products, lalu siram aturan penulisan ulang Anda. WordPress sekarang harus menangani /products/my-product-cat/post-name/!

Akhirnya, kita perlu sedikit membantu WordPress dengan menghasilkan permalink (di luar kotak, ia tidak akan mengenali tag permastruct %product_cat%):

/**
 * Inject term slug into custom post type permastruct.
 * 
 * @link   http://wordpress.stackexchange.com/a/5313/1685
 * 
 * @param  string  $link
 * @param  WP_Post $post 
 * @return array
 */
function wpse_5308_post_type_link( $link, $post ) {
    if ( $post->post_type === 'product_listing' ) {
        if ( $terms = get_the_terms( $post->ID, 'product_cat' ) )
            $link = str_replace( '%product_cat%', current( $terms )->slug, $link );
    }

    return $link;
}

add_filter( 'post_type_link', 'wpse_5308_post_type_link', 10, 2 );

Satu hal yang perlu diperhatikan, ini hanya akan mengambil kategori produk pertama untuk pos yang dipesan berdasarkan nama . Jika Anda menetapkan beberapa kategori ke satu produk, saya dapat dengan mudah mengubah cara menentukan mana yang akan digunakan dalam permalink.

Biar tahu bagaimana Anda melanjutkan ini, dan kita bisa mengatasi masalah lain!

TheDeadMedic
sumber
Oh WOW saya kagum! Ini bekerja! Akhirnya! Saya tidak pernah berpikir apa pun akan !!! terima kasih banyak SOOOOOO !!! ............ Sekarang, bagaimana saya menghasilkan tautan (seperti the_permalink) untuk mengambil url taksonomi sendiri? / products / my-product-cat /
RodeoRamsey
Saya pikir saya sudah berhasil ^^^ ............ tapi sekarang saya terjebak di Pagination. Tampaknya rusak ketika menggunakan pagination (fungsi kustom atau builtin) apa pun sebagai / produk / my-product-cat / terlihat oke tapi / produk / my-product-cat / halaman / 2 / mengembalikan 404 dan meletakkan file taxonomy.php di mendukung file index.php. Saya sudah mencoba semua yang saya bisa temukan dan masih belum ada.
RodeoRamsey
1
Apakah Anda ingin mengubah penulisan ulang produk tunggal product/cat-name/product-name? (perhatikan singularitas) Masalahnya adalah aturan penulisan ulang untuk pagination taksonomi tidak dipicu, karena itu tertangkap oleh aturan sebelumnya untuk produk tunggal!
TheDeadMedic
Saya terbuka untuk itu. Tetapi untuk membungkus kepala saya, apakah itu berarti produk akan memiliki jalur URL yang berbeda jika Anda melihat halaman produk tunggal vs halaman 'kategori'? Jadi lajang akan menjadi produk / nama kucing / nama produk tetapi kucing akan menjadi produk / nama kucing / ? Tidakkah hal itu akan mengalahkan tujuan url "ramah manusia"? Saya mengalami kesulitan membantu klien saya mempelajari dasbor wp apalagi perbedaan itu ... Jika saya salah paham, beri tahu saya! Saya mungkin juga senang dengan direktori depan TIDAK, seperti product-cat / product-nam dan hanya product-cat / . Bisakah itu berhasil?
RodeoRamsey
2
Anda mendapatkannya - meskipun saya akan mengatakan itu adalah "manusia ramah", karena ada perbedaan yang jelas antara arsip ( products/) dan item tunggal ( product/). Dan tidak, saya akan menyimpan 'direktori depan' - ini membantu menjaga perbedaan yang jelas dari posting dan halaman, ditambah sebaliknya Anda mungkin berakhir dengan masalah kinerja (yaitu aturan penulisan ulang verbose).
TheDeadMedic
6

Terima kasih @TheDeadMechanic, jawaban Anda membantu saya, tetapi hanya sebagian. Saya ingin melakukan hal yang sama yang diminta @RodeoRamsey, tetapi dengan kategori bersarang (yaitu:) mysite.com/products/category1/child-category-1/grandchild-category-1/product-namedan solusi Anda tidak berhasil untuk itu.

Saya akhirnya menemukan solusi yang diperluas untuk pertanyaan saya yang berfungsi, jadi jika orang lain membutuhkan kategori / subkategori bersarang, Anda dapat melihat solusi terperinci untuk pertanyaan saya sendiri. Semoga ini bisa membantu orang lain, dan terima kasih untuk langkah awal.

Jeff
sumber
4

Saya tidak yakin wp mendukung struktur itu di luar kotak - tetapi Anda dapat dengan mudah membuat aturan penulisan ulang sendiri untuk melakukannya.

Lihat jawaban sebelumnya di sini Penulis url menulis ulang .

Anda dapat mengubah garis

$newrules['author/([^/]+)/songs/?$'] = 'index.php?post_type=songs&author=$matches[1]';

untuk sesuatu seperti

$newrules['products/([^/]+)/([^/]+)/?$'] = 'index.php?post_type=product_listing&product_cat=$matches[1]&name=$matches[2]';

bagian product_cat di sini mungkin berlebihan - saya tidak yakin apakah itu diperlukan.

Anda dapat menambahkan aturan apa pun yang Anda suka dan mereka akan memiliki prioritas di atas yang inbuilt.

Chris
sumber
Yah, itu tidak menarik. Oh boy, saya pikir aturan penulisan ulang kustom di luar saya. Saya mencoba kode di atas (dan sisanya dari posting lain) dan tidak ada yang berubah. Saya memerah semuanya dan kemudian mencoba lagi dan masih tidak ada perubahan, jadi saya berkomentar semua aturan penulisan ulang yang ditetapkan dalam jenis pos kustom dan taksonomi dan memerah dan MASIH tidak ada.
RodeoRamsey
2

Ya itu membuatku gila sebelum mengatur permalink untuk jenis posting khusus. Saya menemukan plugin untuk menangani jenis posting khusus. Ini sangat mudah digunakan. http://wordpress.org/extend/plugins/custom-post-permalinks/ WP harus menambahkan ini sebagai fitur inti! Leo


sumber
Saya telah melihat yang ini sebelumnya dan menahan diri untuk tidak menggunakannya karena dikatakan taksonomi "untuk non-hierarkis". Saya punya satu yang diatur ke hierarki jadi saya tidak berpikir itu akan berhasil, tetapi sejauh ini, tampaknya telah melakukan trik! Selain itu, tampaknya akan berhasil untuk mencapai / produk / nama kucing / prod-nama / struktur yang saya coba capai (lihat komentar untuk jawaban lain). @TheDeadMedic, apakah ini opsi yang layak? Atau haruskah saya tetap dengan penulisan ulang dalam file functions.php?
RodeoRamsey
0

Sebenarnya, ini cukup mudah. Anda hanya perlu satu baris. Ini kode saya

fungsi create_product_taxonomies ()
{
// Tambahkan taksonomi baru, buat hierarki (seperti kategori)
    $ label = array (
        'name' => _x ('Kategori', 'nama umum taksonomi'),
        'singular_name' => _x ('Category', 'taxulary singular name'),
        'search_items' => __ ('Cari Kategori'),
        'all_items' => __ ('Semua Kategori'),
        'parent_item' => __ ('Kategori Induk'),
        'parent_item_colon' => __ ('Kategori Induk:'),
        'edit_item' => __ ('Edit Kategori'),
        'update_item' => __ ('Perbarui Kategori'),
        'add_new_item' => __ ('Tambah Kategori Baru'),
        'new_item_name' => __ ('Nama Kategori Baru'),
        'menu_name' => __ ('Kategori'),
    );

    register_taxonomy ('product_cat', array ('product_listing'), array (
        'hierarkis' => benar,
        'label' => $ label,
        'show_ui' => true,
        'query_var' => true,
        'rewrite' => array ('hierarchical' => true),
    ));

Dan diterapkan pada taksonomi yang dihasilkan untuk Ulasan saya CPT dari GenerateWP.com. Saya menggunakan ini di situs WordPress saya sendiri, https://www.wpstarters.com

function reviews_category_taxonomy () {

    $ label = array (
        'name' => _x ('Kategori Ulasan', 'Nama Umum Taksonomi', 'ulasan_kategori'),
        'singular_name' => _x ('Kategori Ulasan', 'Nama Singular Taksonomi', 'reviews_category'),
        'menu_name' => __ ('Kategori Ulasan', 'reviews_category'),
        'all_items' => __ ('Semua Kategori Ulasan', 'reviews_category'),
        'parent_item' => __ ('Kategori Tinjauan Induk', 'ulasan_kategori'),
        'parent_item_colon' => __ ('Kategori Tinjauan Induk:', 'reviews_category'),
        'new_item_name' => __ ('Nama Kategori Ulasan Baru', 'reviews_category'),
        'add_new_item' => __ ('Tambah Kategori Ulasan Baru', 'reviews_category'),
        'edit_item' => __ ('Edit Kategori Ulasan', 'reviews_category'),
        'update_item' => __ ('Perbarui Kategori Ulasan', 'reviews_category'),
        'view_item' => __ ('Lihat Kategori Ulasan', 'reviews_category'),
        'separate_items_with_commas' => __ ('Pisahkan item dengan koma', 'reviews_category'),
        'add_or_remove_items' => __ ('Tambah atau hapus item', 'reviews_category'),
        'choose_from_most_used' => __ ('Pilih dari yang paling sering digunakan', 'reviews_category'),
        'popular_items' => __ ('Kategori Tinjauan Populer', 'reviews_category'),
        'search_items' => __ ('Cari Item', 'reviews_category'),
        'not_found' => __ ('Tidak Ditemukan', 'reviews_category'),
        'no_terms' => __ ('Tidak Ada Kategori Ulasan', 'reviews_category'),
        'items_list' => __ ('Daftar Kategori Ulasan', 'reviews_category'),
        'items_list_navigation' => __ ('Navigasi daftar Kategori Tinjauan', 'reviews_category'),
    );
    $ args = array (
        'label' => $ label,
        'hierarkis' => benar,
        'publik' => benar,
        'show_ui' => true,
        'show_admin_column' => true,
        'show_in_nav_menus' => true,
        'show_tagcloud' => false,
        'show_in_rest' => true,
        'rewrite' => array ('hierarchical' => true),
    );
    register_taxonomy ('reviews_category', array ('wps_reviews'), $ args);

}
add_action ('init', 'reviews_category_taxonomy', 0);

Yang Anda butuhkan jadi letakkan 'rewrite' => array ('hierarchical' => true),

Leo Koo
sumber