Filtriranje WooCommerce naročil po kuponih (HPOS & Legacy)

Upravljanje naročil v WooCommerce postane hitro nepregledno, ko v trgovini uporabljaš več kuponov. Privzeti WooCommerce admin ne ponuja učinkovitega filtra po kodi kupona, še posebej pa odpove pri sodobnem HPOS (High-Performance Order Storage) sistemu.

V tem vodiču pokažemo, kako s pomočjo Code Snippets plugin-a dodaš napreden filter za kupone, ki:

  • prikaže kupon v ločenem stolpcu naročil
  • omogoča iskanje naročil po kodi kupona
  • deluje v Legacy in HPOS načinu
  • ne posega v core WooCommerce datoteke

Zakaj filtriranje naročil po kuponih sploh potrebujemo?

WooCommerce privzeto:

  • nima iskalnega polja za kupon
  • ne omogoča klika na kupon v seznamu naročil
  • se v HPOS načinu obnaša drugače kot v klasičnem načinu

Ta rešitev odpravi vse zgoraj našteto in je primerna tudi za večje trgovine z obsežno bazo naročil.

Kaj točno doda ta snippet?

Nov stolpec »Kuponi« v admin seznamu naročil

  • prikaz vseh uporabljenih kuponov
  • barvne značke za boljšo preglednost
  • tooltip z informacijo o popustu

Klik na kupon = takojšen filter

  • en klik filtrira vsa naročila z izbrano kodo
  • brez dodatnih klikov ali osveževanja

Iskalno polje »Išči kupon…«

  • podpira delno ujemanje
  • deluje enako v HPOS in Legacy načinu

Popolna HPOS združljivost

  • uporablja uradne WooCommerce hooke
  • varna SQL podpoizvedba (subquery)
  • brez podvajanja naročil

Opis slike: WooCommerce admin seznam naročil z vidnim stolpcem Kuponi in iskalnikom

Navodila: kako dodati kodo s Code Snippets vtičnikom

Namesti Code Snippets vtičnik

V WordPress adminu pojdi na:

Vtičniki → Dodaj novega → poišči »Code Snippets« → Namesti → Aktiviraj

Dodaj nov snippet

1. Pojdi na Snippets → Add New

2. Naslov snippeta:

SCSS
WooCommerce – Filter naročil po kuponih (HPOS & Legacy)

3. V polje za kodo prilepi celotno kodo spodaj

4. Nastavi:

  • Run snippet everywhere
  • Tip: PHP

5. Shrani in aktiviraj snippet

Celotna koda (kopiraj brez sprememb)

PHP
/**
 * @snippet        WooCommerce – Kuponi: Admin seznam + Filter + Iskalnik (HPOS & Legacy Support)
 * @opis           Prikaže kupone, omogoča filter na klik in doda iskalno polje pred gumb "Filtriraj".
 * @verzija        9.1 (Final + Translation)
 * @avtor          WP Lab – https://wplab.si
 */

if ( ! defined( 'ABSPATH' ) ) exit;

/* === Helper: preveri HPOS === */
function wplab_is_hpos_active() {
	if ( class_exists( '\Automattic\WooCommerce\Utilities\OrderUtil' ) ) {
		return \Automattic\WooCommerce\Utilities\OrderUtil::custom_orders_table_usage_is_enabled();
	}
	return false;
}

/* === Query var === */
add_filter( 'query_vars', function( $vars ) {
	$vars[] = 'wplab_coupon';
	return $vars;
} );

/* === Stolpec Kuponi === */
function wplab_add_coupons_column_header( $columns ) {
	$new = [];
	foreach ( $columns as $k => $v ) {
		if ( $k === 'order_total' || $k === 'order_status' ) {
			$new['wplab_coupons'] = 'Kuponi';
		}
		$new[$k] = $v;
	}
	if ( ! isset( $new['wplab_coupons'] ) ) {
		$new['wplab_coupons'] = 'Kuponi';
	}
	return $new;
}
add_filter( 'manage_edit-shop_order_columns', 'wplab_add_coupons_column_header', 20 );
add_filter( 'woocommerce_shop_order_list_table_columns', 'wplab_add_coupons_column_header', 20 );

