在短代码中使用短代码(插入后元字段值)

时间:2018-03-27 22:06:06

标签: wordpress shortcode post-meta

我有一个插件的短代码,我无法修改...这个短代码有一些参数ex。 [some_shortcode value =""] - 我试图将post meta中的值作为此短代码的参数输入,但它不起作用 - 这里是代码......

这是我创建的短代码的代码(它从post meta返回值)

function test_shortcode( $string ) {
    extract( shortcode_atts( array(
        'string' => 'string'
    ), $string));

    // check what type user entered
    switch ( $string ) {
        case 'first':
            return get_post_meta( get_the_ID(), 'post_meta_one', true );
            break;
        case 'second':
            return get_post_meta( get_the_ID(), 'post_meta_two', true );
            break;
    }
}
add_shortcode('test', 'test_shortcode');

现在我想在我页面上插件的现有短代码中插入此短代码。

For example: [some_shortcode value='[test string="first"]']

这不是这样的。谢谢你的帮助!

1 个答案:

答案 0 :(得分:2)

在您提供的现有短代码中插入短代码是行不通的。您的短代码应该有机会将提供的短代码作为属性进行处理。

您应该在短代码中使用do_shortcode()

[some_shortcode value='[test string="first"]']

并希望在短代码中使用[test string="first"]的返回值first。您的代码将是:

function some_shortcode($atts){
    $atts = shortcode_atts(array(
        'value' => ''
    ), $atts);

    $second_shortcode_value = do_shortcode($atts['value']);

    //some code

    return $something;
}
add_shortcode('some_shortcode', 'some_shortcode');

变量$second_shortcode_value将包含[test string="first"]短代码的输出。

P.S。避免使用exctract()功能,因为它可以make your code hard readable

修改

以下是解决方案dinamically向[some_shortcode] value属性添加属性。

function my_shortcode($atts){
    $atts = shortcode_atts(array(
        'str' => ''
    ), $atts);


    switch ( $atts['str'] ) {
        case 'first':
            $modified = get_post_meta( get_the_ID(), 'leweb_gender', true );
            break;
        default:
            $modified = '';
    }

    if(!empty($modified)) {
        $second_shortcode_with_value = do_shortcode("[some_shortcode value='$modified']");
    }else{
        $second_shortcode_with_value = do_shortcode('[some_shortcode]');
    }

    return $second_shortcode_with_value;
}
add_shortcode('some_shrt', 'my_shortcode');

我们正在做什么:我们正在为[some_shortcode value='something']生成something而不是调用我们的短代码并获取内容,如

[some_shrt str="first"]