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
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
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