TNP.php 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312
  1. <?php
  2. /*
  3. * TNP classes for internal API
  4. *
  5. * Error reference
  6. * 404 Object not found
  7. * 403 Not allowed (when the API key is missing or wrong)
  8. * 400 Bad request, when the parameters are not correct or required parameters are missing
  9. *
  10. */
  11. /**
  12. * Main API functions
  13. *
  14. * @author roby
  15. */
  16. class TNP {
  17. /*
  18. * The full process of subscription
  19. */
  20. public static function subscribe( $params ) {
  21. $newsletter = Newsletter::instance();
  22. $subscription = NewsletterSubscription::instance();
  23. // default params
  24. $defaults = array( 'send_emails' => true );
  25. $params = array_merge( $defaults, $params );
  26. // Messages
  27. $options = get_option( 'newsletter', array() );
  28. // Form field configuration
  29. $options_profile = get_option( 'newsletter_profile', array() );
  30. $optin = (int) $options['noconfirmation']; // 0 - double, 1 - single
  31. $email = $newsletter->normalize_email( stripslashes( $params['email'] ) );
  32. // Should never reach this point without a valid email address
  33. if ( $email == null ) {
  34. return new WP_Error( '-1', 'Email address not valid', array( 'status' => 400 ) );
  35. }
  36. $user = $newsletter->get_user( $email );
  37. if ( $user != null ) {
  38. $newsletter->logger->info( 'Subscription of an address with status ' . $user->status );
  39. // Bounced
  40. if ( $user->status == 'B' ) {
  41. return new WP_Error( '-1', 'Bounced address', array( 'status' => 400 ) );
  42. }
  43. // If asked to put in confirmed status, do not check further
  44. if ( $params['status'] != 'C' && $optin == 0 ) {
  45. // Already confirmed
  46. //if ($optin == 0 && $user->status == 'C') {
  47. if ( $user->status == 'C' ) {
  48. set_transient( $user->id . '-' . $user->token, $params, 3600 * 48 );
  49. $subscription->set_updated( $user );
  50. // A second subscription always require confirmation otherwise anywan can change other users' data
  51. $user->status = 'S';
  52. $subscription->send_activation_email( $user );
  53. return $user;
  54. }
  55. }
  56. }
  57. if ( $user != null ) {
  58. $newsletter->logger->info( "Email address subscribed but not confirmed" );
  59. $user = array( 'id' => $user->id );
  60. } else {
  61. $newsletter->logger->info( "New email address" );
  62. }
  63. if ( $optin ) {
  64. $params['status'] = 'C';
  65. } else {
  66. $params['status'] = 'S';
  67. }
  68. // Lists
  69. if ( ! isset( $params['lists'] ) || ! is_array( $params['lists'] ) ) {
  70. $params['lists'] = array();
  71. }
  72. // Public lists: rebuild the array keeping only the valid lists
  73. $lists = $newsletter->get_lists_public();
  74. // Public list IDs
  75. $public_lists = array();
  76. foreach ( $lists as $list ) {
  77. $public_lists[] = $list->id;
  78. }
  79. // Keep only the public lists
  80. $params['lists'] = array_intersect( $public_lists, $params['lists'] );
  81. // Pre assigned lists
  82. $lists = $newsletter->get_lists();
  83. foreach ( $lists as $list ) {
  84. if ( $list->forced ) {
  85. $params['lists'][] = $list->id;
  86. }
  87. }
  88. // Keep only the public profile fields
  89. for ( $i = 1; $i <= NEWSLETTER_PROFILE_MAX; $i ++ ) {
  90. // If the profile cannot be set by subscriber, skip it.
  91. if ( $subscription->options_profile[ 'profile_' . $i . '_status' ] == 0 ) {
  92. unset( $params[ 'profile_' . $i ] );
  93. }
  94. }
  95. apply_filters( 'newsletter_api_subscribe', $params );
  96. $user = TNP::add_subscriber( $params );
  97. if ( is_wp_error( $user ) ) {
  98. return ( $user );
  99. }
  100. // Notification to admin (only for new confirmed subscriptions)
  101. if ( $user->status == 'C' ) {
  102. do_action( 'newsletter_user_confirmed', $user );
  103. $subscription->notify_admin( $user, 'Newsletter subscription' );
  104. setcookie( 'newsletter', $user->id . '-' . $user->token, time() + 60 * 60 * 24 * 365, '/' );
  105. }
  106. // skip messages if send_emails = false
  107. if ( ! $params['send_emails'] ) {
  108. return $user;
  109. }
  110. $message_type = ( $user->status == 'C' ) ? 'confirmed' : 'confirmation';
  111. $subscription->send_message( $message_type, $user );
  112. return null;
  113. }
  114. /*
  115. * The UNsubscription
  116. */
  117. public static function unsubscribe( $params ) {
  118. $newsletter = Newsletter::instance();
  119. $user = $newsletter->get_user( $params['email'] );
  120. // $newsletter->logger->debug($params);
  121. if ( ! $user ) {
  122. return new WP_Error( '-1', 'Email address not found', array( 'status' => 404 ) );
  123. }
  124. if ( $user->status == 'U' ) {
  125. return $user;
  126. }
  127. $user = $newsletter->set_user_status( $user, 'U' );
  128. if ( empty( NewsletterSubscription::instance()->options['unsubscribed_disabled'] ) ) {
  129. $newsletter->mail( $user->email, $newsletter->replace( NewsletterSubscription::instance()->options['unsubscribed_subject'], $user ), $newsletter->replace( NewsletterSubscription::instance()->options['unsubscribed_message'], $user ) );
  130. }
  131. NewsletterSubscription::instance()->notify_admin( $user, 'Newsletter unsubscription' );
  132. return $user;
  133. }
  134. /*
  135. * Adds a subscriber if not already in
  136. */
  137. public static function add_subscriber( $params ) {
  138. $newsletter = Newsletter::instance();
  139. $subscription = NewsletterSubscription::instance();
  140. $email = $newsletter->normalize_email( stripslashes( $params['email'] ) );
  141. if ( ! $email ) {
  142. return new WP_Error( '-1', 'Email address not valid', array( 'status' => 400 ) );
  143. }
  144. $user = $newsletter->get_user( $email );
  145. if ( $user ) {
  146. return new WP_Error( '-1', 'Email address already exists', array( 'status' => 400 ) );
  147. }
  148. $user = array( 'email' => $email );
  149. if ( isset( $params['name'] ) ) {
  150. $user['name'] = $newsletter->normalize_name( stripslashes( $params['name'] ) );
  151. }
  152. if ( isset( $params['surname'] ) ) {
  153. $user['surname'] = $newsletter->normalize_name( stripslashes( $params['surname'] ) );
  154. }
  155. if ( ! empty( $params['gender'] ) ) {
  156. $user['sex'] = $newsletter->normalize_sex( $params['gender'] );
  157. }
  158. for ( $i = 1; $i <= NEWSLETTER_PROFILE_MAX; $i ++ ) {
  159. if ( isset( $params[ 'profile_' . $i ] ) ) {
  160. $user[ 'profile_' . $i ] = trim( stripslashes( $params[ 'profile_' . $i ] ) );
  161. }
  162. }
  163. // Lists (an array under the key "lists")
  164. // Preferences (field names are nl[] and values the list number so special forms with radio button can work)
  165. if ( isset( $params['lists'] ) && is_array( $params['lists'] ) ) {
  166. foreach ( $params['lists'] as $list_id ) {
  167. $user[ 'list_' . ( (int) $list_id ) ] = 1;
  168. }
  169. }
  170. if ( ! empty( $params['status'] ) ) {
  171. $user['status'] = $params['status'];
  172. } else {
  173. $user['status'] = 'C';
  174. }
  175. $user['token'] = $newsletter->get_token();
  176. $user['updated'] = time();
  177. $user['ip'] = Newsletter::get_remote_ip();
  178. $user = $newsletter->save_user( $user );
  179. return $user;
  180. }
  181. /*
  182. * Subscribers list
  183. */
  184. public static function subscribers( $params ) {
  185. global $wpdb;
  186. $newsletter = Newsletter::instance();
  187. $items_per_page = 20;
  188. $where = "";
  189. $query = "select name, email from " . NEWSLETTER_USERS_TABLE . ' ' . $where . " order by id desc";
  190. $query .= " limit 0," . $items_per_page;
  191. $list = $wpdb->get_results( $query );
  192. return $list;
  193. }
  194. /*
  195. * Deletes a subscriber
  196. */
  197. public static function delete_subscriber( $params ) {
  198. global $wpdb;
  199. $newsletter = Newsletter::instance();
  200. $user = $newsletter->get_user( $params['email'] );
  201. if ( ! $user ) {
  202. return new WP_Error( '-1', 'Email address not found', array( 'status' => 404 ) );
  203. }
  204. if ( $wpdb->query( $wpdb->prepare( "delete from " . NEWSLETTER_USERS_TABLE . " where id=%d", (int) $user->id ) ) ) {
  205. return "OK";
  206. } else {
  207. $newsletter->logger->debug( $wpdb->last_query );
  208. return new WP_Error( '-1', $wpdb->last_error, array( 'status' => 400 ) );
  209. }
  210. }
  211. /*
  212. * Newsletters list
  213. */
  214. public static function newsletters( $params ) {
  215. global $wpdb;
  216. $newsletter = Newsletter::instance();
  217. $list = $wpdb->get_results( "SELECT id, subject, created, status, total, sent, send_on FROM " . NEWSLETTER_EMAILS_TABLE . " ORDER BY id DESC LIMIT 10", OBJECT );
  218. if ( $wpdb->last_error ) {
  219. $newsletter->logger->error( $wpdb->last_error );
  220. return false;
  221. }
  222. if ( empty( $list ) ) {
  223. return array();
  224. }
  225. return $list;
  226. }
  227. }