Нестандартная длина краткого описания не работает у меня

Я пытаюсь уменьшить количество слов, которые отображаются в «Discours» при публикации статьи в WordPress. Но вместо этого я не вижу ни одного слова :slight_smile:


Используете ли вы редактор блоков или старый классический редактор для публикации записи?

Можете ли вы поделиться ссылкой на запись? Это может дать некоторые подсказки о том, что идет не так.

Что произойдет, если вы попробуете вручную добавить краткое содержание к записи:

Спасибо за ваш ответ. Мы по-прежнему используем классический редактор.
Проблема возникает у нас сейчас со всеми статьями, но вот ссылки:

Я не уверен, что полностью понимаю, как вручную добавить отрывок.

Мы уже несколько лет не используем «Выдержку» для записей в WordPress, и я не сразу понял это.

Но, похоже, когда я заполняю её «вручную» в WordPress, всё работает отлично.

Есть ли решение, чтобы первые X слов отправлялись в Discourse без необходимости вручную заполнять «Выдержку»?

Это имеет смысл. Логика, используемая для создания краткого содержания, отличается в случае ручного создания от случая, когда плагин WP Discourse извлекает краткое содержание из содержимого поста.

Теперь это должно работать, но на вашем сайте может возникать конфликт между плагином Discourse и другим установленным плагином. Другая возможная причина — использование в постах шорткодов, которые некорректно обрабатываются при попытке плагина Discourse создать краткое содержание.

Используете ли вы шорткоды в своих постах?

Для своих записей отмечу, что проблема, похоже, находится здесь: wp-discourse/lib/discourse-publish.php at main · discourse/wp-discourse · GitHub. Предполагаю, что что-то идёт не так при вызове $excerpt = apply_filters( 'the_content', $raw );.

Да, мы используем короткие коды. Я попробую временно отключить их и посмотрю, что произойдет. Спасибо за указания. Я сообщу вам, что мы обнаружим.

Если я отключу большинство плагинов на сайте, всё работает правильно. Спасибо за подсказки. Я поищу проблемный плагин :slight_smile:

Через несколько часов :). Я уже нашел виновника. Плагин Lnk.Bio – Plugin WordPressu | WordPress.org Česko вызывает это? Есть ли идеи, как это исправить?

Плагин LnkBio содержит функцию, которая подключается к действию 'wp_insert_post'. Эта функция вызывает unset($post->post_content) для объекта WordPress $post. Теоретически это не должно удалять атрибут post_content поста вне функции LnkBio, но при локальном тестировании (с имитацией API-вызовов плагина LnkBio) вызов unset($post->post_content) удаляет содержимое поста для плагина WP Discourse здесь: wp-discourse/lib/discourse-publish.php at main · discourse/wp-discourse · GitHub.

Это происходит только при публикации постов через Классический редактор. Если посты публикуются через Блочный редактор, содержимое поста доступно плагину WP Discourse. Я предполагаю, что это связано с тем, что посты, опубликованные через Блочный редактор, публикуются через REST-запрос.

Обратите внимание, что я сталкиваюсь с проблемой отсутствия контента в Discourse как при установке произвольной длины цитаты, так и при выборе опции WP 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 использует функцию unset только для локальной переменной $post, поэтому она не должна влиять на какой-либо код вне этой функции.

Переменная $post также не передаётся по ссылке, поэтому она точно является локальной для этой функции. В противном случае это влияло бы на посты/выдержки во всём коде WordPress.

Любые изменения, которые мы вносим в $post, локальны только для этой функции, если только код Discourse каким-то образом не использует глобальные переменные.

У вас есть установка Discourse в тестовой среде (sandbox), для которой вы могли бы предоставить учётные данные API, чтобы мы могли протестировать плагин Discourse локально и проверить, как он взаимодействует с нашим кодом?

Заранее спасибо.

Да, я так и думал.

Плагин WP Discourse использует global $post в трёх местах:

Не уверен, может ли это как-то повлиять на происходящее. Также не вижу хорошего способа избежать использования global $post в этих файлах.

Это интересно: Global Variables « WordPress Codex

Разработчикам рекомендуется рассматривать это как список зарезервированных имён и не создавать локальные переменные с такими же именами в плагинах или темах. В некоторых случаях значение глобальной переменной может быть заменено значением локальной переменной, что приведёт к ошибкам в ядре WordPress, которые трудно диагностировать.

Кажется, мы нашли пограничный случай.

Нет. Я просто предоставляю бесплатную поддержку здесь. Я знаю, что вы можете зарегистрироваться на бесплатную пробную версию на Discourse pricing | Discourse - Civilized Discussion. Выберите тариф Standard или Business. Запуск сайта займёт всего несколько минут.

Спасибо, обратная связь очень ценна.

Мы, как вы и советовали, оформили пробную подписку и смогли воспроизвести проблему.

Мы выяснили, что даже переименование $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 уже выполнено и работает нормально (я немного запутался, что версия плагина осталась неизменной). Спасибо