| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312 |
- <?php
- /*
- * TNP classes for internal API
- *
- * Error reference
- * 404 Object not found
- * 403 Not allowed (when the API key is missing or wrong)
- * 400 Bad request, when the parameters are not correct or required parameters are missing
- *
- */
- /**
- * Main API functions
- *
- * @author roby
- */
- class TNP {
- /*
- * The full process of subscription
- */
- public static function subscribe( $params ) {
- $newsletter = Newsletter::instance();
- $subscription = NewsletterSubscription::instance();
- // default params
- $defaults = array( 'send_emails' => true );
- $params = array_merge( $defaults, $params );
- // Messages
- $options = get_option( 'newsletter', array() );
- // Form field configuration
- $options_profile = get_option( 'newsletter_profile', array() );
- $optin = (int) $options['noconfirmation']; // 0 - double, 1 - single
- $email = $newsletter->normalize_email( stripslashes( $params['email'] ) );
- // Should never reach this point without a valid email address
- if ( $email == null ) {
- return new WP_Error( '-1', 'Email address not valid', array( 'status' => 400 ) );
- }
- $user = $newsletter->get_user( $email );
- if ( $user != null ) {
- $newsletter->logger->info( 'Subscription of an address with status ' . $user->status );
- // Bounced
- if ( $user->status == 'B' ) {
- return new WP_Error( '-1', 'Bounced address', array( 'status' => 400 ) );
- }
- // If asked to put in confirmed status, do not check further
- if ( $params['status'] != 'C' && $optin == 0 ) {
- // Already confirmed
- //if ($optin == 0 && $user->status == 'C') {
- if ( $user->status == 'C' ) {
- set_transient( $user->id . '-' . $user->token, $params, 3600 * 48 );
- $subscription->set_updated( $user );
- // A second subscription always require confirmation otherwise anywan can change other users' data
- $user->status = 'S';
- $subscription->send_activation_email( $user );
- return $user;
- }
- }
- }
- if ( $user != null ) {
- $newsletter->logger->info( "Email address subscribed but not confirmed" );
- $user = array( 'id' => $user->id );
- } else {
- $newsletter->logger->info( "New email address" );
- }
- if ( $optin ) {
- $params['status'] = 'C';
- } else {
- $params['status'] = 'S';
- }
- // Lists
- if ( ! isset( $params['lists'] ) || ! is_array( $params['lists'] ) ) {
- $params['lists'] = array();
- }
- // Public lists: rebuild the array keeping only the valid lists
- $lists = $newsletter->get_lists_public();
- // Public list IDs
- $public_lists = array();
- foreach ( $lists as $list ) {
- $public_lists[] = $list->id;
- }
- // Keep only the public lists
- $params['lists'] = array_intersect( $public_lists, $params['lists'] );
- // Pre assigned lists
- $lists = $newsletter->get_lists();
- foreach ( $lists as $list ) {
- if ( $list->forced ) {
- $params['lists'][] = $list->id;
- }
- }
- // Keep only the public profile fields
- for ( $i = 1; $i <= NEWSLETTER_PROFILE_MAX; $i ++ ) {
- // If the profile cannot be set by subscriber, skip it.
- if ( $subscription->options_profile[ 'profile_' . $i . '_status' ] == 0 ) {
- unset( $params[ 'profile_' . $i ] );
- }
- }
- apply_filters( 'newsletter_api_subscribe', $params );
- $user = TNP::add_subscriber( $params );
- if ( is_wp_error( $user ) ) {
- return ( $user );
- }
- // Notification to admin (only for new confirmed subscriptions)
- if ( $user->status == 'C' ) {
- do_action( 'newsletter_user_confirmed', $user );
- $subscription->notify_admin( $user, 'Newsletter subscription' );
- setcookie( 'newsletter', $user->id . '-' . $user->token, time() + 60 * 60 * 24 * 365, '/' );
- }
- // skip messages if send_emails = false
- if ( ! $params['send_emails'] ) {
- return $user;
- }
- $message_type = ( $user->status == 'C' ) ? 'confirmed' : 'confirmation';
- $subscription->send_message( $message_type, $user );
- return null;
- }
- /*
- * The UNsubscription
- */
- public static function unsubscribe( $params ) {
- $newsletter = Newsletter::instance();
- $user = $newsletter->get_user( $params['email'] );
- // $newsletter->logger->debug($params);
- if ( ! $user ) {
- return new WP_Error( '-1', 'Email address not found', array( 'status' => 404 ) );
- }
- if ( $user->status == 'U' ) {
- return $user;
- }
- $user = $newsletter->set_user_status( $user, 'U' );
- if ( empty( NewsletterSubscription::instance()->options['unsubscribed_disabled'] ) ) {
- $newsletter->mail( $user->email, $newsletter->replace( NewsletterSubscription::instance()->options['unsubscribed_subject'], $user ), $newsletter->replace( NewsletterSubscription::instance()->options['unsubscribed_message'], $user ) );
- }
- NewsletterSubscription::instance()->notify_admin( $user, 'Newsletter unsubscription' );
- return $user;
- }
- /*
- * Adds a subscriber if not already in
- */
- public static function add_subscriber( $params ) {
- $newsletter = Newsletter::instance();
- $subscription = NewsletterSubscription::instance();
- $email = $newsletter->normalize_email( stripslashes( $params['email'] ) );
- if ( ! $email ) {
- return new WP_Error( '-1', 'Email address not valid', array( 'status' => 400 ) );
- }
- $user = $newsletter->get_user( $email );
- if ( $user ) {
- return new WP_Error( '-1', 'Email address already exists', array( 'status' => 400 ) );
- }
- $user = array( 'email' => $email );
- if ( isset( $params['name'] ) ) {
- $user['name'] = $newsletter->normalize_name( stripslashes( $params['name'] ) );
- }
- if ( isset( $params['surname'] ) ) {
- $user['surname'] = $newsletter->normalize_name( stripslashes( $params['surname'] ) );
- }
- if ( ! empty( $params['gender'] ) ) {
- $user['sex'] = $newsletter->normalize_sex( $params['gender'] );
- }
- for ( $i = 1; $i <= NEWSLETTER_PROFILE_MAX; $i ++ ) {
- if ( isset( $params[ 'profile_' . $i ] ) ) {
- $user[ 'profile_' . $i ] = trim( stripslashes( $params[ 'profile_' . $i ] ) );
- }
- }
- // Lists (an array under the key "lists")
- // Preferences (field names are nl[] and values the list number so special forms with radio button can work)
- if ( isset( $params['lists'] ) && is_array( $params['lists'] ) ) {
- foreach ( $params['lists'] as $list_id ) {
- $user[ 'list_' . ( (int) $list_id ) ] = 1;
- }
- }
- if ( ! empty( $params['status'] ) ) {
- $user['status'] = $params['status'];
- } else {
- $user['status'] = 'C';
- }
- $user['token'] = $newsletter->get_token();
- $user['updated'] = time();
- $user['ip'] = Newsletter::get_remote_ip();
- $user = $newsletter->save_user( $user );
- return $user;
- }
- /*
- * Subscribers list
- */
- public static function subscribers( $params ) {
- global $wpdb;
- $newsletter = Newsletter::instance();
- $items_per_page = 20;
- $where = "";
- $query = "select name, email from " . NEWSLETTER_USERS_TABLE . ' ' . $where . " order by id desc";
- $query .= " limit 0," . $items_per_page;
- $list = $wpdb->get_results( $query );
- return $list;
- }
- /*
- * Deletes a subscriber
- */
- public static function delete_subscriber( $params ) {
- global $wpdb;
- $newsletter = Newsletter::instance();
- $user = $newsletter->get_user( $params['email'] );
- if ( ! $user ) {
- return new WP_Error( '-1', 'Email address not found', array( 'status' => 404 ) );
- }
- if ( $wpdb->query( $wpdb->prepare( "delete from " . NEWSLETTER_USERS_TABLE . " where id=%d", (int) $user->id ) ) ) {
- return "OK";
- } else {
- $newsletter->logger->debug( $wpdb->last_query );
- return new WP_Error( '-1', $wpdb->last_error, array( 'status' => 400 ) );
- }
- }
- /*
- * Newsletters list
- */
- public static function newsletters( $params ) {
- global $wpdb;
- $newsletter = Newsletter::instance();
- $list = $wpdb->get_results( "SELECT id, subject, created, status, total, sent, send_on FROM " . NEWSLETTER_EMAILS_TABLE . " ORDER BY id DESC LIMIT 10", OBJECT );
- if ( $wpdb->last_error ) {
- $newsletter->logger->error( $wpdb->last_error );
- return false;
- }
- if ( empty( $list ) ) {
- return array();
- }
- return $list;
- }
- }
|