current_shortcode () - ตรวจสอบรหัสย่อที่ใช้ในปัจจุบัน


11

ในคลาสปลั๊กอินฉันต้องการให้ฟิลด์ง่าย ๆ สำหรับข้อมูลสาธารณะ: อีเมล, หมายเลขโทรศัพท์, Twitter เป็นต้นสามารถขยายรายการได้

ดูปลั๊กอินข้อมูลติดต่อสาธารณะใน GitHub สำหรับรายละเอียด

เพื่อให้การใช้งานง่ายขึ้นฉันต้องการเสนอรหัสย่อที่พิมพ์ได้ง่าย:

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

ข้อแตกต่างเพียงอย่างเดียวคือส่วนที่สอง ฉันไม่ต้องการอาร์กิวเมนต์เพิ่มเติมสำหรับรหัสย่อเนื่องจากข้อผิดพลาดเกิดขึ้นได้ง่าย ดังนั้นฉันลงทะเบียนตัวจัดการรหัสย่อหนึ่งรายการสำหรับฟิลด์ทั้งหมดในคลาสปลั๊กอินของฉัน:

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

ตอนนี้shortcode_handler()ต้องทราบรหัสย่อที่ถูกเรียก คำถามของฉันคือ: ฉันจะทำเช่นนี้ได้อย่างไร

วิธีแก้ปัญหาปัจจุบันของฉันคือฟังก์ชั่นอื่น:

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

งานนี้ ... the_content()สำหรับ แต่มันก็ไม่ได้สวยงามและแข็งแกร่ง
ฉันอ่านwp-includes/shortcodes.phpแล้ว แต่ฉันไม่สามารถเห็นได้ในขณะนี้ว่าจะทำอย่างไรดี


1
คุณมีฉันทุกคนอยากรู้ตอนนี้ ฉันจะตรวจสอบเรื่องนี้ในไม่ช้า ฉันรู้ว่า shortcodes.php เป็นเพียงกลุ่มของฟังก์ชั่นถ้ามันถูกเขียนอย่างถูกต้องโดยใช้ OOP คงไม่ต้องสงสัยเลยว่ามีตัวแปรคลาส current_shortcode และทำให้ทุกอย่างง่ายขึ้น เพื่อความรู้ของฉัน Wordpress เก็บเฉพาะรหัสย่อและการเรียกกลับทั้งหมดในอาเรย์ฉันสงสัยว่ามีวิธีที่จะทำให้มันจัดเก็บรหัสย่อแต่ละรายการเป็นตัวแปรตามที่ประมวลผลและไม่มีการแฮ็คไฟล์หลักหรือไม่
Dwayne Charrington

@toscho เห็นด้วยฉันคิดว่านั่นเป็นปัญหาจริงๆการเปลี่ยนแปลงในแบบที่ทำรหัสย่อเสร็จ (ควรใช้ OOP อย่าง Widgets มากกว่า) ฉันชอบที่จะช่วยในเรื่องนั้นและส่งต่อให้เป็นการอัปเดตไปยัง Core
Webord

@brasofilo ใช่ฉันเพิ่งทำตอนนี้
fuxia

คำตอบ:


3

นี่ไม่ได้ทดสอบแต่ฟังก์ชันการเรียกกลับมีให้กับอาเรย์ของข้อโต้แย้ง$argsซึ่งจะให้ (ถ้ามี) พารามิเตอร์ที่มีให้พร้อมกับรหัสย่อ บางครั้งรายการเลขศูนย์มีชื่อของรหัสย่อที่ใช้ (เช่นpublic_email) โดยบางครั้งฉันหมายถึง ...

รายการ zeroeth ของอาร์เรย์คุณลักษณะ ($ atts [0]) จะมีสตริงที่ตรงกับรหัสย่อ regex แต่เฉพาะถ้าแตกต่างจากชื่อการโทรกลับซึ่งจะปรากฏเป็นอาร์กิวเมนต์ที่สามของฟังก์ชันการเรียกกลับ

(ดูCodex ) สำหรับวัตถุประสงค์ของคุณแล้ว$atts[0]จะมีอย่างใดอย่างหนึ่งpublic_email, public_phoneฯลฯ

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;   
}

ฉันจำได้ว่าเคยเจออะไรที่คล้ายกันมานานแล้ว ในกรณีของฉันมันเป็นอาร์กิวเมนต์ที่สามสำหรับตัวจัดการรหัส ตัวแรกคือ$argsตัวย่อ$contentและตัวที่สองและตัวสุดท้าย!
fuxia

จริงๆ? ที่แตกต่างจากชื่อรหัสเรียกกลับ 'shortcode_handler' ... $argsฉันจะได้คิดว่ามันจะได้รับใน แต่ถ้ามันเหมาะกับคุณ ... : D
Stephen Harris

2

จากคำตอบของสตีเฟ่นแฮร์ริสฉันทำให้ผู้จัดการทั้งหมดยอมรับข้อโต้แย้งที่สามซึ่งเป็นชื่อรหัสย่อ:

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

ดูการทำงานในปลั๊กอินที่ลิงก์ในคำถามของฉัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.