Skip to content

Instantly share code, notes, and snippets.

@RichardNesbitt
Last active April 23, 2024 09:06
Show Gist options
  • Star 23 You must be signed in to star a gist
  • Fork 7 You must be signed in to fork a gist
  • Save RichardNesbitt/5ed1198ef75ef53fcc820419e57307ee to your computer and use it in GitHub Desktop.
Save RichardNesbitt/5ed1198ef75ef53fcc820419e57307ee to your computer and use it in GitHub Desktop.
WP Bakery Page Builder - Add URL option to make entire column clickable - Updated 22 June 2023
<?php
/* add this to your theme's functions.php file */
/* Add option for URL to column settings */
vc_add_param("vc_column", array(
"type" => "vc_link",
"class" => "",
"heading" => "Column Link",
"param_name" => "column_link"
));
/* Add option for URL to column_inner settings */
vc_add_param("vc_column_inner", array(
"type" => "vc_link",
"class" => "",
"heading" => "Column Link",
"param_name" => "column_link"
));
?>
<?php
/* place this file in [your-theme]/vc_templates/ */
if ( ! defined( 'ABSPATH' ) ) {
die( '-1' );
}
/* This file modifies the vc_column output to accomodate the otional URL parameter */
/**
* Shortcode attributes
* @var $atts
* @var $el_id
* @var $el_class
* @var $width
* @var $css
* @var $offset
* @var $content - shortcode content
* @var $css_animation
* Shortcode class
* @var WPBakeryShortCode_Vc_Column $this
*/
$el_class = $el_id = $width = $parallax_speed_bg = $parallax_speed_video = $parallax = $parallax_image = $video_bg = $video_bg_url = $video_bg_parallax = $css = $offset = $css_animation = '';
$output = '';
$atts = vc_map_get_attributes( $this->getShortcode(), $atts );
extract( $atts );
wp_enqueue_script( 'wpb_composer_front_js' );
$width = wpb_translateColumnWidthToSpan( $width );
$width = vc_column_offset_class_merge( $offset, $width );
$css_classes = array(
$this->getExtraClass( $el_class ) . $this->getCSSAnimation( $css_animation ),
'wpb_column',
'vc_column_container',
$width,
);
if ( vc_shortcode_custom_css_has_property( $css, array(
'border',
'background',
) ) || $video_bg || $parallax
) {
$css_classes[] = 'vc_col-has-fill';
}
$wrapper_attributes = array();
$has_video_bg = ( ! empty( $video_bg ) && ! empty( $video_bg_url ) && vc_extract_youtube_id( $video_bg_url ) );
$parallax_speed = $parallax_speed_bg;
if ( $has_video_bg ) {
$parallax = $video_bg_parallax;
$parallax_speed = $parallax_speed_video;
$parallax_image = $video_bg_url;
$css_classes[] = 'vc_video-bg-container';
wp_enqueue_script( 'vc_youtube_iframe_api_js' );
}
if ( ! empty( $parallax ) ) {
wp_enqueue_script( 'vc_jquery_skrollr_js' );
$wrapper_attributes[] = 'data-vc-parallax="' . esc_attr( $parallax_speed ) . '"'; // parallax speed
$css_classes[] = 'vc_general vc_parallax vc_parallax-' . $parallax;
if ( false !== strpos( $parallax, 'fade' ) ) {
$css_classes[] = 'js-vc_parallax-o-fade';
$wrapper_attributes[] = 'data-vc-parallax-o-fade="on"';
} elseif ( false !== strpos( $parallax, 'fixed' ) ) {
$css_classes[] = 'js-vc_parallax-o-fixed';
}
}
if ( ! empty( $parallax_image ) ) {
if ( $has_video_bg ) {
$parallax_image_src = $parallax_image;
} else {
$parallax_image_id = preg_replace( '/[^\d]/', '', $parallax_image );
$parallax_image_src = wp_get_attachment_image_src( $parallax_image_id, 'full' );
if ( ! empty( $parallax_image_src[0] ) ) {
$parallax_image_src = $parallax_image_src[0];
}
}
$wrapper_attributes[] = 'data-vc-parallax-image="' . esc_attr( $parallax_image_src ) . '"';
}
if ( ! $parallax && $has_video_bg ) {
$wrapper_attributes[] = 'data-vc-video-bg="' . esc_attr( $video_bg_url ) . '"';
}
$css_class = preg_replace( '/\s+/', ' ', apply_filters( VC_SHORTCODE_CUSTOM_CSS_FILTER_TAG, implode( ' ', array_filter( $css_classes ) ), $this->settings['base'], $atts ) );
$wrapper_attributes[] = 'class="' . esc_attr( trim( $css_class ) ) . '"';
if ( ! empty( $el_id ) ) {
$wrapper_attributes[] = 'id="' . esc_attr( $el_id ) . '"';
}
$output .= '<div ' . implode( ' ', $wrapper_attributes ) . '>';
$innerColumnClass = 'vc_column-inner ' . esc_attr( trim( vc_shortcode_custom_css_class( $css ) ) );
$output .= '<div class="' . trim( $innerColumnClass ) . '">';
/* Inserted to check whether a link is present in the settings */
if( !empty($column_link) ){
$column_link_array = vc_build_link($column_link);
$column_link = esc_url($column_link_array['url']);
$column_target = $column_link_array['target'];
$column_rel = $column_link_array['rel'];
$column_title = $column_link_array['title'];
$output .= "<a href='$column_link' ";
$output .= ( $column_target == '_blank' ) ? "target='_blank' " : '';
$output .= ( $column_rel == 'nofollow' ) ? "rel='nofollow' " : '';
$output .= ( $column_title !== '' ) ? "title='$column_title' " : '';
$output .= "class='big_link' style='position:absolute;top:0;left:0;width:100%;height:100%;z-index:9999;'aria-hidden='true'></a>";
}
/* End Changes - Resume base code */
$output .= '<div class="wpb_wrapper">';
$output .= wpb_js_remove_wpautop( $content );
$output .= '</div>';
$output .= '</div>';
$output .= '</div>';
echo $output;
<?php
/* place this file in [your-theme]/vc_templates/ */
if ( ! defined( 'ABSPATH' ) ) {
die( '-1' );
}
/* This file modifies the vc_column_inner output to accomodate the otional URL parameter */
/**
* Shortcode attributes
* @var $atts
* @var $el_class
* @var $el_id
* @var $width
* @var $css
* @var $offset
* @var $content - shortcode content
* Shortcode class
* @var WPBakeryShortCode_Vc_Column_Inner $this
*/
$el_class = $width = $el_id = $css = $offset = '';
$output = '';
$atts = vc_map_get_attributes( $this->getShortcode(), $atts );
extract( $atts );
$width = wpb_translateColumnWidthToSpan( $width );
$width = vc_column_offset_class_merge( $offset, $width );
$css_classes = array(
$this->getExtraClass( $el_class ),
'wpb_column',
'vc_column_container',
$width,
);
if ( vc_shortcode_custom_css_has_property( $css, array(
'border',
'background',
) ) ) {
$css_classes[] = 'vc_col-has-fill';
}
$wrapper_attributes = array();
$css_class = preg_replace( '/\s+/', ' ', apply_filters( VC_SHORTCODE_CUSTOM_CSS_FILTER_TAG, implode( ' ', array_filter( $css_classes ) ), $this->settings['base'], $atts ) );
$wrapper_attributes[] = 'class="' . esc_attr( trim( $css_class ) ) . '"';
if ( ! empty( $el_id ) ) {
$wrapper_attributes[] = 'id="' . esc_attr( $el_id ) . '"';
}
$output .= '<div ' . implode( ' ', $wrapper_attributes ) . '>';
$innerColumnClass = 'vc_column-inner ' . esc_attr( trim( vc_shortcode_custom_css_class( $css ) ) );
$output .= '<div class="' . trim( $innerColumnClass ) . '">';
/* Inserted to check whether a link is present in the settings */
if( !empty($column_link) ){
$column_link_array = vc_build_link($column_link);
$column_link = esc_url($column_link_array['url']);
$column_target = $column_link_array['target'];
$column_rel = $column_link_array['rel'];
$column_title = $column_link_array['title'];
$output .= "<a href='$column_link' ";
$output .= ( $column_target == '_blank' ) ? "target='_blank' " : '';
$output .= ( $column_rel == 'nofollow' ) ? "rel='nofollow' " : '';
$output .= ( $column_title !== '' ) ? "title='$column_title' " : '';
$output .= "class='big_link' style='position:absolute;top:0;left:0;width:100%;height:100%;z-index:9999;'aria-hidden='true'></a>";
}
/* End Changes - Resume base code */
$output .= '<div class="wpb_wrapper">';
$output .= wpb_js_remove_wpautop( $content );
$output .= '</div>';
$output .= '</div>';
$output .= '</div>';
echo $output;
@RichardNesbitt
Copy link
Author

