diff --git a/adminpages/reports/memberships.php b/adminpages/reports/memberships.php index 2bd0eaa09..bd62b3fd7 100644 --- a/adminpages/reports/memberships.php +++ b/adminpages/reports/memberships.php @@ -187,26 +187,17 @@ function pmpro_report_memberships_page() { // testing or live data $gateway_environment = get_option( "pmpro_gateway_environment"); - // get data - if ( - $type === 'signup_v_cancel' || - $type === 'signup_v_expiration' || - $type === 'signup_v_all' - ) { - $sqlQuery = "SELECT $date_function(mu.startdate) as date, COUNT(DISTINCT mu.user_id) as signups - FROM $wpdb->pmpro_memberships_users mu "; - - if ( ! empty( $discount_code ) ) { - $sqlQuery .= "LEFT JOIN $wpdb->pmpro_discount_codes_uses dc ON mu.user_id = dc.user_id "; - } - - $sqlQuery .= "WHERE mu.startdate >= '" . esc_sql( $startdate ) . "' "; + // Get signups. + $sqlQuery = "SELECT $date_function(mu.startdate) as date, COUNT(DISTINCT mu.user_id) as signups + FROM $wpdb->pmpro_memberships_users mu "; - if ( ! empty( $enddate ) ) { - $sqlQuery .= "AND mu.startdate <= '" . esc_sql( $enddate ) . "' "; - } + if ( ! empty( $discount_code ) ) { + $sqlQuery .= "LEFT JOIN $wpdb->pmpro_discount_codes_uses dc ON mu.user_id = dc.user_id "; } + $sqlQuery .= "WHERE mu.startdate >= '" . esc_sql( $startdate ) . "' "; + $sqlQuery .= "AND mu.startdate <= '" . esc_sql( $enddate ) . "' "; + if ( ! empty( $l ) ) { $sqlQuery .= 'AND mu.membership_id IN(' . $l . ') '; // $l is already escaped for SQL. See declaration. } @@ -219,35 +210,30 @@ function pmpro_report_memberships_page() { $dates = $wpdb->get_results( $sqlQuery ); - // fill in blanks in dates + // Build array of dates to track. + // We are doing this after getting the signup data in case annual is selected so that we know the first year we have data for. $cols = array(); if ( $period == 'daily' ) { $lastday = date_i18n( 't', strtotime( $startdate, current_time( 'timestamp' ) ) ); for ( $i = 1; $i <= $lastday; $i++ ) { - // Signups vs. Cancellations, Expirations, or All - if ( $type === 'signup_v_cancel' || $type === 'signup_v_expiration' || $type === 'signup_v_all' ) { - $cols[ $i ] = new stdClass(); - $cols[ $i ]->signups = 0; - foreach ( $dates as $day => $date ) { - if ( $date->date == $i ) { - $cols[ $i ]->signups = $date->signups; - } + $cols[ $i ] = new stdClass(); + $cols[ $i ]->signups = 0; + foreach ( $dates as $day => $date ) { + if ( $date->date == $i ) { + $cols[ $i ]->signups = $date->signups; } } } } elseif ( $period == 'monthly' ) { for ( $i = 1; $i < 13; $i++ ) { - // Signups vs. Cancellations, Expirations, or All - if ( $type === 'signup_v_cancel' || $type === 'signup_v_expiration' || $type === 'signup_v_all' ) { - $cols[ $i ] = new stdClass(); - $cols[ $i ]->date = $i; - $cols[ $i ]->signups = 0; - foreach ( $dates as $date ) { - if ( $date->date == $i ) { - $cols[ $i ]->date = $date->date; - $cols[ $i ]->signups = $date->signups; - } + $cols[ $i ] = new stdClass(); + $cols[ $i ]->date = $i; + $cols[ $i ]->signups = 0; + foreach ( $dates as $date ) { + if ( $date->date == $i ) { + $cols[ $i ]->date = $date->date; + $cols[ $i ]->signups = $date->signups; } } } @@ -261,16 +247,13 @@ function pmpro_report_memberships_page() { } for ( $i = $first_year; $i <= $thisyear; $i++ ) { - // Signups vs. Cancellations, Expirations, or All - if ( $type === 'signup_v_cancel' || $type === 'signup_v_expiration' || $type === 'signup_v_all' ) { - $cols[ $i ] = new stdClass(); - $cols[ $i ]->date = $i; - $cols[ $i ]->signups = 0; - foreach ( $dates as $date ) { - if ( $date->date == $i ) { - $cols[ $i ]->date = $date->date; - $cols[ $i ]->signups = $date->signups; - } + $cols[ $i ] = new stdClass(); + $cols[ $i ]->date = $i; + $cols[ $i ]->signups = 0; + foreach ( $dates as $date ) { + if ( $date->date == $i ) { + $cols[ $i ]->date = $date->date; + $cols[ $i ]->signups = $date->signups; } } } @@ -279,58 +262,56 @@ function pmpro_report_memberships_page() { $dates = ( ! empty( $cols ) ) ? $cols : $dates; // Signups vs. all - if ( $type === 'signup_v_cancel' || $type === 'signup_v_expiration' || $type === 'signup_v_all' ) { - $sqlQuery = "SELECT $date_function(mu1.modified) as date, COUNT(DISTINCT mu1.user_id) as cancellations - FROM $wpdb->pmpro_memberships_users mu1 "; + $sqlQuery = "SELECT $date_function(mu1.modified) as date, COUNT(DISTINCT mu1.user_id) as cancellations + FROM $wpdb->pmpro_memberships_users mu1 "; - // restrict by discount code - if ( ! empty( $discount_code ) ) { - $sqlQuery .= "LEFT JOIN $wpdb->pmpro_discount_codes_uses dc ON mu1.user_id = dc.user_id "; - } + // restrict by discount code + if ( ! empty( $discount_code ) ) { + $sqlQuery .= "LEFT JOIN $wpdb->pmpro_discount_codes_uses dc ON mu1.user_id = dc.user_id "; + } - if ( $type === 'signup_v_cancel' ) { - $sqlQuery .= "WHERE mu1.status IN('inactive','cancelled','admin_cancelled') "; - } elseif ( $type === 'signup_v_expiration' ) { - $sqlQuery .= "WHERE mu1.status IN('expired') "; - } else { - $sqlQuery .= "WHERE mu1.status IN('inactive','expired','cancelled','admin_cancelled') "; - } + if ( $type === 'signup_v_cancel' ) { + $sqlQuery .= "WHERE mu1.status IN('inactive','cancelled','admin_cancelled') "; + } elseif ( $type === 'signup_v_expiration' ) { + $sqlQuery .= "WHERE mu1.status IN('expired') "; + } else { + $sqlQuery .= "WHERE mu1.status IN('inactive','expired','cancelled','admin_cancelled') "; + } - $sqlQuery .= "AND mu1.enddate >= '" . esc_sql( $startdate ) . "' - AND mu1.enddate < '" . esc_sql( $enddate ) . "' "; + $sqlQuery .= "AND mu1.enddate >= '" . esc_sql( $startdate ) . "' + AND mu1.enddate < '" . esc_sql( $enddate ) . "' "; - // restrict by level - if ( ! empty( $l ) ) { - $sqlQuery .= 'AND mu1.membership_id IN(' . $l . ') '; // $l is already escaped for SQL. See declaration. - } + // restrict by level + if ( ! empty( $l ) ) { + $sqlQuery .= 'AND mu1.membership_id IN(' . $l . ') '; // $l is already escaped for SQL. See declaration. + } - if ( ! empty( $discount_code ) ) { - $sqlQuery .= "AND dc.code_id = '" . esc_sql( $discount_code ) . "' "; - } + if ( ! empty( $discount_code ) ) { + $sqlQuery .= "AND dc.code_id = '" . esc_sql( $discount_code ) . "' "; + } - $sqlQuery .= ' GROUP BY date ORDER BY date '; - - /** - * Filter query to get cancellation numbers in signups vs cancellations detailed report. - * - * @since 1.8.8 - * - * @param string $sqlQuery The current SQL - * @param string $type report type - * @param string $startdate Start Date in YYYY-MM-DD format - * @param string $enddate End Date in YYYY-MM-DD format - * @param int $l Level ID - */ - $sqlQuery = apply_filters( 'pmpro_reports_signups_sql', $sqlQuery, $type, $startdate, $enddate, $l ); - - $cdates = $wpdb->get_results( $sqlQuery, OBJECT_K ); - - foreach ( $dates as $day => &$date ) { - if ( ! empty( $cdates ) && ! empty( $cdates[ $day ] ) ) { - $date->cancellations = $cdates[ $day ]->cancellations; - } else { - $date->cancellations = 0; - } + $sqlQuery .= ' GROUP BY date ORDER BY date '; + + /** + * Filter query to get cancellation numbers in signups vs cancellations detailed report. + * + * @since 1.8.8 + * + * @param string $sqlQuery The current SQL + * @param string $type report type + * @param string $startdate Start Date in YYYY-MM-DD format + * @param string $enddate End Date in YYYY-MM-DD format + * @param int $l Level ID + */ + $sqlQuery = apply_filters( 'pmpro_reports_signups_sql', $sqlQuery, $type, $startdate, $enddate, $l ); + + $cdates = $wpdb->get_results( $sqlQuery, OBJECT_K ); + + foreach ( $dates as $day => &$date ) { + if ( ! empty( $cdates ) && ! empty( $cdates[ $day ] ) ) { + $date->cancellations = $cdates[ $day ]->cancellations; + } else { + $date->cancellations = 0; } } @@ -489,8 +470,17 @@ function pmpro_ShowMonthOrYear() function drawVisualization() { var data = google.visualization.arrayToDataTable([ - - ['', 'Signups', 'All Cancellations'], + + ['', '', ''], $value ) { ?> [' ', signups ); ?>, cancellations ); ?>], - - - - ['', 'Signups', 'Cancellations'], - $value ) { ?> - [' - date, 2 ) ) ); - } elseif ( $period == 'daily' ) { - echo esc_html( $key ); - } else { - echo esc_html( $value->date ); - } - ?> - ', signups ); ?>, cancellations ); ?>], - - - - - ['', 'Signups', 'Expirations'], - $value ) { ?> - [' - date, 2 ) ) ); - } elseif ( $period == 'daily' ) { - echo esc_html( $key ); - } else { - echo esc_html( $value->date ); - } - ?> - ', signups ); ?>, cancellations ); ?>], - - - ]); var options = { @@ -571,6 +525,48 @@ function drawVisualization() { +
+ + + + + + + + + + $value ) { + ?> + + + + + + + + + + + + + + +
date, 2 ) ) ); + } elseif ( $period == 'daily' ) { + echo esc_html( $key ); + } else { + echo esc_html( $value->date ); + } + ?>signups ); ?>cancellations ); ?>
+
+