current_shortcode () - wykrywa aktualnie używany shortcode

11

W klasie wtyczek chcę podać proste pola dla danych publicznych: e-mail, numer telefonu, Twitter itp. Listę można rozszerzyć.

Szczegółowe informacje można znaleźć we wtyczce Publiczne dane kontaktowe na GitHub.

Aby uprościć użytkowanie, chcę również oferować łatwe do pisania skróty:

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

Jedyną różnicą jest druga część. Nie chcę dalszych argumentów za skrótami, ponieważ są one podatne na błędy. Dlatego rejestruję jedną procedurę obsługi krótkich kodów dla wszystkich pól w mojej klasie wtyczek:

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

Teraz shortcode_handler()musi wiedzieć, który skrót został wywołany. Moje pytanie brzmi: jak to zrobić?

Moje obecne obejście to inna funkcja:

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

To… działa dla the_content(). Ale nie jest ani elegancki, ani solidny.
Przeczytałem wp-includes/shortcodes.php, ale nie widzę teraz, jak to zrobić lepiej.

fuxia
źródło
1
Jesteście teraz ciekawi mnie. Zajmę się tym wkrótce. Wiem, że shortcodes.php to tylko garść funkcji, jeśli zostałby poprawnie napisany przy użyciu OOP, bez wątpienia miałby zmienną klasy current_shortcode i ułatwiłby wszystko. Według mojej wiedzy Wordpress przechowuje tylko wszystkie skróty i wywołania zwrotne w tablicy, zastanawiam się, czy istnieje sposób, aby zapisać każdy skrót w zmiennej podczas przetwarzania i bez włamywania się do podstawowych plików?
Dwayne Charrington,
@toscho Zgadzam się, myślę, że to naprawdę problem, należy pamiętać o przebudowie sposobu, w jaki tworzone są skróty, (obejmując więcej OOP, takich jak widżety). Chciałbym w tym pomóc, a później wysłać to jako aktualizację do rdzenia.
Webord,
@brasofilo Racja, właśnie to zrobiłem.
fuxia

Odpowiedzi:

3

Jest to niesprawdzone , ale funkcja wywołania zwrotnego jest wyposażona w tablicę argumentów, $argsktóre dają (jeśli w ogóle) parametry dostarczone ze skrótem. Wpis zerowy czasami zawiera nazwę użytego krótkiego kodu (np public_email.). Czasami mam na myśli ...

Wpis zerowy tablicy atrybutów ($ atts [0]) będzie zawierał ciąg pasujący do wyrażenia regularnego shortcode, ale TYLKO, jeśli różni się on od nazwy wywołania zwrotnego, która w przeciwnym razie pojawia się jako trzeci argument funkcji wywołania zwrotnego.

(Zobacz Kodeks ). Do swoich celów, a następnie $atts[0]będzie zawierać albo public_email, public_phoneetc.

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
źródło
Ach, pamiętam, dawno temu wpadłem na coś podobnego. W moim przypadku jest to trzeci argument dla procedury obsługi krótkiego kodu. Pierwszy to $argsdrugi, $contenta ostatni krótki kod!
fuxia
Naprawdę? Krótki kod różni się od nazwy wywołania zwrotnego „shortcode_handler” ... Myślałem, że zostanie podany w $args. Ale jeśli to Ci odpowiada ...: D.
Stephen Harris
2

Opierając się na odpowiedzi Stephena Harrisa, sprawiłem, że mój program obsługi catch zaakceptował trzeci argument, którym jest nazwa shortcode:

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

Zobacz to w działaniu we wtyczce połączonej z moim pytaniem.

fuxia
źródło