在简码中使用简码(插入 post 元字段值)

Use Shortcode in Shortcode (insert post meta field value)

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

这是我创建的短代码的代码(它 returns 来自 post 元的值)

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"]']

它不是这样工作的。感谢您的帮助!

无法像您提供的那样将简码插入现有简码中。您的简码应该有机会处理提供的简码作为属性。

您应该在短代码中使用 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.

编辑:

这是将属性动态添加到 [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"]