Изображения не публикуются в Discourse в WP 5.3

Полагаю, это связано с изменениями блоков в обновлении 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.

Я наткнулся на этот пост WP Discourse plug in being odd - #10 by adamprocter, но у меня версия 1.9.7, и пользователь, от имени которого осуществляется публикация, является активным.

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

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

Не уверен, связано ли это с изменениями в WordPress 5.3.

Если вы видите предупреждение «Мы обнаружили API-запрос, использующий устаревший метод аутентификации», это не является причиной проблемы с изображениями. Версии WP Discourse 1.9.6 и новее не должны вызывать это предупреждение. Все API-запросы от плагина теперь используют аутентификацию на основе заголовков.

Похоже, проблема заключается в том, что когда Markdown-разметка загружения Discourse обернута в HTML-теги, она не обрабатывается. Например, вот что я вижу в посте WordPress после выполнения задачи Discourse PullHotlinkedImages:

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

Редактирование поста с удалением любых HTML-тегов, окружающих ссылку Markdown, решает проблему, но для этого потребуется найти правильное решение.

Извините за беспокойство, но вы работаете над этим, Саймон, или кто-то уже назначен на эту задачу?

Проблема заключается в том, что при публикации постов с изображениями в Discourse HTML-код поста изначально выглядит примерно так:

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

Если на Discourse включена настройка сайта «Загружать удалённые изображения локально», ссылка на изображение будет нарушена, когда Discourse загрузит пост из WordPress. Эта проблема возникнет в любом случае, когда тег изображения с удалённым URL обернут в HTML-теги.

Самые простые решения этой проблемы — либо отключить настройку сайта «Загружать удалённые изображения локально», либо не публиковать полный контент постов из WordPress в Discourse.

В будущем плагин WP Discourse может убрать возможность публикации полных постов. При публикации полного содержимого постов из WordPress в Discourse может возникнуть множество проблем. Большинство из них можно решить, публикуя в Discourse только анонсы (excerpt) из WordPress, а затем используя кнопку «Показать полный пост» для отображения всего поста на Discourse. Звучит ли это как решение, которое может подойти для вашего случая?

Другим возможным решением будет кастомизация шаблона, используемого для публикации постов из WordPress. Изображения можно извлекать из постов и публиковать вместе с анонсом. С помощью кастомного шаблона HTML-код изображений можно структурировать так, чтобы он не конфликтовал с процессором Markdown в Discourse.

Спасибо, Саймон. «Скачивать удалённые изображения локально» — это пока простое решение. Меня расстраивает, что функция «публиковать полные посты» может быть удалена. Сейчас я использую её так: публикую пост в WordPress, который затем публикуется в разделе «Статьи» на Discourse. По умолчанию для всех участников там стоит настройка «Следить за первым постом». Благодаря этому все получают письмо с полным содержанием статьи, и самое главное — они могут просто ответить на это письмо, чтобы добавить комментарий. Если же им придётся сделать дополнительный шаг и перейти на сайт, скорее всего, большинство не прочтёт статью, особенно если там только короткий отрывок, особенно без изображений, которые для нашего сайта действительно важны. Если функция «публиковать полные посты» исчезнет, я, возможно, откажусь от WordPress и начну публиковать статьи напрямую в Discourse. Это не идеально с точки зрения SEO и других факторов, но, на мой взгляд, вовлечённость важнее.

Мне бы не хватило полноценной публикации.
Я не на 100% уверен, что именно вы здесь предлагаете…
Как бы вы извлекали изображения? С помощью регулярного выражения?
Я могу представить регулярное выражение, которое заменяет теги изображений на правильный синтаксис разметки. Именно это вы имеете в виду, и сработает ли это?

Нет. Я бы соблазнился этим, если бы не пробовал подобные вещи в прошлом. В этой публикации на Stack Overflow отчасти объясняется проблема: https://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454.

Я изучу, насколько сложно будет плагину собрать базовую HTML-версию содержимого поста. В крайнем случае можно использовать методы DOMDocument для парсинга содержимого. Комментарии, возвращаемые Discourse, парсятся с помощью этих методов, и жалоб на проблемы с этим не поступало.

Я считаю, что публикация отрывка с последующим просмотром полного поста пользователями по кнопке «Показать полный пост» в Discourse, вероятно, является лучшим решением, но я не хочу убирать опцию «Опубликовать полный пост» из плагина WP Discourse.

Спасибо за объяснение.
Я попрошу моих авторов просто опубликовать статью и нажать «Обновить», так как публикация с последующим обновлением статьи в WP, похоже, всегда исправляет изображения в Discourse.

Я скорее предпочту, чтобы мои авторы тратили на каждую статью на секунду больше, чем видеть, как полностью исчезает опция публикации :wink:

Если у вас включена настройка сайта Discourse «Скачивать удалённые изображения локально», не исчезает ли изображение снова через несколько минут после обновления поста? Если это не так, я разберусь, почему это решает проблему.

У меня это включено, и изображения на всех моих последних статьях корректно отображаются даже спустя дни и недели. Пример с статьёй месячной давности, в которой я столкнулся с проблемой отображения изображений.

Кроме того, я проверил ссылки на изображения на стороне Discourse — они ведут на 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="Блог" 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 мог их обработать. Дайте знать, если столкнётесь с какими-либо проблемами после обновления. Если в Discourse по-прежнему некорректно отображаются какие-то блоки WordPress, сообщите об этом — теперь блоки можно парсить по имени, поэтому решить любые проблемы должно быть возможно.

На следующей неделе я добавлю фильтр, к которому можно будет подключиться для обработки любых блоков, которые слишком специфичны для обработки плагином.

Немного проблем после обновления.

В WP я использую «классический редактор» (TinyMCE).

У меня были старые статьи с URL-адресами видео в шорткодах [video], а самые последние статьи (возрастом менее 3 лет) использовали плагин встраивания видео ARVE, который помещает URL видео внутрь шорткода [arve].
Поэтому я отфильтровал записи из WP в Discourse следующим образом:

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

Это работало идеально, и в Discourse передавались только URL-адреса видео, поэтому они отображались в виде встроенных плееров.

Но после обновления WP-Discourse видео перестали отображаться в Discourse.
Я также пробовал просто вставлять URL YouTube в TinyMCE без шорткода (я узнал, что для встраивания видео YouTube в WP шорткод вроде бы не требуется… Или, возможно, это из-за одного из моих других плагинов или моей темы? :thinking: Но, думаю, это не имеет значения), и удалил свои функции preg_replace, но видео всё равно не отображаются в Discourse.

Вот мой текст в WP (обычный текст, не вкладка визуального редактора):

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

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

Как это выглядит в WP:

Запись в Discourse:

HTML-код записи в Discourse:

<p>Тест видео:</p>
<div data-mode="normal" data-provider="youtube">
<div></div>
</div>
<div data-mode="normal" data-provider="youtube">
<div></div>
</div>

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

Это странно. Я надеялся, что это изменение не затронет посты, опубликованные с помощью классического редактора. Я попробую воспроизвести проблему. Можете ли вы показать разметку, которую вы видите, если откроете пост на вкладке «Текст» в редакторе?

С плагином WP ARVE

<p>Test vidé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&amp;modestbranding=1&amp;rel=0&amp;autohide=1&amp;playsinline=1&amp;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&amp;modestbranding=1&amp;rel=0&amp;autohide=1&amp;playsinline=1&amp;autoplay=0" width="480" height="270"></iframe></div></div>

Без плагина, если я просто ввожу в WP:

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

Редактор Discourse показывает такой результат:

<p>Test vidé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: