Edit File by line

Deprecated: str_replace(): Passing null to parameter #2 ($replace) of type array|string is deprecated in /home/sportsfever/public_html/filemanger/function.php on line 93
/home/sportsfe.../httpdocs/clone/wp-conte.../themes/Divi/includes/builder/module/woocomme...
File: Tabs.php
<?php
[0] Fix | Delete
/**
[1] Fix | Delete
* WooCommerce Modules: ET_Builder_Module_Woocommerce_Tabs class
[2] Fix | Delete
*
[3] Fix | Delete
* The ET_Builder_Module_Woocommerce_Tabs Class is responsible for rendering the
[4] Fix | Delete
* Tabs markup using the WooCommerce template.
[5] Fix | Delete
*
[6] Fix | Delete
* @package Divi\Builder
[7] Fix | Delete
*
[8] Fix | Delete
* @since 3.29
[9] Fix | Delete
*/
[10] Fix | Delete
[11] Fix | Delete
/**
[12] Fix | Delete
* Class representing WooCommerce Add to cart component.
[13] Fix | Delete
*
[14] Fix | Delete
* @since 3.29
[15] Fix | Delete
*/
[16] Fix | Delete
class ET_Builder_Module_Woocommerce_Tabs extends ET_Builder_Module_Tabs {
[17] Fix | Delete
/**
[18] Fix | Delete
* Define WooCommerce Tabs property.
[19] Fix | Delete
*/
[20] Fix | Delete
public function init() {
[21] Fix | Delete
// Inherit tabs module property.
[22] Fix | Delete
parent::init();
[23] Fix | Delete
[24] Fix | Delete
// Define WooCommerce Tabs module property; overwriting inherited property.
[25] Fix | Delete
$this->name = esc_html__( 'Woo Tabs', 'et_builder' );
[26] Fix | Delete
$this->plural = esc_html__( 'Woo Tabs', 'et_builder' );
[27] Fix | Delete
$this->slug = 'et_pb_wc_tabs';
[28] Fix | Delete
[29] Fix | Delete
/*
[30] Fix | Delete
* Set property for holding rendering data so the data rendering via
[31] Fix | Delete
* ET_Builder_Module_Woocommerce_Tabs::get_tabs() is only need to be done once.
[32] Fix | Delete
*/
[33] Fix | Delete
$this->rendered_tabs_data = array();
[34] Fix | Delete
[35] Fix | Delete
// Remove module item.
[36] Fix | Delete
$this->child_slug = null;
[37] Fix | Delete
$this->child_item_text = null;
[38] Fix | Delete
[39] Fix | Delete
// Set WooCommerce Tabs specific toggle / options group.
[40] Fix | Delete
$this->settings_modal_toggles['general']['toggles']['main_content'] = array(
[41] Fix | Delete
'title' => et_builder_i18n( 'Content' ),
[42] Fix | Delete
'priority' => 10,
[43] Fix | Delete
);
[44] Fix | Delete
[45] Fix | Delete
$this->advanced_fields['fonts']['tab']['font_size'] = array(
[46] Fix | Delete
'default' => '14px',
[47] Fix | Delete
);
[48] Fix | Delete
$this->advanced_fields['fonts']['tab']['line_height'] = array(
[49] Fix | Delete
'default' => '1.7em',
[50] Fix | Delete
);
[51] Fix | Delete
[52] Fix | Delete
$this->help_videos = array(
[53] Fix | Delete
array(
[54] Fix | Delete
'id' => '7X03vBPYJ1o',
[55] Fix | Delete
'name' => esc_html__( 'Divi WooCommerce Modules', 'et_builder' ),
[56] Fix | Delete
),
[57] Fix | Delete
);
[58] Fix | Delete
}
[59] Fix | Delete
[60] Fix | Delete
/**
[61] Fix | Delete
* Get product all possible tabs data
[62] Fix | Delete
*
[63] Fix | Delete
* @since 3.29
[64] Fix | Delete
* @since 4.4.2 Fix to include Custom tabs.
[65] Fix | Delete
*
[66] Fix | Delete
* @global WP_Post $post WordPress Post.
[67] Fix | Delete
* @global WC_Product $product WooCommerce Product.
[68] Fix | Delete
*
[69] Fix | Delete
* @return array
[70] Fix | Delete
*/
[71] Fix | Delete
public function get_product_tabs() {
[72] Fix | Delete
static $tabs = null;
[73] Fix | Delete
[74] Fix | Delete
if ( ! is_null( $tabs ) ) {
[75] Fix | Delete
return $tabs;
[76] Fix | Delete
}
[77] Fix | Delete
[78] Fix | Delete
global $post, $product;
[79] Fix | Delete
[80] Fix | Delete
// Save existing $post and $product global.
[81] Fix | Delete
$original_post = $post;
[82] Fix | Delete
$original_product = $product;
[83] Fix | Delete
[84] Fix | Delete
$post_id = 'product' === $this->get_post_type()
[85] Fix | Delete
? ET_Builder_Element::get_current_post_id()
[86] Fix | Delete
: ET_Builder_Module_Helper_Woocommerce_Modules::get_product_id( 'latest' );
[87] Fix | Delete
[88] Fix | Delete
// Overwriting global $post is necessary as WooCommerce relies on it.
[89] Fix | Delete
$post = get_post( $post_id );
[90] Fix | Delete
$product = wc_get_product( $post_id );
[91] Fix | Delete
[92] Fix | Delete
/*
[93] Fix | Delete
* Get relevant product tabs data. Product tabs hooks use global based conditional
[94] Fix | Delete
* for adding / removing product tabs data via filter hoook callback, hence the
[95] Fix | Delete
* need to overwrite the global for determining product tabs data
[96] Fix | Delete
*/
[97] Fix | Delete
$tabs = is_object( $product )
[98] Fix | Delete
? apply_filters( 'woocommerce_product_tabs', array() )
[99] Fix | Delete
: ET_Builder_Module_Helper_Woocommerce_Modules::get_default_product_tabs();
[100] Fix | Delete
[101] Fix | Delete
// Reset $post and $product global.
[102] Fix | Delete
$post = $original_post;
[103] Fix | Delete
$product = $original_product;
[104] Fix | Delete
[105] Fix | Delete
/*
[106] Fix | Delete
* Always return all possible tabs
[107] Fix | Delete
*/
[108] Fix | Delete
return $tabs;
[109] Fix | Delete
}
[110] Fix | Delete
[111] Fix | Delete
/**
[112] Fix | Delete
* Get product tabs options; product data formatted for checkbox control's options
[113] Fix | Delete
*
[114] Fix | Delete
* @since 3.29
[115] Fix | Delete
*
[116] Fix | Delete
* @return array
[117] Fix | Delete
*/
[118] Fix | Delete
public function get_tab_options() {
[119] Fix | Delete
$tabs = $this->get_product_tabs();
[120] Fix | Delete
$options = array();
[121] Fix | Delete
[122] Fix | Delete
foreach ( $tabs as $name => $tab ) {
[123] Fix | Delete
if ( ! isset( $tab['title'] ) ) {
[124] Fix | Delete
continue;
[125] Fix | Delete
}
[126] Fix | Delete
[127] Fix | Delete
$options[ $name ] = array(
[128] Fix | Delete
'value' => $name,
[129] Fix | Delete
'label' => 'reviews' === $name ? esc_html__( 'Reviews', 'et_builder' ) :
[130] Fix | Delete
esc_html( $tab['title'] ),
[131] Fix | Delete
);
[132] Fix | Delete
}
[133] Fix | Delete
[134] Fix | Delete
return $options;
[135] Fix | Delete
}
[136] Fix | Delete
[137] Fix | Delete
/**
[138] Fix | Delete
* Get product tabs default based on product tabs options
[139] Fix | Delete
*
[140] Fix | Delete
* @since 3.29
[141] Fix | Delete
*
[142] Fix | Delete
* @return string
[143] Fix | Delete
*/
[144] Fix | Delete
public function get_tab_defaults() {
[145] Fix | Delete
return implode( '|', array_keys( $this->get_product_tabs() ) );
[146] Fix | Delete
}
[147] Fix | Delete
[148] Fix | Delete
/**
[149] Fix | Delete
* Define Woo Tabs fields
[150] Fix | Delete
*
[151] Fix | Delete
* @since 3.29
[152] Fix | Delete
*
[153] Fix | Delete
* @return array
[154] Fix | Delete
*/
[155] Fix | Delete
public function get_fields() {
[156] Fix | Delete
$fields = array_merge(
[157] Fix | Delete
parent::get_fields(),
[158] Fix | Delete
array(
[159] Fix | Delete
'product' => ET_Builder_Module_Helper_Woocommerce_Modules::get_field(
[160] Fix | Delete
'product',
[161] Fix | Delete
array(
[162] Fix | Delete
'default' => ET_Builder_Module_Helper_Woocommerce_Modules::get_product_default(),
[163] Fix | Delete
'computed_affects' => array(
[164] Fix | Delete
'__tabs',
[165] Fix | Delete
'include_tabs',
[166] Fix | Delete
),
[167] Fix | Delete
)
[168] Fix | Delete
),
[169] Fix | Delete
'include_tabs' => array(
[170] Fix | Delete
'label' => esc_html__( 'Include Tabs', 'et_builder' ),
[171] Fix | Delete
'type' => 'checkboxes_advanced_woocommerce',
[172] Fix | Delete
'option_category' => 'configuration',
[173] Fix | Delete
'default' =>
[174] Fix | Delete
ET_Builder_Module_Helper_Woocommerce_Modules::get_woo_default_tabs(),
[175] Fix | Delete
'description' => esc_html__( 'Here you can select the tabs that you would like to display.', 'et_builder' ),
[176] Fix | Delete
'toggle_slug' => 'main_content',
[177] Fix | Delete
'mobile_options' => true,
[178] Fix | Delete
'hover' => 'tabs',
[179] Fix | Delete
'computed_depends_on' => array(
[180] Fix | Delete
'product',
[181] Fix | Delete
),
[182] Fix | Delete
),
[183] Fix | Delete
'__tabs' => array(
[184] Fix | Delete
'type' => 'computed',
[185] Fix | Delete
'computed_callback' => array(
[186] Fix | Delete
'ET_Builder_Module_Woocommerce_Tabs',
[187] Fix | Delete
'get_tabs',
[188] Fix | Delete
),
[189] Fix | Delete
'computed_depends_on' => array(
[190] Fix | Delete
'product',
[191] Fix | Delete
),
[192] Fix | Delete
'computed_minimum' => array(
[193] Fix | Delete
'product',
[194] Fix | Delete
),
[195] Fix | Delete
),
[196] Fix | Delete
)
[197] Fix | Delete
);
[198] Fix | Delete
[199] Fix | Delete
return $fields;
[200] Fix | Delete
}
[201] Fix | Delete
[202] Fix | Delete
/**
[203] Fix | Delete
* Get tabs nav output
[204] Fix | Delete
*
[205] Fix | Delete
* @since 3.29
[206] Fix | Delete
*
[207] Fix | Delete
* @return string
[208] Fix | Delete
*/
[209] Fix | Delete
public function get_tabs_nav() {
[210] Fix | Delete
$nav = '';
[211] Fix | Delete
$index = 0;
[212] Fix | Delete
[213] Fix | Delete
// get_tabs_content() method is called earlier so get_tabs_nav() can reuse tabs data.
[214] Fix | Delete
if ( ! empty( $this->rendered_tabs_data ) ) {
[215] Fix | Delete
foreach ( $this->rendered_tabs_data as $name => $tab ) {
[216] Fix | Delete
$index ++;
[217] Fix | Delete
[218] Fix | Delete
$nav .= sprintf(
[219] Fix | Delete
'<li class="%3$s%1$s"><a href="#">%2$s</a></li>',
[220] Fix | Delete
( 1 === $index ? ' et_pb_tab_active' : '' ),
[221] Fix | Delete
esc_html( $tab['title'] ),
[222] Fix | Delete
sprintf( '%1$s_tab', esc_attr( $name ) )
[223] Fix | Delete
);
[224] Fix | Delete
}
[225] Fix | Delete
}
[226] Fix | Delete
[227] Fix | Delete
return $nav;
[228] Fix | Delete
}
[229] Fix | Delete
[230] Fix | Delete
/**
[231] Fix | Delete
* Get tabs content output
[232] Fix | Delete
*
[233] Fix | Delete
* @since 4.4.1 Fix [embed][/embed] shortcodes not working in tab content
[234] Fix | Delete
* @since 3.29
[235] Fix | Delete
*
[236] Fix | Delete
* @return string
[237] Fix | Delete
*/
[238] Fix | Delete
public function get_tabs_content() {
[239] Fix | Delete
// Get tabs data.
[240] Fix | Delete
$this->rendered_tabs_data = self::get_tabs(
[241] Fix | Delete
array(
[242] Fix | Delete
'product' => $this->props['product'],
[243] Fix | Delete
'include_tabs' => $this->props['include_tabs'],
[244] Fix | Delete
)
[245] Fix | Delete
);
[246] Fix | Delete
[247] Fix | Delete
// Add tabs module classname.
[248] Fix | Delete
$this->add_classname( 'et_pb_tabs' );
[249] Fix | Delete
[250] Fix | Delete
// Render tabs content output.
[251] Fix | Delete
$index = 0;
[252] Fix | Delete
$content = '';
[253] Fix | Delete
[254] Fix | Delete
foreach ( $this->rendered_tabs_data as $name => $tab ) {
[255] Fix | Delete
$index ++;
[256] Fix | Delete
[257] Fix | Delete
$content .= sprintf(
[258] Fix | Delete
'<div class="et_pb_tab clearfix%2$s">
[259] Fix | Delete
<div class="et_pb_tab_content">
[260] Fix | Delete
%1$s
[261] Fix | Delete
</div><!-- .et_pb_tab_content" -->
[262] Fix | Delete
</div>',
[263] Fix | Delete
$tab['content'],
[264] Fix | Delete
1 === $index ? ' et_pb_active_content' : ''
[265] Fix | Delete
);
[266] Fix | Delete
}
[267] Fix | Delete
[268] Fix | Delete
return $content;
[269] Fix | Delete
}
[270] Fix | Delete
[271] Fix | Delete
/**
[272] Fix | Delete
* Load comments template.
[273] Fix | Delete
*
[274] Fix | Delete
* @param string $template template to load.
[275] Fix | Delete
* @return string
[276] Fix | Delete
*/
[277] Fix | Delete
public static function comments_template_loader( $template ) {
[278] Fix | Delete
if ( ! et_builder_tb_enabled() ) {
[279] Fix | Delete
return $template;
[280] Fix | Delete
}
[281] Fix | Delete
[282] Fix | Delete
$check_dirs = array(
[283] Fix | Delete
trailingslashit( get_stylesheet_directory() ) . WC()->template_path(),
[284] Fix | Delete
trailingslashit( get_template_directory() ) . WC()->template_path(),
[285] Fix | Delete
trailingslashit( get_stylesheet_directory() ),
[286] Fix | Delete
trailingslashit( get_template_directory() ),
[287] Fix | Delete
trailingslashit( WC()->plugin_path() ) . 'templates/',
[288] Fix | Delete
);
[289] Fix | Delete
[290] Fix | Delete
if ( WC_TEMPLATE_DEBUG_MODE ) {
[291] Fix | Delete
$check_dirs = array( array_pop( $check_dirs ) );
[292] Fix | Delete
}
[293] Fix | Delete
[294] Fix | Delete
foreach ( $check_dirs as $dir ) {
[295] Fix | Delete
if ( file_exists( trailingslashit( $dir ) . 'single-product-reviews.php' ) ) {
[296] Fix | Delete
return trailingslashit( $dir ) . 'single-product-reviews.php';
[297] Fix | Delete
}
[298] Fix | Delete
}
[299] Fix | Delete
}
[300] Fix | Delete
[301] Fix | Delete
/**
[302] Fix | Delete
* Get tabs data
[303] Fix | Delete
*
[304] Fix | Delete
* @since 4.0.9 Avoid fetching Tabs content using `the_content` when editing TB layout.
[305] Fix | Delete
*
[306] Fix | Delete
* @param array $args Additional args.
[307] Fix | Delete
*
[308] Fix | Delete
* @return array
[309] Fix | Delete
*/
[310] Fix | Delete
public static function get_tabs( $args = array() ) {
[311] Fix | Delete
global $product, $post, $wp_query;
[312] Fix | Delete
[313] Fix | Delete
/*
[314] Fix | Delete
* Visual builder fetches all tabs data and filter the included tab on the app to save
[315] Fix | Delete
* app to server request for faster user experience. Frontend passes `includes_tab` to
[316] Fix | Delete
* this method so it only process required tabs
[317] Fix | Delete
*/
[318] Fix | Delete
$defaults = array(
[319] Fix | Delete
'product' => 'current',
[320] Fix | Delete
);
[321] Fix | Delete
$args = wp_parse_args( $args, $defaults );
[322] Fix | Delete
[323] Fix | Delete
// Get actual product id based on given `product` attribute.
[324] Fix | Delete
$product_id = ET_Builder_Module_Helper_Woocommerce_Modules::get_product_id( $args['product'] );
[325] Fix | Delete
[326] Fix | Delete
// Determine whether current tabs data needs global variable overwrite or not.
[327] Fix | Delete
$overwrite_global = et_builder_wc_need_overwrite_global( $args['product'] );
[328] Fix | Delete
[329] Fix | Delete
// Check if TB is used
[330] Fix | Delete
$is_tb = et_builder_tb_enabled();
[331] Fix | Delete
[332] Fix | Delete
if ( $is_tb ) {
[333] Fix | Delete
et_theme_builder_wc_set_global_objects();
[334] Fix | Delete
} else if ( $overwrite_global ) {
[335] Fix | Delete
// Save current global variable for later reset.
[336] Fix | Delete
$original_product = $product;
[337] Fix | Delete
$original_post = $post;
[338] Fix | Delete
$original_wp_query = $wp_query;
[339] Fix | Delete
[340] Fix | Delete
// Overwrite global variable.
[341] Fix | Delete
$post = get_post( $product_id );
[342] Fix | Delete
$product = wc_get_product( $product_id );
[343] Fix | Delete
$wp_query = new WP_Query( array( 'p' => $product_id ) );
[344] Fix | Delete
}
[345] Fix | Delete
[346] Fix | Delete
// Get product tabs.
[347] Fix | Delete
$all_tabs = apply_filters( 'woocommerce_product_tabs', array() );
[348] Fix | Delete
$active_tabs = isset( $args['include_tabs'] ) ? explode( '|', $args['include_tabs'] ) : false;
[349] Fix | Delete
$tabs = array();
[350] Fix | Delete
[351] Fix | Delete
// Get product tabs data.
[352] Fix | Delete
foreach ( $all_tabs as $name => $tab ) {
[353] Fix | Delete
// Skip if current tab is not included, based on `include_tabs` attribute value.
[354] Fix | Delete
if ( $active_tabs && ! in_array( $name, $active_tabs, true ) ) {
[355] Fix | Delete
continue;
[356] Fix | Delete
}
[357] Fix | Delete
[358] Fix | Delete
if ( 'description' === $name ) {
[359] Fix | Delete
if ( ! et_builder_tb_enabled() && ! et_pb_is_pagebuilder_used( $product_id ) ) {
[360] Fix | Delete
// If selected product doesn't use builder, retrieve post content.
[361] Fix | Delete
if ( et_theme_builder_overrides_layout( ET_THEME_BUILDER_BODY_LAYOUT_POST_TYPE ) ) {
[362] Fix | Delete
$tab_content = apply_filters( 'et_builder_wc_description', $post->post_content );
[363] Fix | Delete
} else {
[364] Fix | Delete
$tab_content = $post->post_content;
[365] Fix | Delete
}
[366] Fix | Delete
} else {
[367] Fix | Delete
/*
[368] Fix | Delete
* Description can't use built in callback data because it gets `the_content`
[369] Fix | Delete
* which might cause infinite loop; get Divi's long description from
[370] Fix | Delete
* post meta instead.
[371] Fix | Delete
*/
[372] Fix | Delete
if ( et_builder_tb_enabled() ) {
[373] Fix | Delete
$placeholders = et_theme_builder_wc_placeholders();
[374] Fix | Delete
[375] Fix | Delete
$tab_content = $placeholders['description'];
[376] Fix | Delete
} else {
[377] Fix | Delete
$tab_content = get_post_meta( $product_id, ET_BUILDER_WC_PRODUCT_LONG_DESC_META_KEY, true );
[378] Fix | Delete
[379] Fix | Delete
// Cannot use `the_content` filter since it adds content wrapper.
[380] Fix | Delete
// Content wrapper added at
[381] Fix | Delete
// `includes/builder/core.php`::et_builder_add_builder_content_wrapper()
[382] Fix | Delete
// This filter is documented at
[383] Fix | Delete
// includes/builder/feature/woocommerce-modules.php
[384] Fix | Delete
$tab_content = apply_filters( 'et_builder_wc_description', $tab_content );
[385] Fix | Delete
}
[386] Fix | Delete
}
[387] Fix | Delete
} else {
[388] Fix | Delete
// Get tab value based on defined product tab's callback attribute.
[389] Fix | Delete
ob_start();
[390] Fix | Delete
// @phpcs:ignore Generic.PHP.ForbiddenFunctions.Found
[391] Fix | Delete
call_user_func( $tab['callback'], $name, $tab );
[392] Fix | Delete
$tab_content = ob_get_clean();
[393] Fix | Delete
}
[394] Fix | Delete
[395] Fix | Delete
// Populate product tab data.
[396] Fix | Delete
$tabs[ $name ] = array(
[397] Fix | Delete
'name' => $name,
[398] Fix | Delete
'title' => $tab['title'],
[399] Fix | Delete
'content' => $tab_content,
[400] Fix | Delete
);
[401] Fix | Delete
}
[402] Fix | Delete
[403] Fix | Delete
// Reset overwritten global variable.
[404] Fix | Delete
if ( $is_tb ) {
[405] Fix | Delete
et_theme_builder_wc_reset_global_objects();
[406] Fix | Delete
} else if ( $overwrite_global ) {
[407] Fix | Delete
$product = $original_product;
[408] Fix | Delete
$post = $original_post;
[409] Fix | Delete
$wp_query = $original_wp_query;
[410] Fix | Delete
}
[411] Fix | Delete
[412] Fix | Delete
return $tabs;
[413] Fix | Delete
}
[414] Fix | Delete
[415] Fix | Delete
/**
[416] Fix | Delete
* Gets Multi view attributes to the Outer wrapper.
[417] Fix | Delete
*
[418] Fix | Delete
* Since we do not have control over the WooCommerce Breadcrumb markup, we inject Multi view
[419] Fix | Delete
* attributes on to the Outer wrapper.
[420] Fix | Delete
*
[421] Fix | Delete
* @used-by ET_Builder_Module_Tabs::render()
[422] Fix | Delete
*
[423] Fix | Delete
* @return string
[424] Fix | Delete
*/
[425] Fix | Delete
public function get_multi_view_attrs() {
[426] Fix | Delete
$multi_view = et_pb_multi_view_options( $this );
[427] Fix | Delete
[428] Fix | Delete
$multi_view_attrs = $multi_view->render_attrs( array(
[429] Fix | Delete
'attrs' => array(
[430] Fix | Delete
'data-include_tabs' => '{{include_tabs}}',
[431] Fix | Delete
),
[432] Fix | Delete
'target' => '%%order_class%%',
[433] Fix | Delete
) );
[434] Fix | Delete
[435] Fix | Delete
return $multi_view_attrs;
[436] Fix | Delete
}
[437] Fix | Delete
}
[438] Fix | Delete
[439] Fix | Delete
new ET_Builder_Module_Woocommerce_Tabs();
[440] Fix | Delete
[441] Fix | Delete
It is recommended that you Edit text format, this type of Fix handles quite a lot in one request
Function