0

在过去的几年里,我一直在开发自定义主题和各种插件,为 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);
}

这将“强制全宽”复选框添加到 Page Builder 的标准“单个图像”元素。该复选框完美显示,如果我选中它,保存然后查看网站的前端,该复选框确实有效;复选框值已保存,图像被拉伸到全宽。但是,如果我回到后端并单击 Single Image 元素再次编辑它的设置,则该复选框将变为未选中状态,并且它保存的值将丢失。

同样,对于我使用 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'
),

单击打开设置窗口后,此复选框仍会清除。

我已经进行了相当多的测试,看来这个问题(到目前为止)只存在于复选框中。我创建的所有其他输入,例如文本字段、颜色选择器、下拉列表等,在我重新打开设置窗口时都可以正常保存并保留它们的值。

有人对此有任何想法吗?

4

1 回答 1

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>';
        }
    }
于 2019-05-28T08:31:59.610 回答