我试图减少我在 WordPress 中发布文章时,“Discours”中显示的单词数量。但相反,我一个字也看不到 ![]()
感谢您的回复。我们仍在使用经典编辑器。
目前所有文章都出现了这个问题,但这是链接:
- 来源文章(WordPress):Fotky Google dostanou praktickou vychytávku. Oceníte ji?
- 目标帖子(Discourse):Do aplikace Fotky Google se chystá praktická funkce. Usnadní procházení fotografií - Komentáře ke článkům - Komunita Svět Androida
我不太清楚如何手动添加摘要。
我们已经好几年没有在 WordPress 中使用“摘要”来发布文章了,我一开始没有弄明白。\n\n但似乎当我手动填写 WordPress 中的内容时,一切都正常工作。\n\n有没有什么方法可以在不手动填写“摘要”的情况下,将前 X 个单词发送到 Discourse?\n
这说得通。用于创建摘要的逻辑在手动创建摘要时与 WP Discourse 插件从帖子内容解析摘要时使用的逻辑不同。
现在应该可以了,但您的网站上可能存在 Discourse 插件与您安装在网站上的另一个插件之间的冲突。另一种可能性是,您在帖子中使用了简码(shortcodes),而 Discourse 插件在尝试创建摘要时未能正确解析这些简码。
您在帖子中使用简码吗?
供我参考,问题似乎在这里:wp-discourse/lib/discourse-publish.php at main · discourse/wp-discourse · GitHub $excerpt = apply_filters( 'the_content', $raw ); 时出现了与此相关的问题。
是的,我们使用短代码。我将尝试暂时禁用它们,看看会发生什么。感谢您的指导。我会告知您我们的发现。
如果我禁用网站上的大多数插件,一切似乎都能正常工作。感谢您的指导。我将查找有问题的插件 ![]()
几个小时后 :)。我已经找到了罪魁祸首,插件 Lnk.Bio – Plugin WordPressu | WordPress.org Česko 会这样做吗?有什么办法可以修复它吗?
LnkBio 插件有一个函数会挂钩到 'wp_insert_post' 操作。该函数会在 WordPress $post 对象上调用 unset($post->post_content)。理论上,这不应该在 LnkBio 函数之外取消设置帖子的 post_content 属性,但当我在本地进行测试(模拟 LnkBio 插件的 API 调用)时,调用 unset($post->post_content) 会取消设置 WP Discourse 插件在此处 wp-discourse/lib/discourse-publish.php at main · discourse/wp-discourse · GitHub 的帖子的 post_content。
这仅在帖子使用经典编辑器发布时发生。如果帖子使用块编辑器发布,则帖子内容可供 WP Discourse 插件使用。我假设这是因为使用块编辑器发布的帖子是通过 REST 请求发布的。
请注意,当我设置自定义摘要长度或选择 WP Discourse 的“使用完整帖子内容”选项时,都会遇到没有内容发布到 Discourse 的问题。
最简单的修复方法是切换到使用块编辑器。
另一种选择是联系 LnkBio 并告知他们这个问题。他们可以通过查找更安全的方式来解析其 API 请求的帖子内容来解决此问题:
function lnkbio_api_sync($post_id, $post, $update) {
unset($post->post_content);
if ($post->post_status === 'publish') {
if (!get_option('lnkbio_id') || !get_option('lnkbio_secret')) {
return;
}
// url 设置为 `example.com` 以在没有 lnkbio 帐户的情况下进行测试
wp_remote_post(
'http://example.com',
[
'blocking' => false,
'body' => [
'ACTION' => 'WP_sync',
'post_id' => $post_id,
'post' => json_encode($post),
'id' => get_option('lnkbio_id'),
'secret' => get_option('lnkbio_secret'),
'permalink' => get_permalink($post),
'is_pub' => true,
'image' => get_the_post_thumbnail_url($post_id, 'full'),
'group_id' => get_option('lnkbio_group'),
]
]
);
}
}
编辑:您也可以直接编辑 LnkBio 插件的代码,删除对 unset($post->post_content); 的调用,然后找到一种方法来设置此处使用的 $post 对象的适当值:
'post' => json_encode($post)
通常以这种方式编辑插件是一个坏主意,但如果您非常小心,它会起作用。可能只有在您有方法在非生产站点上测试更改时才这样做。
您好,
我是 Lnk.Bio WordPress 插件的维护者。
lnkbio_api_sync 函数仅在本地变量 $post 上使用 unset 函数,这不应影响函数外部的任何代码。
$post 变量也不是通过引用传递的,因此它绝对仅限于该函数,否则会影响 WP 代码中的所有帖子/摘要。
我们对 $post 所做的任何更改都仅限于该函数,除非 Discourse 代码以某种方式使用了全局变量?
您是否有沙盒 Discourse 安装,您可以分享 API 凭据,以便我们可以在本地测试 Discourse 插件以及它如何与我们的代码交互?
提前感谢。
是的,我就是这么想的。
WP Discourse 插件在三个地方使用了 global $post:
我不确定这是否会对正在发生的事情产生任何影响。我也没看到在这些文件中避免使用 global $post 的好方法。
这很有趣:Global Variables « WordPress Codex
建议开发者将此视为保留名称列表,不要在插件或主题中创建同名的本地变量。在某些情况下,全局变量的值将被本地变量的值替换,导致 WordPress 核心出现难以诊断的错误。
我认为我们可能找到了一个边缘情况。
我没有。我只是在这里提供免费支持。我知道您可以在 Discourse pricing | Discourse - Civilized Discussion 注册免费试用。选择标准版或商务版。只需几分钟即可启动并运行一个站点。
谢谢,感谢您的反馈。
我们已按照您的建议注册了试用版,并能够重现该问题。
我们发现即使将 $post 重命名为 $local_post 或类似的名称也无法解决问题。我们发现唯一的解决方法是 json_encode 然后 json_decode 内容,以创建一个完全独立的对象。非常丑陋。
尽管如此,我们还是发布了一个更新来解决此不兼容问题,即使之前的设计从代码角度来看是 100% 正确的。
这是已发布的补丁
- unset($post->post_content);
+ $json = json_encode($post);
+ $local_post = json_decode($json);
+ unset($local_post->post_content);
if ($post->post_status === 'publish') {
if (!get_option('lnkbio_id') || !get_option('lnkbio_secret')) {
return;
@@ -138,7 +140,7 @@ function lnkbio_api_sync($post_id, $post, $update) {
'body' => [
'ACTION' => 'WP_sync',
'post_id' => $post_id,
- 'post' => json_encode($post),
+ 'post' => json_encode($local_post),
'id' => get_option('lnkbio_id'),
'secret' => get_option('lnkbio_secret'),
'permalink' => get_permalink($post),
太好了!
在我看来,它看起来是正确的。我对发生的事情感到惊讶。很抱歉我在最初关于这个问题的帖子中语气有些生硬。那时我已经为此苦思冥想了好几个小时。
你一点也不严厉,你的见解很棒。
在对其进行了一些修改后,我们找到了一个更好、更优雅的解决方案,使用了 clone 函数。
这已经发布到更新的 Lnk.Bio 插件中,补丁很简单
diff --git a/lnk.bio.php b/lnk.bio.php
index 65759fc..cc0c0d2 100644
--- a/lnk.bio.php
+++ b/lnk.bio.php
@@ -126,8 +126,7 @@ function lnkbio_api_post(string $url, array $data) {
}
function lnkbio_api_sync($post_id, $post, $update) {
- $json = json_encode($post);
- $local_post = json_decode($json);
+ $local_post = clone($post);
unset($local_post->post_content);
if ($post->post_status === 'publish') {
if (!get_option('lnkbio_id') || !get_option('lnkbio_secret')) {
非常感谢你们两位,你们能够如此迅速地发现并解决问题,我对此深感钦佩和敬佩。你们是否计划将此改进正式纳入 Link.Bio 插件的更新中?如果计划,大约在什么时候?
Lnk.Bio 插件的更新看起来已经完成并且运行正常(插件版本保持不变让我有点困惑)。谢谢。



