WC_Widget_Product_Categories::widget()publicWC 1.0

Output widget.

Method of the class: WC_Widget_Product_Categories{}

Return

null. Nothing (null).

Usage

$WC_Widget_Product_Categories = new WC_Widget_Product_Categories();
$WC_Widget_Product_Categories->widget( $args, $instance );
$args(array) (required)
Widget arguments.
$instance(array) (required)
Widget instance.

Notes

WC_Widget_Product_Categories::widget() code WC 9.4.2

public function widget( $args, $instance ) {
	global $wp_query, $post;

	$count              = isset( $instance['count'] ) ? $instance['count'] : $this->settings['count']['std'];
	$hierarchical       = isset( $instance['hierarchical'] ) ? $instance['hierarchical'] : $this->settings['hierarchical']['std'];
	$show_children_only = isset( $instance['show_children_only'] ) ? $instance['show_children_only'] : $this->settings['show_children_only']['std'];
	$dropdown           = isset( $instance['dropdown'] ) ? $instance['dropdown'] : $this->settings['dropdown']['std'];
	$orderby            = isset( $instance['orderby'] ) ? $instance['orderby'] : $this->settings['orderby']['std'];
	$hide_empty         = isset( $instance['hide_empty'] ) ? $instance['hide_empty'] : $this->settings['hide_empty']['std'];
	$dropdown_args      = array(
		'hide_empty' => $hide_empty,
	);
	$list_args          = array(
		'show_count'   => $count,
		'hierarchical' => $hierarchical,
		'taxonomy'     => 'product_cat',
		'hide_empty'   => $hide_empty,
	);
	$max_depth          = absint( isset( $instance['max_depth'] ) ? $instance['max_depth'] : $this->settings['max_depth']['std'] );

	$list_args['menu_order'] = false;
	$dropdown_args['depth']  = $max_depth;
	$list_args['depth']      = $max_depth;

	if ( 'order' === $orderby ) {
		$list_args['orderby']      = 'meta_value_num';
		$dropdown_args['orderby']  = 'meta_value_num';
		$list_args['meta_key']     = 'order';
		$dropdown_args['meta_key'] = 'order';
	}

	$this->current_cat   = false;
	$this->cat_ancestors = array();

	if ( is_tax( 'product_cat' ) ) {
		$this->current_cat   = $wp_query->queried_object;
		$this->cat_ancestors = get_ancestors( $this->current_cat->term_id, 'product_cat' );

	} elseif ( is_singular( 'product' ) ) {
		$terms = wc_get_product_terms(
			$post->ID,
			'product_cat',
			apply_filters(
				'woocommerce_product_categories_widget_product_terms_args',
				array(
					'orderby' => 'parent',
					'order'   => 'DESC',
				)
			)
		);

		if ( $terms ) {
			$main_term           = apply_filters( 'woocommerce_product_categories_widget_main_term', $terms[0], $terms );
			$this->current_cat   = $main_term;
			$this->cat_ancestors = get_ancestors( $main_term->term_id, 'product_cat' );
		}
	}

	// Show Siblings and Children Only.
	if ( $show_children_only && $this->current_cat ) {
		if ( $hierarchical ) {
			$include = array_merge(
				$this->cat_ancestors,
				array( $this->current_cat->term_id ),
				get_terms(
					'product_cat',
					array(
						'fields'       => 'ids',
						'parent'       => 0,
						'hierarchical' => true,
						'hide_empty'   => false,
					)
				),
				get_terms(
					'product_cat',
					array(
						'fields'       => 'ids',
						'parent'       => $this->current_cat->term_id,
						'hierarchical' => true,
						'hide_empty'   => false,
					)
				)
			);
			// Gather siblings of ancestors.
			if ( $this->cat_ancestors ) {
				foreach ( $this->cat_ancestors as $ancestor ) {
					$include = array_merge(
						$include,
						get_terms(
							'product_cat',
							array(
								'fields'       => 'ids',
								'parent'       => $ancestor,
								'hierarchical' => false,
								'hide_empty'   => false,
							)
						)
					);
				}
			}
		} else {
			// Direct children.
			$include = get_terms(
				'product_cat',
				array(
					'fields'       => 'ids',
					'parent'       => $this->current_cat->term_id,
					'hierarchical' => true,
					'hide_empty'   => false,
				)
			);
		}

		$list_args['include']     = implode( ',', $include );
		$dropdown_args['include'] = $list_args['include'];

		if ( empty( $include ) ) {
			return;
		}
	} elseif ( $show_children_only ) {
		$dropdown_args['depth']        = 1;
		$dropdown_args['child_of']     = 0;
		$dropdown_args['hierarchical'] = 1;
		$list_args['depth']            = 1;
		$list_args['child_of']         = 0;
		$list_args['hierarchical']     = 1;
	}

	$this->widget_start( $args, $instance );

	if ( $dropdown ) {
		wc_product_dropdown_categories(
			apply_filters(
				'woocommerce_product_categories_widget_dropdown_args',
				wp_parse_args(
					$dropdown_args,
					array(
						'show_count'         => $count,
						'hierarchical'       => $hierarchical,
						'show_uncategorized' => 0,
						'selected'           => $this->current_cat ? $this->current_cat->slug : '',
					)
				)
			)
		);

		wp_enqueue_script( 'selectWoo' );
		wp_enqueue_style( 'select2' );

		wc_enqueue_js(
			"
			jQuery( '.dropdown_product_cat' ).on( 'change', function() {
				if ( jQuery(this).val() != '' ) {
					var this_page = '';
					var home_url  = '" . esc_js( home_url( '/' ) ) . "';
					if ( home_url.indexOf( '?' ) > 0 ) {
						this_page = home_url + '&product_cat=' + jQuery(this).val();
					} else {
						this_page = home_url + '?product_cat=' + jQuery(this).val();
					}
					location.href = this_page;
				} else {
					location.href = '" . esc_js( wc_get_page_permalink( 'shop' ) ) . "';
				}
			});

			if ( jQuery().selectWoo ) {
				var wc_product_cat_select = function() {
					jQuery( '.dropdown_product_cat' ).selectWoo( {
						placeholder: '" . esc_js( __( 'Select a category', 'woocommerce' ) ) . "',
						minimumResultsForSearch: 5,
						width: '100%',
						allowClear: true,
						language: {
							noResults: function() {
								return '" . esc_js( _x( 'No matches found', 'enhanced select', 'woocommerce' ) ) . "';
							}
						}
					} );
				};
				wc_product_cat_select();
			}
		"
		);
	} else {
		include_once WC()->plugin_path() . '/includes/walkers/class-wc-product-cat-list-walker.php';

		$list_args['walker']                     = new WC_Product_Cat_List_Walker();
		$list_args['title_li']                   = '';
		$list_args['pad_counts']                 = 1;
		$list_args['show_option_none']           = __( 'No product categories exist.', 'woocommerce' );
		$list_args['current_category']           = ( $this->current_cat ) ? $this->current_cat->term_id : '';
		$list_args['current_category_ancestors'] = $this->cat_ancestors;
		$list_args['max_depth']                  = $max_depth;

		echo '<ul class="product-categories">';

		wp_list_categories( apply_filters( 'woocommerce_product_categories_widget_args', $list_args ) );

		echo '</ul>';
	}

	$this->widget_end( $args );
}