• Resolved morvy

    (@morvy)


    Donedavna sme pouzivali WPify pre Packetu, presli sme minuly tyzden na Packeta 1.5.x a mame problem s filtrovanim objednavok v admine.

    Mame pridany custom filter, ktory nam filtruje prepravcov GLS, DPD, Pošta, Packeta. Tento plugin si pridava vlastny filter Packeta, kde je moznost vyberu “Zasielky na dopravcov” a “Zasielky na vydajne miesta Packety”.

    Problem je, ze nam teraz nefunguje custom filter, pretoze je tam ten filter Packety. Na tento filter sa neda “hooknut” a pridat tam vlastne filtre. Po vyfiltrovani GLS nam to nezobrazi nic, vypnutim Packeta pluginu to funguje v poriadku.

    Vedeli by ste Vas filter upravit aby ho bolo mozne rozsirit pripadne aby nekolidoval s ostatnymi filtrami?

Viewing 5 replies - 1 through 5 (of 5 total)
  • Plugin Support kovalmatyas

    (@kovalmatyas)

    Dobrý den @morvy,
    děkuji za nahlášení tohoto chování.

    Předávám ho k řešením kolegům z vývoje pluginu, nicméně by nám při řešení pomohlo mít příklad custom filtru, který používáte, se kterým bychom mohli případné úpravy rovnou otestovat.

    Poskytnete nám prosím k tomuto účelu váš custom filtr?
    Děkuji.

    S pozdravem,
    Matyáš Kovaľ – Zásilkovna E-Commerce Support

    Thread Starter morvy

    (@morvy)

    Nech sa paci, kod:

    <?php
    function display_shipping_dropdown() {
    	if ( is_admin() && ! empty( $_GET['post_type'] ) && sanitize_title( $_GET['post_type'] ) == 'shop_order' ) {
    
    		$exp_types = array();
    
    		$zones = WC_Shipping_Zones::get_zones();
    		foreach ( $zones as $z ) {
    			foreach ( $z['shipping_methods'] as $method ) {
    				$exp_types[] = $method->title;
    			}
    		}
    		$exp_types = array_unique( $exp_types );
    
    		if ( empty( $exp_types ) ) {
    			return '';
    		}
    		?>
    		<select name="shipping_method">
    			<option value=""><?php _e( 'Filtrovať podľa dopravy', 'woocommerce' ); ?></option>
    			<?php
    			$current_v = ! empty( $_GET['shipping_method'] ) ? $_GET['shipping_method'] : '';
    			foreach ( $exp_types as $label ) {
    				printf
    				(
    					'<option value="%s"%s>%s</option>',
    					$label,
    					$label == $current_v ? ' selected="selected"' : '',
    					$label
    				);
    			}
    			?>
    		</select>
    		<?php
    	}
    }
    add_action( 'restrict_manage_posts', 'display_shipping_dropdown' );
    
    function admin_shipping_filter( $where, $wp_query ) {
    	global $pagenow;
    	global $wpdb;
    	$method = ! empty( $_GET['shipping_method'] ) ? sanitize_title_for_query( $_GET['shipping_method'] ) : false;
    
    	if ( is_admin() && $pagenow == 'edit.php' && $wp_query->query_vars['post_type'] == 'shop_order' && ! empty( $method ) ) {
    		$where .= 'AND ID
    				IN (
    					SELECT order_id
    					FROM ' . $wpdb->prefix . 'woocommerce_order_items
    					WHERE order_item_type = "shipping"
    					AND order_item_name LIKE "' . $method . '%"
    				)';
    	}
    
    	return $where;
    }
    add_filter( 'posts_where', 'admin_shipping_filter', 10, 2 );
    Thread Starter morvy

    (@morvy)

    Nahodou ste sa k tomuto nedostali? Dost nam to stazuje pracu v admine, riesenie typu prechod na “stary” plugin od WPify by bol komplikovany kvoli ID dopravy

    Plugin Support kovalmatyas

    (@kovalmatyas)

    Dobrý den @morvy,
    omlouvám se za prodlevu v odpovědi.

    Dle vyjádření programátora k této chybě dochází kvůli tomu, že v tabulce woocommerce_order_items jsou ve sloupci order_item_name uloženy názvy přepravních metod (shipping rate) nastavené v “Nastavení dopravců” (nastavení našeho pluginu), tedy například “CZ Zásilkovna výdejní místa”.

    V proměnné $method se ale nachází název shipping method (například string z%c3%a1silkovna) .

    K problému tedy dochází pokaždé, když je shipping rate s jiným názvem než má shipping method.

    Řešením by mělo být načítat použité názvy skrze:
    SELECT DISTINCT order_item_name FROM wp_woocommerce_order_items WHERE order_item_type = ‘shipping’.

    Například by tedy custom filtr po zapracování těchto úpravy mohl vypadat takto:

    function display_shipping_dropdown() {
    	if ( ! empty( $_GET['post_type'] ) && is_admin() && sanitize_title( $_GET['post_type'] ) === 'shop_order' ) {
    		global $wpdb;
    
    		// případně nějak seřadit
    		$exp_types = $wpdb->get_results( 'SELECT DISTINCT order_item_name FROM wp_woocommerce_order_items
    			WHERE order_item_type = "shipping"', ARRAY_A );
    		?>
    		<select name="shipping_method">
    			<option value=""><?php _e( 'Filtrovať podľa dopravy', 'woocommerce' ); ?></option>
    			<?php
    			$current_v = ! empty( $_GET['shipping_method'] ) ? $_GET['shipping_method'] : '';
    			foreach ( $exp_types as $row ) {
    				$label = $row['order_item_name'];
    				printf
    				(
    					'<option value="%s"%s>%s</option>',
    					$label,
    					$label === $current_v ? ' selected="selected"' : '',
    					$label
    				);
    			}
    			?>
    		</select>
    		<?php
    	}
    }
    
    add_action( 'restrict_manage_posts', 'display_shipping_dropdown' );
    
    function admin_shipping_filter( $where, $wp_query ) {
    	global $pagenow;
    	global $wpdb;
    
    	$method = ! empty( $_GET['shipping_method'] ) ? esc_sql( $_GET['shipping_method'] ) : false;
    	if ( $pagenow === 'edit.php' && $wp_query->query_vars['post_type'] === 'shop_order' && ! empty( $method ) && is_admin() ) {
    		$where .= ' AND wp_posts.ID IN (
    					SELECT order_id FROM ' . $wpdb->prefix . 'woocommerce_order_items
    					WHERE order_item_type = "shipping" AND order_item_name LIKE "' . $method . '%"
    				) ';
    	}
    
    	return $where;
    }
    
    add_filter( 'posts_where', 'admin_shipping_filter', 10, 2 );

    S pozdravem,
    Matyáš Kovaľ – Zásilkovna E-Commerce Support

    Plugin Support kovalmatyas

    (@kovalmatyas)

    Dobrý den @morvy ,
    zatím jsem od Vás nedostal další reakci k tomuto tématu, pomohl vám návrh řešení od kolegy programátora?

    S pozdravem,
    Matyáš Kovaľ – Zásilkovna E-Commerce Support

Viewing 5 replies - 1 through 5 (of 5 total)
  • The topic ‘Konflikt filtrov v objednavkach’ is closed to new replies.