在过去的几年中,我一直在开发自定义主题和各种插件,这些插件可为WPBakery Page Builder元素添加选项并创建新的自定义元素,等等。
在Page Builder v5.7之前,一切都运行良好。但是当v6.0.x发布时,突然我添加到每个元素的每个Checkbox选项(无论是自定义元素还是Page Builder的标准元素之一)都出现了问题:在页面编辑器中单击该元素后,要打开它的设置,无论其默认值或保存的值如何,所有复选框都将清除并取消选中。
如果我勾选了一个复选框并保存设置,那么当我查看站点的前端时,该选项确实已保存并且可以正常工作;但是当我再次打开元素的设置窗口时,它们都被清除了。
我已经查看了所有代码,并将其与其他插件的代码以及WPBakery的所有文档等进行了比较,但我在任何地方都看不到问题。我认为这可能是Page Builder v6.0.x的一个错误,因此我已向他们发送了支持通知单,但他们无法给我答案。不过,其他人的插件以及Page Builder自己的所有内置元素似乎都可以正常工作,这使我相信这一定与我的代码有关。
这里是一个例子:
// After VC Init
add_action( 'vc_after_init', 'gd_after_init_actions' );
// ADD OPTIONS TO VISUAL COMPOSER ELEMENTS //
function gd_after_init_actions() {
// ADD FULL WIDTH CHECKBOX TO SINGLE IMAGE ELEMENTS //
$single_image_attributes = array(
'type' => 'checkbox',
'class' => 'full_width_image',
'param_name' => 'full_width_image',
'value' => array('Force Full Width' => true),
'weight' => 1
);
vc_add_param('vc_single_image', $single_image_attributes);
}
这将在“页面构建器”的标准“单个图像”元素中添加“强制全宽”复选框。该复选框显示完美,如果我选中该复选框,请保存并查看网站的前端,该复选框确实可以正常工作;复选框值已保存,图像被拉伸到全宽。但是,如果我返回到后端并再次单击“单个图像”元素以对其设置进行编辑,则该复选框将变为未选中状态,并且其保存的值将丢失。
类似地,对于使用vc_map()添加选项的插件,这是一个示例:
function vc_before_init_actions(){
// Stop all if VC is not enabled
if ( !defined( 'WPB_VC_VERSION' ) ) {
return;
}
// ELEMENT CLASS //
class vcResponsiveYouTubeVideo extends WPBakeryShortCode {
// ELEMENT INIT //
function __construct() {
add_action( 'init', array( $this, 'vc_youtube_video_mapping' ) );
add_shortcode( 'vc_youtube', array( $this, 'vc_youtube_video_html' ) );
}
// ELEMENT MAPPING //
public function vc_youtube_video_mapping() {
// Map the block with vc_map()
$youtubeIcon = plugins_url('responsive-youtube-icon.png',__FILE__ );
vc_map(
array(
'name' => __('Responsive YouTube Video', 'text-domain'),
'base' => 'vc_youtube',
'category' => __('Custom Elements', 'text-domain'),
'icon' => $youtubeIcon,
'params' => array(
array(
'type' => 'checkbox',
'param_name' => 'lightbox',
'value' => array('Pop up video in lightbox' => true),
'admin_label' => false,
'weight' => 0,
'group' => 'Custom Group'
),
)
)
);
}
[etc...]
}
这只是代码片段,还有更多内容,但这只是与我在此特定插件中具有的复选框选项之一有关的部分。就像前面的示例一样,如果我检查并保存选项,它可以工作,但是如果我返回到元素的设置,它就会清除。
设置为默认情况下甚至选中的复选框:
array(
'type' => 'checkbox',
'param_name' => 'branding',
'value' => array('Keep YouTube Branding in Control Bar' => true),
'std' => true,
'admin_label' => false,
'weight' => 0,
'group' => 'Custom Group'
),
单击打开设置窗口后,该复选框仍会清除。
我已经做了相当多的测试,看来这个问题(到目前为止)仅在Checkboxes中存在。重新创建设置窗口时,我创建的所有其他输入(例如文本字段,颜色选择器,下拉列表等)都可以很好地保存并保留其值。
有人对此有想法吗?
答案 0 :(得分:0)
我们发现了一个问题,这是由于我们为复选框的键-值对添加了严格比较,但是在您的映射值中为布尔值true,但是短代码将其保存为字符串“ 1”,并且在打开编辑表单时进行严格比较失败。
对于BC,我们将在下一个版本中对此进行修复,其中有一个修补程序:
Index: include/params/default_params.php
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- include/params/default_params.php (revision afcb0ccf521c36ce176651964792d18c1f9b1bfc)
+++ include/params/default_params.php (date 1559032145000)
@@ -85,7 +85,9 @@
$values = isset( $settings['value'] ) && is_array( $settings['value'] ) ? $settings['value'] : array( esc_html__( 'Yes', 'js_composer' ) => 'true' );
if ( ! empty( $values ) ) {
foreach ( $values as $label => $v ) {
- $checked = in_array( $v, $current_value, true ) ? 'checked' : '';
+ // NOTE!! Don't use strict compare here for BC!
+ // @codingStandardsIgnoreLine
+ $checked = in_array( $v, $current_value ) ? 'checked' : '';
$output .= ' <label class="vc_checkbox-label"><input id="' . $settings['param_name'] . '-' . $v . '" value="' . $v . '" class="wpb_vc_param_value ' . $settings['param_name'] . ' ' . $settings['type'] . '" type="checkbox" name="' . $settings['param_name'] . '" ' . $checked . '>' . $label . '</label>';
}
}