MailChimp 活动内容更新

Posted

技术标签:

【中文标题】MailChimp 活动内容更新【英文标题】:MailChimp Campaign Content Update 【发布时间】:2018-08-06 03:40:16 【问题描述】:

MailChimp 活动内容文档 - https://developer.mailchimp.com/documentation/mailchimp/reference/campaigns/content

我正在尝试通过 API 将活动内容中的一些占位符替换为实际值。起初,我认为可能存在一些语法错误或内部逻辑错误,例如非唯一 mc:edits 到 mc:repeatable 中,这会导致 html 被 MailChimp 拒绝/拒绝,因此更新没有发生,但是,那是不是这样的。

尝试用简单的<p>test</p> 替换 html,但仍然无法正常工作。

这里有几个本地日志,我将使用 xyz 作为我的广告系列 ID:

2018-02-26 16:26:13 [::1][9804][-][warning][application] calling GET /campaigns/xyz/content []

2018-02-26 16:26:13 [::1][9804][-][warning][application] got both plain_text and html versions of content

2018-02-26 16:26:13 [::1][9804][-][warning][application] calling PUT /campaigns/xyz/content "html":"<p>test</p>"

2018-02-26 16:26:14 [::1][9804][-][warning][application] got response [ 'plain_text' => 'test' + other MailChimp stuff such as footer, that were appended automatically by MailChimp, 'html' => '<p>test</p>' ]

// calling GET immediately after PUT in order to see if any update occurred

2018-02-26 16:26:14 [::1][9804][-][warning][application] calling GET /campaigns/xyz/content []

2018-02-26 16:26:14 [::1][9804][-][warning][application] got updated html (my "test" paragraph + auto footer from MailChimp) and proper plain_text

根据这些看起来一切都很好,这意味着两个版本都按预期进行了更新。但是,在下一个 API/MailChimp 仪表板请求中,它会显示旧的 HTML 内容,仅保留我刚刚在纯文本版本中所做的更新。

没有错误,没有什么可调查的。这可能是任何内部 MailChimp 行为。

PS:我知道Setting Mailchimp campaign content html not working 或MailChimp API v3 campaign content template sections,但提供给这些的答案都没有帮助。

PS2:我知道我应该联系 MailChimp,但根据

我们的 MailChimp 支持团队没有接受过深入的 API 故障排除培训。如果您需要开发人员帮助您使用 API 进行配置,请查看我们出色的专家目录,其中列出了可以聘请来提供帮助的第三方 MailChimp 专家。

他们不为 API 故障排除提供支持。

【问题讨论】:

听起来可能是仪表板上的缓存问题?如果您移位刷新,或者稍后再试,它会显示更新的内容吗?如果您使用该模板发送邮件,它会发送旧内容还是新内容? 不光是dashboard,API调用也是,PUT显示正确的内容后马上调用GET,但是再调用一次GET会弹出过时的内容。它可以在 MailChimp 端缓存,但他们声明他们在 GET 上强制更新内容,此外,它似乎没有缓存,因为 1 周后我仍然有正确的纯文本版本和过时的 HTML(刚刚检查过)。更新的内容需要由负责此类工作的人员手动审核。没有人会盲目地将广告系列推送给成千上万的用户,即使这样会奏效。 猜猜我目前唯一的选择是 MailChimp 支持或完全由 API 支持的活动创建界面,如果我想允许像 MailChimp 这样漂亮/用户友好的可编辑块,这需要几个小时的工作和更多的工作时间做。 :( 我遇到了完全相同的问题。响应显示更改已收集,但实际上没有任何更改。 文本版本是否改变(至少)?也有一个开放的赏金,但没有人回答。 :( 【参考方案1】:

MailChimp 不允许更新活动的 HTML 内容,因为活动类型基于模板。

为了更新 HTML 内容,必须将广告系列设置为自定义 HTML 而不是模板。您可以通过向 /campaigns/campaigns/campaign_id 发送 GET API 请求并在响应 (documentation) 中找到 content_type 属性来检查类型。

或者,在仪表板中,可以通过编辑电子邮件的设计来确定类型。 “自己编写代码”下的任何内容都是 HTML,模板当然是模板。

我不完全确定为什么对模板广告系列的 PUT 请求的第一个响应会显示更新的内容,但更改内容类型应该可以让您根据需要进行更新。

希望这会有所帮助!

【讨论】:

模板本质上是围绕 MailChimp 语法格式化的 HTML(从那时起,它在 DB 中存储每个可编辑区域的键和值),你所说的有点道理,但为什么会他们将我们限制在这一点/甚至不响应错误消息,例如“html 只能针对原始 HTML 模板进行修改”... :(您可能是对的,将在几个小时内检查。 如果他们拒绝 HTML,他们为什么要更新文本版本?如果是这种情况,他们也不应该接触文本版本,我称之为糟糕的 API 设计。 @Ravenous 在我看来,如果他们打算通过 API 更新模板活动,他们会添加一种方法来设置 mc:edit 内容区域作为 html 参数的替代方案.或者这可能只是 API 设计中的疏忽。 HTML 可以通过编程方式生成,因此他们也可以确定这不是必需的功能。 @Ravenous 也是。整个 PUT html api 路由有点奇怪。我最终在 mailchimp 编辑器上制作了一个模板,然后导出了它的 HTML。我在我的服务器上有那个 html,然后当我通过我的应用程序创建一个新的广告系列时,我只需发送它,并根据用户输入的空间持有者和数据更新这个 html。这样,竞选活动就是使用我想要的数据进行的。不过,我稍后也会考虑将类型从模板更改为自定义 html。【参考方案2】:

如果有人还在寻找这个问题的答案。

几周前我设法解决了这个问题,但没有通过 API 创建广告系列,而是实际更新了它。

我使用了诸如 [product_card id=123] 之类的占位符,每块/行 3 张卡片,都是可重复的,它们被包装在一个我命名为 product-card 的类中.在 MailChimp 仪表板中,您可能仍会看到占位符,但在预览和任何形式的预览(如缩略图)中,它将正确显示。

在服务器上,我抓取活动的内容,根据 MailChimp 中我的印象“检测”部分名称,并使用我想要的内容更新每个部分。

下面的 php sn-p,一些 Yii2 的东西,但主要是普通的 PHP。我使用$preview 显示模板外观的预览,我知道它在函数中不可见。

/**
 * @param $id - Id of the campaign
 * @param $s  - Whether to save or just preview
 *
 * @return bool
 */
function changeContent($id, $s = false)

    $mcCampaign          = new McCampaign();
    $mcCampaign::$itemId = $id;

    $content = $this->api->get("/campaigns/$id/content");

    if (!isset($content['html'])) return false;

    $template = $content['html'];

    $forgedDom = new \DOMDocument();
    $forgedDom->loadHTML($template);

    $mcSections = [];

    $finder = new \DOMXPath($forgedDom);

    $nodes = $finder->query('//td[contains(@class, "product-card")]');

    // disabling this shit in order to avoid strict errors
    libxml_use_internal_errors(true);

    $mcEditId    = 1;
    $mcEditIndex = 0;
    foreach ($nodes as $key => $node) 
        /** @var \DOMElement $node */
        $textContent = $node->textContent;
        if (!preg_match("#\[product_card id=\d+\]#", $textContent)) continue;

        $productId         = filter_var($textContent, FILTER_SANITIZE_NUMBER_INT);
        $node->textContent = false;

        $product = Product::findOne($productId);

        $productDetails = $product ? $this->renderPartial('/partials/_mc-product', [
            'product' => $product
        ]) : 'Product not found.';

        if ($key != 0) 
            if ($key % 3 == 0) 
                $mcEditId = 1;
                $mcEditIndex++;
             else 
                $mcEditId++;
            
        

        $mcSections["repeat_1:$mcEditIndex:product_card_$mcEditId"] = $productDetails;


        $fragment = $forgedDom->createDocumentFragment();
        $fragment->appendXML($productDetails);

        $node->appendChild($fragment);
    
    libxml_use_internal_errors(false);

    $preview = $forgedDom->saveHTML();

    // just in case
    /* $preview = str_replace(["\n", "\t", "\r"], "", $preview); */

    if ($s) 
        if (!empty($mcSections)) 
            $res = $this->api->put("/campaigns/$id/content", [
                'template' => [
                    'id'       => *template_id_here*,
                    'sections' => $mcSections
                ],
            ]);

            // forcing Mc to rebuild cache
            $this->api->get("/campaigns/$id/content");

            Yii::$app->session->setFlash('success', 'Done.');

            return $this->redirect(['campaign/index']);
         else 
            Yii::$app->session->setFlash('error', 'Something went wrong.');
        
    

【讨论】:

以上是关于MailChimp 活动内容更新的主要内容,如果未能解决你的问题,请参考以下文章

MailChimp RSS 活动:强制包含旧帖子

使用maleorang v3.0 java api发送mailchimp活动

Mailchimp 活动发送错误 - 此活动已发送,无法再次发送

只需一次调用 MailChimp API v3 即可获取所有 mailchimp 活动的详细信息

缺少 drupal mailchimp 活动内容部分

创建活动时 Mailchimp 自定义模板空白