获取嵌套快捷码的属性

时间:2013-11-07 作者:Joren

当您的短代码定义如下:

[myform]
    Foo: [mytextbox name="foo"]
[/myform]
在php中:

function shortcode_myform($atts, $content = null) {
   return \'<form action="#" method="post">\' . do_shortcode($content) . \'</form>\';
}
add_shortcode(\'myform\',\'shortcode_myform\');

function shortcode_mytextbox($atts) {
   return \'<input type="text" name="\'$atts[\'name\']\'" />\';
}
add_shortcode(\'mytextbox\',\'shortcode_mytextbox\');
获得name 的任何子级的属性myform 属性中的shortcode_myform 作用

我想我可以使用会话或全局会话,但这似乎不是正确的做法。

1 个回复
最合适的回答,由SO网友:Joren 整理而成

由于没有人给出完整的答案,我使用了这种方法s_ha_dum 描述并编写了一个函数,该函数返回shortcode => attributes 阵列/映射。

function attribute_map($str, $att = null) {
    $res = array();
    $reg = get_shortcode_regex();
    preg_match_all(\'~\'.$reg.\'~\',$str, $matches);
    foreach($matches[2] as $key => $name) {
        $parsed = shortcode_parse_atts($matches[3][$key]);
        $parsed = is_array($parsed) ? $parsed : array();

        if(array_key_exists($name, $res)) {
            $arr = array();
            if(is_array($res[$name])) {
                $arr = $res[$name];
            } else {
                $arr[] = $res[$name];
            }

            $arr[] = array_key_exists($att, $parsed) ? $parsed[$att] : $parsed;
            $res[$name] = $arr;

        } else {
            $res[$name][] = array_key_exists($att, $parsed) ? $parsed[$att] : $parsed;
        }
    }

    return $res;
}

Example usage:

页面内容:

[outer_shortcode]
    [inner_code url="#" title="Hello"]
[/outer_shortcode]
短代码实现:

add_shortcode(\'outer_shortcode\',function($atts,$content) {
    return attribute_map($content);
});

add_shortcode(\'inner_shortcode\',function($atts,$content) {
    return \'\';
});
这将渲染到:

Array
(
    [inner_shortcode] => Array
        (
            [url] => #
            [title] => Hello
        )

)

结束

相关推荐

Custom field within shortcode

我目前正在使用“WP Simple Paypal Shopping Cart”插件建立一个简单的Paypal电子商务网站,它非常容易使用,但为了节省客户编写短代码的时间,我在后端设置了自定义字段以输入产品名称和价格TheAdd to Cart 按钮是使用一段简单的短代码生成的,如下所示:<?php echo print_wp_cart_button_for_product(\'Product Name\', Product Price); ?> 显然正在替换Product Name