如何在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
相关产品推荐
相关产品推荐

