「外部リンクをデフォルトで新しいタブで開く」が機能しない

こんにちは、

最近、私のフォーラムにあるすべての外部リンクが新しいタブで開かなくなっています。「デフォルトで外部リンクを新しいタブで開く」オプションを再度確認しましたが、チェックが入っています:

インスペクト要素を使ってリンクの HTML を確認したところ、target="_blank" が明らかに欠落していることがわかりました。

どうすればよいでしょうか?

セーフモードで試しましたか?新しいテーマ、テーマコンポーネント、またはプラグインが干渉している可能性がありますね🧐

セーフモードでサイトを試しましたが、依然として同じ問題が発生しています。

Discourse のどのバージョンをお使いですか?再現できるか確認しやすくなります。

最新の 2.7.0.beta1 を実行しています。

Meta でこれをテストしてみませんか?外部リンクを新しいタブで開くように設定して、ご自身で動作を確認してください。私にとっては非常にうまく機能しています。

@riteshsaini さん、こんにちは。

最初のトラブルシューティングとして最も有効な選択肢の一つは、ウェブ開発者コンソールを使用して DOM を直接確認し、リンクの正確な属性、特に「target」属性を検証することです。

多くの場合、ソースコードを直接読むだけではこれらの DOM 属性は確認できません(これらの属性は DOM には存在するがソースコードには存在しないことがあります)。そのため、100% 確実を期すには、DOM をクエリして属性を取得する必要があります。

これで意味が通じることを願っています。

彼がここでやったことはそれだと思います。

いいえ。ソースコードを読むことと、DOM を確認することは同じではありません。

DOM の属性はソースコードと異なることがあり(実際、よく異なります)、特に Discourse のように JavaScript を多用して DOM を操作するウェブサイトではその傾向が強いです。

そのため、単にソースコードを見るのではなく、具体的に DOM をクエリするようお伝えしたのです :slight_smile:

ただし、@osioke さんにお同意します。ソースコードには明らかに target 属性が欠落していることが示されています。しかし、DOM を確認すれば、その属性が何であるかを「確実」に知ることができます。DOM はソースコードとは異なる状態にあることがあり(実際、よく異なります)。

私個人としては、「何も仮定しない」という方針を強く支持しています。そのため、@riteshsaini さんには、DOM を確認して「確実」にした上で「そこから進める」よう提案したのです。

DOM とソースコードのリンクの target 属性が同じ状態にある可能性は十分にあります。しかし、トラブルシューティングを行う際は、こうした詳細を仮定しないよう常に推奨しています。そのため、トラブルシューティングの一環として DOM をクエリすることを提案したのです。

これが役立つことを願っています。

設定で微調整する代わりに、この方法を使用しています

デモ: https://theme-creator.discourse.org/theme/Bcat/auto_link_new_tab

<script type="text/discourse-plugin" version="0.8">
    api.onPageChange((url, title) => {
        // 外部リンクを自動的に新しいタブまたはウィンドウで開く
        var pc = 1;
        if ($("html").hasClass("mobile-device")) pc = 0;
        var links = document.links;
        for (var i = 0, linksLength = links.length; i < linksLength; i++) {
            if (links[i].hostname != window.location.hostname) {
                if (pc) links[i].target = '_blank'; else links[i].target = '_self';
            }
        }
    });
</script>

…そして、DOM とソースコードの状態が異なることを、堅牢な Discourse API の例で完璧に示しています。上記の JS によって設定されたターゲット属性は、HTML ソースコードでは表示されません :slight_smile:

@Bcat このスニペットを共有してくださりありがとうございます。でも、どこに追加すればいいのでしょうか?

追伸:愚かな質問で申し訳ありません。私はプログラマーではなく、Discourse は全くの初心者です :slight_smile:

@neounix さん、返信ありがとうございます。

その方法があまりよくわかりません :slight_smile: もしお時間がありましたら、詳しく教えていただけますでしょうか。

トピックを表示: Installing a theme or theme component

discourse-automatically-open-external-links-in-new-tab.zip|添付ファイル (843 バイト)

個人プロファイルの「設定/インターフェース」を確認しましたか?通常、この問題は個人プロファイルで外部リンクを新しいタブで開く設定が無効になっている場合に発生します。

チェックが入っていなかったので、チェックを入れました。これでログイン時に限り、リンクが新しいタブで開くようになりました。ただし、シークレットタブでサイトを確認すると、まだ動作しません。

期待通りに完璧に動作しています。本当にありがとうございます :slight_smile:

管理者が追加した外部リンクを含め、すべての外部リンクに rel="nofollow" を追加する方法について、解決策はありますか?

何ヶ月も前からそれに取り組もうとしていますが、うまくいきません。

リンクの共有やダウンロードを目的としたフォーラム(Bitly や他のサイトを利用する場合など、セキュリティが低い場合)において、「rel=“nofollow”」の代わりに「rel=“noopener noreferrer”」の使用を検討していただけませんか?
「noopener noreferrer」について詳しくは、こちらをご覧ください。

noopener noreferrer の追加は検討できますが、それに加えて nofollow も追加する必要があります。問題は、これらのリンクがアフィリエイトリンクであるため、Google に追跡されたりインデックスされたりしたくないという点です。そのためには nofollow しか機能しません。

links[i].rel = 'nofollow'; を追加するか、ファイル: discourse-automatically-open-external-links-in-new-tab.zip (856 バイト)