You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在WPBakery的vc_map下拉菜单中显示动态输出?

WPBakery页面构建器动态下拉菜单问题解决方法

问题场景

使用WPBakery页面构建器时,需要为自定义短代码的下拉菜单添加动态加载的选项。静态代码能正常生成符合预期的下拉菜单,但动态实现时输出异常:

  • 预期:下拉菜单显示正常的可选项(如静态代码中的"Item One")
  • 当前:下拉菜单无法正确解析动态选项,显示不符合要求

静态代码(正常工作)

$params=array(
        'name'     => __('Speaker'),
        'base'     => 'speaker',
        'category' => __('My shortcodes'),
        'class'       => 'js-example-basic-single',
        "icon" => get_template_directory_uri() . "/images/shortcode_slider.png",
        'params'   => array(
            array(
                'type'        => 'dropdown',
                'heading'     => __('Speakers'),
                'param_name'  => 'speakersname',
                'class'       => 'js-example-basic-single',
                'admin_label' => true,
                'value'         => array(__('Item One', 'textdomain')    => '1'), // 静态键值对数组
               'description' => __('Select speakers')
        ))
    );

 echo"<pre>";
print_r($params);
echo "</pre>";
vc_map( $params );

静态代码的数组输出

Array
(
    [name] => Speaker
    [base] => speaker
    [category] => My shortcodes
    [class] => js-example-basic-single
    [icon] => https://example.com/wordpress/wp-content/themes/testing/images/shortcode_slider.png
    [params] => Array
        (
            [0] => Array
                (
                    [type] => dropdown
                    [heading] => Speakers
                    [param_name] => speakersname
                    [class] => js-example-basic-single
                    [admin_label] => 1
                    [value] => Array
                        (
                            [Item One] => 1
                        )

                    [description] => Select speakers
                )

        )

)

动态代码(存在问题)

原动态代码错误地将选项拼接为字符串,导致value参数格式不符合WPBakery要求:

$speakerpost_args = array( 'post_type'=>'speaker','post_status' => 'publish', 'posts_per_page' => 80);
$speaker_posts = wp_get_recent_posts($speakerpost_args);
$selectSpeaker="";
foreach ($speaker_posts as $key => $value) {
    $selectSpeaker.="__( 'Item One', 'textdomain' )    => '1',";
}

$params=array(
        'name'     => __('Webinar Speaker'),
        'base'     => 'speaker',
        'category' => __('Hybreed shortcodes'),
        'class'       => 'js-example-basic-single',
        "icon" => get_template_directory_uri() . "/images/shortcode_slider.png",
        'params'   => array(
            array(
                'type'        => 'dropdown',
                'heading'     => __('Speakers'),
                'param_name'  => 'speakersname',
                'class'       => 'js-example-basic-single',
                'admin_label' => true,
                'value'       => array($selectSpeaker), // 错误:将字符串作为数组元素传入
               'description' => __('Select speakers')
        ))
    );

echo"<pre>";
print_r($params);
echo "</pre>";
vc_map( $params );

错误代码的数组输出

Array
(
    [name] => Speaker
    [base] => speaker
    [category] =>My shortcodes
    [class] => js-example-basic-single
    [icon] => https://exmple.com/wordpress/wp-content/themes/testing/images/shortcode_slider.png
    [params] => Array
        (
            [0] => Array
                (
                    [type] => dropdown
                    [heading] => Speakers
                    [param_name] => speakersname
                    [class] => js-example-basic-single
                    [admin_label] => 1
                    [value] => Array
                        (
                            [0] => __( 'Item One', 'textdomain' )    => '1' // 格式错误
                        )

                    [description] => Select speakers
                )

        )

)

错误原因

WPBakery的dropdown类型参数要求value是键值对数组(键为显示文本,值为选项对应的值),但原代码将选项拼接成字符串后作为单个元素传入数组,导致格式完全不符合要求。

修正后的代码

将$selectSpeaker初始化为数组,循环中直接添加键值对,然后将该数组直接赋值给value参数:

$speakerpost_args = array( 
    'post_type'=>'speaker',
    'post_status' => 'publish', 
    'posts_per_page' => 80
);
$speaker_posts = wp_get_recent_posts($speakerpost_args);
// 初始化数组而非字符串
$selectSpeaker = array();
foreach ($speaker_posts as $post) {
    // 用文章标题作为显示文本,ID作为对应值,可根据需求替换字段
    $selectSpeaker[__($post['post_title'], 'textdomain')] = $post['ID'];
}

$params=array(
    'name'     => __('Webinar Speaker'),
    'base'     => 'speaker',
    'category' => __('Hybreed shortcodes'),
    'class'       => 'js-example-basic-single',
    "icon" => get_template_directory_uri() . "/images/shortcode_slider.png",
    'params'   => array(
        array(
            'type'        => 'dropdown',
            'heading'     => __('Speakers'),
            'param_name'  => 'speakersname',
            'class'       => 'js-example-basic-single',
            'admin_label' => true,
            'value'       => $selectSpeaker, // 直接传入键值对数组
            'description' => __('Select speakers')
        )
    )
);

echo "<pre>";
print_r($params);
echo "</pre>";
vc_map( $params );

修正后的数组输出(预期)

Array
(
    [name] => Webinar Speaker
    [base] => speaker
    [category] => Hybreed shortcodes
    [class] => js-example-basic-single
    [icon] => https://exmple.com/wordpress/wp-content/themes/testing/images/shortcode_slider.png
    [params] => Array
        (
            [0] => Array
                (
                    [type] => dropdown
                    [heading] => Speakers
                    [param_name] => speakersname
                    [class] => js-example-basic-single
                    [admin_label] => 1
                    [value] => Array
                        (
                            [Speaker Title 1] => 101
                            [Speaker Title 2] => 102
                            // 更多动态生成的键值对
                        )

                    [description] => Select speakers
                )

        )

)

内容的提问来源于stack exchange,提问作者user9437856

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 00:30:45