taksonomi kustom dan halaman menulis ulang konflik siput memberi 404


9

Saya menggunakan plugin Custom Post Type UI untuk membuat taksonomi kustom saya. Saya memiliki portofolio yang terdiri dari proyek (jenis pos kustom) dengan 2 taksonomi khusus teknologi dan klien. Taksonomi klien memiliki siput penulisan ulang kustom portfolio/clients/, sedangkan taksonomi teknologi memiliki siput penulisan ulang kustomportfolio/

Penulisan Ulang:
portfolio/html <- halaman menampilkan semua proyek menggunakan HTML
portfolio/clients/client-a<- halaman menampilkan semua proyek untuk klien A

Sekarang ketika saya mencoba membuat halaman arahan untuk klien yang memiliki slug url /portfolio/clientssaya mendapatkan halaman 404. Saya cukup yakin ini karena url penulisan ulang yang saling bertentangan dari teknologi taksonomi. Saya menduga ketika mencarinya di taksonomi teknologi, itu tidak ada kemudian meludahkan halaman 404. Jadi, bagaimana saya membuat slug penulisan ulang url berfungsi sehingga ketika saya menekan /portfolio/clients, itu tidak mengirim kembali halaman 404 dan menggunakan templat halaman yang benar?

Jawaban:


16

Anda tampaknya memerlukan "aturan penulisan ulang sebagian verbose". Aturan penulisan ulang Verbose berarti semua halaman diletakkan di atas karena WordPress tidak dapat menemukan perbedaan antara halaman dan posting. Di sini ia berpikir bisa, karena semua URL formulir portfolio/([^/]+)/berasal dari portfoliotaksonomi Anda , kecuali yang ini portfolio/clients/. Anda harus meletakkan yang di atas aturan penulisan ulang, sehingga cocok sebelum taksonomi portofolio yang lebih umum. Anda mungkin juga bisa memaksa semua aturan penulisan ulang menjadi bertele-tele, tetapi itu akan memengaruhi kinerja jika Anda memiliki banyak halaman.

Jawaban ini ditulis dengan pemahaman saya yang baru saja didapat dari aturan penulisan ulang, jadi saya harap ini adalah cara yang baik untuk melakukannya dan kode contoh tidak mengandung terlalu banyak kesalahan.

Halaman tidak hanya menghasilkan satu aturan penulisan ulang, itu menghasilkan grup:

  • (pagename)/trackback/?$
  • (pagename)/feed/(feed|rdf|rss|rss2|atom)/?$
  • (pagename)/(feed|rdf|rss|rss2|atom)/?$
  • (pagename)/page/?([0-9]{1,})/?$
  • (pagename)/comment-page-([0-9]{1,})/?$
  • (pagename)(/[0-9]+)?/?$

Anda tidak harus membuat ini sendiri, Anda dapat menggunakan kembali kekuatan WP_Rewrite. Lihatlah page_rewrite_rules()metodenya: jika kita dalam mode verbose, ia mendapat daftar semua halaman (melalui page_uri_index()) dan lampirannya, menimpa %pagename%tag penulisan ulang, dan menghasilkan aturan penulisan ulang untuk halaman ini. Kita juga bisa melakukan ini:

// We only generate them for this page
$page_uri = 'portfolio/clients';
// Returns site root + '%pagename%'
$page_structure = $wp_rewrite->get_page_permastruct();
// Everywhere you see %pagename% in the structure used to generate rules
// in the next step, replace it with our fixed page name
$wp_rewrite->add_rewrite_tag('%pagename%', "({$page_uri})", 'pagename=');
// This generates the group given above
$page_rewrite_rules = $wp_rewrite->generate_rewrite_rules($page_structure, EP_PAGES);

Ini akan memberi kita aturan untuk halaman, tetapi belum untuk lampiran yang digunakan di halaman. Jika Anda juga menginginkannya, Anda ulangi langkah untuk setiap lampiran, tetapi dengan add_rewrite_tag('%pagename%', "({$attachment_uri})", 'attachment=')(lihat page_rewrite_rules()untuk detail lebih lanjut).

Bagus, kami punya aturannya, tapi sekarang Anda perlu menambahkannya ke struktur penulisan ulang yang lengkap. Anda bisa melakukan ini dengan add_rewrite_rule(), tetapi Anda harus memanggilnya untuk setiap aturan yang dihasilkan dalam $page_rewrite_rulesarray. Untuk alasan ini, banyak orang mengaitkan ke dalam rewrite_rules_arraysaringan , karena Anda hanya dapat memodifikasi array sana.

add_filter('rewrite_rules_array', 'add_verbose_portfolio_clients_page');
function add_verbose_portfolio_clients_page($rewrite_rules)
{
    global $wp_rewrite;

    // The previous code snippet comes here, where we generate $page_rewrite_rules

    // Our rules have priority, they should be on top
    $rewrite_rules = array_merge($page_rewrite_rules, $rewrite_rules);

    return $rewrite_rules;
}

Setelah Anda memasukkan filter ini, Anda harus menyiram aturan penulisan ulang (sekali, tidak setiap memuat halaman, karena cukup berat). Anda dapat melakukan ini dengan menelepon flush_rewrite_rules(), atau dengan mengunjungi halaman pengaturan "Permalinks".


Luar biasa! Jan terima kasih! Ini berhasil. Saya tidak bisa menerima penjelasan yang lebih baik.
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.