获取嵌套的短码的计数

时间:2013-10-01 作者:Marco Berrocal

假设我有一个嵌套的短代码,其中最外面的短代码只是HTML,而里面的短代码是显示数据的短代码。

[outer_shortcode][inner_code url="#" title="Hello"][/outer_shortcode]
在这种情况下,内部项的计数为1。在以下情况下:

[outer_shortcode][inner_code url="#" title="Hello"][inner_code url="#2" title="Hello2"][/outer_shortcode]
内部计数为2。

如何根据我使用的函数确定这一点?

我目前有(调用内部的外部短代码):

return \'<section id="recipes"><nav><ul>\'.do_shortcode($content).\'</ul></nav></section>\';
作为内部:

        $the_stuff .= \'<li>\';     
        $the_stuff .= \'<a href="\' .$url. \'" rel="external">\'.$title.\'</a>\';
        $the_stuff .= \'</li>\';

        return $the_stuff;
这就是我想要的。要计算list items. 我如何才能做到这一点?

1 个回复
SO网友:s_ha_dum

下面是非常非常粗略的代码,可以帮助您开始:

add_shortcode(\'outer_shortcode\',function($attts,$content){return 1;});
add_shortcode(\'inner_code\',function($attts,$content){return 1;});
$str = \'[outer_shortcode][inner_code url="#" title="Hello"][inner_code url="#2" title="Hello2"][/outer_shortcode]\';
$reg = get_shortcode_regex();
preg_match_all(\'~\'.$reg.\'~\',$str,$matches);
var_dump($matches);
preg_match_all(\'~\'.$reg.\'~\',$matches[5][0],$matches2);
var_dump($matches2);
所发生的是,您正在解析与外部短代码匹配并“分离”的字符串。然后需要解析该短代码的内容(数组元素5)来解析两个内部短代码。count($matches[0][0]) 应为2。原则很简单,但有很多方法可能出错。您可能需要进行大量的错误检查,并且可能需要迭代数组,而不是假设第一个匹配,$matches[5][0], 就像我做的那样。

如果你look at the source for get_shortcode_regex 您可以看到这个复杂数组的不同部分意味着什么:

199  * 1 - An extra [ to allow for escaping shortcodes with double [[]]
200  * 2 - The shortcode name
201  * 3 - The shortcode argument list
202  * 4 - The self closing /
203  * 5 - The content of a shortcode when it wraps some content.
204  * 6 - An extra ] to allow for escaping shortcodes with double [[]]
如果你正在做我认为你正在做的事情,你可能想要这样的东西:

add_shortcode(
  \'outer_shortcode\',
  function($atts,$content){
    $reg = get_shortcode_regex();
    preg_match_all(\'~\'.$reg.\'~\',$content,$matches);
    echo count($matches[0]);
    return do_shortcode($content);
  }
);

add_shortcode(
  \'inner_code\',
  function($atts,$content){
    $the_stuff = \'<li>\';     
      $the_stuff .= \'<a href="\' .$atts[\'url\']. \'" rel="external">\'.$atts[\'title\'].\'</a>\';
    $the_stuff .= \'</li>\';
    return $the_stuff;
  }
);

// now test it
$str = \'[outer_shortcode][inner_code url="#" title="Hello"][inner_code url="#2" title="Hello2"][/outer_shortcode]\';
echo do_shortcode($str);
我想你可以填写其余的加价。

结束

相关推荐

Custom field in a shortcode?

我无法将图像从我的一个字段转换为短代码(它与get_the_post_thumbnail($post->ID, \'thumbnail\') 但我需要字段中的值udstiller logo.function logo_shortcode( $atts ) { extract( shortcode_atts( array( \'limit\' => \'50\', \'orderby\' => \'name\',