Add_rewrite_rule öğesini anlama


11

add_rewrite_ruleUrl'den bir param çıkarmak ve isteği iletmek için çalışmaya çalışıyorum . Bununla ilgili birkaç gönderi gördü, ancak çalıştıramadı.

Bir url belirli bir dize ile başlarsa, onu url'den kaldırmak ve bir sorgu parametreleri olarak geçirmek istiyorum.

Örnek istek URL'si:

http://domain.com/foo/my_page

Bu,

http://domain.com/my_page?param=foo

Eğer 'foo' yoksa, sadece normal bir istek olarak geçmelidir. Bu mantık, sitemdeki tüm sayfa URL'lerine veya özel yazı türü URL'lerine uygulanmalıdır (temel olarak foo / *). Eğer url 'foo' çıkarırsa ve sonra Wordpress'e normal bir şeyle geçerse, bunun bir geçiş olarak hareket edeceğini düşünmek.

Zaten izin verilen bir sorgu_vars olarak 'param' var.

Toplamda, aşağıdakiler için çalışması gerekir:

  • / foo / sayfam (Sayfa)
  • / foo / my_folder / my_page (Alt Sayfa)
  • / foo / example_type (Özel Gönderi Arşivi)
  • / foo / example_type / example_post (Tekil Mesaj Özel)

herhangi bir URL, yani pageyazı , kategori, etiket vb. hiyerarşideki üst / alt sayfalar ne olacak?
Milo

@Milo bunu senin için açıkladım. Yalnızca sayfaları ve özel yazı türlerini (arşiv ve tek sayfalar) kullanıyorum.
Louis W

Yanıtlar:


8

Örneğinizde işe yarayacak temel bir kural:

function wpd_foo_rewrite_rule() {
    add_rewrite_rule(
        '^foo/([^/]*)/?',
        'index.php?pagename=$matches[1]&param=foo',
        'top'
    );
}
add_action( 'init', 'wpd_foo_rewrite_rule' );

Sonra gelen her şeyi alır ve sorgu için foo/olduğu gibi ayarlar pagenameve sonra paramstatik değeri alır foo. Farklı URL kalıplarına ihtiyacınız varsa, her benzersiz kalıp için ek kurallara ihtiyacınız olacaktır. Yeniden yazma kuralları içinde ayarlanabilen çeşitli sorgu değişkenleri için WP_Querydokümanlara bakın . Yenilerini ekledikten sonra yeniden yazma kurallarını temizlemeyi unutmayın. Bu, Kalıcı Bağlantı Ayarları sayfasını ziyaret ederek yapılabilir.

Şimdi örnek URL'nizi ziyaret edin:

http://domain.com/foo/my_page

doğru sayfayı yükler, ancak tam olarak ziyaret etmek gibi davranmaz:

http://domain.com/my_page?param=foo

çünkü dahili yeniden yazma kullanılırken , süper küresel değil sorgu nesnesi paramiçinde ayarlanır . İçinde bir değer arayan kodla çalışmanız gerekiyorsa, bu değeri ayarlamak için fazladan bir adım atmanız gerekir:$wp_query$_GET$_GET

function wpd_foo_get_param() {
    if( false !== get_query_var( 'param' ) ){
        $_GET['param'] = get_query_var( 'param' );
    }
}
add_action( 'parse_query', 'wpd_foo_get_param' );

Dikkate alınması gereken başka bir yöntem de uç noktaları kullanmaktır, bu nedenle /foo/önek olarak değil URL'lerin sonunda olur. Bunun avantajı, API'lerin add_rewrite_endpointsayfalandırmayı etkinleştirmek de dahil olmak üzere ihtiyacınız olan tüm kuralları eklemeyi basitleştirmesidir.


Açıklamalı açıklama için teşekkürler. Yakın görünüyor, sayfalar için çalışıyor ancak bana özel yazı arşivi ve tek URL'ler için 404 hatası veriyor.
Louis W

