Saya membuat taksonomi 'forum', menggunakan aturan ini:
register_taxonomy(
'forum',
array('topic'),
array(
'public' => true,
'name' => _a('Forums'),
'singular_name' => _a('Forum'),
'show_ui' => true,
'show_in_nav_menus' => true,
'hierarchical' => true,
'labels' => array(
'name' => _a('Forums'),
'singular_name' => _a('Forum'),
'search_items' => _a('Search Forums'),
'popular_items' => _a('Popular Forums'),
'all_items' => _a('All Forums'),
'parent_item' => _a('Parent Forum'),
'parent_item_colon' => _a('Parent Forum:'),
'edit_item' => _a('Edit Forum'),
'update_item' => _a('Update Forum'),
'add_new_item' => _a('Add New Forum'),
'new_item_name' => _a('New Forum Name'),
),
'query_var' => true,
'rewrite' => array('slug' => 'forums', 'with_front' => false, 'hierarchical' => true),
)
);
Di front-end URL-nya terlihat seperti:
forums/general-discussion/sub-forum
Bagaimana saya bisa menghapus siput depan ("forum")? Yaitu, ubah URL menjadi:
general-discussion/sub-forum
Jika saya memberikan argumen slug kosong ke register_taxonomy () itu berfungsi, tapi itu menyebabkan masalah dengan permalinks dari jenis tulisan yang terkait dengan taksonomi ini
custom-post-types
custom-taxonomy
permalinks
onetrickpony
sumber
sumber
'slug' => 'forums'
kosong hanya dengan menghapus semuanya sekaligus'rewrite' => array('with_front' => false, 'hierarchical' => true)
? Saya pikir itu telah berhasil di masa lalu bagi saya. Pastikan juga Anda membersihkan permalinks.'slug' => ''
membuatnya berfungsi, tetapi kemudian posting menggunakan taksonomi ini menghasilkan 404%forum%
harus menjadi segmen tingkat atasJawaban:
MEMPERBARUI
Sejak menulis inti WordPress ini telah menambahkan
'do_parse_request'
pengait yang memungkinkan perutean URL ditangani secara elegan dan tanpa perlu memperpanjangWP
kelas. Saya membahas topik ini secara mendalam dalam ceramah Atlanta WordCamp 2014 saya yang berjudul " Hardcore URL Routing " ; slide tersedia di tautan.JAWABAN ASLI
Desain URL telah menjadi penting selama lebih dari satu dekade; Saya bahkan menulis blog tentang itu beberapa tahun yang lalu. Dan meskipun WordPress adalah jumlah perangkat lunak yang brilian, sayangnya sistem penulisan ulang URL-nya hanya kekurangan otak (IMHO, tentu saja. :) Bagaimanapun, senang melihat orang-orang peduli dengan desain URL!
Jawaban yang akan saya berikan adalah plugin yang saya panggil
WP_Extended
yang merupakan bukti konsep untuk proposal ini pada Trac (Perhatikan bahwa proposal dimulai sebagai satu hal dan berkembang menjadi yang lain, jadi Anda harus membaca semuanya untuk melihat di mana itu menuju.)Pada dasarnya idenya adalah untuk mensubkelas
WP
kelas, menggantiparse_request()
metode, dan kemudian menetapkan$wp
variabel global dengan turunan dari subkelas. Kemudian di dalam diriparse_request()
Anda sebenarnya memeriksa jalan demi segmen alih-alih menggunakan daftar ekspresi reguler yang harus cocok dengan URL secara keseluruhan.Jadi untuk menyatakannya secara eksplisit, teknik ini menyisipkan logika di depan
parse_request()
yang memeriksa kecocokan URL-ke-RegEx dan sebagai gantinya pertama-tama mencari kecocokan istilah taksonomi, tetapi teknik ini HANYA menggantikanparse_request()
dan membiarkan seluruh sisa sistem perutean URL WordPress utuh termasuk dan terutama penggunaan$query_vars
variabel.Untuk kasus penggunaan Anda, implementasi ini hanya membandingkan segmen jalur URL dengan istilah taksonomi karena hanya itu yang Anda butuhkan. Implementasi ini memeriksa persyaratan taksonomi yang menghormati hubungan istilah orangtua-anak dan ketika menemukan kecocokan, ia menetapkan jalur URL (dikurangi garis miring utama dan garis belakang) ke
$wp->query_vars['category_name']
,$wp->query_vars['tag']
atau$wp->query_vars['taxonomy']
& &$wp->query_vars['term']
serta mem-bypassparse_request()
metodeWP
kelas.Di sisi lain jika jalur URL tidak cocok dengan istilah dari taksonomi yang telah Anda tetapkan itu mendelegasikan logika routing URL ke sistem penulisan ulang WordPress dengan memanggil
parse_request()
metodeWP
kelas.Untuk menggunakan
WP_Extended
case-use Anda, Anda harus memanggilregister_url_route()
fungsi dari dalamfunctions.php
file tema Anda seperti:Apa yang ada di sini adalah kode sumber untuk plugin:
PS CAVEAT # 1
Meskipun untuk situs tertentu saya pikir teknik ini berfungsi dengan baik tetapi teknik ini TIDAK PERNAH digunakan untuk plugin yang akan didistribusikan di WordPress.org untuk digunakan orang lain . Jika itu adalah inti dari paket perangkat lunak berbasis WordPress maka itu mungkin tidak apa-apa. Kalau tidak, teknik ini harus dibatasi untuk meningkatkan perutean URL untuk situs tertentu .
Mengapa? Karena hanya satu plugin yang dapat menggunakan teknik ini . Jika dua plugin mencoba menggunakannya, mereka akan saling bertentangan.
Selain itu, strategi ini dapat diperluas untuk secara umum menangani hampir semua pola penggunaan yang mungkin diperlukan dan itulah yang ingin saya terapkan segera setelah saya menemukan waktu luang atau klien yang dapat mensponsori waktu yang diperlukan untuk membangun implementasi sepenuhnya generik.
CAVEAT # 2
Saya menulis ini untuk mengesampingkan
parse_request()
yang merupakan fungsi yang sangat besar, dan sangat mungkin bahwa saya melewatkan satu atau dua properti dari$wp
objek global yang seharusnya saya atur .. Jadi jika ada sesuatu yang tidak beres, beri tahu saya dan saya akan senang untuk riset dan revisi jawabannya jika perlu.Bagaimanapun...
sumber
'forum'
taksonomi namun saya akan merevisinya untuk bekerja hari ini ...'forums'
alih-alih'forum'
? Apakah Anda mengharapkan URL yang tertaut ke halaman ini berubah (jika ya, tidak heran, kode saya tidak membahas pencetakan URL, hanya perutean URL.)site/rootforum/
berfungsi, tetapisite/rootforum/subforum/
tidak (404 kesalahan) ...Sederhana, sungguh.
Langkah 1: Berhenti menggunakan parameter menulis ulang sama sekali. Kami akan melempar penulisan ulang Anda sendiri.
Langkah 2: Tetapkan aturan halaman verbose. Ini memaksa Halaman normal untuk memiliki aturan sendiri alih-alih menjadi catch-all di bagian bawah halaman.
Langkah 3: Buat beberapa aturan penulisan ulang untuk menangani kasus penggunaan Anda.
Langkah 4: Secara manual memaksa aturan flush terjadi. Cara termudah: pergi ke pengaturan-> permalink dan klik tombol simpan. Saya lebih suka ini daripada metode aktivasi plugin untuk penggunaan saya sendiri, karena saya dapat memaksa aturan untuk memerah setiap kali saya mengubah keadaan.
Jadi, kode waktu:
Ingatlah bahwa setelah menambahkan kode ini, Anda harus membuatnya aktif ketika Anda membuka aturan permalink (dengan Menyimpan halaman pada Pengaturan-> Permalinks)!
Setelah Anda menyiram aturan dan menyimpannya ke database, maka / apa pun yang harus pergi ke forum Anda = halaman taksonomi apa pun.
Aturan penulisan ulang sebenarnya tidak terlalu sulit jika Anda memahami ekspresi reguler. Saya menggunakan kode ini untuk membantu saya ketika men-debug mereka:
Dengan cara ini, saya bisa melihat peraturan saat ini secara sekilas di halaman saya. Ingatlah bahwa dengan diberi URL apa pun, sistem akan dimulai di bagian atas aturan dan menelusuriinya sampai menemukan yang cocok. Pencocokan ini kemudian digunakan untuk menulis ulang kueri menjadi yang lebih normal? Key = value set. Kunci-kunci itu diuraikan menjadi apa yang masuk ke objek WP_Query. Sederhana.
Sunting: Catatan tambahan, metode ini mungkin hanya akan berfungsi jika struktur posting kustom normal Anda dimulai dengan sesuatu yang bukan catchall, seperti% kategori% atau beberapa hal seperti itu. Anda harus memulainya dengan string statis atau numerik, seperti% year%. Ini untuk mencegahnya menangkap URL Anda sebelum sampai ke aturan Anda.
sumber
Anda tidak akan dapat melakukan ini menggunakan WP_Rewrite saja, karena itu tidak dapat membedakan antara siput istilah dan siput posting.
Anda juga harus terhubung ke 'permintaan' dan mencegah 404, dengan mengatur var permintaan posting alih-alih yang taksonomi.
Sesuatu seperti ini:
Perhatikan bahwa taksonomi harus didefinisikan sebelumnya jenis posting.
Ini akan menjadi saat yang tepat untuk menunjukkan bahwa memiliki taksonomi dan jenis posting dengan kueri var yang sama adalah Ide Buruk.
Juga, Anda tidak akan dapat menjangkau posting yang memiliki siput yang sama dengan salah satu syarat.
sumber
Saya akan melihat kode plugin kucing tingkat atas:
http://fortes.com/projects/wordpress/top-level-cats/
Anda dapat dengan mudah beradaptasi sehingga mencari siput taksonomi kustom Anda dengan mengubah
on line 74 ke sesuatu seperti:
sumber
Saya sarankan untuk melihat plugin Custom Post Permalinks . Saya tidak punya waktu untuk menguji sekarang, tetapi mungkin membantu dengan situasi Anda.
sumber
%forum%
, yang persis apa yang saya coba hindari ...Karena saya terbiasa dengan pertanyaan Anda yang lain , saya akan menjawab dengan itu dalam pikiran.
Saya belum menguji ini sama sekali, tetapi mungkin berhasil jika Anda menjalankan ini sekali setelah Anda mendaftarkan semua permastructs yang Anda inginkan .:
Kegunaannya: menghapus aturan penulisan ulang yang dihasilkan dari topik permalink dari aliran normal array aturan dan menggabungkannya kembali di akhir array. Ini mencegah aturan-aturan itu mengganggu aturan penulisan ulang lainnya. Selanjutnya, itu memaksa aturan penulisan ulang verbose (setiap halaman mendapatkan aturan individu dengan ekspresi reguler tertentu). Ini mencegah halaman dari mengganggu aturan topik Anda. Akhirnya, ia mengeksekusi hard flush (pastikan file .htaccess Anda dapat ditulisi, jika tidak ini tidak akan berfungsi) dan menyimpan berbagai aturan penulisan ulang yang sangat rumit.
sumber
Ada plugin untuk ini .
Ini menghapus tipe siput dengan menambahkan aturan khusus untuk setiap halaman tipe posting kustom.
sumber
Tidak yakin apakah ini akan berfungsi untuk taksonomi, tetapi ini berfungsi untuk jenis pos kustom
Meskipun belum diperbarui selama 2 tahun, plugin di bawah ini berfungsi untuk saya: http://wordpress.org/plugins/remove-slug-from-custom-post-type/
FYI Saya menjalankan WP
3.9.1
dengan Jenis WP1.5.7
sumber
Gunakan garis miring sebagai nilai untuk slug ... 100% berfungsi
sumber
page
jenis posting ke 404.