current_shortcode () - şu anda kullanılan kısa kodu tespit et


11

Eklenti sınıfında herkese açık veriler için basit alanlar sağlamak istiyorum: e-posta, telefon numarası, Twitter vb. Liste uzatılabilir.

Ayrıntılar için GitHub'daki Genel Kişi Verileri eklentisine bakın.

Kullanımı basit tutmak için, yazması kolay kısa kodlar sunmak istiyorum:

  • [public_email]
  • [public_phone]
  • [public_something]

Tek fark ikinci kısımdır. Hata kodlu oldukları için kısa kodlar için başka argümanlar istemiyorum. Bu yüzden eklenti sınıfımdaki tüm alanlar için bir kısa kod işleyicisi kaydediyorum:

foreach ( $this->fields as $key => $value )
{
    add_shortcode( 'public_' . $key, array( $this, 'shortcode_handler' ) );
}

Şimdi shortcode_handler()hangi kısa kodun çağrıldığını bilmek zorunda. Sorum şu: Bunu nasıl yaparım?

Geçerli geçici çözümüm başka bir işlev:

protected function current_shortcode()
{
    $backtrace = debug_backtrace( DEBUG_BACKTRACE_IGNORE_ARGS );
    return $backtrace[3]['args'][0][2];
}

Bu… işe yarıyor the_content(). Ancak ne zarif ne de sağlamdır.
Okudum wp-includes/shortcodes.php, ama şimdi nasıl daha iyi yapılacağını göremiyorum.


1
Beni hep merak ettin. Bunu kısaca inceleyeceğim. Ben shortcodes.php sadece fonksiyonları bir grup olduğunu biliyorum, eğer OOP kullanarak doğru yazılmış olsaydı hiç şüphesiz current_shortcode sınıf değişkeni olurdu ve her şeyi kolaylaştırdı. Bildiğim kadarıyla Wordpress tüm kısa kodları ve geri aramaları bir dizide saklar, işlendiği ve çekirdek dosyaları hacklemeden her kısa kodu bir değişkene depolamanın bir yolu olup olmadığını merak ediyorum?
Dwayne Charrington

@toscho Kabul ediyorum, bence bu gerçekten bir sorun, kısa kodların yapılma biçiminde bir yeniden düzenleme, (daha çok OOP gibi Widget'ları kucaklamak) akılda tutulmalıdır. Bu konuda yardım etmek isterim ve daha sonra bunu Çekirdeğe bir güncelleme olarak gönderirim.
Webord

@brasofilo Doğru, şimdi yaptım.
fuxia

Yanıtlar:


3

Bu test edilmemiştir , ancak geri çağrı işlevi, $args(varsa) shorttocode ile sağlanan parametreleri veren bir dizi argümanla sağlanır. Sıfırıncı giriş bazen kullanılan kısa kodun adını içerir (örn. public_email). Bazen demek istediğim ...

Öznitelikler dizisinin sıfırıncı girişi ($ atts [0]), kısa kod normal ifadesiyle eşleşen dizeyi içerir, ancak YALNIZCA geri çağırma işlevinin üçüncü bağımsız değişkeni olarak görünen geri çağrı adından farklıysa.

( Kodeks'e bakınız ). Senin amaçları Çünkü o zaman $atts[0]ya içerecektir public_email, public_phonevb

function shortcode_handler($atts,$content=NULL){
     if(!isset($atts[0]))
         return; //error?

     switch($atts[0]):
         case 'public_email':
              //deal with this case
              break;
         case 'public_phone':
              //deal with this case
              break;
         case 'public_something':
              //deal with this case
              break;
     endswitch;   
}

Ah, hatırlıyorum, uzun zaman önce benzer bir şeyle karşılaştım. Benim durumumda, bu kısa kod işleyicisi için üçüncü argüman. Birincisi $args, ikincisi $contentve sonuncusu kısa kod!
fuxia

Gerçekten mi? Kısa kod 'shortcode_handler' geri arama adından farklı ... Ben verilmiş olacağını düşündüm $args. Ama bu senin için işe yararsa ...: D.
Stephen Harris

2

Stephen Harris'in cevabına dayanarak, tüm işleyicimin kısa kod adı olan üçüncü bir argümanı kabul etmesini sağladım:

/**
 * Handler for all shortcodes.
 *
 * @param  array  $args
 * @param  NULL   $content Not used.
 * @param  string $shortcode Name of the current shortcode.
 * @return string
 */
public function shortcode_handler(  $args = array (), $content = NULL, $shortcode = '' )
{
    $key = $this->current_shortcode_key( $shortcode );
    $args['print'] = FALSE;
    return $this->action_handler( $key, $args );
}

/**
 * Returns the currently used shortcode. Sometimes.
 *
 * @return string
 */
protected function current_shortcode_key( $shortcode )
{
    return substr( $shortcode, 7 );
}

Soruma bağlı eklentide nasıl çalıştığını görün.

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.