php 如何通过API向mailchimp用户添加“标签”

uttx8gqw  于 2023-09-29  发布在  PHP
关注(0)|答案(8)|浏览(108)

希望通过API添加tags到我的邮件列表成员。但是我不知道在documentation中向何处传递标记。有没有人能举个例子,说明如何通过API更新与成员相关联的标记?

ma8fv8wu

ma8fv8wu1#

如果要创建成员并在执行此操作时添加标记,可以按以下方式指定标记属性:

$data = array(
              'apikey'        => $api_key,
              'email_address' => $email,
              'status'     => $status,
              'tags'  => array('your-tag-name'),
              'merge_fields'  => array(
                    'FNAME' => $fname,
                    'LNAME' => $lname
                  )
            );

尽管MC API有些地方会告诉你填写一个名称和一个状态,它帮助我将标签定义为一个数组,但只粘贴标签的名称。
Seefan在这个帖子中的回答帮助了我,我想我想帮助一个花了几天时间的人(像我一样)弄清楚“标签”是如何指定的:add tags to mailchimp subscriber created via api php

gywdnpxw

gywdnpxw2#

标记替换了静态段。因此,用于创建标记以及向成员添加和删除标记的端点与以前用于管理段的端点相同。以下是有关端点的文档,用于通过API管理标记,其中包括请求和响应主体参数以及示例请求和响应:
http://developer.mailchimp.com/documentation/mailchimp/reference/lists/segments/
为了给你的成员添加标签,你需要在'static_segment'数组参数中包含他们的电子邮件地址。
希望能帮上忙。

5sxhfpxr

5sxhfpxr3#

这是添加标签的官方方法:https://developer.mailchimp.com/documentation/mailchimp/reference/lists/members/tags/它工作正常,只是在我的测试中,响应消息是空的,即使添加了标记。
以下是Google Apps脚本中的示例代码:

payload = '{\
  "tags": [\
    {\
     "name":"' + tagName + '",\
     "status":"' + tagStatus + '"\
    }\
   ]\
}'
;

params = {
  "method": "POST",
  "headers":MC_headers,
  "payload": payload,
  "muteHttpExceptions": true
};
url = MC_url + 'lists/' + MC_IDs.listId + '/members/' + sub_hash + '/tags';
response = UrlFetchApp.fetch(url, params);
esbemjvw

esbemjvw4#

显然Mailchimp的“标签”是“段”。
我编写了几个函数,允许我按名称(而不是ID)向成员(即订阅者)的电子邮件地址。

/**
 * 
 * @param string $emailAddress
 * @param array $tags
 * @return void
 */
public function addTagsToContact($emailAddress, $tags) {
    $list_id = $this->getDefaultListId();
    foreach ($tags as $tag) {
        $this->addMemberToSegment($emailAddress, $list_id, $tag);
    }
}

/**
 * Add a tag to a subscriber (tags replaced segments https://stackoverflow.com/a/52315577/470749)
 * 
 * @param string $emailAddress
 * @param string $list_id
 * @param string $segment_name
 * @return array
 */
public function addMemberToSegment($emailAddress, $list_id, $segment_name) {
    $api = Newsletter::getApi();
    $segmentsByName = $this->getSegments($list_id);
    $segment_id = $segmentsByName[$segment_name]['id'];
    $response = $api->post("lists/$list_id/segments/$segment_id", [
        'members_to_add' => [$emailAddress]
    ]); //https://developer.mailchimp.com/documentation/mailchimp/reference/lists/segments/#create-post_lists_list_id_segments_segment_id
    return $response;
}

/**
 * 
 * @param string $list_id
 * @return array
 */
public function getSegments($list_id) {//https://developer.mailchimp.com/documentation/mailchimp/reference/lists/segments/#%20
    $segmentsByName = [];
    $api = Newsletter::getApi();
    $count = 50; //default is 10
    $offset = 0;
    do {
        $url = "lists/$list_id/segments/?" . http_build_query(['count' => $count, 'offset' => $offset]);
        Log::debug($url);
        $response = $api->get($url);
        $total_items = $response['total_items'];
        foreach ($response['segments'] as $segment) {
            $segmentsByName[$segment['name']] = $segment;
        }
        $offset += $count;
    } while (count($segmentsByName) < $total_items);
    //Log::debug(json_encode($segmentsByName));
    return $segmentsByName;
}

