このスクリプトを使用して、サイト全体のアイコンを正常に変更できました。これにより、Solved プラグインの「解決済み」チェックアイコンが「親指を立てる」アイコンに変更されます。
ただし、サイト内のすべての場所で変更されるわけではありません。例えば、通知リスト内では変更されません。
![]()
~
以下は、変更が正常に機能するサイト内の他の場所での表示例です。
![]()
通知を含むいくつかのアイコンは、異なる名前を使用しているため特別な処理が必要です。この場合、notification.solved.accepted_notification を探してください(これらの逸脱したアイコン名はすべて、https://github.com/discourse/discourse/blob/master/app/assets/javascripts/discourse-common/lib/icon-library.js.es6 の replacements セクションに記載されています)。
その特定のアイコンの場所と状態に対して変更しようとしていますか?まだアイコンをグローバルに変更しようとしている場合、最初に投稿されたコードは正しいままです。
api.replaceIcon('far-check-square', 'thumbs-up')
api.replaceIcon('check-square', 'thumbs-up')
「Kudos」の隣のチェックマークアイコンはデフォルトではないため、どこかに競合するコードがある可能性がありますか?
クリスが言及した通り、一部のアイコンのみ特別扱いが必要です。通知はその一つなので、notification.solved.accepted_notification を使用する必要がありました。投稿コントロール内の解決済みアイコンの場合は、汎用的なアイコン名を使用しているため、replaceIcon メソッドを使用する際のみ、それをグローバルに変更できます。
より詳細に制御したい場合は、solved プラグインで定義されている addPostMenuButton 関数をオーバーライドする必要があります。以下を試してみてください:
<script type="text/discourse-plugin" version="0.8">
const { iconNode } = require("discourse-common/lib/icon-library");
api.addPostMenuButton("solved", attrs => {
const currentUser = api.getCurrentUser();
const canAccept = attrs.can_accept_answer;
const canUnaccept = attrs.can_unaccept_answer;
const accepted = attrs.accepted_answer;
const isOp = currentUser && currentUser.id === attrs.topicCreatedById;
const position =
!accepted && canAccept && !isOp ? "second-last-hidden" : "first";
if (canAccept) {
return {
action: "acceptAnswer",
icon: "far-check-square",
className: "unaccepted",
title: "solved.accept_answer",
label: "solved.solution",
position
};
} else if (canUnaccept && accepted) {
const title = canUnaccept
? "solved.unaccept_answer"
: "solved.accepted_answer";
return {
action: "unacceptAnswer",
icon: "thumbs-up", // ここで変更
title,
className: "accepted fade-out",
position,
label: "solved.solution"
};
} else if (!canAccept && accepted) {
return {
className: "hidden",
disabled: "true",
position,
beforeButton(h) {
return h(
"span.accepted-text",
{
title: I18n.t("solved.accepted_description")
},
[
h("span", iconNode("thumbs-up")), // ここで変更
h("span.accepted-label", I18n.t("solved.solution"))
]
);
}
};
}
});
</script>
おや、変ですね!なぜか管理者以外のユーザーでだけ失敗する理由がわかりません…いずれにせよ、スクリプトに不足していた部分を追加して更新しました。
ああ、スクリプトを更新しました。