/** * Get, sort and filter subscriptions for display. * * @uses $this->_column_headers * @uses $this->items * @uses $this->get_columns() * @uses $this->get_sortable_columns() * @uses $this->get_pagenum() * @uses $this->set_pagination_args() * @since 1.0 */ function prepare_items() { $screen = get_current_screen(); $per_page = $this->get_items_per_page($screen->get_option('per_page', 'option'), 10); $paged = isset($_GET['paged']) ? $_GET['paged'] : 1; $this->get_column_info(); $this->process_actions(); $status_to_show = isset($_GET['status']) ? $_GET['status'] : 'all'; $subscriptions_query = array('paged' => $paged, 'subscriptions_per_page' => $per_page, 'subscription_status' => $status_to_show, 'order' => !empty($_REQUEST['order']) ? strtoupper($_REQUEST['order']) : 'DESC', 'orderby' => !empty($_REQUEST['orderby']) ? $_REQUEST['orderby'] : '_subscription_start_date'); // Filter by a certain customer? if (isset($_GET['_customer_user']) && !empty($_GET['_customer_user'])) { $subscriptions_query['customer_id'] = $_GET['_customer_user']; } // Filter by a certain product? if (isset($_GET['_product_id']) && !empty($_GET['_product_id'])) { $subscriptions_query['product_id'] = $_GET['_product_id']; } $subscriptions = WC_Subscriptions::get_subscriptions($subscriptions_query); $total_items = WC_Subscriptions::get_subscription_count($subscriptions_query); $this->statuses = array(); foreach ($subscriptions as $subscription) { $this->statuses[$subscription['status']] = isset($this->statuses[$subscription['status']]) ? $this->statuses[$subscription['status']] + 1 : 1; } $this->statuses = WC_Subscriptions::get_subscription_status_counts(); if (isset($this->statuses['trash'])) { $this->statuses['all'] = $this->statuses['all'] - $this->statuses['trash']; } // Add sorted & sliced data to the items property to be used by the rest of the class $this->items = $subscriptions; $this->set_pagination_args(array('total_items' => $total_items, 'per_page' => $per_page, 'total_pages' => ceil($total_items / $per_page))); }
/** * Get, sort and filter subscriptions for display. * * @uses $this->_column_headers * @uses $this->items * @uses $this->get_columns() * @uses $this->get_sortable_columns() * @uses $this->get_pagenum() * @uses $this->set_pagination_args() * @since 1.0 */ function prepare_items() { global $wcs_list_table_statuses; $screen = get_current_screen(); $per_page = $this->get_items_per_page($screen->get_option('per_page', 'option'), 10); $paged = isset($_GET['paged']) ? $_GET['paged'] : 1; $this->get_column_info(); $status_to_show = isset($_GET['status']) ? $_GET['status'] : 'all'; if (isset($_REQUEST['s']) || !empty($_REQUEST['orderby']) && 'next_payment_date' === $_REQUEST['orderby']) { @set_time_limit(300); $subscriptions = $wcs_list_table_statuses = array(); // It's a search if (isset($_REQUEST['s'])) { $subscriptions_grouped_by_user = WC_Subscriptions_Manager::search_subscriptions($_REQUEST['s']); } else { // Order by next payment date $subscriptions_grouped_by_user = WC_Subscriptions_Manager::get_all_users_subscriptions(); } foreach ($subscriptions_grouped_by_user as $user_id => $users_subscriptions) { // Filter by a certain customer? if (isset($_GET['_customer_user']) && (int) $user_id !== (int) $_GET['_customer_user']) { continue; } foreach ($users_subscriptions as $subscription_key => $subscription) { // Filter by a certain product? if (isset($_GET['_product_id']) && (int) $subscription['product_id'] !== (int) $_GET['_product_id']) { continue; } $wcs_list_table_statuses[$subscription['status']] = isset($wcs_list_table_statuses[$subscription['status']]) ? $wcs_list_table_statuses[$subscription['status']] + 1 : 1; if ($status_to_show == $subscription['status'] || $status_to_show == 'all' && $subscription['status'] != 'trash') { $subscriptions[$subscription_key] = $subscription + array('user_id' => $user_id, 'subscription_key' => $subscription_key); } } } // If we have a request for a status that does not exist, default to all subscriptions if (!isset($wcs_list_table_statuses[$status_to_show])) { if ($status_to_show != 'all') { $status_to_show = $_GET['status'] = 'all'; foreach ($subscriptions_grouped_by_user as $user_id => $users_subscriptions) { // Filter by a certain customer? if (isset($_GET['_customer_user']) && (int) $user_id !== (int) $_GET['_customer_user']) { continue; } foreach ($users_subscriptions as $subscription_key => $subscription) { // Filter by a certain product? if (isset($_GET['_product_id']) && (int) $subscription['product_id'] !== (int) $_GET['_product_id']) { continue; } $subscriptions[$subscription_key] = $subscription + array('user_id' => $user_id, 'subscription_key' => $subscription_key); } } } else { $_GET['status'] = 'all'; } } ksort($wcs_list_table_statuses); $wcs_list_table_statuses = array('all' => array_sum($wcs_list_table_statuses)) + $wcs_list_table_statuses; if (isset($wcs_list_table_statuses['trash'])) { $wcs_list_table_statuses['all'] = $wcs_list_table_statuses['all'] - $wcs_list_table_statuses['trash']; } $total_items = count($subscriptions); @usort($subscriptions, array(&$this, 'sort_subscriptions')); // Need to suppress warnings due to PHP bug here: https://bugs.php.net/bug.php?id=50688 $subscriptions = array_slice($subscriptions, ($paged - 1) * $per_page, $per_page); } else { $subscriptions_query = array('paged' => $paged, 'subscriptions_per_page' => $per_page, 'subscription_status' => $status_to_show, 'order' => !empty($_REQUEST['order']) ? strtoupper($_REQUEST['order']) : 'DESC', 'orderby' => !empty($_REQUEST['orderby']) ? $_REQUEST['orderby'] : '_subscription_start_date'); // Filter by a certain customer? if (isset($_GET['_customer_user']) && !empty($_GET['_customer_user'])) { $subscriptions_query['customer_id'] = $_GET['_customer_user']; } // Filter by a certain product? if (isset($_GET['_product_id']) && !empty($_GET['_product_id'])) { $subscriptions_query['product_id'] = $_GET['_product_id']; } $subscriptions = WC_Subscriptions::get_subscriptions($subscriptions_query); $wcs_list_table_statuses = WC_Subscriptions::get_subscription_status_counts(); if (isset($wcs_list_table_statuses['trash'])) { $wcs_list_table_statuses['all'] = $wcs_list_table_statuses['all'] - $wcs_list_table_statuses['trash']; } if ('all' === $status_to_show && !isset($subscriptions_query['customer_id']) && !isset($subscriptions_query['product_id'])) { $total_items = $wcs_list_table_statuses['all']; } else { $total_items = WC_Subscriptions::get_subscription_count($subscriptions_query); } } // Add sorted & sliced data to the items property to be used by the rest of the class $this->items = $subscriptions; $this->set_pagination_args(array('total_items' => $total_items, 'per_page' => $per_page, 'total_pages' => ceil($total_items / $per_page))); }
function woo_ce_get_subscriptions( $args = array() ) { global $export; $limit_volume = -1; $offset = 0; if( $args ) { $limit_volume = ( isset( $args['limit_volume'] ) ? $args['limit_volume'] : -1 ); $offset = $args['offset']; $subscription_status = ( isset( $args['subscription_status'] ) ? $args['subscription_status'] : array() ); $subscription_product = ( isset( $args['subscription_product'] ) ? $args['subscription_product'] : array() ); } $troubleshooting_url = 'http://www.visser.com.au/documentation/store-exporter-deluxe/usage/'; // @mod - Will migrate to a WP_Query solution once feature is stable /* $limit_volume = -1; $offset = 0; if( $args ) { $limit_volume = ( isset( $args['limit_volume'] ) ? $args['limit_volume'] : false ); $offset = $args['offset']; $orderby = ( isset( $args['subscription_orderby'] ) ? $args['subscription_orderby'] : 'ID' ); $order = ( isset( $args['subscription_order'] ) ? $args['subscription_order'] : 'ASC' ); } $post_type = 'shop_order'; $args = array( 'post_type' => $post_type, 'orderby' => $orderby, 'order' => $order, 'offset' => $offset, 'posts_per_page' => $limit_volume, 'post_status' => apply_filters( 'woo_ce_subscription_post_status', 'publish' ), 'fields' => 'ids' ); $subscription_ids = new WP_Query( $args ); if( $subscription_ids->posts ) { foreach( $subscription_ids->posts as $subscription_id ) $subscriptions[] = $subscription_id; $export->total_rows = count( $subscriptions ); } */ $output = array(); // Check that WooCommerce Subscriptions exists if( !class_exists( 'WC_Subscriptions' ) || !class_exists( 'WC_Subscriptions_Manager' ) ) { $message = __( 'The WooCommerce Subscriptions class <code>WC_Subscriptions</code> or <code>WC_Subscriptions_Manager</code> could not be found, this is required to export Subscriptions.', 'woo_ce' ) . ' (<a href="' . $troubleshooting_url . '" target="_blank">' . __( 'Need help?', 'woo_ce' ) . '</a>)'; woo_cd_admin_notice( $message, 'error' ); return; } else { // Check that the get_all_users_subscriptions() function exists if( !method_exists( 'WC_Subscriptions_Manager', 'get_all_users_subscriptions' ) ) { $message = __( 'The WooCommerce Subscriptions method <code>WC_Subscriptions_Manager->get_all_users_subscriptions()</code> could not be found, this is required to export Subscriptions.', 'woo_ce' ) . ' (<a href="' . $troubleshooting_url . '" target="_blank">' . __( 'Need help?', 'woo_ce' ) . '</a>)'; woo_cd_admin_notice( $message, 'error' ); return; } } if( class_exists( 'WC_Subscriptions' ) ) { if( method_exists( 'WC_Subscriptions', 'get_subscriptions' ) ) { $args = array( 'subscriptions_per_page' => $limit_volume, 'offset' => $offset ); // Allow other developers to bake in their own filters $args = apply_filters( 'woo_ce_get_subscriptions_args', $args ); if( $subscriptions = WC_Subscriptions::get_subscriptions( $args ) ) { $subscription_statuses = woo_ce_get_subscription_statuses(); foreach( $subscriptions as $subscription ) { $subscription = woo_ce_get_subscription_data( $subscription ); $key = $subscription['key']; $output[$key] = apply_filters( 'woo_ce_subscription', (object)$subscription ); // Filter by Subscription Status if( !empty( $subscription_status ) ) { if( !in_array( strtolower( $subscription['status'] ), $subscription_status ) ) { unset( $output[$key] ); continue; } } // Filter by Subscription Product if( !empty( $subscription_product ) ) { if( !in_array( $subscription['product_id'], $subscription_product ) ) { unset( $output[$key] ); continue; } } } } } } return $output; }