图片无法在 WP 5.3 中发布到 Discourse

我猜这与 5.3 更新中对块的更改有关。您可以在这里查看该帖子:In Conversation with Anna Morgan - Discussions - Nature Photographers Network

顺便提一下,我也有这段用于 CDN 图像的代码片段:

add_filter( 'wp_discourse_excerpt', 'wpdc_custom_excerpt' );
function wpdc_custom_excerpt( $content ) {
    
    return apply_filters( 'as3cf_filter_post_local_to_s3', $content );
}

我的仪表板中也出现了这个错误,我相当确定这是由 WordPress 插件引起的。

我发现了这篇帖子 https://meta.discourse.org/t/wp-discourse-plug-in-being-odd/133287/10,但我使用的是 1.9.7 版本,且发布用户名是一个活跃账户。

我今天会着手调查这个问题。我在我的网站上看到的情况是,从 WordPress 发布的图片在 Discourse 尝试下载远程图片之前都能正确显示。一旦 Discourse 开始下载,就会出现像你在帖子中看到的这种标记:

![](upload://kw9YUV5qtquQf5xwatRof6S9RmK.jpeg)

我不确定这是否与 WordPress 5.3 的更新有关。

如果你收到了“检测到使用已弃用的身份验证方法的 API 请求”警告,这不会导致你遇到的图片问题。WP Discourse 1.9.6 及更高版本不应再引发该警告。该插件发出的所有 API 请求现在都使用基于请求头的身份验证方式。

问题似乎在于,当 Discourse 上传的 Markdown 被 HTML 标签包裹时,Markdown 无法被正确解析。例如,在 Discourse 的 PullHotlinkedImages 任务运行后,我在 WordPress 文章中看到的内容如下:

<small>Originally published at:		https://scossar.com/figure-tags-cause-issues/
		</small><br>
<figure class="wp-block-image">![](upload://3hPHOMnM5v5srjlz5QWGmVxY4AL.jpeg)</figure>

通过编辑文章并移除包裹 Markdown 链接的 HTML 标签可以解决此问题,但仍需找到更完善的解决方案。

抱歉打扰,请问 Simon 你正在处理这个吗?还是已经有人被分配了?

问题在于,当带有图片的帖子发布到 Discourse 时,帖子的 HTML 最初看起来像这样:

<figure><img src="https://example.com/wp-content/uploads/your-image.png" /></figure>

如果在 Discourse 上启用了“将远程图片下载到本地”的站点设置,当 Discourse 从 WordPress 下载帖子时,图片链接将会失效。只要包含远程 URL 的图片标签被 HTML 标签包裹,就会发生此问题。

解决此问题最简单的方法是:要么禁用“将远程图片下载到本地”的站点设置,要么不从 WordPress 发布完整的帖子内容。

未来,WP Discourse 插件可能会移除发布完整帖子的选项。从 WordPress 向 Discourse 发布完整帖子内容时可能会出现多种问题。大多数这些问题可以通过从 WordPress 发布摘要,然后在 Discourse 上使用“显示完整帖子”按钮来展示完整帖子的方式解决。这对您的情况来说是否可行?

另一种可能的解决方案是自定义用于发布 WordPress 帖子的模板。可以从帖子中提取图片,然后与帖子摘要一起发布。通过自定义模板,可以将图片的 HTML 结构设计为不与 Discourse 的 Markdown 处理器冲突。

谢谢 Simon,将远程图片下载到本地 是目前最简单的解决方案。听到“发布完整帖子”的功能可能会取消,我感到有些沮丧。我目前的使用方式是:先在 WordPress 上发布帖子,然后自动发布到 Discourse 的“文章”板块,该板块默认对所有用户设置为“关注首帖”。这样一来,每个人都会收到包含文章完整内容的邮件,最棒的是,他们只需直接回复邮件即可添加评论。如果必须额外访问网站,大多数人可能根本不会阅读文章,尤其是当内容只是简短摘要且缺少图片时——而图片对我们的网站来说非常重要。如果“发布完整帖子”的功能被取消,我可能会考虑放弃 WordPress,改为直接在 Discourse 上发布文章。虽然这对 SEO 等方面并不理想,但我认为用户参与度更为重要。

我也希望能支持完整的发布功能。
我还不太确定你在这里具体建议了什么……
你会如何提取图片?使用正则表达式吗?
我可以想象用一个正则表达式将图片标签替换为正确的 Markdown 语法。你是这个意思吗?这样做可行吗?

不。如果我没有过去尝试过这类方法,我可能会想这么做。这篇 Stack Overflow 帖子大致解释了这个问题:https://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454。

我打算研究一下让插件组装帖子内容的基本 HTML 版本会有多困难。最后的备选方案是使用 DOMDocument 方法来解析内容。Discourse 返回的注释就是用这些方法解析的,而我尚未收到关于此方法存在问题的报告。

我认为发布摘要,然后让用户点击 Discourse 上的“显示完整帖子”按钮来查看完整帖子,可能是解决此问题的最佳方案,但我不太愿意从 WP Discourse 插件中移除“发布完整帖子”选项。

感谢您的解释。
我会让作者直接发布文章并点击“更新”,因为在 WordPress 上先发布再更新文章似乎总能修复 Discourse 上的图片问题。

我宁愿让作者每篇文章多花 1 秒钟,也不愿看到“完整发布”选项消失:wink:

如果您已启用 Discourse 的“将远程图片下载到本地”站点设置,那么在帖子更新后的几分钟内,图片不会再次消失吗?如果不是这种情况,我会进一步调查为何此方法能解决问题。

我确实已启用此设置,且在数天甚至数周后,我所有最新文章中的图片仍显示正常。例如,在这篇 1 个月前的文章 中,我曾遇到过图片显示问题。

此外,我查看了 Discourse 端的图片 URL,发现链接直接指向 WordPress,说明图片并未被下载至 Discourse。这是否是因为网站和论坛共享同一个域名?
(网站:https://monocycle.info,论坛:https://forum.monocycle/info)

当我更新 Discourse 帖子时,仍然显示一个巨大的损坏缩略图,而不是图片。编辑帖子时,我在 < > 中看到以下内容:

img src="http://mysite.com/wp-content/uploads/2020/03/asha2.jpg" class="ss-hidden-pin-image" alt="Blog" data-pin-url="" data-pin-media="http://mysite.com/wp-content/uploads/2020/03/asha2.jpg" data-pin-description=""/

您的 WordPress 站点是 http 还是 https?

目前使用的是 HTTP,不过我正在研究 HTTPS。

如果页面是 HTTPS,浏览器将不会加载来自不安全来源的内容。

如果您依赖 HTML 元素来加载图像,那么直到您的主站使用 HTTPS 之前,这都不会生效。

我刚刚将 WP Discourse 版本 2.0.2 推送到 WordPress 插件仓库。此次更新应能解决在使用区块编辑器发布帖子到 Discourse 时出现的图片损坏问题。

现在,帖子中的图片、图片画廊,以及 YouTube 和 Vimeo 视频都会被提取并以 Discourse 能够处理的方式进行格式化。如果您在更新后遇到任何问题,请随时告知。如果仍有某些 WordPress 区块在 Discourse 上无法正确渲染,也请告诉我——现在可以按名称解析区块,因此应该能够解决任何相关问题。

下周我将添加一个过滤器,可以挂钩用于解析那些过于生僻、插件本身无法处理的区块。

更新后这里有些问题。

在 WordPress 中,我使用的是“经典编辑器”(TinyMCE)。

我有一些旧文章,其中的视频 URL 使用了 [video] 短代码;而最近的文章(不到 3 年)则使用了 ARVE 视频嵌入插件,它将视频 URL 放在 [arve] 短代码中。
因此,我通过以下方式将 WordPress 的文章过滤到 Discourse:

    $excerpt = preg_replace('/\[arve .*url="(.*?)" .*\/\]/is',"\n$1\n", $excerpt);
    $excerpt = preg_replace('/\[video .*mp4="(.*)"\]\[\/video\]/is',"\n$1\n", $excerpt);

之前一切正常,只有视频 URL 被传递到 Discourse,因此它们在 Discourse 上正确显示为嵌入视频。

但自从 WP-Discourse 更新后,视频无法在 Discourse 上显示了。
我还尝试直接在 TinyMCE 中粘贴 YouTube URL,不使用短代码(我了解到 WordPress 似乎不需要短代码就能嵌入 YouTube 视频……或者这可能是因为我的其他插件或主题?:thinking: 但我想这并不重要),并移除了我的 preg_replace 函数,但视频仍然无法在 Discourse 上显示。

以下是我在 WordPress 上的文本(纯文本模式,非可视化编辑标签):

https://www.youtube.com/watch?v=e6MCkspqtxo

[arve url="https://www.youtube.com/watch?v=e6MCkspqtxo" /]

在 WordPress 上的显示效果:

Discourse 上的帖子:

Discourse 帖子的 HTML 代码:

<p>Test vidéooo:</p>
<div data-mode="normal" data-provider="youtube">
<div></div>
</div>
<div data-mode="normal" data-provider="youtube">
<div></div>
</div>

编辑:另外,我注意到当文章在 WordPress 上设为私密时,编辑文章后不会同步到 Discourse。这在进行私密测试时有点烦人。

这很奇怪。我进行这次更改的初衷是希望它不会影响通过经典编辑器发布的帖子。我会尝试复现该问题。如果您在编辑器的“文本”标签中打开该帖子,能否分享一下您看到的标记?

使用 WP 插件 ARVE

<p>测试视频ooo:</p>
<div class="arve-wrapper aligncenter" data-mode="normal" data-provider="youtube" id="arve-e6MCkspqtxo-3" style="max-width:800px;" itemscope itemtype="http://schema.org/VideoObject">
<div class="arve-embed-container" style="padding-bottom:56.250000%"><iframe allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen class="arve-iframe fitvidsignore" frameborder="0" name sandbox="allow-scripts allow-same-origin allow-presentation allow-popups allow-popups-to-escape-sandbox" scrolling="no" src="https://www.youtube-nocookie.com/embed/e6MCkspqtxo?iv_load_policy=3&#038;modestbranding=1&#038;rel=0&#038;autohide=1&#038;playsinline=1&#038;autoplay=0" width="480" height="270"></iframe></div>
</div>
<div class="arve-wrapper aligncenter" data-mode="normal" data-provider="youtube" id="arve-e6MCkspqtxo-4" style="max-width:800px;" itemscope itemtype="http://schema.org/VideoObject"><div class="arve-embed-container" style="padding-bottom:56.250000%"><iframe allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen class="arve-iframe fitvidsignore" frameborder="0" name sandbox="allow-scripts allow-same-origin allow-presentation allow-popups allow-popups-to-escape-sandbox" scrolling="no" src="https://www.youtube-nocookie.com/embed/e6MCkspqtxo?iv_load_policy=3&#038;modestbranding=1&#038;rel=0&#038;autohide=1&#038;playsinline=1&#038;autoplay=0" width="480" height="270"></iframe></div></div>

不使用插件,如果我只在 WP 中写入:

https://www.youtube.com/watch?v=e6MCkspqtxo

Discourse 编辑器显示的结果如下:

<p>测试视频ooo:</p>
<div class="fitvids-video"><iframe title="Volkor X - Enclave" width="800" height="450" src="https://www.youtube.com/embed/e6MCkspqtxo?feature=oembed" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe></div>

看起来 WP 仍在使用另一个非原生库,也许来自我的主题?:thinking:
我想问题更多出在我这边,而不是你们那边,不过更新之前一切正常……:sweat_smile: