Willkommen bei WordPress. Dies ist dein erster Beitrag. Bearbeite oder lösche ihn und beginne mit dem Schreiben!
Hallo Welt!
von raredesign | Dez 3, 2019 | Allgemein | 0 Kommentare
Cokiee Shell
Current Path : /var/www/web28/html/wp-content/plugins/fusion-builder/shortcodes/ |
Current File : //var/www/web28/html/wp-content/plugins/fusion-builder/shortcodes/fusion-woo-product-grid.php |
<?php /** * Add an element to fusion-builder. * * @package fusion-builder * @since 1.0 */ if ( fusion_is_element_enabled( 'fusion_woo_product_grid' ) && class_exists( 'WooCommerce' ) ) { if ( ! class_exists( 'FusionSC_WooProductGrid' ) ) { /** * Shortcode class. * * @since 1.0 */ class FusionSC_WooProductGrid extends Fusion_Element { /** * The counter. * * @access private * @since 3.2 * @var int */ private $element_counter = 1; /** * Shortcode name. * * @access public * @since 3.2 * @var string */ public $shortcode_name; /** * Holds query data. * * @var WP_Query */ private $query = null; /** * Constructor. * * @access public * @since 1.0 */ public function __construct() { parent::__construct(); $this->shortcode_name = 'fusion_woo_product_grid'; add_filter( 'fusion_attr_woo-product-grid-shortcode', [ $this, 'attr' ] ); add_filter( 'fusion_attr_woo-product-grid-shortcode-pagination', [ $this, 'attr_pagination' ] ); add_filter( 'fusion_attr_woo-product-grid-shortcode-products', [ $this, 'attr_products' ] ); add_shortcode( $this->shortcode_name, [ $this, 'render' ] ); // Ajax mechanism for query related part. add_action( 'wp_ajax_get_fusion_woo_product_grid', [ $this, 'ajax_query' ] ); add_action( 'pre_get_posts', [ $this, 'alter_shop_loop' ], 20 ); } /** * Gets the default values. * * @static * @access public * @since 2.0.0 * @return array */ public static function get_element_defaults() { $fusion_settings = awb_get_fusion_settings(); $default_orderby = apply_filters( 'woocommerce_default_catalog_orderby', get_option( 'woocommerce_default_catalog_orderby', 'menu_order' ) ); $default_order = 'menu_order' === $default_orderby ? 'ASC' : 'DESC'; return [ 'hide_on_mobile' => fusion_builder_default_visibility( 'string' ), 'class' => '', 'id' => '', 'pull_by' => 'category', 'cat_slug' => '', 'exclude_cats' => '', 'tag_slug' => '', 'exclude_tags' => '', 'columns' => $fusion_settings->get( 'woocommerce_shop_page_columns' ), 'column_spacing' => $fusion_settings->get( 'woocommerce_archive_grid_column_spacing' ), 'number_posts' => $fusion_settings->get( 'woo_items' ), 'offset' => '', 'order' => $default_order, 'orderby' => $default_orderby, 'scrolling' => 'pagination', 'show_title' => 'yes', 'show_thumbnail' => 'yes', 'show_buttons' => 'yes', 'show_price' => 'yes', 'show_rating' => 'yes', 'grid_box_color' => $fusion_settings->get( 'timeline_bg_color' ), 'grid_border_color' => $fusion_settings->get( 'timeline_color' ), 'grid_separator_color' => $fusion_settings->get( 'grid_separator_color' ), 'grid_separator_style_type' => $fusion_settings->get( 'grid_separator_style_type' ), 'margin_bottom' => '', 'margin_left' => '', 'margin_right' => '', 'margin_top' => '', 'animation_type' => '', 'animation_direction' => 'down', 'animation_speed' => '0.1', 'animation_delay' => '', 'animation_offset' => $fusion_settings->get( 'animation_offset' ), 'animation_color' => '', ]; } /** * Used to set any other variables for use on front-end editor template. * * @static * @access public * @since 2.0.0 * @return array */ public static function get_element_extras() { $fusion_settings = awb_get_fusion_settings(); return [ 'box_design' => $fusion_settings->get( 'woocommerce_product_box_design', false, 'classic' ), 'load_more_text' => apply_filters( 'avada_load_more_products_name', esc_attr__( 'Load More Products', 'fusion-builder' ) ), 'visibility_medium' => $fusion_settings->get( 'visibility_medium' ), ]; } /** * Maps settings to extra variables. * * @static * @access public * @since 2.0.0 * @return array */ public static function settings_to_extras() { return [ 'woocommerce_product_box_design' => 'box_design', ]; } /** * Gets the query data. * * @static * @access public * @since 2.0.0 * @param array $defaults An array of defaults. * @return void */ public function ajax_query( $defaults ) { check_ajax_referer( 'fusion_load_nonce', 'fusion_load_nonce' ); $this->query( $defaults ); } /** * Gets the query data. * * @static * @access public * @since 2.0.0 * @param array $defaults The default args. * @return array|Object */ public function query( $defaults ) { global $avada_woocommerce; $live_request = false; // Return if there's a query override. $query_override = apply_filters( 'fusion_woo_product_grid_query_override', null, $defaults ); if ( $query_override ) { return $query_override; } // From Ajax Request. if ( isset( $_POST['model'] ) && ! apply_filters( 'fusion_builder_live_request', false ) ) { // phpcs:ignore WordPress.Security.NonceVerification $defaults = wp_unslash( $_POST['model']['params'] ); // phpcs:ignore WordPress.Security $return_data = []; $live_request = true; add_filter( 'fusion_builder_live_request', '__return_true' ); } $paged = ( get_query_var( 'paged' ) ) ? get_query_var( 'paged' ) : 1; if ( is_front_page() || is_home() ) { $paged = ( get_query_var( 'paged' ) ) ? get_query_var( 'paged' ) : ( ( get_query_var( 'page' ) ) ? get_query_var( 'page' ) : 1 ); } $defaults['paged'] = $paged; $number_posts = ( isset( $_GET['product_count'] ) ) ? (int) $_GET['product_count'] : (int) $defaults['number_posts']; // phpcs:ignore WordPress.Security $defaults['orderby'] = ( isset( $_GET['product_orderby'] ) ) ? $_GET['product_orderby'] : $defaults['orderby']; // phpcs:ignore WordPress.Security $defaults['order'] = ( isset( $_GET['product_order'] ) ) ? $_GET['product_order'] : $defaults['order']; // phpcs:ignore WordPress.Security if ( '0' == $defaults['offset'] ) { // phpcs:ignore Universal.Operators.StrictComparisons $defaults['offset'] = ''; } if ( 'default' === $defaults['orderby'] ) { $defaults['orderby'] = apply_filters( 'woocommerce_default_catalog_orderby', get_option( 'woocommerce_default_catalog_orderby', 'menu_order' ) ); } if ( isset( $_GET['product_orderby'] ) && 'date' === $_GET['product_orderby'] && ! isset( $_GET['product_order'] ) ) { // phpcs:ignore WordPress.Security $defaults['order'] = 'DESC'; } $args = [ 'post_type' => 'product', 'posts_per_page' => $number_posts, 'paged' => $defaults['paged'], ]; remove_filter( 'woocommerce_get_catalog_ordering_args', [ $avada_woocommerce, 'get_catalog_ordering_args' ], 20 ); $ordering_args = WC()->query->get_catalog_ordering_args( $defaults['orderby'], $defaults['order'] ); add_filter( 'woocommerce_get_catalog_ordering_args', [ $avada_woocommerce, 'get_catalog_ordering_args' ], 20 ); $args['orderby'] = $ordering_args['orderby']; $args['order'] = $ordering_args['order']; if ( $ordering_args['meta_key'] ) { $args['meta_key'] = $ordering_args['meta_key']; // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_key } if ( '' !== $defaults['offset'] ) { $args['offset'] = $defaults['offset']; } // Pull products by category. if ( 'tag' !== $defaults['pull_by'] ) { if ( '' !== $defaults['cat_slug'] && $defaults['cat_slug'] ) { $cat_id = $defaults['cat_slug']; if ( false !== strpos( $defaults['cat_slug'], ',' ) ) { $cat_id = explode( ',', $defaults['cat_slug'] ); } elseif ( false !== strpos( $defaults['cat_slug'], '|' ) ) { $cat_id = explode( '|', $defaults['cat_slug'] ); } $args['tax_query'] = [ // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_tax_query [ 'taxonomy' => 'product_cat', 'field' => 'slug', 'terms' => $cat_id, ], ]; } if ( '' !== $defaults['exclude_cats'] && $defaults['exclude_cats'] ) { $cat_id = $defaults['exclude_cats']; if ( false !== strpos( $defaults['exclude_cats'], ',' ) ) { $cat_id = explode( ',', $defaults['exclude_cats'] ); } elseif ( false !== strpos( $defaults['exclude_cats'], '|' ) ) { $cat_id = explode( '|', $defaults['exclude_cats'] ); } $args['tax_query'][] = [ 'taxonomy' => 'product_cat', 'field' => 'slug', 'terms' => $cat_id, 'operator' => 'NOT IN', ]; } } else { if ( '' !== $defaults['tag_slug'] && $defaults['tag_slug'] ) { $cat_id = $defaults['tag_slug']; if ( false !== strpos( $defaults['tag_slug'], ',' ) ) { $cat_id = explode( ',', $defaults['tag_slug'] ); } elseif ( false !== strpos( $defaults['tag_slug'], '|' ) ) { $cat_id = explode( '|', $defaults['tag_slug'] ); } $args['tax_query'] = [ // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_tax_query [ 'taxonomy' => 'product_tag', 'field' => 'slug', 'terms' => $cat_id, ], ]; } if ( '' !== $defaults['exclude_tags'] && $defaults['exclude_tags'] ) { $cat_id = $defaults['exclude_tags']; if ( false !== strpos( $defaults['exclude_tags'], ',' ) ) { $cat_id = explode( ',', $defaults['exclude_tags'] ); } elseif ( false !== strpos( $defaults['exclude_tags'], '|' ) ) { $cat_id = explode( '|', $defaults['exclude_tags'] ); } $args['tax_query'][] = [ 'taxonomy' => 'product_tag', 'field' => 'slug', 'terms' => $cat_id, 'operator' => 'NOT IN', ]; } } $args['tax_query']['relation'] = 'AND'; $args['tax_query'][] = [ 'taxonomy' => 'product_visibility', 'field' => 'slug', 'terms' => [ 'exclude-from-catalog', 'exclude-from-search' ], 'operator' => 'NOT IN', ]; // If out of stock are set not to show, hide them. if ( 'yes' === get_option( 'woocommerce_hide_out_of_stock_items', 'no' ) ) { $args['meta_query'][] = [ 'key' => '_stock_status', 'value' => 'outofstock', 'compare' => 'NOT IN', ]; } // Ajax returns protected posts, but we just want published. if ( $live_request ) { $args['post_status'] = 'publish'; } $products = fusion_cached_query( apply_filters( $this->shortcode_name . '_query_args', $args ) ); fusion_library()->woocommerce->remove_post_clauses( $args['orderby'], $args['order'] ); if ( ! $live_request ) { return $products; } if ( ! $products->have_posts() ) { $return_data['placeholder'] = fusion_builder_placeholder( 'product', 'products' ); echo wp_json_encode( $return_data ); wp_die(); } if ( $products->have_posts() ) { $this->args = $defaults; $this->setup_loop( $products ); ob_start(); $this->before_shop_loop(); while ( $products->have_posts() ) { $products->the_post(); do_action( 'woocommerce_shop_loop' ); wc_get_template_part( 'content', 'product' ); } $this->after_shop_loop(); $return_data['loop_product'] = ob_get_clean(); ob_start(); woocommerce_pagination(); $return_data['pagination'] = ob_get_clean(); wc_reset_loop(); } echo wp_json_encode( $return_data ); wp_die(); } /** * Render the shortcode. * * @access public * @since 1.0 * @param array $args Shortcode parameters. * @param string $content Content between shortcode. * @return string HTML output */ public function render( $args, $content = '' ) { $this->defaults = self::get_element_defaults(); $defaults = FusionBuilder::set_shortcode_defaults( $this->defaults, $args, 'fusion_woo_product_grid' ); $html = ''; if ( class_exists( 'Woocommerce' ) ) { $products = $this->query( $defaults ); $this->query = $products; $this->args = $defaults; $product_list = ''; if ( $products->have_posts() ) { $original_post = $GLOBALS['post']; ob_start(); // Setup the loop. $this->setup_loop( $products ); echo '<ul ' . FusionBuilder::attributes( 'woo-product-grid-shortcode-products' ) . '>'; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped $this->before_shop_loop(); while ( $products->have_posts() ) { $products->the_post(); $GLOBALS['post'] = get_post( get_the_ID() ); // phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited setup_postdata( $GLOBALS['post'] ); $this->render_card(); } $this->after_shop_loop(); echo '</ul>'; if ( 'no' !== $this->args['scrolling'] ) { echo '<div ' . FusionBuilder::attributes( 'woo-product-grid-shortcode-pagination' ) . '>'; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped woocommerce_pagination(); echo '</div>'; } wc_reset_loop(); $product_list = ob_get_clean(); $GLOBALS['post'] = $original_post; // phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited } else { $this->element_counter++; return fusion_builder_placeholder( 'product', 'products' ); } wp_reset_query(); // phpcs:ignore WordPress.WP.DiscouragedFunctions wp_reset_postdata(); $html = '<div ' . FusionBuilder::attributes( 'woo-product-grid-shortcode' ) . '>'; $html .= $product_list; // If infinite scroll with "load more" button is used. if ( 'load_more_button' === $this->args['scrolling'] && 1 < $products->max_num_pages ) { $html .= '<button class="fusion-load-more-button fusion-product-button fusion-clearfix">' . apply_filters( 'avada_load_more_products_name', esc_attr__( 'Load More Products', 'fusion-builder' ) ) . '</button>'; } $html .= '</div>'; } $this->element_counter++; $this->on_render(); return apply_filters( 'fusion_element_woo_product_grid_content', $html, $args ); } /** * Render product card. * * @access public * @since 3.3 * @return void */ public function render_card() { do_action( 'woocommerce_shop_loop' ); wc_get_template_part( 'content', 'product' ); } /** * Setup WC Loop. * * @access public * @since 3.2 * @param object $products the products object. * @return void */ public function setup_loop( $products ) { wc_setup_loop( [ 'columns' => $this->args['columns'], 'name' => 'products', 'is_shortcode' => false, 'is_search' => false, 'is_paginated' => true, 'total' => $products->found_posts, 'total_pages' => $products->max_num_pages, 'per_page' => $this->args['number_posts'], 'current_page' => $products->query_vars['paged'], ] ); } /** * Before shop loop. * * @access public * @since 3.2 * @return void */ public function before_shop_loop() { global $avada_woocommerce; if ( class_exists( 'Avada' ) && null !== $avada_woocommerce && 'no' === $this->args['show_thumbnail'] ) { $priority = 'clean' === Avada()->settings->get( 'woocommerce_product_box_design' ) ? 10 : 7; remove_action( 'woocommerce_before_shop_loop_item_title', 'woocommerce_show_product_loop_sale_flash', $priority ); remove_action( 'woocommerce_before_shop_loop_item_title', [ $avada_woocommerce, 'show_product_loop_outofstock_flash' ], 7 ); remove_action( 'woocommerce_before_shop_loop_item_title', [ $avada_woocommerce, 'thumbnail' ], 10 ); } if ( class_exists( 'Avada' ) && null !== $avada_woocommerce && 'no' === $this->args['show_title'] && 'no' === $this->args['show_price'] && 'no' === $this->args['show_rating'] && 'no' === $this->args['show_buttons'] ) { $priority = 'clean' === Avada()->settings->get( 'woocommerce_product_box_design' ) ? 9 : 5; // Avada hooks. remove_action( 'woocommerce_after_shop_loop_item', [ $avada_woocommerce, 'before_shop_item_buttons' ], $priority ); remove_action( 'woocommerce_after_shop_loop_item', [ $avada_woocommerce, 'after_shop_item_buttons' ], 20 ); remove_action( 'woocommerce_after_shop_loop_item', [ $avada_woocommerce, 'template_loop_add_to_cart' ], 10 ); remove_action( 'woocommerce_after_shop_loop_item', [ $avada_woocommerce, 'show_details_button' ], 15 ); remove_action( 'woocommerce_before_shop_loop_item_title', [ $avada_woocommerce, 'add_product_wrappers_open' ], 30 ); remove_action( 'woocommerce_shop_loop_item_title', [ $avada_woocommerce, 'product_title' ], 10 ); remove_action( 'woocommerce_after_shop_loop_item_title', [ $avada_woocommerce, 'add_product_wrappers_close' ], 20 ); // WC hooks. remove_action( 'woocommerce_after_shop_loop_item_title', 'woocommerce_template_loop_price', 10 ); remove_action( 'woocommerce_after_shop_loop_item_title', 'woocommerce_template_loop_rating', 5 ); } if ( '' !== $this->args['grid_separator_style_type'] ) { add_filter( 'avada_grid_separator_style_types', [ $this, 'separator_style_filter' ] ); } } /** * After shop loop. * * @access public * @since 3.2 * @return void */ public function after_shop_loop() { global $avada_woocommerce; if ( class_exists( 'Avada' ) && null !== $avada_woocommerce && 'no' === $this->args['show_thumbnail'] ) { $priority = 'clean' === Avada()->settings->get( 'woocommerce_product_box_design' ) ? 10 : 7; add_action( 'woocommerce_before_shop_loop_item_title', 'woocommerce_show_product_loop_sale_flash', $priority ); add_action( 'woocommerce_before_shop_loop_item_title', [ $avada_woocommerce, 'show_product_loop_outofstock_flash' ], 7 ); add_action( 'woocommerce_before_shop_loop_item_title', [ $avada_woocommerce, 'thumbnail' ], 10 ); } if ( class_exists( 'Avada' ) && null !== $avada_woocommerce && 'no' === $this->args['show_title'] && 'no' === $this->args['show_price'] && 'no' === $this->args['show_rating'] && 'no' === $this->args['show_buttons'] ) { $priority = 'clean' === Avada()->settings->get( 'woocommerce_product_box_design' ) ? 9 : 5; // Avada hooks. add_action( 'woocommerce_after_shop_loop_item', [ $avada_woocommerce, 'before_shop_item_buttons' ], $priority ); add_action( 'woocommerce_after_shop_loop_item', [ $avada_woocommerce, 'after_shop_item_buttons' ], 20 ); add_action( 'woocommerce_after_shop_loop_item', [ $avada_woocommerce, 'template_loop_add_to_cart' ], 10 ); add_action( 'woocommerce_after_shop_loop_item', [ $avada_woocommerce, 'show_details_button' ], 15 ); add_action( 'woocommerce_before_shop_loop_item_title', [ $avada_woocommerce, 'add_product_wrappers_open' ], 30 ); add_action( 'woocommerce_shop_loop_item_title', [ $avada_woocommerce, 'product_title' ], 10 ); add_action( 'woocommerce_after_shop_loop_item_title', [ $avada_woocommerce, 'add_product_wrappers_close' ], 20 ); // WC hooks. add_action( 'woocommerce_after_shop_loop_item_title', 'woocommerce_template_loop_price', 10 ); add_action( 'woocommerce_after_shop_loop_item_title', 'woocommerce_template_loop_rating', 5 ); } if ( '' !== $this->args['grid_separator_style_type'] ) { remove_filter( 'avada_grid_separator_style_types', [ $this, 'separator_style_filter' ] ); } } /** * Builds the attributes array. * * @access public * @since 1.0 * @return array */ public function attr() { $attr = fusion_builder_visibility_atts( $this->args['hide_on_mobile'], [ 'class' => 'fusion-woo-product-grid fusion-product-archive fusion-woo-product-grid-' . $this->element_counter, 'style' => '', ] ); if ( $this->args['animation_type'] ) { $attr = Fusion_Builder_Animation_Helper::add_animation_attributes( $this->args, $attr ); } if ( $this->is_spacing_off() ) { $attr['class'] .= ' fusion-woo-product-grid-spacing-off'; } if ( ! $this->is_default( 'grid_separator_color' ) && 'shadow' === $this->args['grid_separator_style_type'] ) { $attr['class'] .= ' has-content-sep-shadow'; } if ( ! $this->is_default( 'show_title' ) ) { $attr['class'] .= ' hide-product-title'; } if ( ! $this->is_default( 'show_price' ) ) { $attr['class'] .= ' hide-price'; } if ( ! $this->is_default( 'show_rating' ) ) { $attr['class'] .= ' hide-rating'; } if ( ! $this->is_default( 'show_buttons' ) ) { $attr['class'] .= ' hide-buttons'; } if ( ! $this->is_default( 'show_title' ) && ! $this->is_default( 'show_price' ) && ! $this->is_default( 'show_rating' ) && ! $this->is_default( 'show_buttons' ) ) { $attr['class'] .= ' hide-content'; } if ( $this->is_load_more() ) { $attr['class'] .= ' has-load-more'; } if ( ! $this->is_default( 'column_spacing' ) && '1' !== $this->args['columns'] ) { $attr['class'] .= ' has-column-spacing'; } $attr['style'] .= $this->get_style_variables(); if ( $this->args['class'] ) { $attr['class'] .= ' ' . $this->args['class']; } if ( $this->args['id'] ) { $attr['id'] = $this->args['id']; } return $attr; } /** * Builds the attributes array. * * @access public * @since 3.2 * @return array */ public function attr_pagination() { $attr = [ 'class' => 'fusion-woo-product-grid-pagination fusion-clearfix', ]; if ( $this->is_load_more() ) { $attr['class'] .= ' infinite-scroll infinite-scroll-hide'; } return $attr; } /** * Builds the attributes array. * * @access public * @since 3.2 * @return array */ public function attr_products() { $attr = [ 'class' => 'products products-' . $this->args['columns'], ]; if ( $this->is_load_more() ) { $attr['class'] .= ' fusion-products-container-infinite'; $attr['data-pages'] = $this->query->max_num_pages; } if ( 'load_more_button' === $this->args['scrolling'] ) { $attr['class'] .= ' fusion-products-container-load-more'; } return $attr; } /** * Sets the necessary scripts. * * @access public * @since 3.2 * @return void */ public function on_first_render() { // Skip if empty. if ( null === $this->args || empty( $this->args ) ) { return; } Fusion_Dynamic_JS::enqueue_script( 'fusion-js-' . $this->shortcode_name, FusionBuilder::$js_folder_url . '/general/fusion-product-grid.js', FusionBuilder::$js_folder_path . '/general/fusion-product-grid.js', [ 'jquery', 'isotope', 'jquery-infinite-scroll' ], FUSION_BUILDER_VERSION, true ); Fusion_Dynamic_JS::localize_script( 'fusion-js-' . $this->shortcode_name, 'fusionProductGridVars', [ 'infinite_blog_text' => '<em>' . __( 'Loading the next set of products...', 'fusion-builder' ) . '</em>', 'infinite_finished_msg' => '<em>' . __( 'All items displayed.', 'fusion-builder' ) . '</em>', 'pagination_type' => $this->args['scrolling'], ] ); } /** * Load base CSS. * * @access public * @since 3.0 * @return void */ public function add_css_files() { // Needs styling for product rollover. if ( class_exists( 'Avada' ) && class_exists( 'WooCommerce' ) ) { Fusion_Dynamic_CSS::enqueue_style( Avada::$template_dir_path . '/assets/css/dynamic/woocommerce/woo-products.min.css', Avada::$template_dir_url . '/assets/css/dynamic/woocommerce/woo-products.min.css' ); } FusionBuilder()->add_element_css( FUSION_BUILDER_PLUGIN_DIR . 'assets/css/shortcodes/woo-product-grid.min.css' ); } /** * Check if pagination is loadmore. * * @access public * @since 3.2 * @return boolean */ public function is_load_more() { return in_array( $this->args['scrolling'], [ 'infinite', 'load_more_button' ], true ); } /** * Check if spacing should be off. * * @access public * @since 3.3 * @return boolean */ public function is_spacing_off() { return ! $this->is_default( 'show_price' ) && ! $this->is_default( 'show_rating' ); } /** * Remove buttons action. * * @access public * @since 3.2 * @return void */ public function remove_action_buttons() { global $avada_woocommerce; if ( class_exists( 'Avada' ) && null !== $avada_woocommerce ) { $priority = 'clean' === Avada()->settings->get( 'woocommerce_product_box_design' ) ? 9 : 5; remove_action( 'woocommerce_after_shop_loop_item', [ $avada_woocommerce, 'before_shop_item_buttons' ], $priority ); remove_action( 'woocommerce_after_shop_loop_item', [ $avada_woocommerce, 'after_shop_item_buttons' ], 20 ); } } /** * Add buttons action. * * @access public * @since 3.2 * @return void */ public function add_action_buttons() { global $avada_woocommerce; if ( class_exists( 'Avada' ) && null !== $avada_woocommerce ) { $priority = 'clean' === Avada()->settings->get( 'woocommerce_product_box_design' ) ? 9 : 5; add_action( 'woocommerce_after_shop_loop_item', [ $avada_woocommerce, 'before_shop_item_buttons' ], $priority ); add_action( 'woocommerce_after_shop_loop_item', [ $avada_woocommerce, 'after_shop_item_buttons' ], 20 ); } } /** * Separators style filter. * * @access public * @since 3.2 * @param string $separators Separator styles. * @return string */ public function separator_style_filter( $separators ) { return $this->args['grid_separator_style_type']; } /** * Get the style variables. * * @access protected * @since 3.9 * @return string */ protected function get_style_variables() { $custom_vars = []; if ( ! $this->is_default( 'grid_separator_color' ) && 'shadow' === $this->args['grid_separator_style_type'] ) { $colors = Fusion_Color::new_color( $this->args['grid_separator_color'] ); $gradient = sprintf( 'linear-gradient(to left, rgba(%1$d, %2$d, %3$d, 0) 0%%, rgba(%1$d, %2$d, %3$d, 0) 15%%, rgba(%1$d, %2$d, %3$d, 0.65) 50%%, rgba(%1$d, %2$d, %3$d, 0) 85%%, rgba(%1$d, %2$d, %3$d, 0) 100%%)', $colors->red, $colors->green, $colors->blue ); $gradient_after = sprintf( 'radial-gradient(ellipse at 50%% -50%%, rgba(%1$d, %2$d, %3$d, 0.5) 0, rgba(255, 255, 255, 0) 65%%)', $colors->red, $colors->green, $colors->blue ); $custom_vars['gradient'] = $gradient; $custom_vars['gradient_after'] = $gradient_after; } if ( ! $this->is_default( 'column_spacing' ) && '1' !== $this->args['columns'] ) { $column_spacing = fusion_library()->sanitize->get_value_with_unit( $this->args['column_spacing'] ); $custom_vars['column_spacing_margin'] = sprintf( 'calc((%s)/ -2)', $column_spacing ); $custom_vars['column_spacing_padding'] = sprintf( 'calc((%s)/ 2)', $column_spacing ); } $css_vars_options = [ 'margin_top' => [ 'callback' => [ 'Fusion_Sanitize', 'get_value_with_unit' ] ], 'margin_right' => [ 'callback' => [ 'Fusion_Sanitize', 'get_value_with_unit' ] ], 'margin_bottom' => [ 'callback' => [ 'Fusion_Sanitize', 'get_value_with_unit' ] ], 'margin_left' => [ 'callback' => [ 'Fusion_Sanitize', 'get_value_with_unit' ] ], 'grid_box_color' => [ 'callback' => [ 'Fusion_Sanitize', 'color' ] ], 'grid_border_color' => [ 'callback' => [ 'Fusion_Sanitize', 'color' ] ], 'grid_separator_color' => [ 'callback' => [ 'Fusion_Sanitize', 'color' ] ], ]; $styles = $this->get_css_vars_for_options( $css_vars_options ) . $this->get_custom_css_vars( $custom_vars ); return $styles; } /** * Apply post per page on shop page. * * @access public * @since 3.3 * @param object $query The WP_Query object. * @return void */ public function alter_shop_loop( $query ) { if ( ! is_admin() && $query->is_main_query() && ! $query->is_search && $query->is_post_type_archive( 'product' ) && 'no' === fusion_get_option( 'show_wc_shop_loop' ) ) { $search_override = get_post( wc_get_page_id( 'shop' ) ); $has_archives_component = $search_override && has_shortcode( $search_override->post_content, 'fusion_woo_product_grid' ); if ( $has_archives_component ) { $pattern = get_shortcode_regex( [ 'fusion_woo_product_grid' ] ); $content = $search_override->post_content; if ( preg_match_all( '/' . $pattern . '/s', $search_override->post_content, $matches ) && array_key_exists( 2, $matches ) && in_array( 'fusion_woo_product_grid', $matches[2], true ) ) { $search_atts = shortcode_parse_atts( $matches[3][0] ); $number_posts = ( isset( $_GET['product_count'] ) ) ? (int) $_GET['product_count'] : $search_atts['number_posts']; // phpcs:ignore WordPress.Security.NonceVerification $query->set( 'paged', ( get_query_var( 'paged' ) ) ? get_query_var( 'paged' ) : 1 ); if ( '0' !== $number_posts ) { $query->set( 'posts_per_page', $number_posts ); } } } } } } } new FusionSC_WooProductGrid(); } /** * Map shortcode to Avada Builder. */ function fusion_element_woo_product_grid() { if ( class_exists( 'WooCommerce' ) ) { $fusion_settings = awb_get_fusion_settings(); $builder_status = function_exists( 'is_fusion_editor' ) && is_fusion_editor(); $default_orderby = apply_filters( 'woocommerce_default_catalog_orderby', get_option( 'woocommerce_default_catalog_orderby', 'menu_order' ) ); $default_order = 'menu_order' === $default_orderby ? 'ASC' : 'DESC'; $lookup_table_link = admin_url( 'admin.php?page=wc-status&tab=tools' ); $product_cat = $builder_status ? fusion_builder_shortcodes_categories( 'product_cat', false, false, 26 ) : []; $product_tags = $builder_status ? fusion_builder_shortcodes_tags( 'product_tag', false, false, 26 ) : []; $include_cat = [ 'type' => 'multiple_select', 'heading' => esc_attr__( 'Categories', 'fusion-builder' ), 'placeholder' => esc_attr__( 'Categories', 'fusion-builder' ), 'description' => esc_attr__( 'Select a category or leave blank for all.', 'fusion-builder' ), 'param_name' => 'cat_slug', 'value' => $product_cat, 'default' => '', 'dependency' => [ [ 'element' => 'pull_by', 'value' => 'tag', 'operator' => '!=', ], ], 'callback' => [ 'function' => 'fusion_ajax', 'action' => 'get_fusion_woo_product_grid', 'ajax' => true, ], ]; $exclude_cat = [ 'type' => 'multiple_select', 'heading' => esc_attr__( 'Exclude Categories', 'fusion-builder' ), 'placeholder' => esc_attr__( 'Exclude Categories', 'fusion-builder' ), 'description' => esc_attr__( 'Select categories to exclude.', 'fusion-builder' ), 'param_name' => 'exclude_cats', 'value' => $product_cat, 'default' => '', 'dependency' => [ [ 'element' => 'pull_by', 'value' => 'tag', 'operator' => '!=', ], ], 'callback' => [ 'function' => 'fusion_ajax', 'action' => 'get_fusion_woo_product_grid', 'ajax' => true, ], ]; $include_tags = [ 'type' => 'multiple_select', 'heading' => esc_attr__( 'Tags', 'fusion-builder' ), 'placeholder' => esc_attr__( 'Tags', 'fusion-builder' ), 'description' => esc_attr__( 'Select a tag or leave blank for all.', 'fusion-builder' ), 'param_name' => 'tag_slug', 'value' => $product_tags, 'default' => '', 'dependency' => [ [ 'element' => 'pull_by', 'value' => 'category', 'operator' => '!=', ], ], 'callback' => [ 'function' => 'fusion_ajax', 'action' => 'get_fusion_woo_product_grid', 'ajax' => true, ], ]; $exclude_tags = [ 'type' => 'multiple_select', 'heading' => esc_attr__( 'Exclude Tags', 'fusion-builder' ), 'placeholder' => esc_attr__( 'Tags', 'fusion-builder' ), 'description' => esc_attr__( 'Select a tag to exclude.', 'fusion-builder' ), 'param_name' => 'exclude_tags', 'value' => $product_tags, 'default' => '', 'dependency' => [ [ 'element' => 'pull_by', 'value' => 'category', 'operator' => '!=', ], ], 'callback' => [ 'function' => 'fusion_ajax', 'action' => 'get_fusion_woo_product_grid', 'ajax' => true, ], ]; if ( count( $product_cat ) > 25 ) { $include_cat['type'] = 'ajax_select'; $include_cat['ajax'] = 'fusion_search_query'; $include_cat['value'] = []; $include_cat['ajax_params'] = [ 'taxonomy' => 'product_cat', 'use_slugs' => true, ]; $exclude_cat['type'] = 'ajax_select'; $exclude_cat['ajax'] = 'fusion_search_query'; $exclude_cat['value'] = []; $exclude_cat['ajax_params'] = [ 'taxonomy' => 'product_cat', 'use_slugs' => true, ]; } if ( count( $product_tags ) > 25 ) { $include_tags['type'] = 'ajax_select'; $include_tags['ajax'] = 'fusion_search_query'; $include_tags['value'] = []; $include_tags['ajax_params'] = [ 'taxonomy' => 'product_tag', 'use_slugs' => true, ]; $exclude_tags['type'] = 'ajax_select'; $exclude_tags['ajax'] = 'fusion_search_query'; $exclude_tags['value'] = []; $exclude_tags['ajax_params'] = [ 'taxonomy' => 'product_tag', 'use_slugs' => true, ]; } fusion_builder_map( fusion_builder_frontend_data( 'FusionSC_WooProductGrid', [ 'name' => esc_attr__( 'Woo Product Grid', 'fusion-builder' ), 'shortcode' => 'fusion_woo_product_grid', 'icon' => 'fusiona-product-grid-and-archives', 'help_url' => 'https://avada.com/documentation/woocommerce-product-carousel-element/', 'params' => [ [ 'type' => 'radio_button_set', 'heading' => esc_attr__( 'Pull Products By', 'fusion-builder' ), 'description' => esc_attr__( 'Choose to show products by category or tag.', 'fusion-builder' ), 'param_name' => 'pull_by', 'default' => 'category', 'value' => [ 'category' => esc_attr__( 'Category', 'fusion-builder' ), 'tag' => esc_attr__( 'Tag', 'fusion-builder' ), ], 'callback' => [ 'function' => 'fusion_ajax', 'action' => 'get_fusion_woo_product_grid', 'ajax' => true, ], ], $include_cat, $exclude_cat, $include_tags, $exclude_tags, [ 'type' => 'range', 'heading' => esc_attr__( 'Number of Products', 'fusion-builder' ), 'description' => esc_attr__( 'Select the number of products to display.', 'fusion-builder' ), 'param_name' => 'number_posts', 'min' => '0', 'max' => '50', 'step' => '1', 'value' => '', 'default' => $fusion_settings->get( 'woo_items' ), 'callback' => [ 'function' => 'fusion_ajax', 'action' => 'get_fusion_woo_product_grid', 'ajax' => true, ], ], [ 'type' => 'range', 'heading' => esc_attr__( 'Product Offset', 'fusion-builder' ), 'description' => esc_attr__( 'The number of products to skip. ex: 1.', 'fusion-builder' ), 'param_name' => 'offset', 'value' => '0', 'min' => '0', 'max' => '24', 'step' => '1', 'callback' => [ 'function' => 'fusion_ajax', 'action' => 'get_fusion_woo_product_grid', 'ajax' => true, ], ], [ 'type' => 'range', 'heading' => esc_attr__( 'Number of Columns', 'fusion-builder' ), 'description' => esc_attr__( 'Set the number of columns per row.', 'fusion-builder' ), 'param_name' => 'columns', 'value' => '', 'default' => $fusion_settings->get( 'woocommerce_shop_page_columns' ), 'min' => '1', 'max' => '6', 'step' => '1', ], [ 'type' => 'range', 'heading' => esc_attr__( 'Column Spacing', 'fusion-builder' ), 'description' => esc_attr__( "Insert the amount of spacing between items without 'px'. ex: 40.", 'fusion-builder' ), 'param_name' => 'column_spacing', 'value' => '', 'default' => $fusion_settings->get( 'woocommerce_archive_grid_column_spacing' ), 'min' => '1', 'max' => '300', 'step' => '1', 'dependency' => [ [ 'element' => 'columns', 'value' => '1', 'operator' => '!=', ], ], ], [ 'type' => 'select', 'heading' => esc_attr__( 'Order By', 'fusion-builder' ), /* translators: Lookup table link. */ 'description' => sprintf( __( 'Defines how products should be ordered. NOTE: If Order by Price is not working, please regenerate the Product Lookup Tables <a href="%s" target="_blank">here</a>.', 'fusion-builder' ), $lookup_table_link ), 'param_name' => 'orderby', 'default' => $default_orderby, 'value' => [ 'menu_order' => esc_attr__( 'Default sorting', 'fusion-builder' ), 'date' => esc_attr__( 'Date', 'fusion-builder' ), 'title' => esc_attr__( 'Title', 'fusion-builder' ), 'rand' => esc_attr__( 'Random', 'fusion-builder' ), 'id' => esc_attr__( 'ID', 'fusion-builder' ), 'price' => esc_attr__( 'Price', 'fusion-builder' ), 'popularity' => esc_attr__( 'Popularity (sales)', 'fusion-builder' ), 'rating' => esc_attr__( 'Average Rating', 'fusion-builder' ), ], 'callback' => [ 'function' => 'fusion_ajax', 'action' => 'get_fusion_woo_product_grid', 'ajax' => true, ], ], [ 'type' => 'radio_button_set', 'heading' => esc_attr__( 'Order', 'fusion-builder' ), 'description' => esc_attr__( 'Defines the sorting order of products.', 'fusion-builder' ), 'param_name' => 'order', 'default' => $default_order, 'value' => [ 'DESC' => esc_attr__( 'Descending', 'fusion-builder' ), 'ASC' => esc_attr__( 'Ascending', 'fusion-builder' ), ], 'dependency' => [ [ 'element' => 'orderby', 'value' => 'rand', 'operator' => '!=', ], ], 'callback' => [ 'function' => 'fusion_ajax', 'action' => 'get_fusion_woo_product_grid', 'ajax' => true, ], ], [ 'type' => 'radio_button_set', 'heading' => esc_attr__( 'Show Thumbnail', 'fusion-builder' ), 'description' => esc_attr__( 'Display the product featured image.', 'fusion-builder' ), 'param_name' => 'show_thumbnail', 'default' => 'yes', 'value' => [ 'yes' => esc_attr__( 'Yes', 'fusion-builder' ), 'no' => esc_attr__( 'No', 'fusion-builder' ), ], 'group' => esc_html__( 'Design', 'fusion-builder' ), 'callback' => [ 'function' => 'fusion_ajax', 'action' => 'get_fusion_woo_product_grid', 'ajax' => true, ], ], [ 'type' => 'radio_button_set', 'heading' => esc_attr__( 'Show Title', 'fusion-builder' ), 'description' => esc_attr__( 'Display the product title below the featured image.', 'fusion-builder' ), 'param_name' => 'show_title', 'default' => 'yes', 'value' => [ 'yes' => esc_attr__( 'Yes', 'fusion-builder' ), 'no' => esc_attr__( 'No', 'fusion-builder' ), ], 'group' => esc_html__( 'Design', 'fusion-builder' ), 'callback' => [ 'function' => 'fusion_ajax', 'action' => 'get_fusion_woo_product_grid', 'ajax' => true, ], ], [ 'type' => 'radio_button_set', 'heading' => esc_attr__( 'Show Price', 'fusion-builder' ), 'description' => esc_attr__( 'Choose to show or hide the price.', 'fusion-builder' ), 'param_name' => 'show_price', 'value' => [ 'yes' => esc_attr__( 'Yes', 'fusion-builder' ), 'no' => esc_attr__( 'No', 'fusion-builder' ), ], 'default' => 'yes', 'group' => esc_html__( 'Design', 'fusion-builder' ), 'callback' => [ 'function' => 'fusion_ajax', 'action' => 'get_fusion_woo_product_grid', 'ajax' => true, ], ], [ 'type' => 'radio_button_set', 'heading' => esc_attr__( 'Show Rating', 'fusion-builder' ), 'description' => esc_attr__( 'Choose to show or hide the rating.', 'fusion-builder' ), 'param_name' => 'show_rating', 'value' => [ 'yes' => esc_attr__( 'Yes', 'fusion-builder' ), 'no' => esc_attr__( 'No', 'fusion-builder' ), ], 'default' => 'yes', 'group' => esc_html__( 'Design', 'fusion-builder' ), 'callback' => [ 'function' => 'fusion_ajax', 'action' => 'get_fusion_woo_product_grid', 'ajax' => true, ], ], [ 'type' => 'radio_button_set', 'heading' => esc_attr__( 'Show Buttons', 'fusion-builder' ), 'description' => esc_attr__( 'Choose to show or hide Add to Cart / Details buttons.', 'fusion-builder' ), 'param_name' => 'show_buttons', 'value' => [ 'yes' => esc_attr__( 'Yes', 'fusion-builder' ), 'no' => esc_attr__( 'No', 'fusion-builder' ), ], 'default' => 'yes', 'group' => esc_html__( 'Design', 'fusion-builder' ), 'callback' => [ 'function' => 'fusion_ajax', 'action' => 'get_fusion_woo_product_grid', 'ajax' => true, ], ], [ 'type' => 'radio_button_set', 'heading' => esc_attr__( 'Pagination Type', 'fusion-builder' ), 'description' => esc_attr__( 'Choose the type of pagination.', 'fusion-builder' ), 'param_name' => 'scrolling', 'default' => 'pagination', 'value' => [ 'no' => esc_attr__( 'No Pagination', 'fusion-builder' ), 'pagination' => esc_attr__( 'Pagination', 'fusion-builder' ), 'infinite' => esc_attr__( 'Infinite Scrolling', 'fusion-builder' ), 'load_more_button' => esc_attr__( 'Load More Button', 'fusion-builder' ), ], ], [ 'type' => 'colorpickeralpha', 'heading' => esc_attr__( 'Grid Box Color', 'fusion-builder' ), 'description' => esc_attr__( 'Controls the background color for the grid boxes.', 'fusion-builder' ), 'param_name' => 'grid_box_color', 'value' => '', 'default' => $fusion_settings->get( 'timeline_bg_color' ), 'group' => esc_html__( 'Design', 'fusion-builder' ), ], [ 'type' => 'colorpickeralpha', 'heading' => esc_attr__( 'Grid Border Color', 'fusion-builder' ), 'description' => esc_attr__( 'Controls the color of borders for the grid boxes.', 'fusion-builder' ), 'param_name' => 'grid_border_color', 'value' => '', 'default' => $fusion_settings->get( 'timeline_color' ), 'group' => esc_html__( 'Design', 'fusion-builder' ), ], [ 'type' => 'select', 'heading' => esc_attr__( 'Grid Separator Style', 'fusion-builder' ), 'description' => __( 'Controls the line style of grid separators. <strong>NOTE:</strong> Separators will display, when buttons below the separators is displayed and Box Design mode set to Classic.', 'fusion-builder' ), 'param_name' => 'grid_separator_style_type', 'value' => [ '' => esc_attr__( 'Default', 'fusion-builder' ), 'none' => esc_attr__( 'No Style', 'fusion-builder' ), 'single|solid' => esc_attr__( 'Single Border Solid', 'fusion-builder' ), 'double|solid' => esc_attr__( 'Double Border Solid', 'fusion-builder' ), 'single|dashed' => esc_attr__( 'Single Border Dashed', 'fusion-builder' ), 'double|dashed' => esc_attr__( 'Double Border Dashed', 'fusion-builder' ), 'single|dotted' => esc_attr__( 'Single Border Dotted', 'fusion-builder' ), 'double|dotted' => esc_attr__( 'Double Border Dotted', 'fusion-builder' ), 'shadow' => esc_attr__( 'Shadow', 'fusion-builder' ), ], 'default' => $fusion_settings->get( 'grid_separator_style_type' ), 'group' => esc_html__( 'Design', 'fusion-builder' ), 'dependency' => [ [ 'element' => 'show_buttons', 'value' => 'no', 'operator' => '!=', ], ], 'callback' => [ 'function' => 'fusion_ajax', 'action' => 'get_fusion_woo_product_grid', 'ajax' => true, ], ], [ 'type' => 'colorpickeralpha', 'heading' => esc_attr__( 'Grid Separator Color', 'fusion-builder' ), 'description' => __( 'Controls the line style color of grid separators. <strong>NOTE:</strong> Only work when Box Design mode set to Classic.', 'fusion-builder' ), 'param_name' => 'grid_separator_color', 'value' => '', 'default' => $fusion_settings->get( 'grid_separator_color' ), 'group' => esc_html__( 'Design', 'fusion-builder' ), 'dependency' => [ [ 'element' => 'show_buttons', 'value' => 'no', 'operator' => '!=', ], ], ], [ 'type' => 'dimension', 'remove_from_atts' => true, 'heading' => esc_attr__( 'Margin', 'fusion-builder' ), 'description' => esc_attr__( 'In pixels or percentage, ex: 10px or 10%.', 'fusion-builder' ), 'param_name' => 'margin', 'value' => [ 'margin_top' => '', 'margin_right' => '', 'margin_bottom' => '', 'margin_left' => '', ], 'group' => esc_attr__( 'Design', 'fusion-builder' ), ], [ 'type' => 'checkbox_button_set', 'heading' => esc_attr__( 'Element Visibility', 'fusion-builder' ), 'param_name' => 'hide_on_mobile', 'value' => fusion_builder_visibility_options( 'full' ), 'default' => fusion_builder_default_visibility( 'array' ), 'description' => esc_attr__( 'Choose to show or hide the element on small, medium or large screens. You can choose more than one at a time.', 'fusion-builder' ), ], [ 'type' => 'textfield', 'heading' => esc_attr__( 'CSS Class', 'fusion-builder' ), 'description' => esc_attr__( 'Add a class to the wrapping HTML element.', 'fusion-builder' ), 'param_name' => 'class', 'value' => '', ], [ 'type' => 'textfield', 'heading' => esc_attr__( 'CSS ID', 'fusion-builder' ), 'description' => esc_attr__( 'Add an ID to the wrapping HTML element.', 'fusion-builder' ), 'param_name' => 'id', 'value' => '', ], 'fusion_animation_placeholder' => [ 'preview_selector' => '.fusion-woo-product-grid', ], ], 'callback' => [ 'function' => 'fusion_ajax', 'action' => 'get_fusion_woo_product_grid', 'ajax' => true, ], ] ) ); } } add_action( 'fusion_builder_wp_loaded', 'fusion_element_woo_product_grid' );
Cokiee Shell Web 1.0, Coded By Razor
Neueste Kommentare