/**
 * 
 * @return string
 */
public function getDefaultListId() {
    return config('newsletter.lists.subscribers.id');
}

这依赖于https://github.com/spatie/laravel-newsletter库。
P.S.非常感谢@Jelan,他的回答让我走上了正确的道路!

mutmk8jj

mutmk8jj5#

我也花了一段时间才弄明白这一点。他们的文档不清楚,似乎有两种方法来添加标签,要么通过标签端点使用POST,要么通过更新用户通过PATCH。下面是PHP中POST的一个例子:

function tagUser($email){
global $api_key;
global $listId;
$hashedEmail = md5(strtolower($email));
$args = array(
    'method' => 'POST',
    'headers' => array(
        'Authorization' => 'Basic ' . base64_encode( 'user:'. $api_key )
    ),
    'body' => json_encode(array(
        'tags' => array(['name'=>'healthy','status'=>'active'])
    ))
);
$response = wp_remote_post( 'https://usxx.api.mailchimp.com/3.0/lists/'.$listId.'/members/'.$hashedEmail.'/tags', $args );

$body = json_decode( $response['body'] );

}
jgwigjjp

jgwigjjp6#

这是WordPress的代码,但应该有帮助。我确实从另一个答案中得到了大部分信息,但在其他地方找不到它的工作。请注意,只有当订阅者已经存在于列表中,然后您可以标记或取消标记它们时,此操作才有效。

$api_key = XXXXXXXXXXXXXXXXXXX-us20';
    $email = '[email protected]';
    $list_id = 'XXXXXXXX'; //This is the list /Audience id
    $tag_name_text = 'XXXXX'; //This can be whatever you want it to be. Mail chimp will add it to the tags if not already on the system

    //TAGS
    $args = array(
      'method' => 'POST',
        'headers' => array(
            'Authorization' => 'Basic ' . base64_encode( 'user:'. $api_key )
    ),
    'body' => json_encode(array(

            'tags' => array(
                    ['name' => $tag_name_text,
                    'status' => 'active']
            )



    ))
);
$response = wp_remote_post( 'https://' . substr($api_key,strpos($api_key,'-')+1) . '.api.mailchimp.com/3.0/lists/' . $list_id . '/members/'.md5(strtolower($email)).'/tags', $args );
if ($response['response']['code'] == 200 && $body->status == $status || $response['resp`enter code here`onse']['code'] == 204) {
    //echo 'The you have been successfully ' . $status . '. Please check your emails';

} else {
    echo '<b>' . $response['response']['code'] . $body->title . ':</b> ' . $body->detail;
}
ikfrs5lh

ikfrs5lh7#

使用Grails按名称将标签列表添加到通过电子邮件发送的用户列表的完整示例

请注意,您可能需要设置一些错误检查,以查看MailChimp受众成员是否存在。

BusinessLogicController.groovy

/* 
 * Add list of tags by name to list of members
 */
def addTagsByNameToUser(){
    List<string> tagNamesToAdd = ['foo', 'bar']
    def addResult = mailChimpService.addTagsToContactsByName(["[email protected]", "[email protected]"], tagNamesToAdd)
}

MailChimpService.groovy

import grails.util.Holders
import groovyx.net.http.Method

class MailChimpService {

   def grailsApplication
   ApiConsumerService apiConsumerService

   final String AUTH = Holders.config.grails.mailChimp.auth
   final String BASEURL = "https://us19.api.mailchimp.com/3.0/"
   final String LISTID = "abc123"

   //Add list of tags by name to list of subscribers by email
   def addTagsToContactsByName(List emailAddresses, List tags = []) {
      tags.each { tagName ->
         addMembersToSegment(emailAddresses, tagName);
      }
   }

