Üç önemli şey yapmanız gerekiyor:
- URI'nin bölümlerini geçirilen değerlere dönüştürmek için özel bir yeniden yazma kuralı oluşturun
index.php
.
- WordPress'in sorgu değişkenlerini beyaz listeye ekleyin
myroute
ve ekleyin myargument
, böylece WordPress yalnızca bir sorgu dizesinde göründüklerinde bunları yok saymaz.
- Yeniden yazma kurallarını yıkayın.
İlk olarak, bunun yerine http://www.example.org/myroute/myargument
, URI'nin bu özel 'rotalardan' biri olarak görülmesi gerektiğini belirtmek için bir tür özel önek veya sonek belirlemenizi tavsiye edeceğim . Bu örnek uğruna, öneki seçtim, api
öyle olur http://www.example.org/api/myroute/myargument
. Ben seçtim api
çünkü RESTful bir şey yaptığımda, üzerinde çalışıyor gibi görünüyor, bir API için oldu.
Kod
add_filter( 'rewrite_rules_array', 'my_insert_rewrite_rules' );
add_filter( 'query_vars', 'my_insert_query_vars' );
add_action( 'wp_loaded', 'my_flush_rules' );
// flush_rules() if our rules are not yet included
function my_flush_rules() {
$rules = get_option( 'rewrite_rules' );
if ( ! isset( $rules['api/(.*?)/(.+?)'] ) ) {
global $wp_rewrite;
$wp_rewrite->flush_rules();
}
}
// Adding a new rule
function my_insert_rewrite_rules( $rules ) {
$newrules = array();
$newrules['api/(.*?)/(.+?)'] = 'index.php?myroute=$matches[1]&myargument=$matches[2]';
return $newrules + $rules;
}
// Adding the id var so that WP recognizes it
function my_insert_query_vars( $vars ) {
array_push( $vars, 'myroute', 'myargument' );
return $vars;
}
Hızlı Dağılım
Her şey oldukça basit. Normal ifade deseni, WordPress'teki tüm yeniden yazma kurallarının bir listesine eklenir ve özel deseniniz listenin en üstünde bulunur. Kalıp eşleştiğinde, WordPress yeniden yazma kuralları listesine bakmayı durduracak ve regex'in yakalanan değerlerini, iletilen sorgu dizesindeki başvurular ( $matches[1]
ve $matches[2]
) yerine kullanacaktır index.php
.
Sorgu değişkenlerini myroute
ve myargument
beyaz listeye eklemek, WordPress'i atmak yerine bunlara dikkat etmenizi sağlar.
Özel rotanızı 'adlandırmanın' alternatif yolu
/api/
Önek olarak kullanmaktan kaçınmak istiyorsanız, bunun yerine bir sorgu dizesi değişkeni / alanı kullanabilirsiniz. Böyle bir şey yapmak için, normal ifadeyi benzer bir şeye değiştirir (.*?)/(.+?)\\?api=1
ve daha sonra yapılan çağrıya api
ek bir parametre olarak eklersiniz .array_push()
my_insert_query_vars()
Bu, özel rotayı değiştirecek, böylece her zaman tetiklenecek api=1
, sorgu dizesinin ilk öğesi olacak, örneğin tetikleyecek http://example.com/anytext/anytext?api=1
.
'Ad alanı' teriminin kullanımını görmezden gelin - sadece kısalık için kullanın.
Bir önek veya sonek ile 'ad alanı' yapmazsanız, URI kalıplarıyla çarpışırsınız. Bunun nedeni, WordPress'in özel deseninizi bir gönderi veya sayfa olması amaçlanandan ayırt etmesinin bir yolu olmamasıdır. WordPress'in myroute
bir sınıflandırma, terim veya üst sayfa olmadığını nasıl bilebilir ?
Bu yardımcı olur umarım.
my_insert_rewrite_rules
tanım sırasına göre tanımlanan kurallar ! Önce en uzun kuralla başlayın, sonra en basitine kadar çalışın, aksi takdirde / api / myroute / api / myroute / myargument'i geçersiz kılar.