Add_rewrite_rule konusunda yardıma mı ihtiyacınız var


55

ÇÖZÜM


Güncelleme 3 ile birlikte gittim ve çalışmasını sağladım. Ben yanlış anladığını Ne, Bir yeniden yazma kuralı değiştirmek inanıyordu olmasıydı designers/?designer=some-designer&bid=9için /designers/some-designer. Ama elbette tam tersi.


Biraz araştırma yapıyorum, ancak add_rewrite_rule () yöntemini nasıl kullanacağımı tam olarak anlamadım .

Bu gönderi ihtiyacım olana oldukça yakın, ama gerçekten bu kadar koda ihtiyacım var mı?

Mevcut bağlantım şudur:
http://www.norwegianfashion.no/designers/?designer=Batlak-og-Selvig&bid=9
İstediğim şey bu
http://www.norwegianfashion.no/designers/Batlak-og-Selvig /

  1. Nasıl kullanırım add_rewrite_rule()?
  2. Tasarımcı kimliğini (teklif) geçmem gerekiyor. Re.write kurallarını URL’de göründüğü şekilde kullanırken nasıl yapabilirim?

Güncelleme 1

Bunu biraz daha açıklayıcı buldum . Ama işe yaramıyor:

function add_rewrite_rules( $wp_rewrite ) 
{
    $new_rules = array(
        '('.$template_page_name.')/designers/(.*?)/?([0-9]{1,})/?$' => 'designers.php?designer='.
        $wp_rewrite->preg_index(1).'&bid='.
        $wp_rewrite->preg_index(2)
    );
       // Always add your rules to the top, to make sure your rules have priority
    $wp_rewrite->rules = $new_rules + $wp_rewrite->rules;
}
add_action('generate_rewrite_rules', 'add_rewrite_rules');

function query_vars($public_query_vars) {

    $public_query_vars[] = "designer";
    $public_query_vars[] = "bid";
    return $public_query_vars;
}
add_filter('query_vars', 'query_vars')

Güncelleme 2

Jan Fabry'nin başka bir konuda önerdiği başka bir çözüm var . Bunu fonksiyonlarımda yazdım.php, ancak bunun bir etkisi yok.

add_action('generate_rewrite_rules', 'add_rewrite_rules');
add_filter('query_vars', 'query_vars');

/* Custom re-write rules for desigenrs
------------------------------------------------------------------------------*/
function add_rewrite_rules( $wp_rewrite ) 
{
    add_rewrite_rule('^designers/([^/]*)/([^/]*)$ /designers/?designer=$1&bid=$2 [L]', 'top');
    flush_rewrite_rules(false);
}


function query_vars($public_query_vars) {

    $public_query_vars[] = "designer";
    $public_query_vars[] = "bid";
    return $public_query_vars;
}

