自定义摘录长度对我不起作用

我试图减少我在 WordPress 中发布文章时,“Discours”中显示的单词数量。但相反,我一个字也看不到 :slight_smile:


2 个赞

您使用的是 Block 编辑器还是旧的 Classic 编辑器来发布帖子?

您能否分享该帖子的链接?这可能会提供一些关于出现问题的线索。

如果您尝试手动为帖子添加摘要,会发生什么情况:

感谢您的回复。我们仍在使用经典编辑器。
目前所有文章都出现了这个问题,但这是链接:

我不太清楚如何手动添加摘要。

我们已经好几年没有在 WordPress 中使用“摘要”来发布文章了,我一开始没有弄明白。\n\n但似乎当我手动填写 WordPress 中的内容时,一切都正常工作。\n\n有没有什么方法可以在不手动填写“摘要”的情况下,将前 X 个单词发送到 Discourse?\n

1 个赞

这说得通。用于创建摘要的逻辑在手动创建摘要时与 WP Discourse 插件从帖子内容解析摘要时使用的逻辑不同。

现在应该可以了,但您的网站上可能存在 Discourse 插件与您安装在网站上的另一个插件之间的冲突。另一种可能性是,您在帖子中使用了简码(shortcodes),而 Discourse 插件在尝试创建摘要时未能正确解析这些简码。

您在帖子中使用简码吗?

供我参考,问题似乎在这里:wp-discourse/lib/discourse-publish.php at main · discourse/wp-discourse · GitHub $excerpt = apply_filters( 'the_content', $raw ); 时出现了与此相关的问题。

3 个赞

是的,我们使用短代码。我将尝试暂时禁用它们,看看会发生什么。感谢您的指导。我会告知您我们的发现。

1 个赞

如果我禁用网站上的大多数插件,一切似乎都能正常工作。感谢您的指导。我将查找有问题的插件 :slight_smile:

2 个赞

几个小时后 :)。我已经找到了罪魁祸首,插件 Lnk.Bio – Plugin WordPressu | WordPress.org Česko 会这样做吗?有什么办法可以修复它吗?

1 个赞

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)

通常以这种方式编辑插件是一个坏主意,但如果您非常小心,它会起作用。可能只有在您有方法在非生产站点上测试更改时才这样做。

1 个赞

您好,

我是 Lnk.Bio WordPress 插件的维护者。

lnkbio_api_sync 函数仅在本地变量 $post 上使用 unset 函数,这不应影响函数外部的任何代码。

$post 变量也不是通过引用传递的,因此它绝对仅限于该函数,否则会影响 WP 代码中的所有帖子/摘要。

我们对 $post 所做的任何更改都仅限于该函数,除非 Discourse 代码以某种方式使用了全局变量?

您是否有沙盒 Discourse 安装,您可以分享 API 凭据,以便我们可以在本地测试 Discourse 插件以及它如何与我们的代码交互?

提前感谢。

2 个赞

是的,我就是这么想的。
WP Discourse 插件在三个地方使用了 global $post

我不确定这是否会对正在发生的事情产生任何影响。我也没看到在这些文件中避免使用 global $post 的好方法。

这很有趣:Global Variables « WordPress Codex

建议开发者将此视为保留名称列表,不要在插件或主题中创建同名的本地变量。在某些情况下,全局变量的值将被本地变量的值替换,导致 WordPress 核心出现难以诊断的错误。

我认为我们可能找到了一个边缘情况。

我没有。我只是在这里提供免费支持。我知道您可以在 Discourse pricing | Discourse - Civilized Discussion 注册免费试用。选择标准版或商务版。只需几分钟即可启动并运行一个站点。

2 个赞

谢谢,感谢您的反馈。

我们已按照您的建议注册了试用版,并能够重现该问题。

我们发现即使将 $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),
1 个赞

太好了!

在我看来,它看起来是正确的。我对发生的事情感到惊讶。很抱歉我在最初关于这个问题的帖子中语气有些生硬。那时我已经为此苦思冥想了好几个小时。

4 个赞

你一点也不严厉,你的见解很棒。

在对其进行了一些修改后,我们找到了一个更好、更优雅的解决方案,使用了 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')) {
4 个赞

非常感谢你们两位,你们能够如此迅速地发现并解决问题,我对此深感钦佩和敬佩。你们是否计划将此改进正式纳入 Link.Bio 插件的更新中?如果计划,大约在什么时候?

1 个赞

Lnk.Bio 插件的更新看起来已经完成并且运行正常(插件版本保持不变让我有点困惑)。谢谢。

1 个赞