it-swarm.com.de

current_shortcode () - Ermittelt den aktuell verwendeten Shortcode

In einer Plugin-Klasse möchte ich einfache Felder für öffentliche Daten bereitstellen: E-Mail, Telefonnummer, Twitter usw. Die Liste kann erweitert werden.

Weitere Informationen finden Sie im Plugin Öffentliche Kontaktdaten auf GitHub.

Um die Benutzung einfach zu halten, möchte ich auch einfach zu tippende Shortcodes anbieten:

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

Der einzige Unterschied ist der zweite Teil. Ich möchte keine weiteren Argumente für die Kurzwahlnummern, da sie fehleranfällig sind. Also registriere ich one Shortcode-Handler für alle Felder in meiner Plugin-Klasse:

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

Jetzt muss shortcode_handler() wissen, welcher Shortcode aufgerufen wurde. Meine Frage ist: Wie mache ich das?

Meine aktuelle Problemumgehung ist eine andere Funktion:

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

Dies… funktioniert für the_content(). Aber es ist weder elegant noch robust.
Ich habe wp-includes/shortcodes.php gelesen, kann aber momentan nicht sehen, wie ich es besser machen kann.

10
fuxia

Dies ist ungetestet , aber die Rückruffunktion ist mit einem Array von Argumenten versehen, $args, die (falls vorhanden) die mit dem Kurzcode versehenen Parameter angeben. Der nullte Eintrag manchmal enthält den Namen des verwendeten Shortcodes (z. B. public_email). Mit manchmal meine ich ...

Der nullte Eintrag des Attributarrays ($ atts [0]) enthält die Zeichenfolge, die mit dem regulären Kurzcode übereinstimmt, jedoch NUR, wenn sich dieser vom Rückrufnamen unterscheidet, der ansonsten als drittes Argument für die Rückruffunktion erscheint.

(Siehe den Codex ). Für Ihre Zwecke enthält $atts[0] entweder public_email, public_phone usw.

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;   
}
1
Stephen Harris

Basierend auf Stephen Harris Antwort ließ ich meinen Catch-All-Handler ein drittes Argument akzeptieren, nämlich den Shortcode-Namen:

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

Sehen Sie es in Aktion in dem Plugin, das in meiner Frage verlinkt ist.

2
fuxia