3 güncelleyin
Ben burada birkaç örnek buldum da. Ancak bu ya da çalışmıyor :(

add_filter('rewrite_rules_array','wp_insertMyRewriteRules');
add_filter('query_vars','wp_insertMyRewriteQueryVars');
add_filter('init','flushRules');  

// Remember to flush_rules() when adding rules
function flushRules(){
    global $wp_rewrite;
    $wp_rewrite->flush_rules();
}

// Adding a new rule
function wp_insertMyRewriteRules($rules)
{
    $newrules = array();
    $newrules['(designers)/(\d*)$'] = 'index.php?pagename=designers&designer=$matches[1]';
    return $newrules + $rules;
}

// Adding the bid var so that WP recognizes it
function wp_insertMyRewriteQueryVars($vars)
{
    array_push($vars, 'designer');
    return $vars;
}

Güncelleme 4 Bu çözümü de denedim, ancak hala başarılı olamadım.

add_filter('search_rewrite_rules', 'designers_createRewriteRules');

function designers_createRewriteRules($rewrite) {
global $wp_rewrite;

// add rewrite tokens
$designer_token = '%designers%';
$wp_rewrite->add_rewrite_tag($designer_token, '(.+)', 'designers=');

$bid_token = '%bid%';
$wp_rewrite->add_rewrite_tag($bid_token, '(.+)', 'bid=');

$keywords_structure = $wp_rewrite->root . "designers/$designer_token/$bid_token";
$keywords_rewrite = $wp_rewrite->generate_rewrite_rules($keywords_structure);

return ( $rewrite + $keywords_rewrite );

}

Güncelleme 5
Yeniden yazma kurallarım eklenmemiş görünüyor. Follwoing uygulamasından yeni kurallar çıkardıktan sonra:, print_r($wp_rewrite)yeni yeniden yazma kurallarım dahil değil.

Güncelleme 6
Jan'in çözümünü test ettim. Ancak URL değişmez :(

/* Initiation script for NF template
------------------------------------------------------------------------------*/   
add_action('after_setup_theme','norwegianfashion_setup');

if ( ! function_exists( 'norwegianfashion_setup' ) ):

  function norwegianfashion_setup() { 
    /* Here I do a lot of stuff */

    // SEO friendly URL for desigenrs
    add_action( 'init', 'wpa5413_init' );
    add_filter( 'query_vars', 'wpa5413_query_vars' );
  }

endif;


/* Custom re-write rules for desigenrs
------------------------------------------------------------------------------*/
function wpa5413_init()
{
    // Remember to flush the rules once manually after you added this code!
    add_rewrite_rule(
        'designers/([^/]+)/?',
        'index.php?pagename=designers&designer=$matches[1]',
        'top' );
}

function wpa5413_query_vars( $query_vars )
{
    $query_vars[] = 'designer';
    return $query_vars;
}

Birisi bu sorunu çözmeme yardım etseydi çok sevinirim.


Bu, burada sorduğunuz ve cevap verdiğim ilk soruya çok benziyor . O zamandan beri durum değişti, bu yüzden cevabım artık geçerli değil mi? Tasarımcının kimliğini URL’nizde istemiyorsanız, "sümüklü böcek" ü kimliğe dönüştürmeniz gerekir, WordPress bunu sizin için yapamaz. Tasarımcılar hala harici bir nesne midir?
Jan Fabry,

@Jan Fabry Evet, bunu gönderdikten sonra (unutmuşum) öğrendim. Şimdi öneriyorum ki, öneriniz daha iyi. Güncellenen koduma bakın. Tasarımcılarım hala özel bir DB'ye girdiler. Geçiş için POST insted og GET kullanmak mümkün mü bid?
Steven

Bir POST isteği kullanmak, bağlantıyı kopyalayıp başka birine gönderirsem, sorun olmaz. Sümüklüböcek benzersiz yapmak ve veri oradan arama yapmak sorun mu?
Jan Fabry,

@Jan Fabry: Ne demek istiyorsun slug? Tasarımcı verilerini almak bidyerine kullanmak çok daha kolaydırdesigner
Steven

Yanıtlar:


87

Yeniden yazma kuralları hakkında biraz bilgi

WP Yeniden Yazma sistemi karmaşık görünüyor, ama aslında nasıl çalıştığını anlamak zor değil. Güzel URL'leri ( /designers/), sanki hoş olmayan ( ) gibi ayrıştırmak için kullanılır /index.php?pagename=designers. Temel fikir, yeniden yazma kuralları listesine , gelen URL'lerle eşleşebilecek düzenli ifadelere sahip olmanız ve bunları çoğunlukla index.phpbazı sorgu değişkenleri biçiminde diğer URL'lere yeniden yazmanızdır . Bu değişkenler, normal ifadenin URL ile eşleşen kısımlarına ayarlanır. Kurallar yukarıdan aşağıya doğru değerlendirilir, bu nedenle iki kural eşleşirse, ilki "kazanır".

Bu yeniden yazma kuralları arama yaparak veritabanında saklanır flush_rewrite_rules(), ancak bu kuralları oluşturmak ve yazmak pahalı bir işlem olduğundan, her konuda bunu yapmamalısınız init. Bunun yerine, yalnızca kuralları değiştirdiğinizde yaparsınız: muhtemelen eklenti etkinliğinde (kullanarak register_activation_hook()) veya Kalıcı bağlantılar ayarları sayfasını el ile ziyaret ederek ( bunu otomatik olarak tema etkinliğinde yapmak zor olduğu için ). Kurallara uymazsanız, aramanın add_rewrite_rule()hiçbir etkisi olmaz. Çağrı için hiçbir sorun add_rewrite_rule()her on initkuralları kızardı sonra bile.

Yeniden yazma kurallarınızı eklemenin birçok yolu vardır ve yalnızca bir kural eklemek istiyorsanız, bunu birlikte yapabilirsiniz add_rewrite_rule(). Mesajların, sayfa, bir sınıflandırmada için kurallar ... birden fazla kurala neden olduğundan, gibi üst düzey fonksiyonları ile oluşturulan add_rewrite_tag(), add_permastruct(), ... Ama bunlar bizim burada sahip basit bir durum için gerekli değildir.

Bazı filtreler de vardır, bu yüzden generate_rewrite_rulesveya generate_rewrite_rules_arraykancaları kullanarak kurallarınızı da ekleyebilirsiniz . Bunlar size tüm kurallar üzerinde çok detaylı kontrol sağlar, ancak yine de add_rewrite_rule()sadece bir kural eklemek istiyorsanız yeterlidir.

Geçerli yeniden yazma kurallarını analiz etmenizi sağlayan küçük bir eklenti oluşturdum ve (tabii ki) bir şeyi değiştirmeye çalıştığınızda kullanmanızı öneririz.

Ek bilgilerinizi URL’den almak

Verdiğiniz örneği üzerine kuralım. Tasarımcı markası var Batlak og Selvig, ID ( bid) 9. Bu kimliği URL’de istemezsiniz, yalnızca adı Biz (boşluk veya özel karakter içermeyen) adın URL dostu sürümünü çağırır sümüklü böcek : Batlak-og-Selvig.

Genel olarak, URL sayfada göstermek istediğiniz içeriği tanımlamak için tüm bilgileri içermelidir. Görüntülemek istediğiniz asıl tasarımcı kimliğini saklamak için çerezleri veya POST isteklerini kullanabilirsiniz, ancak bağlantıyı paylaşan, posta, Facebook, Twitter üzerinden göndererek veya telefonla yüksek sesle okuyarak bu durum bozulacaktır. URL’nizde sayısal kimliği kullanmak istemiyorsanız, sümüklü böceklerin benzersiz olduğundan emin olmalısınız: daha sonra önce sümüklü böcek kimliğine göre bir arama yapın ve daha önce yaptığınız gibi devam edin.

Peki şimdi öğrendik biz kalıbı için bir yeniden yazma kuralını eklemek istediğiniz olmasıdır " /designers/sonraki kadar şey tarafından takip edilen /" ve bu tasarruf "şey" in designer_slugsorgu değişkeni. Sizin durumunuzda, sayfayı designersgenel sayfa içeriği olarak sümüklü böcek ile birlikte kullanmak istediğinize inanıyorum , bu yüzden WordPress'e de söyleyeceğiz.

add_action( 'init', 'wpa5413_init' );
function wpa5413_init()
{
    // Remember to flush the rules once manually after you added this code!
    add_rewrite_rule(
        // The regex to match the incoming URL
        'designers/([^/]+)/?',
        // The resulting internal URL: `index.php` because we still use WordPress
        // `pagename` because we use this WordPress page
        // `designer_slug` because we assign the first captured regex part to this variable
        'index.php?pagename=designers&designer_slug=$matches[1]',
        // This is a rather specific URL, so we add it to the top of the list
        // Otherwise, the "catch-all" rules at the bottom (for pages and attachments) will "win"
        'top' );
}

Geriye kalan tek şey WordPress'e designer_slugsorgu değişkenlerinde de tutmasını söylemek , böylece daha sonra erişebilmenizi sağlamak. WordPress, kişilerin gönderiler sorgusunun her parametresini URL yoluyla değiştirmelerini önlemek için izin verilen sorgu değişkenlerinin beyaz listesini kullanır. Bu listede olmayan her şey göz ardı edilir. Sadece kancayı takın query_varsve ekstra değişkeninizi ekleyin:

add_filter( 'query_vars', 'wpa5413_query_vars' );
function wpa5413_query_vars( $query_vars )
{
    $query_vars[] = 'designer_slug';
    return $query_vars;
}

Gördüğünüz gibi, bu cevap temelde önceki cevabımla aynı , ancak kurallara uymayan kural olmadan (bu yüzden functions.phpbir eklenti yerine temanızda kullanabilirsiniz), ve biraz daha kesin ve açıklama ile öğrendim. İlk sorunuzu cevaplamaktan bu yana (ve dolayısıyla nedeniyle) kuralları yeniden yazmak hakkında çok şey var.

Sohbet odası tartışma

Sohbet odasında bu sorunun son sayılarını temizledik . Sonunda, Steven generate_rewrite_ruleskancayı kullandı , çünkü add_rewrite_rule()işlev onun için işe yaramadı.


2
@Steven: pagenameGörüntülemek istediğiniz WordPress sayfasının temeli (veritabanına kayıt). Bu sayfa designers.phpşablon dosyasını WP admin alanında kullanmak istediğini gösterebilir . Böylece, sayfa adını, şablon adını değil, aynı şablon birden fazla sayfa için kullanılabileceğini gösterir: bu durumda WordPress ne yapmak istediğinizi bilmiyor.
Jan Fabry,

1
@Steven: Kancaları kurma şeklinizi aşırı karmaşık hale getirdiğinizi düşünüyorum. add_rewrite_rules()İşlevi kaldırın ve add_filter()/add_action()doğrudan arayın . Bu bir tema dosyasındaysa, flush_rewrite_rules()kuralları wpse5413_init()silmek için (veya daha sonra bunları ekleyip kaldırmak için) izinleri kaldırma sayfasını kaldırın ve ziyaret edin . Eklentim mevcut yeniden yazma kurallarını gösterir. Bunun, kodunuzun URL’leri HTML’ye nasıl yazacağını değil, yalnızca gelen URL’lerin işlenme biçimini değiştirdiğini unutmayın.
Jan Fabry,

1
@Steven: Kaydet düğmesine basmanız gerektiğini bile sanmıyorum, sadece kalıcı sayfaları açmak da onu temizleyecektir. Ve yine, bu yalnızca WordPress’in /designers/designer-slug/URL’leri kabul etme özelliğini ekleyecektir, bu URL’leri yazdığınız yerleri HTML’nizde kendiniz değiştirmeniz gerekir. /designers/Batlak-og-Selvig/Kendinize bakarak test edin , eğer işe yararsa, bu URL’leri oluşturan tüm yerleri bulun ve yeni yapıyı kullanmak için onları değiştirin.
Jan Fabry,

1
Ah, şimdi sanırım dürüst olmaya başladım. Yeniden yazma kurallarının, URL’nin tarayıcı URL’si alanına nasıl dağıtıldığını değiştireceğini düşündüm. Ama ne anlama geliyor ki, aslında URL’yi çıkarmam gerekiyor www.mysite.com/batlat-og-selvig/9ve sonra bu da "çevrildi"/?designer=Batlak-og-Selvig&bid=9
Steven

1
@Steven: Evet, gerçekten: yeniden yazma kuralları gelen bağlantıları yönetir ve (yalnızca birkaç seçili durumda) kodunuzda oluşturulan linkleri etkilemez.
Jan Fabry
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.