   //Add a tag to a subscriber by name
   def addMembersToSegment(List emailAddresses, String segmentName) {
      def segmentsByName = getAllSegmentsInList()

      String segmentId = segmentsByName["$segmentName"] as String

      return addMailChimpTagToUsers(emailAddresses, segmentId)
   }

   //Get information about all available segments for a specific list.
   def getAllSegmentsInList(Map query = [:]) {
      String path = "lists/"+LISTID+"/segments/"
      Map segments = [:]
      def segmentResults = apiConsumerService.getRequest(BASEURL, path, AUTH, query, Method.GET)
      segmentResults.segments.each { segment ->
         segments.put(segment.name, segment.id)
      }

      return segments
   }

   //Add list of tags to a list members. 
   def addMailChimpTagToUsers(List emailAddresses = [], String segmentId) {
      String path = "lists/LISTID/segments/" + segmentId

      apiConsumerService.postRequest(BASEURL, path, AUTH, ['members_to_add': emailAddresses], Method.POST)
    }    
}

ApiConsumerService.groovy

import grails.transaction.Transactional
import groovyx.net.http.ContentType
import groovyx.net.http.HTTPBuilder
import groovyx.net.http.Method

@Transactional
class ApiConsumerService {

   //POST REQUEST
   def postRequest(String baseUrl, String path, String auth, Map query = [:], Method method = Method.POST) {
      try {
         HTTPBuilder http = new HTTPBuilder(baseUrl)
         http.headers['Authorization'] = 'Basic ' + "${auth}".getBytes('iso-8859-1').encodeBase64()

         http.request(method, ContentType.JSON) { req ->
            uri.path = path
            if (method == Method.POST) {
                body = query
            } else {
                uri.query = query
            }

            headers.'Accept' = 'application/json'
            headers.'User-Agent' = "MyPetCerts/US19"
            response.success = { resp, json ->
                return json
            }

            response.failure = { resp, json ->
                println "POST response status: ${resp.statusLine}"
            }
         }
      } catch (groovyx.net.http.HttpResponseException ex) {
           ex.printStackTrace()
           return null
      } catch (java.net.ConnectException ex) {
           ex.printStackTrace()
           return null
      }
   }

   //GET Request
   def getRequest(String baseUrl, String path, String auth, Map query = [:], Method method = Method.GET) {
      return postRequest(baseUrl, path, auth, query, method)
   }
}
lvjbypge

lvjbypge8#

工作示例-如何使用API v3和PHP(2023)在MailChimp上添加/删除标签

即使有了所有的答案,这也需要大量的时间来工作。
由于这在2023年仍然是一个相关的问题,这里有一个例子,已经过测试,可以在2023年一步一步地工作。
这是一个比较完整的答案,不仅给出了MailChimp所需的标签数组格式,而且给出了正确生成该数组所需的所有步骤。根据我的经验,知道阵列的 * 格式 *-但不知道 * 如何创建它 * -只是成功的一半。
场景

  • 带有HTML表单的网页,表单上有一系列复选框。
  • 每个复选框都有一个ID和名称,与标签名称匹配,例如BusinessEnglishPro(在本例中只是一个在线课程名称,去掉了空格)

  • 一个onclick处理程序被分配给每个复选框。它循环检查复选框,创建复选框名称(标记名称)及其“checked”状态的关联数组,然后将表单POST到我们的PHP处理程序。我们将在后面看到它创建的数组。

这是HTML和JavaScript部分,允许我们获取标记列表。

PHP处理器

然后JavaScript会将上面的数组POST到我们的PHP处理器。
请注意,在下面的内容中,假设MailChimp联系人存在,我们只是希望更新其关联的标记。
让我们包括我们需要的MailChimp信息。下面的信息自然是虚拟的,你可以在这里插入自己的信息:

$mc_api = 'f1211112223334445550ffd-us21'; // MailChimp API Key
$mc_url_prefix = substr($mc_api,strpos($mc_api,'-')+1) ; // e.g.us21
$mc_audience_id = '654321abc'; // MailChimp Audience ID

