WPBakery Page Builder - 复选框不会保留来自 v6.xx 的值
WPBakery Page Builder - Checkboxes won't retain values from v6.xx
在过去的几年里,我一直在开发自定义主题和各种插件,这些插件可以为 WPBakery Page Builder 元素添加选项并创建新的自定义元素等。
在 Page Builder v5.7 之前,一切都运行良好。但是当 v6.0.x 出来时,突然间我添加到每个元素的每个 Checkbox 选项,无论是自定义元素还是 Page Builder 的标准元素之一,都会出现问题:只要我单击页面编辑器打开它的设置,所有复选框都会清除并取消选中,无论它们的默认值或保存值如何。
如果我勾选一个复选框并保存设置,当我查看网站的前端时,该选项确实已保存并且可以正常工作;但是当我再次打开元素的设置 window 时,它们都清除了。
我查看了我的所有代码并将其与其他插件的代码和所有 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);
}
这会向 Page Builder 的标准 "Single Image" 元素添加一个 "Force Full Width" 复选框。该复选框显示完美,如果我选中它,保存然后查看网站的前端,该复选框确实有效;复选框值已保存,图像被拉伸至全宽。但是,如果我回到后端并单击“单图像”元素再次编辑它的设置,复选框将变为未选中状态,并且它保存的值将丢失。
类似地,对于我使用 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'
),
单击打开设置后,此复选框仍会清除 window。
我已经做了一些测试,看来这个问题(到目前为止)只存在于复选框中。我创建的所有其他输入,例如文本字段、颜色选择器、下拉菜单等,在我重新打开设置 window.
时都可以很好地保存并保留它们的值
有没有人对此有任何想法?
我们发现了一个问题,这是因为我们为复选框的 key-value 对添加了严格比较,但在您的映射中值为布尔值 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>';
}
}
在过去的几年里,我一直在开发自定义主题和各种插件,这些插件可以为 WPBakery Page Builder 元素添加选项并创建新的自定义元素等。
在 Page Builder v5.7 之前,一切都运行良好。但是当 v6.0.x 出来时,突然间我添加到每个元素的每个 Checkbox 选项,无论是自定义元素还是 Page Builder 的标准元素之一,都会出现问题:只要我单击页面编辑器打开它的设置,所有复选框都会清除并取消选中,无论它们的默认值或保存值如何。
如果我勾选一个复选框并保存设置,当我查看网站的前端时,该选项确实已保存并且可以正常工作;但是当我再次打开元素的设置 window 时,它们都清除了。
我查看了我的所有代码并将其与其他插件的代码和所有 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);
}
这会向 Page Builder 的标准 "Single Image" 元素添加一个 "Force Full Width" 复选框。该复选框显示完美,如果我选中它,保存然后查看网站的前端,该复选框确实有效;复选框值已保存,图像被拉伸至全宽。但是,如果我回到后端并单击“单图像”元素再次编辑它的设置,复选框将变为未选中状态,并且它保存的值将丢失。
类似地,对于我使用 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'
),
单击打开设置后,此复选框仍会清除 window。
我已经做了一些测试,看来这个问题(到目前为止)只存在于复选框中。我创建的所有其他输入,例如文本字段、颜色选择器、下拉菜单等,在我重新打开设置 window.
时都可以很好地保存并保留它们的值有没有人对此有任何想法?
我们发现了一个问题,这是因为我们为复选框的 key-value 对添加了严格比较,但在您的映射中值为布尔值 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>';
}
}