Skip to content

Instantly share code, notes, and snippets.

@javierarques
Created January 23, 2014 12:07
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save javierarques/8577543 to your computer and use it in GitHub Desktop.
Save javierarques/8577543 to your computer and use it in GitHub Desktop.
Woocommerce - Filter orders in wp-admin by products
/***********************************************************************************
* 2. FILTRO POR PRODUCTOS EN PEDIDOS
***********************************************************************************/
define('FILTRO_PRODUCT_NAME', 'filtro_producto');
define('ORDER_POST_TYPE', 'shop_order');
/**
* Añade la query de las sedes
* Hook 'pre_get_posts'
* @global type $pagenow
* @global type $typenow
* @param type $query
*/
function query_filter_product_order( $query ){
global $pagenow, $typenow;
if ( $query->is_main_query() && is_admin() && $pagenow=='edit.php' && $typenow == ORDER_POST_TYPE && isset($_GET[FILTRO_PRODUCT_NAME])) {
global $wpdb;
$wpdb->show_errors;
$producto_id = $_GET[FILTRO_PRODUCT_NAME];
// 1. Sacamos los "order_items" que tienen nuestro producto
$order_items = $wpdb->get_col( $wpdb->prepare("SELECT order_item_id FROM wp_woocommerce_order_itemmeta WHERE meta_key = '_product_id' AND meta_value= %d", $producto_id) );
if (empty($order_items))
return $query;
// 2. Sacamos los orders de los $order_items
$orders = $wpdb->get_col( $wpdb->prepare("SELECT order_id FROM wp_woocommerce_order_items WHERE order_item_id IN (%s)", implode($order_items)) );
if (empty($orders))
return $query;
$query->set('post__in', $orders);
}
} add_filter( 'pre_get_posts', 'query_filter_product_order' );
/**
* Hook que añade el select de sedes a la zona de filtros de edit.php
* Hook 'restrict_manage_posts'
* @global type $typenow
* @global type $wp_query
* @return boolean
*/
function filter_product_order(){
global $typenow;
if ( $typenow != 'shop_order')
return false;
$productos = get_posts( array('post_type' =>'product', 'posts_per_page' => -1, 'orderby' => 'title', 'order' => 'ASC'));
$selected = empty( $_REQUEST[FILTRO_PRODUCT_NAME] )?'':$_REQUEST[FILTRO_PRODUCT_NAME];
if ( $productos ):
?>
<select name="<?php echo FILTRO_PRODUCT_NAME ?>">
<option value=""><?php _e('Filtrar por producto', 'instema')?></option>
<?php foreach( $productos as $producto ): ?>
<option <?php selected($selected, $producto->ID)?> value="<?php echo $producto->ID ?>"><?php echo $producto->post_title ?></option>
<?php endforeach;?>
</select>
<?php endif;
} add_action( 'restrict_manage_posts', 'filter_product_order' );
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment