Ako pridať vlastné štítky produktov v téme Woodmart

Téma Woodmart ponúka svojím používateľom množstvo užitočných funkcií, vrátane vlastných produktových štítkov (custom product labels). Tie sú v téme vyriešené pomerne jednoducho pomocou vlastností produktov, ktorým je možné nastaviť, či a v akej forme sa majú zobraziť medzi štítkami produktov. Viac o používaní produktových štítkov v téme Woodmart sa dočítate v dokumentácií na tomto odkaze

Postup je teda jednoduchý, stačí si v administrácií vlastností produktov vytvoriť novú vlastnosť, napr.  Štítok a v časti Extra povoliť možnosť  “Show attribute label on products”

Povolenie možnosti zobraziť vlastnosť medzi štítkami produktu.

Medzi hodnoty vlastnosti Štítok si môžeme pridať napr. Black Friday, Vyrobené na Slovensku, Použité a pod. Ďalej je potrebné už len priradiť túto vlastnosť produktom, ktorých sa týka. To je možné spraviť jednoducho cez editáciu produktu v časti Vlastnosti. Priradená vlastnosť sa tak zobrazí aj medzi štítkami produktu v zozname produktov ako aj v detaile produktu.  

Zobrazenie vlastnosti medzi štítkami produktu v zozanem produktov.

V prípade veľkého množstva produktov je možné použiť niektorý z pluginov pre hrodmadné úpravy produktov, tie sú ale väčšinou veľmi komplexné a môžu spôsobiť spomalenie e-shopu. Z tohto dôdvodu som sa rozhodol naprogramovať vlastnú funkcionalitu pre hromadné pridávanie a odoberanie produktových štítkov, resp. vlastností k produktom.  

				
					class PxBulkEditProductLabel {

	public string $taxonomy;

	public array $terms;

	public function __construct( $taxonomy ) {

		$this->taxonomy = $taxonomy;

		$terms = get_terms( [
			'taxonomy'   => $this->taxonomy,
			'hide_empty' => false,
		] );

		$this->terms = $terms;

		$this->hooks();

	}

	public function hooks(): void {

		/* Bulk Actions */

		add_filter( 'bulk_actions-edit-product', [ $this, 'add_bulk_actions' ], 20, 1 );

		add_filter( 'handle_bulk_actions-edit-product', [ $this, 'bulk_actions_handle' ], 10, 3 );


		/* Admin Product Column */
		add_filter( 'manage_edit-product_columns', [ $this, 'custom_product_column' ], 20 );
		add_action( 'manage_product_posts_custom_column', [ $this, 'custom_orders_list_column_content' ], 20, 2 );

		/* Change Query */
		add_action( 'pre_get_posts', [ $this, 'change_query' ] );

	}

	function add_bulk_actions( $actions ) {

		foreach ( $this->terms as $term ) {
			$actions[ 'add_tag_' . $term->slug ]    = __( 'Pridať štítok ' . $term->name, 'px-invoices' );
			$actions[ 'remove_tag_' . $term->slug ] = __( 'Odobrať štítok ' . $term->name, 'px-invoices' );
		}

		return $actions;
	}

	function bulk_actions_handle( $redirect_to, $action, $post_ids ) {

		if ( ! str_starts_with( $action, 'add_tag_' ) && ! str_starts_with( $action, 'remove_tag_' ) ) {
			return $redirect_to;
		}

		$term_id = str_replace( 'add_tag_', '', $action );
		$term_id = str_replace( 'remove_tag_', '', $term_id );

		foreach ( $post_ids as $post_id ) {

			$term = get_term_by( 'slug', $term_id, $this->taxonomy );

			if ( $term ) {
				$attributes = get_post_meta( $post_id, '_product_attributes', 1 );
				
				if(!is_array($attributes)) {
				    $attributes = [];
				}

				if ( str_starts_with( $action, 'remove' ) ) {
					unset( $attributes[ $this->taxonomy ] );
					wp_remove_object_terms( $post_id, $term->name, $this->taxonomy );
				} else {
					wp_set_object_terms( $post_id, $term->name, $this->taxonomy );

					$attributes[ $this->taxonomy ] = array(
						'name'         => $this->taxonomy,
						'value'        => $term->name,
						'is_visible'   => '0',
						'is_taxonomy'  => '1',
						'is_variation' => '0',
					);
				}

				update_post_meta( $post_id, '_product_attributes', $attributes );

			}

		}

		return $redirect_to = add_query_arg( array(
			$action           => '1',
			'processed_count' => count( $post_ids ),
		), $redirect_to );
	}


	/* Admin Order Columns */
	function custom_product_column( $columns ): array {
		$reordered_columns = array();

		foreach ( $columns as $key => $column ) {
			$reordered_columns[ $key ] = $column;
			if ( $key == 'price' ) {
				// Inserting after "Status" column
				$reordered_columns['px_labels'] = __( 'Štítky', 'pixeler' );
			}
		}

		return $reordered_columns;
	}

	function custom_orders_list_column_content( $column, $post_id ): void {
		switch ( $column ) {
			case 'px_labels' :
				$terms = get_the_terms( $post_id, $this->taxonomy );

				if ( ! empty( $terms ) ) {

					foreach ( $terms as $term ) {
						$edit_url = admin_url( 'edit.php?post_type=product&' . $this->taxonomy . '=' . $term->slug );
						echo '<a href="' . $edit_url . '">' . $term->name . '</a>,';
					}
				}
				break;
		}
	}

	/* Admin Product Filter Query */

	function change_query( $query ): void {

		if ( is_admin() && $query->get( 'post_type' ) == 'product' ) {

			if ( isset( $_GET[$this->taxonomy] ) ) {
				$query->set( 'tax_query', [
					[
						'taxonomy' => $this->taxonomy,
						'terms'    => $_GET[$this->taxonomy],
						'field'    => 'slug',
					]
				] );
			}
		}
	}

}

add_action( 'init', function () {
	$PxBulkEditProductLabel = new PxBulkEditProductLabel( 'pa_stitok' );
}, 999999 );
				
			

Tento kód je potrebné vložiť do functions.php témy alebo ako snippet pomocou niektorého z pluginov. Jediným parametrom je slug taxonómie predstavujúcu vlastnosť pre štítky, v našom prípade je to pa_stitok

Hromadné úpravy vlastností predstavujucich štítky produktov.

Výsledkom je dynamické pridanie hromadných akcií pre pridávanie a odoberanie vlastností k produktom ako aj samotné zobrazenie priradených vlastností v samostatnom stĺpci a filtrovanie podľa nich. 

Picture of Roman Kraiger

Roman Kraiger

Zakladateľ agentúry Pixeler, vášnivý cyklista, programátor a občasný bloger.

Páčil sa Vám tento článok?

Odmeňte ho páčikom.

alebo ho zdieľajte medzi priateľmi na:

Pridaj komentár

Vaša e-mailová adresa nebude zverejnená. Vyžadované polia sú označené *