current_shortcode () - erkennt den aktuell verwendeten Shortcode

11

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 Verwendung einfach zu halten, möchte ich auch Shortcodes anbieten, die einfach einzugeben sind:

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

Der einzige Unterschied ist der zweite Teil. Ich möchte keine weiteren Argumente für die Shortcodes, da diese fehleranfällig sind. Also registriere ich einen 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 shortcode_handler()muss man wissen, welcher Shortcode aufgerufen wurde. Meine Frage ist: Wie mache ich das?

Meine aktuelle Problemumgehung ist eine weitere Funktion:

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

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

Fuxia
quelle
1
Du hast mich jetzt alle neugierig gemacht. Ich werde mich in Kürze darum kümmern. Ich weiß, dass shortcodes.php nur eine Reihe von Funktionen ist. Wenn es mit OOP richtig geschrieben worden wäre, hätte es zweifellos eine aktuelle_shortcode-Klassenvariable gehabt und alles einfacher gemacht. Meines Wissens speichert Wordpress nur alle Shortcodes und Rückrufe in einem Array. Ich frage mich, ob es eine Möglichkeit gibt, jeden Shortcode während der Verarbeitung und ohne Hacken von Kerndateien in einer Variablen zu speichern.
Dwayne Charrington
@toscho Einverstanden, ich denke, das ist wirklich ein Problem, eine Umgestaltung in der Art und Weise, wie Shortcodes gemacht werden (mehr OOP wie Widgets) sollte in Betracht gezogen werden. Ich würde gerne dabei helfen und dies später als Update an den Core senden.
Webord
@brasofilo Richtig, das habe ich gerade gemacht.
Fuxia

Antworten:

3

Dies ist nicht getestet , aber die Rückruffunktion wird mit einer Reihe von Argumenten bereitgestellt, $argsdie (falls vorhanden) die mit dem Shortocode bereitgestellten Parameter angeben. Der nullte Eintrag enthält manchmal den Namen des verwendeten Shortcodes (z public_email. B. ). Mit manchmal meine ich ...

Der nullte Eintrag des Attribut-Arrays ($ atts [0]) enthält die Zeichenfolge, die mit dem Shortcode-Regex übereinstimmt, jedoch NUR, wenn dieser vom Rückrufnamen abweicht, der ansonsten als drittes Argument für die Rückruffunktion angezeigt wird.

(Siehe den Kodex ). Für Ihre Zwecke dann $atts[0]entweder enthalten public_email, public_phoneusw.

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
quelle
Ah, ich erinnere mich, ich bin vor langer Zeit auf etwas Ähnliches gestoßen. In meinem Fall ist es das dritte Argument für den Shortcode-Handler. Der erste ist $args, der zweite $contentund der letzte der Shortcode!
Fuxia
"Ja wirklich?" Der Shortcode unterscheidet sich vom Rückrufnamen 'shortcode_handler' ... Ich hätte gedacht, dass er in der angegeben wurde $args. Aber wenn das bei Ihnen funktioniert ...: D.
Stephen Harris
2

Basierend auf der Antwort von Stephen Harris 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.

Fuxia
quelle