current_shortcode () - mendeteksi kode pendek yang saat ini digunakan

11

Di kelas plugin saya ingin memberikan bidang sederhana untuk data publik: email, nomor telepon, Twitter dll. Daftar dapat diperpanjang.

Lihat plugin Data Kontak Publik di GitHub untuk detailnya.

Agar penggunaannya sederhana, saya juga ingin menawarkan kode pendek yang mudah diketik:

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

Satu-satunya perbedaan adalah bagian kedua. Saya tidak ingin argumen lebih lanjut untuk kode pendek karena mereka rawan kesalahan. Jadi saya mendaftarkan satu penangan kode pendek untuk semua bidang di kelas plugin saya:

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

Sekarang shortcode_handler()harus tahu kode pendek mana yang telah dipanggil. Pertanyaan saya adalah: Bagaimana saya melakukan ini?

Solusi saya saat ini adalah fungsi lain:

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

Ini ... bekerja untuk the_content(). Tapi itu tidak elegan dan juga tidak kuat.
Saya telah membaca wp-includes/shortcodes.php, tetapi sekarang saya tidak bisa melihat bagaimana melakukannya dengan lebih baik.

fuxia
sumber
1
Anda membuat saya penasaran sekarang. Saya akan melihat ini sebentar lagi. Saya tahu shortcodes.php hanya sekelompok fungsi, jika ditulis dengan benar menggunakan OOP tidak diragukan lagi memiliki variabel kelas current_shortcode dan membuat semuanya lebih mudah. Sepengetahuan saya Wordpress hanya menyimpan semua kode pendek dan panggilan balik dalam sebuah array, saya bertanya-tanya apakah ada cara untuk membuatnya menyimpan setiap kode pendek ke dalam suatu variabel karena diproses dan tanpa meretas file inti?
Dwayne Charrington
@toscho Setuju, saya pikir itu benar-benar masalah, sebuah remodeling dalam cara shortcode dilakukan, (merangkul lebih banyak OOP seperti Widgets) harus ada dalam pikiran. Saya ingin membantu itu, dan kemudian mengirim ini sebagai pembaruan ke Core.
Webord
@ brasofilo Benar, saya baru saja melakukannya.
fuxia

Jawaban:

3

Ini belum diuji , tetapi fungsi callback disediakan dengan berbagai argumen, $argsyang memberikan (jika ada) parameter yang disediakan dengan shortocode. Entri ke nol terkadang berisi nama kode pendek yang digunakan (misalnya public_email). Maksud saya terkadang ...

Entri ke-nol dari array atribut ($ atts [0]) akan berisi string yang cocok dengan regex kode pendek, tetapi HANYA jika itu berbeda dari nama panggilan balik, yang jika tidak muncul sebagai argumen ketiga ke fungsi panggilan balik.

(Lihat Codex ). Untuk keperluan Anda maka $atts[0]akan berisi public_email, public_phonedll.

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;   
}
Stephen Harris
sumber
Ah, saya ingat, saya pernah mengalami sesuatu yang serupa sejak lama. Dalam kasus saya ini adalah argumen ketiga untuk penangan kode pendek. Yang pertama adalah $args, yang kedua $contentdan yang terakhir kode pendek!
fuxia
Betulkah? Kode pendek berbeda dari nama panggilan balik 'shortcode_handler' ... Saya akan berpikir itu akan diberikan dalam $args. Tetapi jika itu berhasil untuk Anda ...: D.
Stephen Harris
2

Berdasarkan jawaban Stephen Harris saya membuat tangkapan saya semua penangan menerima argumen ketiga, yaitu nama kode pendek:

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

Lihat beraksi di plugin yang ditautkan dalam pertanyaan saya.

fuxia
sumber