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:edit
s 到 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 活动内容更新的主要内容,如果未能解决你的问题,请参考以下文章
使用maleorang v3.0 java api发送mailchimp活动
Mailchimp 活动发送错误 - 此活动已发送,无法再次发送