根据其嵌套内容以不同方式解析短代码

时间:2013-01-30 作者:supertrue

假设我们有两组不同的嵌套短代码,如下所示:

苹果版本[wrapper snack="apple"] Today I had a [flavor] snack... [/wrapper]
  • Desired output: 我今天的零食很健康
    • 甜甜圈版本[wrapper snack="donut"] Today I had a [flavor] snack... [/wrapper]
    • Desired output: 我今天的零食很油腻[flavor]) 根据其嵌套的短代码不同(即基于[wrapper]\'s零食属性)?出于问题的考虑,请接受将属性添加到[flavor].

      在伪代码中,它的工作方式可能如下所示:

      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\';
      }
      
      我想有多种方法可以通过我们的写作方式获得同样的效果wrapper\'s处理程序函数。

      想法1:使用全局变量

      function wrapper_shortcode_handler ( $atts, $content ) {
           // After extracting the snack attribute...
           $GLOBALS[\'wrapper_value\'] = $snack;
           return do_shortcode( $content );
      }
      
      想法2:在处理嵌套的短代码之前查找/替换它
    • 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 );
      }
      
      很明显,这些例子和解决方案过于简单,但有没有更好的替代方案?

    1 个回复
    SO网友:fuxia

    根据属性值注册新的短代码处理程序:

    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 );
    }
    
    另请参见Execute shortcode only in another shortcode

    结束

    相关推荐

    Use AJAX in shortcode

    我有以下代码来显示随机引用的快捷码。问题:如何使按钮显示新的随机报价?我的意思是,这会点击按钮并显示一个新的报价(当然不会刷新页面)。function random_quote() { // quotes file $array = file(\"/path to txt file\"); // generate a random number between 0 and the total count of $array minus