evet, dediğim gibi, bu kalıpların her birine uyan ek kurallar eklemelisin. Kurulumunuzda bu URL'lerin nasıl göründüğünü bilmiyorum.
Milo

Bir arşiv ve tek sayfaları olan 'projeler' adlı özel bir sayfa türü var. Buna bir örnek verebilir misin, ben de diğerlerini yapabilirim.
Louis W

Ayrıca, alt sayfalar için de işe yaramıyor.
Louis W

1
Kural gerektiren her URL modeline bir örnek eklemek için sorunuzu düzenleyin. Cevabımın kabul edilmesinden gerçekten endişelenmiyorum, bazen insanları kendilerine başlayacak bir şeyler vererek kendi sorularını cevaplamaları için kandırabilirim.
Milo

6

Tamam, tüm 3 tip istek için çalışma örnekleri aldım. Onları çalıştırabilmek için bir sürü deneme ve uğraşmak gerekiyordu. Sanırım Milo, insanları kendi sorularını cevaplamaya itme konusunda iyi.

Sayısız değişiklik ve kalıcı bağlantıların yenilenmesinden sonra, add_rewrite_url dışındaki URL'leri anlamanın çok daha kolay olduğunu gördükten sonra yeniden yazmayı tanımladılar. Örnek varlık index.php?param=foo&post_type=example_type.

Başka bir belirgin şey, ama buraya eklemek, böylece başka birine yardımcı olabilir. Sayfa / alt sayfa joker karakter kurallarınızı tanımlamadan ÖNCE özel yazı türü add_rewrite_rule kurallarını tanımlamanız gerekir. Bununla biraz zaman kaybettim ve kuralların neden işe yaramadığını anlamama neden olan ana şey olduğunu düşünüyorum.

İşte tüm ihtiyaçlarımı karşılayan 3 kural. Sayfa / Alt Sayfa kuralı tek bir kuralda birleştirildi.

// Custom Post Archive
add_rewrite_rule(
    '^foo/example_type/?$',
    'index.php?param=foo&post_type=example_type',
    'top'
    );

// Custom Post Individual
add_rewrite_rule(
    '^foo/example_type/([^/]*)/?$',
    'index.php?param=foo&example_type=$matches[1]',
    'top'
    );

// Pages, Top-Level and Sub-Pages
// This MUST be placed in the code AFTER custom post add_rewrite_rule
add_rewrite_rule(
    '^foo/(.+)/?$',    
    'index.php?param=foo&pagename=$matches[1]',
    'top'
    );

Ayrıca yaptığım, birden çok özel yazı türü kuralı eklemek için bir döngü kurmaktır. Unutmayın, özel yazı türü add_rewrite_rule kurallarını, sayfa / alt sayfa joker karakter kurallarınızı tanımlamadan ÖNCE tanımlamanız gerekir.

$custom_types = array('example_type', 'projects', 'people');

foreach($custom_types as $type) {

    // Custom Post Archive
    add_rewrite_rule(
        '^foo/'.$type.'/?$',
        'index.php?param=foo&post_type='.$type,
        'top'
        );

    // Custom Post Individual
    add_rewrite_rule(
        '^foo/'.$type.'/([^/]*)/?$',
        'index.php?param=foo&'.$type.'=$matches[1]',
        'top'
        );

}

Yeniden Yazma Analyzer iyi Wordpress sayfa / Yayınlar için sorgular anlamaya çalışırken Milo birlikte geçti oldukça yararlı oldu.


Gösteriye geç kaldım, ama başka bir örnek için ping atabilir miyim? Unutmayın, tamamen add_rewrite_rule'un $ tag parametresini anlamıyorum. Ne anlama geldiğini bilmiyorum. Ayrıca pagename = $ ile [1] 'eşleştiren bir örnek anlayamıyorum. BU NE ??? Domain.com/detail?id=2&it=3 gibi bir URL’m var. Sayfanın domain.com/detail/2-3/ olmasını istiyorum. İstekli misin?
Debbie Kurth
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.