özel sınıflandırma ve sayfalar slug çakışmasını yeniden yazar 404 verir


9

Özel sınıflandırmaları oluşturmak için Özel Gönderi Türü UI eklentisini kullanıyorum. 2 özel teknoloji ve müşteri taksonomisi içeren projelerden (özel posta türü) oluşan bir portföyüm var. Müşteriler sınıflandırma özel bir yeniden yazma bilgi portfolio/clients/, teknoloji sınıflandırma özel bir yeniden yazma bilgiportfolio/

Yeniden yazar:
portfolio/html <- sayfa HTML kullanan tüm projeleri görüntüler
portfolio/clients/client-a<- sayfa A istemcisi için tüm projeleri görüntüler

Şimdi bir url slug sahip müşteriler için bir açılış sayfası yapmaya çalıştığımda /portfolio/clients404 sayfasını alıyorum. Bunun teknolojiler taksonomisinin çakışan url yeniden yazma işlemlerinden kaynaklandığından eminim. Teknoloji taksonomisinde onu ararken tahmin ediyorum, o zaman o 404 sayfa tükürür yok. Öyleyse, url yeniden yazma sümüğünün çalışmasını nasıl sağlarım, böylece vurduğumda /portfolio/clients, 404 sayfasını geri göndermez ve doğru sayfa şablonunu kullanır?

Yanıtlar:


16

"Kısmi ayrıntılı yeniden yazma kurallarına" ihtiyacınız var. Ayrıntılı yeniden yazma kuralları, WordPress'in bir sayfa ile yazı arasındaki farkı anlayamadığı için tüm sayfaların üste yerleştirildiği anlamına gelir. Burada olabileceğini düşünüyor, çünkü formun tüm URL'leri, bu hariç portfolio/([^/]+)/, portfoliosınıflandırmanızdan portfolio/clients/. Bunu yeniden yazma kurallarının üstüne koymanız gerekecek, böylece daha genel portföy sınıflandırmasından önce eşleşecek. Muhtemelen tüm yeniden yazma kurallarını ayrıntılı olmaya zorlayabilirsiniz, ancak çok fazla sayfanız varsa performansı etkileyecektir.

Bu cevap, yeniden kazanma kurallarını yeni kazandığım anlayışımla yazılmıştır, bu yüzden umarım bunu yapmanın iyi bir yoludur ve örnek kod çok fazla hata içermez.

Bir sayfa yalnızca bir yeniden yazma kuralı oluşturmaz, bir grup oluşturur:

  • (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]+)?/?$

Bunları kendiniz oluşturmak zorunda değilsiniz, gücünü yeniden kullanabilirsiniz WP_Rewrite. Onun bak page_rewrite_rules()yöntemiyle: Biz modunda ayrıntılı iseniz, tüm (aracılığıyla sayfaların listesini alır page_uri_index(),) ve bunların ekleri üzerine yazar %pagename%yeniden yazma etiketi ve bu sayfa için yeniden yazma kuralları oluşturur. Bunu da yapabiliriz:

// 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);

Bu bize sayfalar için kurallar verir, ancak henüz sayfada kullanılan ekler için değil. Bunları da istiyorsanız, her ek için adımı tekrarlayın, ancak add_rewrite_tag('%pagename%', "({$attachment_uri})", 'attachment=')( page_rewrite_rules()daha fazla bilgi için bkz .)

Güzel, kuralları aldık, ama şimdi bunları bir şekilde tüm yeniden yazma yapısına eklemeniz gerekiyor. Bunu ile yapabilirsiniz add_rewrite_rule(), ancak $page_rewrite_rulesdizide oluşturulan her kural için çağırmalısınız . Bu nedenle, birçok kişi içine kanca filtrenin sadece orada diziyi değiştirebilir beri.rewrite_rules_array

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;
}

Bu filtreyi ekledikten sonra, yeniden yazma kurallarını temizlemelisiniz (bir sayfa, her sayfa yükünde bir değil, oldukça ağır olduğundan). Bunu arayarak flush_rewrite_rules()veya "Kalıcı Bağlantılar" ayarları sayfasını ziyaret ederek yapabilirsiniz.


Mükemmel! Teşekkürler Jan! Bu işe yaradı. Daha iyi bir açıklama alamazdım.
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.