Titik akhir permalink jenis pos khusus

8

Saya memiliki jenis posting khusus yang disebut "tujuan" dan saya telah menetapkan topeng EP untuk jenis posting menjadi EP_PERMALINK default. Saya telah menambahkan beberapa titik akhir sebagai berikut:

add_filter( 'query_vars', 'add_query_vars');

function add_query_vars($vars){
    $vars[] = "tours";
    $vars[] = "activities";
    return $vars;
}

add_action('init', 'add_endpoints');

function add_endpoints(){
    global $wp_rewrite; 

    add_rewrite_endpoint('tours', EP_PERMALINK);
    add_rewrite_endpoint('activities', EP_PERMALINK);

    $wp_rewrite->flush_rules();
}

Sekarang jika saya menguji ini pada posting normal, pengalihan ke template yang saya butuhkan (saya memiliki redirect template untuk hook template tunggal)

yaitu. somesite.com/test-category/test/activities/

Tetapi untuk tipe posting (yang hierarkis) itu hanya menghilangkan titik akhir dari url dan tetap pada templat single-destination.php

yaitu. somesite.com/destination/south-africa/kruger-national-park/activities/

menjadi

somesite.com/destination/south-africa/kruger-national-park/

Bantuan atau bimbingan apa pun akan sangat dihargai. Saya telah berjuang dengan ini selama berjam-jam dan tidak ada hasil :(

Terima kasih

Charl Pretorius
sumber

Jawaban:

25

Beberapa hal. Pertama, nama fungsi Anda harus diawali dengan sesuatu yang unik. WordPress adalah ekosistem besar, dan orang lain mungkin telah menggunakan semua nama fungsi generik yang dapat Anda pikirkan.

Kedua, add_rewrite_endpointberhati-hati dalam menambahkan variabel kueri untuk Anda. Jadi Anda tidak membutuhkan ini:

add_filter( 'query_vars', 'add_query_vars');
function add_query_vars($vars){
    $vars[] = "tours";
    $vars[] = "activities";
    return $vars;
}

Aturan penulisan ulang Flushing pada setiap beban bukanlah ide yang baik. Ini hanya perlu dilakukan sekali setelah aturan Anda ditambahkan. Seperti pada aktivasi plugin. Jadi add_endpointsfungsi Anda bisa disingkat menjadi ini (dengan nama fungsi yang lebih baik per titik di atas).

<?php
add_action('init', 'wpse42279_add_endpoints');
function wpse42279_add_endpoints()
{
    add_rewrite_endpoint('tours', EP_PERMALINK);
    add_rewrite_endpoint('activities', EP_PERMALINK);
}

Yang berfungsi dengan baik untuk posting. Jika Anda ingin itu berfungsi pada halaman atau jenis posting hierarkis lainnya, Anda harus menggunakan EP_PAGESmask titik akhir.

<?php
add_action('init', 'wpse42279_add_endpoints');
function wpse42279_add_endpoints()
{
    add_rewrite_endpoint('tours', EP_PAGES);
    add_rewrite_endpoint('activities', EP_PAGES);
}

Tapi itu masih tidak akan berfungsi seperti yang diharapkan untuk Anda. Endpoint menetapkan variabel kueri mereka sama dengan apa pun yang muncul setelahnya. Jadi, jika URL Anda ...

yoursite.com/some-country/some-city/activities/asdf

aktivitas variabel kueri akan menjadi asdf. Jika tidak ada yang mengikuti activities, var kueri Anda akan kosong (tetapi ditetapkan), jadi itu akan selalu dinilai sebagai salah ketika Anda mencoba untuk menangkapnya ...

<?php
add_action( 'template_redirect', 'wpse42279_catch_vars' );
function wpse42279_catch_vars()
{
    if( get_query_var( 'tours' ) )
    {
        // do stuff!
        exit();
    }
}

Anda dapat menyiasatinya dengan memfilter requestdan mengubah nilai variabel wisata dan aktivitas menjadi true jika disetel.

<?php
add_filter( 'request', 'wpse42279_filter_request' );
function wpse42279_filter_request( $vars )
{
    if( isset( $vars['tours'] ) ) $vars['tours'] = true;
    if( isset( $vars['activities'] ) ) $vars['activities'] = true;
    return $vars;
}

Anda harus melihat pada panduan ini untuk API Menulis Ulang yang saya tulis. Namun, bagian yang relevan untuk pertanyaan Anda dirangkum di atas.

chrisguitarguy
sumber
1
Terima kasih atas tanggapan yang luar biasa! Saya telah melakukan modifikasi sesuai dengan posting dan panduan Anda. Tapi sepertinya wordpress mengarahkan / menghapus titik akhir dan vars setelah memuat url. Saya tidak yakin apakah itu pengalihan kanonik atau apa. Tapi itu hanya menghilangkan titik akhir yang terdaftar. Jika saya menambahkan sesuatu arb ke akhir url saya mendapatkan 404. Tetapi tur atau kegiatan dihapus atau dialihkan ke url tujuan tunggal. :(
Charl Pretorius
1
Sepertinya saya menemukan masalah. Ada hubungannya dengan pengaturan permalink. Saya memiliki pengaturan khusus - /% kategori% /% postname% /. Tetapi jika saya mengaturnya hanya /% postname% / berfungsi, belum yakin mengapa, tetapi akan melihatnya. Terima kasih \ 0 /
Charl Pretorius
1
Anda harus mencoba mengalihkannya kembali ke /% kategori% /% postname% / sekarang dan mungkin berfungsi lagi. Saya menduga alasan WP menghapus barang-barang Anda adalah karena Anda perlu menghapus aturan penulisan ulang. (Mungkin.)
chrisguitarguy
1
Saya memiliki pengaturan permalink kustom juga. Saya baru saja pergi ke Permalinks Pengaturan & mengklik Simpan Perubahan tanpa mengubah apa pun, dan kemudian titik akhir bekerja.
yitwail
Ini banyak membantu saya! Terima kasih banyak saudara!
fdrv