Parsen Sie einen Shortcode unterschiedlich basierend auf dem, in dem er eingebettet ist

Angenommen, wir haben zwei verschiedene Sätze von verschachtelten Shortcodes, so:

Apple-Version

  • [wrapper snack="apple"] Today I had a [flavor] snack... [/wrapper]
  • Gewünschter Output: Mein Snack war heute GESUND

Doughnut-Version

  • [wrapper snack="donut"] Today I had a [flavor] snack... [/wrapper]
  • Gewünschter Output: Mein Snack war heute ziemlich FETTIG …

Meine Frage ist: Wie kann ich den verschachtelten Shortcode ( [flavor] ) abhängig vom Shortcode, in den er eingebettet ist (dh basierend auf dem Snack-Attribut von [wrapper] , analysieren? Bitte akzeptieren Sie für die Frage, dass es unmöglich / unpraktisch ist, ein Attribut zu [flavor] hinzuzufügen.

In Pseudo-Code könnte es etwa so funktionieren:

 function flavor_shortcode_handler ( $atts, $content ) { $wrapper = ??? // The value of the shortcode this is nested inside if ( $wrapper == 'apple' ) return 'HEALTHY'; if ( $wrapper == 'donut' ) return 'FATTY'; } 

Ich stelle mir vor, dass es verschiedene Möglichkeiten gibt, den gleichen Effekt zu erzielen, indem wir die wrapper -Handler-function schreiben.

Idee 1: Verwenden Sie eine globale Variable

 function wrapper_shortcode_handler ( $atts, $content ) { // After extracting the snack attribute... $GLOBALS['wrapper_value'] = $snack; return do_shortcode( $content ); } 

Idee 2: Finde / ersetze den verschachtelten Shortcode vor der Verarbeitung

 function wrapper_shortcode_handler ( $atts, $content ) { // After extracting the snack attribute... $new_content = str_replace( '[flavor]', '[flavor wrapper="'.$snack.'"]', $content ); return do_shortcode( $new_content ); } 

Offensichtlich sind die Beispiele und Lösungen zu stark vereinfacht, aber gibt es eine Alternative, die besser funktioniert?

Solutions Collecting From Web of "Parsen Sie einen Shortcode unterschiedlich basierend auf dem, in dem er eingebettet ist"

Registrieren Sie einen neuen Shortcode-Handler abhängig vom Attributwert:

 function wrapper_shortcode_handler ( $atts, $content ) { if ( "apple" === $atts["snack"] ) add_shortcode( "flavor", "healthy_callback" ); if ( "donut" === $atts["snack"] ) add_shortcode( "flavor", "fatty_callback" ); return do_shortcode( $content ); } 

Siehe auch Shortcode nur in einem anderen Shortcode ausführen