DO NOT DO THIS.
Even if it wasn't a bad idea because you'd have to do it for every 👏 single👏 column👏, it can cause accessibility issues. Without having a semantically clickable element, there's no target for assistive technology.

@Abdullahijazvu
Copy link

DO NOT DO THIS. Even if it wasn't a bad idea because you'd have to do it for every 👏 single👏 column👏, it can cause accessibility issues. Without having a semantically clickable element, there's no target for assistive technology.

I'm using it for Anchor ID, & it works for me :)

@RichardNesbitt
Copy link
Author

RichardNesbitt commented Sep 14, 2023 via email

@eldarsht
Copy link

@RichardNesbitt everything works fine in the backend, but frontend-wise the column is still not clickable :/

WPB Version 6.4.2

@jennyLupo
Copy link

Hi I am trying to get this to work for me. I am able to add the link in the back end, but it is not working in the front end. I may be putting the second lot of code in the wrong place? I cannot find [your-theme]/vc_templates/ */. I found this which I hoped was the same thing
Jevelin: Visual Composer Compatibility(beta!) Page Template (page-vc.php).

Where do I find vc_templates? I tried theme file editor in wordpress and I searched the files on cpanel

Or is there an easier way??

Im am just winging it, any help would be appreciated!!!

@eldarsht
Copy link

@jennyLupo i just pasted both vc files in the theme root folder, since i also dont have any /vc_templates/ folder. maybe that might also be the issue for me.

my theme is bought of envato.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment