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
수동으로 발췌문을 추가하는 방법에 대해 완전히 이해하지 못하고 있습니다.
그렇다면 이해가 갑니다. 발췌본이 수동으로 생성될 때와 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' 액션에 연결되는 기능이 있습니다. 해당 기능은 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.
이 문제는 클래식 에디터로 게시물을 게시할 때만 발생합니다. 블록 에디터로 게시물을 게시하면 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 set to `example.com` for testing without a lnkbio account
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 사용법을 피하는 좋은 방법도 보이지 않습니다.
이 부분은 흥미롭네요: https://codex.wordpress.org/Global_Variables
개발자들은 이 목록을 예약된 이름 목록(Reserved Name List)으로 간주하고, 플러그인이나 테마에서 동일한 이름을 가진 로컬 변수를 생성하지 않는 것을 권장합니다. 일부 상황에서 전역 변수의 값이 로컬 변수의 값으로 대체되어, 진단하기 어려운 WordPress 코어 오류를 유발할 수 있습니다.
우리가 엣지 케이스를 찾은 것 같습니다.
없습니다. 여기서는 무료 지원을 제공하기만 하고 있습니다. https://discourse.org/pricing에서 무료 체험으로 가입할 수 있다는 것을 알고 있습니다. 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 플러그인 업데이트가 이미 완료되어 정상적으로 작동하는 것 같습니다. (플러그인 버전이 변경되지 않아 조금 혼란스러웠습니다.) 감사합니다.



