【问题标题】:How can I render Nested elements on Visual Composer (WPBakery) for wordpress?如何在 Visual Composer (WPBakery) 上为 wordpress 渲染嵌套元素?
【发布时间】:2019-07-22 12:51:08
【问题描述】:

我正在尝试为 wordpress 的 Visual Composer 插件 (WP-Bakery) 做一些自定义元素。

我对简单的自定义元素没有任何问题,但我正在尝试做一些嵌套元素(包含一些子元素的父元素)。我创建子元素没有问题,如果我创建它们,它们会显示在 wordpress 上,但是当我尝试创建父元素时,我可以看到设置元素没有问题,但它没有呈现。

我认为问题是父类上的渲染函数(html),但我无法解决。

父类

    <?php

class vcInfoCardContainer extends WPBakeryShortCodesContainer {

    // Element Init
    function __construct() {
        add_action( 'init', array( $this, 'vc_infocardcontainer_mapping' ) );
        add_shortcode( 'vc_infocard', array( $this, 'vc_infocardcontainer_html' ) );
    }

    // Element Mapping
    public function vc_infocardcontainer_mapping() {

        // Stop all if VC is not enabled
        if ( !defined( 'WPB_VC_VERSION' ) ) {
            return;
        }

        // Map the block with vc_map()
        vc_map(
        array(
            'name' => __('VC Info Card Container', 'ex5_vc_elements'),
            'base' => 'vc_infocardcontainer',
            'description' => __('Info Card Container for VC', 'ex5_vc_elements'),
            'category' => __('Ex5 Elements', 'ex5_vc_elements'),
            'icon' => get_template_directory_uri().'/assets/img/vc-icon.png',
            'as_parent' => array('only' => 'vc_infocard'),
            'is_container' => true,
            'js_view' => 'VcColumnView',
            'params' => array(

              array(
                    'type' => 'textfield',
                    'heading' => __('Button text','ex5_vc_elements'),
                    'param_name' => 'button_text',
                    'description' => __('Default is \'Más info\'', 'ex5_vc_elements'),
                    'group' => 'Button',
                )
            ),
        ));
    }

    //render
    public function vc_infocard_html( $atts, $content = null ) {

        // Params extraction
        extract(
            shortcode_atts(
                array(
                ),
                $atts
            )
        );

        $html = '<div class="ex5-vc-info-card-container">' . do_shortcode($content) . '</div>';

        return $html;

    }

}

new vcInfoCardContainer();

儿童班

<?php

class vcInfoCard extends WPBakeryShortCode {

    // Element Init
    function __construct() {
        add_action( 'init', array( $this, 'vc_infocard_mapping' ) );
        add_shortcode( 'vc_infocard', array( $this, 'vc_infocard_html' ) );
    }

    // Element Mapping
    public function vc_infocard_mapping() {

        // Stop all if VC is not enabled
        if ( !defined( 'WPB_VC_VERSION' ) ) {
            return;
        }

        // Map the block with vc_map()
        vc_map(
        array(
            'name' => __('VC Info Card', 'ex5_vc_elements'),
            'base' => 'vc_infocard',
            'description' => __('Info Card for VC', 'ex5_vc_elements'),
            'category' => __('Ex5 Elements', 'ex5_vc_elements'),
            'icon' => get_template_directory_uri().'/assets/img/vc-icon.png',
            'as_child' => array('only' => 'vc_infocardcontainer'),
            'params' => array(
                array(
                    'type' => 'attach_image',
                    'heading' => __( 'Main image', 'ex5_vc_elements' ),
                    'param_name' => 'image',
                    'group' => 'Images',
                ),
                array(
                    'type' => 'attach_image',
                    'heading' => __( 'Icon', 'ex5_vc_elements' ),
                    'param_name' => 'icon',
                    'group' => 'Images',
                ),
                array(
                    'type' => 'colorpicker',
                    'heading' => __( 'Icon background color', 'ex5_vc_elements' ),
                    'param_name' => 'icon_background_color',
                    'value' => __( '#000000', 'ex5_vc_elements' ),
                    'group' => 'Images',
                    ),
                array(
                    'type' => 'textfield',
                    'heading' => __('Title','ex5_vc_elements'),
                    'param_name' => 'Title',
                    'group' => 'Texts',
                ),

                array(
                    'type' => 'textfield',
                    'heading' => __( 'Text', 'ex5_vc_elements' ),
                    'param_name' => 'text',
                    'group' => 'Texts',
                ),
                array(
                    'type' => 'checkbox',
                    'class' => 'one-third',
                    'heading' => __( 'Show link button', 'ex5_vc_elements' ),
                    'param_name' => 'show_button',
                    'value' => 'show',
                    'description' => __( 'Indicates if link button is shown)', 'ex5_vc_elements' ),
                    'group' => 'Button',
                ),
              array(
                    'type' => 'textfield',
                    'heading' => __('Button text','ex5_vc_elements'),
                    'param_name' => 'button_text',
                    'description' => __('Default is \'Más info\'', 'ex5_vc_elements'),
                    'group' => 'Button',
                ),
                array(
                    'type' => 'vc_link',
                    'heading' => __( 'Button link', 'ex5_vc_elements' ),
                    'param_name' => 'button_link',
                    'group' => 'Button',
                ),
            ),
        ));
    }

    //render
    public function vc_infocard_html( $atts ) {

        // Params extraction
        extract(
            shortcode_atts(
                array(
                    'image'                 => '',
                    'icon'                  => '',
                    'icon_background_color' => '#000000',
                    'title'                 => '',
                    'text'                  => '',
                    'show_button'           => '',
                    'button_text'           => 'Más info',
                    'button_link'           => '',
                ),
                $atts
            )
        );
        if (empty($button_text)) $button_text = __( 'Más info', 'ex5_vc_elements' );

        if ($show_button === 'true') {
            if (!empty($button_link)) {
                $button = '<div class="ex5-vcic-button">
                            <a href="'. $button_link .'" target="_self" class="ex5-vcic-link" title="' . $button_text . '">
                                <span class="ex5-vcic-button-text">' . $button_text . '</span>
                            </a>
                        </div>';
            } else {
                $button = '<div class="ex5-vcic-button">
                            <span class="ex5-vcic-button-text">' . $button_text . '</span>
                        </div>';
            }
        } else {
            $button = '';
        }

        $image = wp_get_attachment_image_src($image);
        $icon = wp_get_attachment_image_src($icon);

        //vc_build_link(
        $html = '
            <div class="ex5-vc-infocard">
                <div class="ex5-vcic-content">
                    <div class="ex5-vcic-image">
                        <span>
                            <img src="' .  $image[0] . '" title="history_inner_14" alt="http://oxigeno.">
                        </span>
                    </div>
                    <div class="ex5-vcic-icon" style="background-color: ' . $icon_background_color . '">
                        <img src="' . $icon[0] . '" />
                    </div>
                    <header class="ex5-vcic-headline">
                        <h3>' . $title . '</h3>
                    </header>
                    <div class="ex5-vcic-text">
                        <p>' . $text . '</p>
                    </div>' .
                    $button
                . '</div>
                </div>';

        return $html;

    }

}

new vcInfoCard();

【问题讨论】:

    标签: wordpress visual-composer wpbakery


    【解决方案1】:

    容器短代码的名称有问题。应该是

            add_shortcode( 'vc_infocardcontainer', array( $this, 'vc_infocardcontainer_html' ) );
    

    但是还是有问题。我的 do_shortcode_tag 函数有问题

    尝试在没有有效回调的情况下解析短代码

    有人知道我该如何解决吗?

    【讨论】:

      【解决方案2】:

      我已经解决了。短代码调用是错误的,因为它也有错误的函数名。

          public function vc_infocard_html( $atts, $content = null ) {
      

      必须是

          public function vc_infocardcontainer_html( $atts, $content = null ) {
      

      【讨论】:

        猜你喜欢
        • 2020-10-06
        • 2017-10-01
        • 2019-05-12
        • 2019-07-16
        • 1970-01-01
        • 2019-06-16
        • 2022-01-03
        • 1970-01-01
        • 2020-03-04
        相关资源
        最近更新 更多