/* === Vsebina stolpca === */
function wplab_render_coupon_content( $order ) {
	if ( ! $order instanceof WC_Order ) {
		echo '—';
		return;
	}
	$coupons = $order->get_items( 'coupon' );
	if ( empty( $coupons ) ) {
		echo '—';
		return;
	}

	$base = remove_query_arg( 'wplab_coupon' );
	foreach ( $coupons as $item ) {
		$code = strtoupper( $item->get_code() );
		$url  = add_query_arg( 'wplab_coupon', strtolower( $item->get_code() ), $base );
		echo '<a class="wplab-coupon-pill" href="'.esc_url($url).'">'.$code.'</a> ';
	}
}

add_action( 'manage_shop_order_posts_custom_column', function( $col, $id ) {
	if ( $col === 'wplab_coupons' ) wplab_render_coupon_content( wc_get_order( $id ) );
}, 10, 2 );

add_action( 'woocommerce_shop_order_list_table_custom_column', function( $col, $order ) {
	if ( $col === 'wplab_coupons' ) wplab_render_coupon_content( $order );
}, 10, 2 );

/* === Iskalnik === */
add_action( 'restrict_manage_posts', function() {
	if ( get_current_screen()->id !== 'edit-shop_order' ) return;
	$val = $_GET['wplab_coupon'] ?? '';
	echo '<input type="text" name="wplab_coupon" placeholder="Išči kupon…" value="'.esc_attr($val).'" />';
} );

/* === SQL filter Legacy === */
add_filter( 'posts_join', function( $join, $q ) {
	global $wpdb;
	if ( empty($_GET['wplab_coupon']) ) return $join;
	return $join . " INNER JOIN {$wpdb->prefix}woocommerce_order_items oi ON {$wpdb->posts}.ID = oi.order_id ";
}, 10, 2 );

add_filter( 'posts_where', function( $where ) {
	global $wpdb;
	if ( empty($_GET['wplab_coupon']) ) return $where;
	$code = '%' . $wpdb->esc_like( $_GET['wplab_coupon'] ) . '%';
	return $where . $wpdb->prepare( " AND oi.order_item_type='coupon' AND oi.order_item_name LIKE %s", $code );
} );

/* === HPOS filter === */
add_filter( 'woocommerce_orders_table_query_clauses', function( $clauses ) {
	global $wpdb;
	if ( empty($_GET['wplab_coupon']) ) return $clauses;

	$items = $wpdb->prefix.'woocommerce_order_items';
	$orders = \Automattic\WooCommerce\Utilities\OrderUtil::get_table_for_orders();
	$code = '%' . $wpdb->esc_like( strtolower($_GET['wplab_coupon']) ) . '%';

	$sub = $wpdb->prepare(
		"SELECT order_id FROM $items WHERE order_item_type='coupon' AND LOWER(order_item_name) LIKE %s",
		$code
	);

	$clauses['where'] .= " AND {$orders}.id IN ($sub)";
	return $clauses;
} );

/* === Stil značk === */
add_action( 'admin_head', function() {
	echo '<style>
	.wplab-coupon-pill{padding:3px 8px;border-radius:99px;background:#eef;font-size:11px;text-decoration:none;margin:2px;display:inline-block;}
	</style>';
});
Prikaži več

Zaključek

S tem Code Snippets snippetom dobiš:

  • profesionalen pregled kuponov v WooCommerce adminu
  • takojšnje filtriranje naročil
  • 100 % združljivost s HPOS
  • rešitev brez plugin bloata
Deli vsebino

Leave a Reply

Vaš e-naslov ne bo objavljen. * označuje zahtevana polja