Ich bin neu bei WooCommerce und möchte die Seite mit der Bestellliste für Administratoren anpassen. Also habe ich im Grunde einen neuen Produkttyp erstellt. Jetzt habe ich auch die Einschränkung vorgenommen, dass der Kunde das Produkt meines benutzerdefinierten Produkttyps oder das Produkt des einfachen Produkttyps gleichzeitig kaufen kann.
Jetzt möchte ich auf der Admin-Auflistungsseite eine Bestellung anzeigen, die das Produkt eines einfachen Produkttyps enthält. Wie kann ich das tun?
Ich habe viel gesucht und ein Plugin gefunden, das einen Filter hat, um die Bestellung nach Produkt und nicht nach Produkttyp anzuzeigen. Während ich dieses Plugin studierte, erfuhr ich, dass ich dies möglicherweise tun kann posts_where
Aktion. Aber ich habe keine richtige Vorstellung.
Die folgenden Funktionen fügen der Admin-Bestellliste ein zusätzliches Filter-Dropdown-Menü hinzu, mit dem Sie Bestellungen basierend auf dem Produktposttyp der Bestellartikel filtern können:
add_action( 'restrict_manage_posts', 'admin_shop_order_by_product_type_filter' );
function admin_shop_order_by_product_type_filter(){
global $pagenow, $post_type;
if( 'shop_order' === $post_type && 'edit.php' === $pagenow ) {
$domain = 'woocommerce';
$filter_id = 'filter_product_type';
$current = isset($_GET[$filter_id])? $_GET[$filter_id] : '';
$query_args = ['taxonomy' => 'product_type', 'fields' => 'names', 'orderby' => 'order'];
echo '<select name="'.$filter_id.'">
<option value="">' . __('Filter by Product post type', $domain) . '</option>';
foreach ( get_terms($query_args) as $term_name ) {
printf( '<option value="%s"%s>%s</option>', $term_name,
$term_name === $current ? '" selected="selected"' : '', ucfirst($term_name) );
}
echo '</select>';
}
}
add_action( 'pre_get_posts', 'process_admin_shop_order_product_type_filter' );
function process_admin_shop_order_product_type_filter( $query ) {
global $pagenow, $post_type, $wpdb;
$filter_id = 'filter_product_type';
if ( $query->is_admin && 'edit.php' === $pagenow && 'shop_order' === $post_type
&& isset( $_GET[$filter_id] ) && $_GET[$filter_id] != '' ) {
$order_ids = $wpdb->get_col( "
SELECT DISTINCT o.ID
FROM {$wpdb->prefix}posts o
INNER JOIN {$wpdb->prefix}woocommerce_order_items oi
ON oi.order_id = o.ID
INNER JOIN {$wpdb->prefix}woocommerce_order_itemmeta oim
ON oi.order_item_id = oim.order_item_id
INNER JOIN {$wpdb->prefix}term_relationships tr
ON oim.meta_value = tr.object_id
INNER JOIN {$wpdb->prefix}term_taxonomy tt
ON tr.term_taxonomy_id = tt.term_taxonomy_id
INNER JOIN {$wpdb->prefix}terms t
ON tt.term_id = t.term_id
WHERE o.post_type="$post_type"
AND oim.meta_key = '_product_id'
AND tt.taxonomy = 'product_type'
AND t.name="{$_GET[$filter_id]}"
");
$query->set( 'post__in', $order_ids ); // Set the new "meta query"
$query->set( 'posts_per_page', 25 ); // Set "posts per page"
$query->set( 'paged', ( get_query_var('paged') ? get_query_var('paged') : 1 ) ); // Set "paged"
}
}
Der Code wird in die Datei functions.php Ihres aktiven untergeordneten Designs (oder aktiven Designs) eingefügt. Getestet und funktioniert.
Was meinst du mit “Admin-Bestelllistenseite”? Welche “Admin”-Seite?
– Jimmy Adaro
14. Mai 2019 um 14:01 Uhr
Ich meine Seite, die alle Bestellungen im Backend anzeigt
– tg910
14. Mai 2019 um 14:17 Uhr
“Befehle” in was? Ich verstehe es nicht.
– Jimmy Adaro
14. Mai 2019 um 14:20 Uhr
Ich meine, ich möchte filtern, dass die Reihenfolge angezeigt wird, in der alle Produkte den gleichen Produkttyp haben
– tg910
14. Mai 2019 um 14:23 Uhr