apiUrl = $apiUrl; $this->apiKey = $apiKey; } public function default_options() { return array( 'api_key' => $this->apiKey, 'api_output' => 'json' ); } public function make_request($action, $options = array(), $method = 'GET') { /* Build request options string. */ $request_options = $this->default_options(); $request_options['api_action'] = $action; if ($request_options['api_action'] == 'contact_edit') $request_options['overwrite'] = '0'; $request_options = http_build_query($request_options); $request_options .= ($method == 'GET') ? '&' . http_build_query($options) : null; /* Build request URL. */ $request_url = untrailingslashit($this->apiUrl) . '/admin/api.php?' . $request_options; $response = null; /* Execute request based on method. */ switch ($method) { case 'POST': $args = array( 'body' => $options, 'timeout' => 30 ); $response = wp_remote_post($request_url, $args); break; case 'GET': $response = wp_remote_get($request_url, [ 'timeout' => 30 ]); break; } $error = $this->maybeError($response); if ($error) { return $error; } return json_decode($response['body'], true); } /** * Test the provided API credentials. * * @access public * @return bool */ public function auth_test() { /* Build options string. */ $request_options = $this->default_options(); $request_options['api_action'] = 'list_paginator'; $request_options = http_build_query($request_options); /* Setup request URL. */ $request_url = untrailingslashit($this->apiUrl) . '/admin/api.php?' . $request_options; /* Execute request. */ $response = wp_remote_get($request_url); $error = $this->maybeError($response); if ($error) { return $error; } return true; } /** * Get all custom list fields. * * @access public * @return array */ public function get_custom_fields() { return $this->make_request('list_field_view', array('ids' => 'all')); } public function getContacts($args = ['offset' => 0, 'status' => -1]) { $args = wp_parse_args( $args, array( 'offset' => 0, 'status' => $args['status'], 'include' => 'contactTags,contactLists,fieldValues', 'limit' => 100, 'api_key' => $this->apiKey, ) ); $subscribers = array(); $request = add_query_arg( $args, untrailingslashit( $this->apiUrl ) . '/api/3/contacts' ); $response = wp_safe_remote_get( $request ); $error = $this->maybeError( $response ); if ( $error ) { return $error; } $response = json_decode( wp_remote_retrieve_body( $response ) ); if ( ! empty( $response->contacts ) ) { // Base subscriber data. foreach ( $response->contacts as $contact ) { $subscribers[ $contact->id ] = array( 'first_name' => $contact->{'firstName'}, 'last_name' => $contact->{'lastName'}, 'email' => $contact->{'email'}, 'phone' => $contact->{'phone'}, 'cdate' => $contact->{'cdate'}, 'ip' => $contact->{'ip'}, 'status' => 1, // @todo this should be checked based on the list membership. 'tags' => array(), 'lists' => array(), 'fields' => array(), ); } // Fields. if ( ! empty( $response->{'fieldValues'} ) ) { foreach ( $response->{'fieldValues'} as $field ) { if ( false !== strpos( $field->value, '||' ) ) { $type = 'checkbox'; } else { $type = 'text'; } $subscribers[ $field->contact ]['fields'][] = array( 'val' => $field->value, 'perstag' => $field->field, 'type' => $type, ); } } // Tags. if ( ! empty( $response->{'contactTags'} ) ) { foreach ( $response->{'contactTags'} as $tag ) { $subscribers[ $tag->contact ]['tags'][] = $tag->tag; } } // Lists. if ( ! empty( $response->{'contactLists'} ) ) { foreach ( $response->{'contactLists'} as $list ) { $subscribers[ $list->contact ]['lists'][] = array( 'listid' => $list->list ); } } } return $subscribers; } public function contactPaginator($args = ['limit' => 20, 'public' => 0]) { return $this->make_request('contact_paginator', $args); } /** * Get all lists in the system. * * @access public * @return array */ public function get_lists() { return $this->make_request('list_list', array('ids' => 'all')); } public function getTags() { return $this->make_request('tags_list', array('ids' => 'all')); } public function maybeError($response) { /* If invalid content type, API URL is invalid. */ if (is_wp_error($response)) return $response; $contentType = isset($response['headers']['content-type']) ? (string) $response['headers']['content-type'] : ''; if (strpos($contentType, 'application/json') === false) { return new \WP_Error('error', 'Invalid API URL'); } if ($response['response']['code'] > 300) { return new \WP_Error('API_Error', $response['response']['message'], $response); } $body = json_decode($response['body'], true); if (isset($body['result_code']) && $body['result_code'] == 0) { $message = 'Invalid API'; return new \WP_Error('API_Error', $message, $response); } return null; } }