WPBakery页面构建器-复选框不会保留来自v6.xx的值

时间:2019-05-24 00:48:51

标签: wordpress visual-composer wpbakery

在过去的几年中,我一直在开发自定义主题和各种插件,这些插件可为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中存在。重新创建设置窗口时,我创建的所有其他输入(例如文本字段,颜色选择器,下拉列表等)都可以很好地保存并保留其值。

有人对此有想法吗?

1 个答案:

答案 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>';
        }
    }