首先检查我们有一些POST数据,并获得标签数组(课程名称)及其相关的表单复选框状态:

if ( $queryType == 'POST' )  {     
      $postdata= json_decode(file_get_contents('php://input'), true);   
      ...
 }

如果商务英语免费被勾选,我们将收到$postdata:

(
            [BusinessEnglishFree] => 1
            [BusinessEnglishPro]  => 
        )

这里省略了验证/过滤这些数据的代码,但对于我们的示例,我们可以假设它一切正常,由我们的表单发布,通过了我们的安全检查等。你可以添加一个WordPress nonse到数组中,如果有效,将其从数组中删除,例如只留下一个标签数组。
为了回答如何更新标签的具体问题,我们需要将这个数组转换为MailChimp喜欢的标签数组。这看起来像这样:

$tags_info = array(
            'tags' => array(    
                array('name' => 'BusinessEnglishFree', 'status' => 'active' ),
                array('name' => 'BusinessEnglishPro',  'status' => 'inactive' )
            )
        );

要创建上面结构正确的$tagsinfo数组,可以使用下面的代码首先创建上面的“最里面”数组。

/* Create an empty inner array to hold the tags, each itself an array.  */
        $tags_inner_array = array();
        
        /* Create, too, a temp array that will hold info about just one tag */
        $tmp_tag_info = array();

        /* Now loop through our array of checkbox names (which are tag names) and their checked state */
        foreach ($postdata as $tagname => $chboxstate ){
            // Convert Boolean checkbox state to an 'active|inactive' string.  (test) ? value if true : value if false
            $chboxstate ? $tagstate = 'active'  :   $tagstate = 'inactive';         
            
            // Populate array with current tag info
            $tmp_tag_info['name']   =  $tagname  ;
            $tmp_tag_info['status'] =  $tagstate  ;

            // ... and add above tag info to the tags inner-array
            array_push($tags_inner_array, $tmp_tag_info);               
        }

现在我们可以像这样轻松地创建完整的$tags_info数组:

$tags_info = array(
    'tags' =>   $tags_inner_array
);

最后,我们可以构造应该提交给MailChimp的参数。请注意,我们在最后一行对上面的$tags_info数组进行了json_encode:

$mailchimp_args = array(
            'headers'   => array(   
                'Authorization' => 'Basic ' . base64_encode( 'user:'. $mc_api ) 
            ),
            'Access-Control-Allow-Origin'   => '*',
            'timeout'                       => 6,
            'method'    => 'POST',
                'body'      => json_encode( $tags_info )
        );

为了构造POST的URL,我们使用以下内容。注意它以'/tags'结尾:

// Construct MailChimp Tags URL
    $mailchimp_URL  = 'https://' . $mc_url_prefix . '.api.mailchimp.com/3.0/lists/' . $mc_audience_id . '/members/' . md5(strtolower($user_email)) . '/tags';

POST到MailChimp并检索响应代码。在这里,我们使用WordPress函数来做到这一点,但要注意的关键事情-如果你用另一种方式来做-是成功的实际响应代码:

// Call MailChimp ...
$response       = wp_remote_get(    $mailchimp_URL , $mailchimp_args );
$response_code  = wp_remote_retrieve_response_code( $response ); // 204 is 'OK'

'success'响应代码是204 -注意-为了完成我们的示例,我们将创建一个数组$return_to_js来保存它:

$return_to_js = array();
 if ( 204 === $response_code ) {                    
    $return_to_js['status'] = "All OK. Mailing preferences updated on MailChimp." ;                 
}

您也可以检查错误等,但这里省略了这些代码。
最后,如果我们通过JavaScript AJAX 调用PHP处理器脚本,我们可以通过发送$return_to_js数组来传递上面创建的状态消息:

return $return_to_js;

我希望这个更完整的答案是有帮助的,当你成功地更新你的标签时,你也会在房间里跳舞。

相关问题