Özel URL yolları nasıl oluşturulur?


50

Çok özel bir gereksinim var, umarım çok kafa karıştırıcı olmadan açıklayabilirim. Harici bir XML dosyasından aldığım bazı özellikleri listelediğim, bugüne kadar sorun çıkmayan bir sayfa şablonu oluşturdum, diyelim ki URL şöyle:

http://www.example.com/properties/

Her özellik, kullanıcıyı bu konuda daha fazla bilgi görüntüleyen bir "Tek Mülkiyet" sayfasına yönlendirmesi gereken bir bağlantıya sahiptir. Bağlantıyı böyle yapmanın bir yolu olup olmadığını merak ediyordum:

http://www.example.com/properties/123

123Mülkiyet kimliği nerede olurdu. Öyleyse, benim gibi bir URL’m varsa, properties/some_idbir görünüm dosyasını ( single.phpveya page.phpdosyalar gibi) yükleyebilmek, ancak bu URL koşuluna özgü olmak istiyorum.

Mümkün mü?

Yanıtlar:


57

Bunu, kendi işlevlerinize ekleyin. Veya eklentisine ekleyin .

add_action( 'init', 'wpse26388_rewrites_init' );
function wpse26388_rewrites_init(){
    add_rewrite_rule(
        'properties/([0-9]+)/?$',
        'index.php?pagename=properties&property_id=$matches[1]',
        'top' );
}

add_filter( 'query_vars', 'wpse26388_query_vars' );
function wpse26388_query_vars( $query_vars ){
    $query_vars[] = 'property_id';
    return $query_vars;
}

Bu, istekleri /properties/, sayfa adının ardından gelen herhangi bir sayı kombinasyonuyla, propertiesvar var sorgusu ile yönlendiren bir yeniden yazma kuralı ekler property_id. Yalnızca kalıcı ayarlar sayfanızı ziyaret ettiğinizden ve yeniden yazma kurallarını silmek için kaydettiğinizden emin olun, bu nedenle bu yeni kural eklenecektir.

Senin içinde page-properties.phpşablona, get_query_var('property_id')o kurulmuştur daha sonra varsayılan özellikleri sayfayı göstermek değilse, mülkiyet id dönecektir.


4
Bu benim için çalışmaya KAPALI oldu ama eklemem gerekiyordu: add_filter ('init', 'flushRules'); flushRules () işlevi {global $ wp_rewrite; $ wp_rewrite-> flush_rules (); }
tooshel

19
@tooshel kesinlikle her istek üzerine kuralları yıkamak istemiyorsanız, bu pahalı bir işlemdir ve sitenizi sürünmeye yavaşlatır. kuralları bir kez, eklenti etkinleştirme işleminde veya yalnızca kalıcı bağlantı ayarları sayfasını ziyaret ederek silmeniz gerekir.
Milo

Evet, anladım. . . ama test ederken orada olması çok hoş!
tooshel

3
Daha akıllı bir yeniden yazma URL'si regexp olabilir ^properties/([0-9]+)/?. Aksi takdirde bir şey gibi eşleşirexample/properties/1
Ryan Taylor

@RyanTaylor bundan emin misiniz? example/properties/1test ederken yakalamaz .
Milo

9

Bunu yapmanın başka bir yolu:

add_action('init', function() {
    add_rewrite_rule( '^properties/([0-9]+)/?',
                      'index.php?pagename=properties&property_id=$matches[1]',
                      'top' );
}, 10, 0);

add_action('init', function() {
    add_rewrite_tag( '%property_id%', '([^&]+)' );
}, 10, 0);

Codex Rewrite API / yeniden yazma kuralı ekleme

Codex Rewrite API / yeniden yazma etiketi ekle


2
Kabul edilen cevap 4.7 (ve 4.8) ile çalışır, neden olmadığını düşündüğünden emin değilim. Kodunuz aslında aynı şeyi yapıyor, add_rewrite_tagsorguyu query_varsfiltre ile aynı diziye var ekler .
Milo

@Milo muhtemelen benim için işe yaramadı, ama ben artık bir 4.7 kullanışlı yok, bu yüzden kontrol edemiyorum. Cevabımı düzenleyeceğim.
Christian Lescuyer

@Milo Kişisel olarak yeniden yazma etiketini tercih etsem de, kabul edilen cevabı yine de test etti ve çalışıyor. Yine de bazı kişisel zevkler.
Jack Johansson

1
@JackJohansson yeniden yazma etiketleri, bunu bir permastruct'ta kullanırken gereklidir . Bu, WordPress'in bu durumda asla kullanmadığı bir miktar veridir.
Milo

her iki kural da aynı yönteme eklenebilir, geri gelmek ve bakım çalışması yapıp yapmamak için daha temiz ve daha kullanışlı bir işlevle
sonuçlanır
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.