Wordpress'te özel eklenti yolu


12

Tamam, sorum çok basit. Eklentim için bazı özel yönlendirme kurallarını uygulamam gerekiyor. Bu rotalar sadece bir argüman alır (bu yüzden karmaşık bir şey yoktur) ve şöyle görünür: http://www.example.org/myroute/myargument

Ve ideal olarak, bu özel bir sınıfı çağırır ve özel bir şablonu görüntüler (doğrudan sınıfa erişebilir).

Bunun için en iyi yaklaşım nedir? Şerefe

Yanıtlar:


15

Üç önemli şey yapmanız gerekiyor:

  1. URI'nin bölümlerini geçirilen değerlere dönüştürmek için özel bir yeniden yazma kuralı oluşturun index.php.
  2. WordPress'in sorgu değişkenlerini beyaz listeye ekleyin myrouteve ekleyin myargument, böylece WordPress yalnızca bir sorgu dizesinde göründüklerinde bunları yok saymaz.
  3. 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 myrouteve myargumentbeyaz 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=1ve daha sonra yapılan çağrıya apiek 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 myroutebir sınıflandırma, terim veya üst sayfa olmadığını nasıl bilebilir ?

Bu yardımcı olur umarım.


1
Kullanışlı not: my_insert_rewrite_rulestanı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.
emc

1
@npcÖzel yeniden yazma kuralları oluştururken dikkat edilmesi gereken önemli bir nokta, bu şekilde de çarpışabilir. Yukarıdaki örnekte olsa da, bu bir sorun değildir, çünkü / api / myroute geçerli bir yol olmaz.
eddiemoya

Example.org/api/myroute/myargument sayfası istendiğinde birisi eklenti dizininden nasıl özel bir şablon yükleyebilir ?
Matt Keys

1
İşte wordpress tarafından gerçek ve eksiksiz çözüm: codex.wordpress.org/Rewrite_API/add_rewrite_rule
Imran Zahoor

6

Eddiemoya'nın yukarıda yaptığı şeyleri biraz genişletmek için:

Bu sorunun orijinal posteri gibi özel bir yeniden yazma oluşturmak ve bu yeniden yazma sayfası için özel bir şablon sunmak istedim. Edditmoya'nın kodu beni doğru yönde başlattı ve sayfaya erişildiğinde özel şablonumu sunmak için ekstra bir işlev ekledim.

Özel şablon herhangi bir yerde bulunabilir, benim durumumda eklenti dizininde saklanır.

Ayrıca sadece yeniden yazma kurallarının eklenti aktivasyonu sırasında yıkanması gerekip gerekmediğini kontrol etmek istedim, bu yüzden bir register_activation_hook

Yaptığım şeyin tam örneği için aşağıya bakın:

Milo'nun tavsiyelerine dayanarak GÜNCELLENDİ

class Your_Class
{

    public function init()
    {
        add_filter( 'template_include', array( $this, 'include_template' ) );
        add_filter( 'init', array( $this, 'rewrite_rules' ) );
    }

    public function include_template( $template )
    {
        //try and get the query var we registered in our query_vars() function
        $account_page = get_query_var( 'account_page' );

        //if the query var has data, we must be on the right page, load our custom template
        if ( $account_page ) {
            return PATH_TO_PLUGIN_TEMPLATES_DIR . 'register.php';
        }

        return $template;
    }

    public function flush_rules()
    {
        $this->rewrite_rules();

        flush_rewrite_rules();
    }

    public function rewrite_rules()
    {
        add_rewrite_rule( 'account/(.+?)/?$', 'index.php?account_page=$matches[1]', 'top');
        add_rewrite_tag( '%account_page%', '([^&]+)' );
    }

}

add_action( 'plugins_loaded', array( new Your_Class, 'init' ) );

// One time activation functions
register_activation_hook( PATH_TO_PLUGIN_FILE, array( new Your_Class, 'flush_rules' ) );

1
Ayrıca, sadece add_rewrite_endpointkuralı sizin için oluşturacak ve tek seferde var değişkenini ekleyeceksiniz. ayrıca kendi yeniden yazma kurallarınızı ekliyorsanız add_rewrite_rule, filtreleme yerine işlevi öneririm rewrite_rules_array.
Milo

Teşekkürler Milo, yeniden yazma dizisini filtrelemek yerine add_rewrite_rule kullanmak için kodu güncelledim. Ben add_rewrite_endpoint baktım ama add_rewrite_tag benim ihtiyaçları için daha uygun olabilir düşünüyorum. Mevcut WP yeniden yazma işlemlerine ekstra argüman eklemek istiyorsanız add_rewrite_endpoint çoğunlukla yararlı görünüyor. Burada yanılıyorsam düzelt.
Matt Keys

1
Nesneye yönelik yaklaşımı seviyorum. Çok fazla WP geliştiricisi hala OOP'un nasıl kullanılacağını bilmiyor. PHP geliştiricilerine olan inancımı yeniden sağlamaya çalıştığınız için teşekkür ederiz. ;)
Arvid
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.