/**
* Related Products
*
* Display a list of related products and/or up-sells
*/
if ( ! defined( 'ABSPATH' ) ) { exit; } // Exit if accessed directly
if( ! class_exists( 'woocommerce' ) )
{
add_shortcode( 'av_product_upsells', 'avia_please_install_woo' );
return;
}
if ( ! class_exists( 'avia_sc_product_upsells' ) )
{
class avia_sc_product_upsells extends aviaShortcodeTemplate
{
/**
* Create the config array for the shortcode button
*/
function shortcode_insert_button()
{
$this->config['version'] = '1.0';
$this->config['self_closing'] = 'yes';
$this->config['name'] = __( 'Related Products', 'avia_framework' );
$this->config['tab'] = __( 'Plugin Additions', 'avia_framework' );
$this->config['icon'] = AviaBuilder::$path['imagesURL'] . 'sc-tabs.png';
$this->config['order'] = 15;
$this->config['target'] = 'avia-target-insert';
$this->config['shortcode'] = 'av_product_upsells';
$this->config['tooltip'] = __( 'Display a list of related products and/or up-sells', 'avia_framework' );
$this->config['drag-level'] = 3;
$this->config['tinyMCE'] = array( 'disable' => 'true' );
$this->config['posttype'] = array( 'product', __( 'This element can only be used on single product pages', 'avia_framework' ) );
$this->config['id_name'] = 'id';
$this->config['id_show'] = 'yes';
$this->config['alb_desc_id'] = 'alb_description';
}
/**
* Popup Elements
*
* If this function is defined in a child class the element automatically gets an edit button, that, when pressed
* opens a modal window that allows to edit the element properties
*
* @return void
*/
function popup_elements()
{
$this->elements = array(
array(
'type' => 'tab_container',
'nodescription' => true
),
array(
'type' => 'tab',
'name' => __( 'Content', 'avia_framework' ),
'nodescription' => true
),
array(
'type' => 'template',
'template_id' => $this->popup_key( 'content_upsells' )
),
array(
'type' => 'tab_close',
'nodescription' => true
),
array(
'type' => 'tab_container_close',
'nodescription' => true
)
);
}
/**
* Create and register templates for easier maintainance
*
* @since 4.6.4
*/
protected function register_dynamic_templates()
{
/**
* Content Tab
* ===========
*/
$c = array(
array(
'name' => __( 'Display options', 'avia_framework' ),
'desc' => __( 'Choose which products you want to display', 'avia_framework' ),
'id' => 'display',
'type' => 'select',
'std' => 'upsells related',
'subtype' => array(
__( 'Display up-sells and related products', 'avia_framework' ) => 'upsells related',
__( 'Display up-sells only', 'avia_framework' ) => 'upsells',
__( 'Display related products only', 'avia_framework' ) => 'related'
)
),
array(
'name' => __( 'Number of items', 'avia_framework' ),
'desc' => __( 'Choose the maximum number of products to display', 'avia_framework' ),
'id' => 'count',
'type' => 'select',
'std' => '4',
'subtype' => array( '1' =>'1', '2' =>'2', '3' =>'3', '4' =>'4', '5' =>'5' )
),
array(
'name' => __( 'WooCommerce Product visibility?', 'avia_framework' ),
'desc' => __( 'Select the visibility of WooCommerce products. Default setting can be set at Woocommerce -> Settings -> Products -> Inventory -> Out of stock visibility. Currently it is only possible to hide products out of stock.', 'avia_framework' ),
'id' => 'wc_prod_visible',
'type' => 'select',
'std' => '',
'subtype' => array(
__( 'Use default WooCommerce Setting (Settings -> Products -> Out of stock visibility)', 'avia_framework' ) => '',
__( 'Hide products out of stock', 'avia_framework' ) => 'hide',
// __( 'Show products out of stock', 'avia_framework' ) => 'show'
)
),
);
AviaPopupTemplates()->register_dynamic_template( $this->popup_key( 'content_upsells' ), $c );
}
/**
* Editor Element - this function defines the visual appearance of an element on the AviaBuilder Canvas
* Most common usage is to define some markup in the $params['innerHtml'] which is then inserted into the drag and drop container
* Less often used: $params['data'] to add data attributes, $params['class'] to modify the className
*
*
* @param array $params this array holds the default values for $content and $args.
* @return $params the return array usually holds an innerHtml key that holds item specific markup.
*/
function editor_element( $params )
{
$params = parent::editor_element( $params );
return $params;
}
/**
* Frontend Shortcode Handler
*
* @param array $atts array of attributes
* @param string $content text within enclosing form of shortcode element
* @param string $shortcodename the shortcode found, when == callback name
* @return string $output returns the modified html string
*/
function shortcode_handler( $atts, $content = '', $shortcodename = '', $meta = '' )
{
global $avia_config, $product;
// fix for seo plugins which execute the do_shortcode() function before everything is loaded
if( ! function_exists( 'WC' ) || ! WC() instanceof WooCommerce || ! is_object( WC()->query ) || ! $product instanceof WC_Product )
{
return '';
}
extract( shortcode_atts( array(
'display' => 'upsells related',
'count' => 4,
'wc_prod_visible' => ''
), $atts, $this->config['shortcode'] ) );
if( ! isset( $meta['el_class'] ) )
{
$meta['el_class'] = '';
}
// force to ignore WC default setting - see hooked function avia_wc_product_is_visible
switch( $wc_prod_visible )
{
case 'show':
$avia_config['woocommerce']['catalog_product_visibility'] = 'show_all';
break;
case 'hide':
$avia_config['woocommerce']['catalog_product_visibility'] = 'hide_out_of_stock';
break;
default:
$avia_config['woocommerce']['catalog_product_visibility'] = 'use_default';
break;
}
$output = '';
// $product = wc_get_product();
$output .= "
";
if( strpos( $display, 'upsells' ) !== false )
{
$output .= avia_woocommerce_output_upsells( $count, $count );
}
if( strpos( $display, 'related' ) !== false )
{
$output .= avia_woocommerce_output_related_products( $count, $count );
}
$output .= '
';
// reset
$avia_config['woocommerce']['catalog_product_visibility'] = 'use_default';
return $output;
}
}
}
About Sónia Nunes This author has yet to write their bio. Meanwhile lets just say that we are proud Sónia Nunes contributed a whooping 14685 entries.
Hidden Perks of Rocketplay Casino for 2025: Win Real Money with Live Chat Support As we navigate through 2025, online casinos continue to evolve, with Rocketplay Casino standing out for offering an engaging and rewarding gaming experience. Beyond its vibrant games and sleek interface, this platform harbors several hidden perks that players might not initially […]
Blogs Better online casinos inside the Canada to have 2025 | jimi hendrix mobile Casino ratings and you will player issues In charge gaming systems from the casinos on the internet within the Canada Such as PayPal, the availableness for casino purchases within the Canada is generally restricted. Québec features a long-status profile as the […]
Content Heatz – Large Incentives with Highest Account Greatest Crypto Bitcoin Gambling enterprises 2025 Post crypto The website also offers from entertaining slots and you may alive casino games to interactive tournaments and provably reasonable mini-online game. All of these options are run on better builders such as Pragmatic Enjoy and Enjoy’n Go, just who […]
Scroll to top
Customize
Reject All
Accept All
✖
Necessary cookies enable essential site features like secure log-ins and consent preference adjustments. They do not store personal data.
None
Functional cookies support features like content sharing on social media, collecting feedback, and enabling third-party tools.
None
Analytical cookies track visitor interactions, providing insights on metrics like visitor count, bounce rate, and traffic sources.
None
Advertisement cookies deliver personalized ads based on your previous visits and analyze the effectiveness of ad campaigns.
None
Unclassified cookies are cookies that we are in the process of classifying, together with the providers of individual cookies.
None