カスタム抜粋の長さが機能しません

WordPressで記事を公開する際に、「抜粋」に表示される単語数を減らそうとしていますが、単語が1つも表示されません :slight_smile:


「いいね!」 2

投稿にブロックエディターを使用していますか、それとも古いクラシックエディターを使用していますか?

投稿へのリンクを共有できますか?問題の原因の手がかりが得られるかもしれません。

投稿に抜粋を手動で追加しようとするとどうなりますか?

ご返信ありがとうございます。クラシックエディターを使用しています。
現在、すべての記事で発生していますが、リンクはこちらです。

抜粋を手動で追加する方法がよく理解できていません。

WordPress の投稿で「抜粋」を使用したのはもう数年前のことです。すぐに理解できませんでした。

しかし、「手動」で WordPress に入力するとすべて正常に機能するようです。

「抜粋」を手動で入力せずに、最初の X 単語を Discourse に送信する方法はありますか?

「いいね!」 1

これは理にかなっています。抜粋を作成するために使用されるロジックは、抜粋が手動で作成される場合と、WP Discourseプラグインが投稿のコンテンツから抜粋を解析する場合とでは異なります。

これで機能するはずですが、Discourseプラグインとサイトにインストールされている別のプラグインとの間に競合がある可能性があります。もう1つの可能性は、投稿でショートコードを使用しており、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属性をunsetするはずではありませんが、ローカルでテスト(LnkBioプラグインのAPI呼び出しをモック)すると、unset($post->post_content)の呼び出しが、WP Discourseプラグインのwp-discourse/lib/discourse-publish.php at main · discourse/wp-discourse · GitHub

これは、Classic Editorで投稿が公開された場合にのみ発生します。Block Editorで投稿が公開された場合、投稿コンテンツはWP Discourseプラグインで利用可能です。これは、Block Editorで公開された投稿はRESTリクエスト経由で公開されるためだと推測されます。

カスタム抜粋長を設定した場合と、WP Discourseの「完全な投稿コンテンツを使用」オプションを選択した場合の両方で、Discourseにコンテンツが公開されない問題に直面していることに注意してください。

最も簡単な解決策は、Block Editorに切り替えることです。

別の選択肢は、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;
		}
		// LnkBioアカウントなしでのテストのため、URLは`example.com`に設定されています
		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 プラグインは、3つの場所で 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

全く厳しくなかったよ、素晴らしい洞察だった。\n\nもう少し作業した結果、clone関数を使った、より洗練された解決策を見つけた。\n\nこれはすでに更新されたLnk.Bioプラグインに公開されており、パッチは単純に\n\n\n\ndiff --git a/lnk.bio.php b/lnk.bio.php\nindex 65759fc..cc0c0d2 100644\n--- a/lnk.bio.php\n+++ b/lnk.bio.php\n@@ -126,8 +126,7 @@ function lnkbio_api_post(string $url, array $data) {\n }\n\n function lnkbio_api_sync($post_id, $post, $update) {\n- $json = json_encode($post);\n- $local_post = json_decode($json);\n+ $local_post = clone($post);\n unset($local_post->post_content);\n if ($post->post_status === 'publish') {\n if (!get_option('lnkbio_id') || !get_option('lnkbio_secret')) {\n

「いいね!」 4

お二人とも本当にありがとうございます。問題の検出と解決をこれほど迅速に行えたことに、感服し尊敬いたします。この改善をLink.Bioプラグインのアップデートに正式に組み込む予定はありますか?もしそうであれば、おおよそいつ頃になりますか?

「いいね!」 1

Lnk.Bio プラグインのアップデートはすでに完了しており、正常に動作しているようです(プラグインのバージョンが変わらなかったので少し混乱していました)。ありがとうございます。

「いいね!」 1