WPBakery Page Builder - флажки не будут сохранять значения из v6.xx - PullRequest
0 голосов
/ 24 мая 2019

В течение последних нескольких лет я занимался разработкой пользовательской темы и различных плагинов, которые добавляют опции в элементы 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'
),

Этот флажок по-прежнему снимается, как только я нажимаю, чтобы открыть окно настроек.

Я провел немало испытаний, и, похоже, эта проблема существует (пока) только с флажками. Все остальные входные данные, которые я создал, такие как текстовые поля, палитры цветов, выпадающие списки и т. Д., Сохраняются в порядке и сохраняют свои значения при повторном открытии окна настроек.

У кого-нибудь есть идеи по этому поводу?

1 Ответ

0 голосов
/ 28 мая 2019

мы нашли проблему, это вызвано тем, что мы добавили строгое сравнение для пар ключ-значение для флажков, но в вашем отображении значение имеет логическое значение 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>';
        }
    }
...