اعضاء وزوار منتدى انكور التطويري، نعود اليكم من جديد بكود وخاصية جديدة لحماية مواقعكم ومنتدياتكم من الروابط الخارجية والسبام. بشكل مختصر، يعمل هذا الكود على تحويل الروابط الخارجية الى رابط موقعك، ويعمل على شكلين. في حال كان الرابط ملحوق بنص فإنه يحول الرابط مباشرة الى رابط موقعكك، وفي حال كان الرابط على شكل رابط فانه يحوله الى نجوم ويحوله الى رابط موقعك ايضًا.
وطبعًا لم انسى الاستثناءات، إذ انه هناك مكان للروابط الاستثنائية مثل مواقع التواصل واليوتيوب وغيره، بحيث يمكنك اضافة اي استثناء من خلال الكود نفسه لاي رابط خارجي تريده حتى لا يحدث خلل وعشوائية في الغاء الروابط.
قمت تجربة الكود على نسخة موقعي هنا وهي 2.3.3 والمفترض انه يعمل على جميع النسخ اذ انه غير مربوط بأي وسم معين من الزين فورو.وطبعًا لم انسى الاستثناءات، إذ انه هناك مكان للروابط الاستثنائية مثل مواقع التواصل واليوتيوب وغيره، بحيث يمكنك اضافة اي استثناء من خلال الكود نفسه لاي رابط خارجي تريده حتى لا يحدث خلل وعشوائية في الغاء الروابط.
تركيب الكود
انا قمت بتركيب الكود وتجربته في قالب Thread_view حتى يعمل الكود في المواضيع فقط ويمكنك وضعه PageContainer حتى يعمل بكل المنتدى واضف الكود التالي في بداية او نهاية القالب:
لا تنسى تغيير yoursite برابط منتداك
JavaScript:
<script>
const config = {
siteUrl: 'https://yoursite.com',
whitelist: [
'youtube.com',
'youtu.be',
'facebook.com',
'twitter.com',
'iinkor.com',
'forum.iinkor.com',
'instagram.com'
]
};
function isWhitelisted(url) {
return config.whitelist.some(domain => url.includes(domain));
}
function isExternalLink(url) {
try {
const urlObj = new URL(url);
const siteUrlObj = new URL(config.siteUrl);
return urlObj.hostname !== siteUrlObj.hostname;
} catch (e) {
return false;
}
}
function convertExternalLink(url, replaceWithStars = false) {
if (!url) return url;
// تجاهل الروابط الداخلية والمستثناة
if (!isExternalLink(url) || isWhitelisted(url)) {
return url;
}
if (replaceWithStars) {
return '****';
}
return config.siteUrl;
}
function processBBCodeLinks() {
const textNodes = document.evaluate(
"//text()[contains(., '[URL')]",
document,
null,
XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,
null
);
for (let i = 0; i < textNodes.snapshotLength; i++) {
const node = textNodes.snapshotItem(i);
let text = node.textContent;
text = text.replace(
/\[URL[^\]]*\](https?:\/\/[^\[]+)\[\/URL\]/g,
(match, url) => {
const isUrlAlone = text.trim() === match;
const newUrl = convertExternalLink(url.trim(), isUrlAlone);
return `[URL]${newUrl}[/URL]`;
}
);
if (text !== node.textContent) {
node.textContent = text;
}
}
}
function processPlainTextLinks() {
const textNodes = document.evaluate(
"//text()[contains(., 'http://') or contains(., 'https://')]",
document,
null,
XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,
null
);
for (let i = 0; i < textNodes.snapshotLength; i++) {
const node = textNodes.snapshotItem(i);
let text = node.textContent;
text = text.replace(
/(https?:\/\/[^\s\[\]<>"']+)/g,
(match) => {
// تحقق مما إذا كان الرابط وحده في النص
const isUrlAlone = text.trim() === match;
return convertExternalLink(match, isUrlAlone);
}
);
if (text !== node.textContent) {
node.textContent = text;
}
}
}
function processPageLinks() {
const links = document.querySelectorAll('.message-body a, .p-body-pageContent a');
links.forEach(link => {
const href = link.getAttribute('href');
if (href) {
const isUrlAlone = link.textContent.trim() === href;
const newHref = convertExternalLink(href, isUrlAlone);
if (newHref !== href) {
link.setAttribute('href', newHref);
if (isUrlAlone) {
link.textContent = '****';
}
link.classList.add('external-redirect');
}
}
});
processBBCodeLinks();
processPlainTextLinks();
}
document.addEventListener('DOMContentLoaded', processPageLinks);
document.addEventListener('XFContentLoaded', processPageLinks);
const observer = new MutationObserver((mutations) => {
mutations.forEach((mutation) => {
if (mutation.addedNodes && mutation.addedNodes.length > 0) {
processPageLinks();
}
});
});
observer.observe(document.body, {
childList: true,
subtree: true
});
</script>
ان شاء الله يكون الكود مفيد ويلبي احتياجاتكم
بالتوفيق للجميع
والسلام ختام
التعديل الأخير: