How do I add an HTML attribute to row (WP Bakery Visual Composer)?

I am trying to add an ID attribute to row in Visual Composer via documented function vc_add_param() in such a way:

$attributes = array(
 'type' => 'textfield',
 'heading' => "HTML ID",
 'param_name' => 'el_id',
 'value' => '',
 'description' => __( "Assign an ID to the row", "discprofile" )
);
vc_add_param( 'vc_row', $attributes );

ID field appears when I edit a row. I set a value, save it, save page, view it, but there is no affect to frontend. A row still has no ID attribute.

Read More

I’ve also tried use 'param_name' => 'id' and 'param_name' => 'element_id', it was the same. What is wrong?

Related posts

Leave a Reply

1 comment

  1. Solution:

    We have to remap a shortcode and change its template to add additional parameters.

    So, in my case:

    // Add custom row options
    
        function change_vc_rows() {
    
            // Add parameters we want
            vc_add_param('vc_row', array(
                'type' => 'textfield',
                'heading' => "HTML ID",
                'param_name' => 'element_id',
                'value' => '',
                'description' => __("Assign an ID to the row", "discprofile")
            ));
    
            // Update 'vc_row' to include custom vc_row template and remap shortcode
            $new_map = vc_map_update( 'vc_row', array('html_template' => locate_template('templates/vc_row.php')) );
    
            // Remove default vc_row
            vc_remove_element('vc_row');
    
            // Remap shortcode with custom template
            vc_map($new_map['vc_row']);
        }
    
        // Include our function when all wordpress stuff is loaded
        add_action( 'wp_loaded', 'change_vc_rows' );
    

    We included templates/vc_rows.php file. It is the row template file, copied from plugins/js_composer/include/templates/shortcodes/vc_rows.php with some changes. Here it is:

    <?php
    /** @var $this WPBakeryShortCode_VC_Row */
    // $element_id was added to output
    $output = $element_id = $el_class = $bg_image = $bg_color = $bg_image_repeat = $font_color = $padding = $margin_bottom = $css = $full_width = '';
    extract( shortcode_atts( array(
        // added element_id attribute
        'element_id' => '',
        'el_class' => '',
        'bg_image' => '',
        'bg_color' => '',
        'bg_image_repeat' => '',
        'font_color' => '',
        'padding' => '',
        'margin_bottom' => '',
        'full_width' => false,
        'css' => '',
    ), $atts ) );
    
    // wp_enqueue_style( 'js_composer_front' );
    wp_enqueue_script( 'wpb_composer_front_js' );
    // wp_enqueue_style('js_composer_custom_css');
    
    $el_class = $this->getExtraClass( $el_class );
    
    $css_class = apply_filters( VC_SHORTCODE_CUSTOM_CSS_FILTER_TAG, 'vc_row wpb_row ' . ( $this->settings( 'base' ) === 'vc_row_inner' ? 'vc_inner ' : '' ) . get_row_css_class() . $el_class . vc_shortcode_custom_css_class( $css, ' ' ), $this->settings['base'], $atts );
    
    $style = $this->buildStyle( $bg_image, $bg_color, $bg_image_repeat, $font_color, $padding, $margin_bottom );
    ?>
    
    <!-- Added an ID attribute where we echo our $element_id variable -->
    <div <?php
        ?>class="<?php echo esc_attr( $css_class ); ?><?php if ( $full_width == 'stretch_row_content_no_spaces' ): echo ' vc_row-no-padding'; endif; ?>" id="<?php echo $element_id; ?>" <?php if ( ! empty( $full_width ) ) {
        echo ' data-vc-full-width="true"';
        if ( $full_width == 'stretch_row_content' || $full_width == 'stretch_row_content_no_spaces' ) {
            echo ' data-vc-stretch-content="true"';
        }
    } ?> <?php echo $style; ?>><?php
    echo wpb_js_remove_wpautop( $content );
    ?></div><?php echo $this->endBlockComment( 'row' );
    echo '<div class="vc_row-full-width"></div>';