Я пытаюсь уменьшить количество слов, которые отображаются в «Discours» при публикации статьи в WordPress. Но вместо этого я не вижу ни одного слова ![]()
Спасибо за ваш ответ. Мы по-прежнему используем классический редактор.
Проблема возникает у нас сейчас со всеми статьями, но вот ссылки:
- исходная статья в 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
Я не уверен, что полностью понимаю, как вручную добавить отрывок.
Это имеет смысл. Логика, используемая для создания краткого содержания, отличается в случае ручного создания от случая, когда плагин WP Discourse извлекает краткое содержание из содержимого поста.
Теперь это должно работать, но на вашем сайте может возникать конфликт между плагином Discourse и другим установленным плагином. Другая возможная причина — использование в постах шорткодов, которые некорректно обрабатываются при попытке плагина 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'. Эта функция вызывает 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 уже выполнено и работает нормально (я немного запутался, что версия плагина осталась неизменной). Спасибо



