# تواقيع الديسكورس

**URL:** https://meta.discourse.org/t/discourse-signatures/42263
**Category:** Plugin
**Tags:** official, signatures
**Created:** [8 أبريل 2016، 9:39م UTC](https://meta.discourse.org/t/discourse-signatures/42263 "2016-04-08T21:39:19Z")
**Posts on this page:** 20
**Page:** 2

<div class="post-metadata">

### Author: ![bar10dr](https://avatars.discourse-cdn.com/v4/letter/b/b38774/32.png) [@bar10dr](https://meta.discourse.org/u/bar10dr)
#### Post date: [24 مايو 2025، 12:55م UTC](https://meta.discourse.org/t/discourse-signatures/42263/187 "2025-05-24T12:55:00Z")

</div>

هل أنا مجنون أم لا يوجد أي تحقق من صحة عنوان URL لصورة التوقيع للمدخلات من المستخدم؟  
بشكل أساسي، يمكن للمستخدم إدخال أي شيء يريده وسيتم دفعه للمستخدمين الآخرين؟

أيضًا، لماذا حجم قاعدة بيانات عنوان URL للتوقيع مضبوط على 32000؟  
لماذا سيحتاج أي شخص إلى 32000 حرف لعنوان URL لصورة؟

مخيف 👻

لقد قمت بتعديل CSS إلى هذا من أجل ترميز الحد الأقصى للارتفاع والعرض يدويًا؛

```css
.signature-img {
  max-width: 600px;
  max-height: 100px;
  width: auto;
  height: auto;
  display: block;
  margin: 5px 0;
}

```

لقد غيرت الحد الأقصى لحجم عنوان URL للتوقيع إلى 250 في plugin.rb

```ruby
  register_user_custom_field_type("signature_url", :string, max_length: 250)
  register_user_custom_field_type("signature_raw", :string, max_length: 250)

```

لقد أضفت هذا في أسفل “on(:user\_updated) do |user|” في plugin.rb (لن أستخدم الوضع المتقدم)

```ruby
    # التحقق من صحة عنوان URL إذا لم يكن في الوضع المتقدم
    if !SiteSetting.signatures_advanced_mode && user.custom_fields["signature_url"]
      url = user.custom_fields["signature_url"]

      # التحقق الصارم: HTTPS فقط، أنواع ملفات صور معينة فقط
      unless url =~ /\Ahttps:\/\/a-zA-Z0-9.\-\/_]+\.(png|jpe?g|gif|webp)(\?[a-zA-Z0-9=\&]+)?\z/
        Rails.logger.warn("[discourse-signatures] Rejected invalid signature_url for user #{user.id}: #{url.inspect}")
        user.custom_fields["signature_url"] = nil
        user.save
      end
    end

```

إذا كنت أفعل أي شيء خاطئ هنا (لم أعمل مع Discourse من قبل)، فيرجى تصحيحه وإظهار الطريقة الصحيحة للقيام بذلك.

---

<div class="post-metadata">

### Author: ![RGJ](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/rgj/32/523185_2.png) [@RGJ](https://meta.discourse.org/u/RGJ)
#### Post date: [24 مايو 2025، 9:37م UTC](https://meta.discourse.org/t/discourse-signatures/42263/188 "2025-05-24T21:37:57Z")

</div>

> [@bar10dr، المنشور:187، الموضوع:42263](#):
>
> أيضًا، لماذا حجم قاعدة بيانات توقيع عنوان URL مضبوط على 32,000؟  
> لماذا يحتاج أحد إلى 32000 حرف لرابط صورة؟

لأن 250 غير كافٍ…

> [@bar10dr، المنشور:187، الموضوع:42263](#):
>
> بشكل أساسي، يمكن للمستخدم إدخال أي شيء يريده وسيتم دفعه إلى مستخدمين آخرين

هذه هي الفكرة الأساسية للتوقيع. نفس الشيء ينطبق على المنتدى، الناس يدخلون أشياء ويشاهدها الآخرون. يا للعالم المجنون، أليس كذلك؟

---

<div class="post-metadata">

### Author: ![MaiiZii](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/maiizii/32/516974_2.png) [@MaiiZii](https://meta.discourse.org/u/MaiiZii)
#### Post date: [11 أغسطس 2025، 2:12م UTC](https://meta.discourse.org/t/discourse-signatures/42263/190 "2025-08-11T14:12:16Z")

</div>

عند ترقية Discourse إلى الإصدار 3.5.0.beta8 (الإصدار 3.5.0.beta9-dev يمثل مشكلة أيضًا)، تم اكتشاف أن المستخدم قام بتعديل التوقيع ولا يمكنه حفظه (على الرغم من أنه يظهر محفوظًا ولكنه لا يسري)، ولا يزال طبيعيًا في الإصدار 3.5.0.beta7. نأمل في إصلاحه قريبًا، حيث تم تضمين العديد من الإضافات من الإصدار beta7 إلى الإصدار beta8.

---

<div class="post-metadata">

### Author: ![tknospdr](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/tknospdr/32/529762_2.png) [@tknospdr](https://meta.discourse.org/u/tknospdr)
#### Post date: [23 سبتمبر 2025، 6:30م UTC](https://meta.discourse.org/t/discourse-signatures/42263/192 "2025-09-23T18:30:45Z")

</div>

لدينا حالة استخدام محددة للتوقيعات وأتساءل عما إذا كان من السهل نسبيًا إجراء بعض التغييرات.

1. أتفق على أنني أود رؤية التوقيعات لمجموعات محددة فقط في واجهة المستخدم، أنا لست جيدًا في CSS.
2. نحن نستخدم Discourse الخاص بنا كمجتمع ونظام تذاكر دعم. هل هناك أي طريقة يمكننا من خلالها الحصول على إعداد لـ “عرض التوقيعات فقط في فئات X”.

نحن نحتاج إليها حقًا فقط في قسم الدعم الخاص بنا حيث يتم إجراء معظم تفاعلاتنا عبر البريد الإلكتروني.

---

<div class="post-metadata">

### Author: ![tobiaseigen](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/tobiaseigen/32/539204_2.png) [@tobiaseigen](https://meta.discourse.org/u/tobiaseigen)
#### Post date: [1 ديسمبر 2025، 2:59م UTC](https://meta.discourse.org/t/discourse-signatures/42263/193 "2025-12-01T14:59:43Z")

</div>

تم تقسيم 4 مشاركات إلى موضوع جديد: [طلب ميزة: تضمين التوقيع في إشعارات البريد الإلكتروني](https://meta.discourse.org/t/feature-request-include-sig-in-email-notifications/390055)

---

<div class="post-metadata">

### Author: ![long](https://avatars.discourse-cdn.com/v4/letter/l/e47774/32.png) [@long](https://meta.discourse.org/u/long)
#### Post date: [18 فبراير 2026، 10:02م UTC](https://meta.discourse.org/t/discourse-signatures/42263/198 "2026-02-18T22:02:27Z")

</div>

هل هناك أي شخص جيد في CSS يعرف كيفية:

1. قصر القدرة على وضع توقيع على مجموعة (مجموعات) محددة؟

2. تحديد الحد الأقصى لحجم الصورة وحجم النص للتوقيع للحفاظ عليه أقل إزعاجاً (spammy)

---

<div class="post-metadata">

### Author: ![NateDhaliwal](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/natedhaliwal/32/313494_2.png) [@NateDhaliwal](https://meta.discourse.org/u/NateDhaliwal)
#### Post date: [19 فبراير 2026، 10:53ص UTC](https://meta.discourse.org/t/discourse-signatures/42263/199 "2026-02-19T10:53:13Z")

</div>

أعتقد أنه يمكنك استخدام هذا:

> [@CSS Classes for Current User's Groups](https://meta.discourse.org/t/css-classes-for-current-users-groups/226068):
>
> discourse2Summary CSS Classes for Current User’s Groups adds the groups that a member is a part of as CSS classes on the \<body\> tag.eyeglassesPreview [Preview on theme-creator.discourse.org](https://discourse.theme-creator.io/theme/Johani/user-groups-css-classes)hammer_and_wrenchRepository Link [https://github.com/discourse/discourse-groups-css-classes-in-body](https://github.com/discourse/discourse-groups-css-classes-in-body)open_bookNew to Discourse Themes? [Beginner’s guide to using Discourse Themes](https://meta.discourse.org/t/beginners-guide-to-using-discourse-themes/91966) Install this theme component Before: [image] After: [image] Discourse only adds the current us…

يمكنك النقر بزر الماوس الأيمن \> فحص للحصول على مُعرِّف/فئة عنصر لإخفائه باستخدام `display:none`. أخشى أنني على هاتفي الآن لذلك لا يمكنني التحقق من الفئات/المُعرِّفات 😅 .

---

<div class="post-metadata">

### Author: ![james10](https://avatars.discourse-cdn.com/v4/letter/j/77aa72/32.png) [@james10](https://meta.discourse.org/u/james10)
#### Post date: [19 فبراير 2026، 3:00م UTC](https://meta.discourse.org/t/discourse-signatures/42263/200 "2026-02-19T15:00:46Z")

</div>

مرحباً يا شباب.

هل هذا المكون الإضافي لا يزال متاحاً؟

لا أستطيع العثور عليه…

 ![Screenshot 2026-02-19 at 14.56.20](https://global.discourse-cdn.com/meta/original/4X/b/0/4/b044544b6133e1ff5a4563724c7f834a48ceb940.png)

---

<div class="post-metadata">

### Author: ![NateDhaliwal](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/natedhaliwal/32/313494_2.png) [@NateDhaliwal](https://meta.discourse.org/u/NateDhaliwal)
#### Post date: [19 فبراير 2026، 3:03م UTC](https://meta.discourse.org/t/discourse-signatures/42263/201 "2026-02-19T15:03:56Z")

</div>

إنها ليست #included-in-core، لذا ستحتاج إلى [تثبيتها بشكل منفصل](https://meta.discourse.org/t/install-plugins-in-discourse/19157).

---

<div class="post-metadata">

### Author: ![long](https://avatars.discourse-cdn.com/v4/letter/l/e47774/32.png) [@long](https://meta.discourse.org/u/long)
#### Post date: [19 فبراير 2026، 8:29م UTC](https://meta.discourse.org/t/discourse-signatures/42263/202 "2026-02-19T20:29:36Z")

</div>

شكرًا لك. أنا سيئ في معرفة تلك الأشياء. ليس لدي فكرة كيف يمكنني فعل ذلك حتى. يجب أن يكون هناك إعداد. أسهل بكثير. ليس لدي فكرة لماذا قد ترغب أي مجموعة في السماح بالتواقيع للجميع. أتمنى أيضًا أن يكون هناك خيار لإخفاء الإعداد “ **تمكين التواقيع** - انظر تواقيع المستخدمين أسفل المشاركات”.

يجب أن يكون هناك أيضًا خيار لتحديد عدد الأحرف في التوقيع النصي وتحديد حجم الصورة لتوقيع الشعار.

أتمنى لو كنت أعرف لغة CSS هههه

---

<div class="post-metadata">

### Author: ![long](https://avatars.discourse-cdn.com/v4/letter/l/e47774/32.png) [@long](https://meta.discourse.org/u/long)
#### Post date: [20 فبراير 2026، 2:45م UTC](https://meta.discourse.org/t/discourse-signatures/42263/203 "2026-02-20T14:45:32Z")

</div>

حسنًا، بالنسبة لأولئك الذين يريدون حقًا جعل توقيعاتهم تعمل بشكل أفضل لمجموعتهم (خاصة إذا كنت تريد استخدام الخيارات لجعل التوقيع جزءًا من ترقية/اشتراك مدفوع)، إليك الكود (والأسباب وراءه) الذي أعتقد أنه يجعله أفضل بكثير، ويمكن أن يساعدك في دفع المزيد من الترقيات. لقد استغرق الأمر مني الكثير من المحاولات، ولكنه يعمل. انتبه إلى الأماكن التي تحتاج فيها إلى استبدال أجزاء “XXXXX”.

أردت تحقيق الأمرين التاليين:  
أ) أردت تعطيل القدرة على عدم عرض التوقيعات. هذا يعني أن المستخدمين الذين يقومون بالترقية يعلمون أن توقيعهم سيظهر للجميع.

ب) أردت فقط مجموعة معينة لديها القدرة على إنشاء توقيع.

1. اذهب إلى Admin \> Appearance \> Themes & components \> Components \> Install \> Create new

2. أضف هذا الكود إلى علامة التبويب :

```plaintext
<script>
// انتظر حتى يتم تحميل هيكل الصفحة الأساسي أولاً
document.addEventListener("DOMContentLoaded", function() {
    
    // قم بإعداد المراقب
    const observer = new MutationObserver(function(mutations) {
        // ابحث عن جميع تسميات التحكم في الصفحة
        const labels = document.querySelectorAll('label.control-label');
        
        labels.forEach(label => {
            // ابحث عن تسمية التوقيعات المحددة
            if (label.textContent.trim() === 'Enable Signatures') {
                // ابحث عن الحاوية الرئيسية التي تحتوي على كل من التسمية ومربع الاختيار وأخفها
                const controlGroup = label.closest('.control-group') || label.parentElement;
                if (controlGroup) {
                    controlGroup.style.display = 'none';
                }
            }
        });
    });

    // ابدأ الآن بمراقبة الجسم، لأننا نعلم أنه موجود
    observer.observe(document.body, { childList: true, subtree: true });
});
</script>

3. أضف هذا الكود إلى علامة التبويب css (استبدل XXXXX باسم مجموعتك):

/* إخفاء قسم التوقيع للجميع */
.user-preferences .control-group.signatures,
.user-preferences .signature-preferences,
.user-preferences div[data-setting-name="user_card_badge"] + .control-group {
    display: none !important;
}

/* إظهاره فقط إذا كان الفصل 'user-is-XXXXX' موجودًا على الجسم */
body.user-is-XXXXX .user-preferences .control-group.signatures,
body.user-is-XXXXX .user-preferences .signature-preferences,
body.user-is-XXXXX .user-preferences div[data-setting-name="user_card_badge"] + .control-group {
    display: block !important;
}

```

1. أضف هذا الكود إلى علامة التبويب أسفل الكتلة الأولى أعلاه (استبدل XXXXX باسم مجموعتك):

```plaintext
<script>
(function() {
  const checkAccess = () => {
    // يخزن Discourse مجموعات المستخدم الحالي في هذا الكائن العام
    const user = window.Discourse && window.Discourse.User && window.Discourse.User.current();
    
    if (user && user.groups) {
      // تحقق مما إذا كان أي اسم مجموعة يطابق "XXXXX"
      const isXXXXX = user.groups.some(g => g.name === 'XXXXX');
      
      if (isXXXXX) {
        document.body.classList.add('user-is-XXXXX');
      }
    }
  };

  // تشغيل فوري
  checkAccess();

  // التشغيل في كل مرة يتنقل فيها المستخدم بين الصفحات
  document.addEventListener('discourse-ready', checkAccess);
  
  // احتياطي: التشغيل مرة أخرى بعد ثانية واحدة لالتقاط التحميلات البطيئة
  setTimeout(checkAccess, 1000);
})();
</script>

```

1. أضف هذا الكود إلى علامة التبويب css أسفل الكتلة الأولى أعلاه (استبدل XXXXX باسم مجموعتك):

```plaintext
/* إخفاء قسم التوقيع للجميع */
.user-preferences .control-group.signatures,
.user-preferences .signature-preferences,
.user-preferences div[data-setting-name="user_card_badge"] + .control-group {
    display: none !important;
}

/* إظهاره فقط إذا كان الفصل 'user-is-XXXXX' موجودًا على الجسم */
body.user-is-XXXXX .user-preferences .control-group.signatures,
body.user-is-XXXXX .user-preferences .signature-preferences,
body.user-is-XXXXX .user-preferences div[data-setting-name="user_card_badge"] + .control-group {
    display: block !important;
}

```

تم.

أنا لست مطورًا. كل ما أعرفه هو أن هذا يعمل بنسبة 100٪ على موقعي.

---

<div class="post-metadata">

### Author: ![Falco](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/falco/32/179432_2.png) [@Falco](https://meta.discourse.org/u/Falco)
#### Post date: [20 فبراير 2026، 3:46م UTC](https://meta.discourse.org/t/discourse-signatures/42263/204 "2026-02-20T15:46:47Z")

</div>

لقد أضفت الميزات الأكثر طلبًا إلى المكوّن الإضافي في فرع

> <https://github.com/discourse/discourse-signatures/pull/105>
>
> \## Summary
> \- Group-based restriction (\`signatures\_allowed\_groups\`) — server-side… enforced
> \- Category-based display (\`signatures\_show\_in\_categories\`)
> \- First-post-only mode (\`signatures\_first\_post\_only\`)
> \- Signature length cap (\`signatures\_max\_length\`) and image height limit (\`signatures\_max\_image\_height\`)
> \- URL validation hardened to HTTP/HTTPS only, max length reduced to 2048
> 
> All defaults are backward-compatible.

إذا تمكنتم من تجربة هذا الفرع وتقديم ملاحظاتكم، يمكنني دمجه الأسبوع المقبل.

---

<div class="post-metadata">

### Author: ![bloodshot\_pico](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/bloodshot_pico/32/151594_2.png) [@bloodshot\_pico](https://meta.discourse.org/u/bloodshot_pico)
#### Post date: [20 فبراير 2026، 5:02م UTC](https://meta.discourse.org/t/discourse-signatures/42263/205 "2026-02-20T17:02:48Z")

</div>

بخصوص الترقية إذا كانت الأسبوع المقبل، كيف سيتم ذلك؟ 🙂

---

<div class="post-metadata">

### Author: ![long](https://avatars.discourse-cdn.com/v4/letter/l/e47774/32.png) [@long](https://meta.discourse.org/u/long)
#### Post date: [20 فبراير 2026، 5:59م UTC](https://meta.discourse.org/t/discourse-signatures/42263/206 "2026-02-20T17:59:07Z")

</div>

كيف نختبر هذا؟ آسف على السؤال المبتدئ. أفضل هذا على ما توصلت إليه أعلاه. أيضًا، هل سيكون من الممكن إضافة خيار لإيقاف توقيعات الصور والسماح فقط بالتوقيعات النصية؟ شكرًا لك!

---

<div class="post-metadata">

### Author: ![tobiaseigen](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/tobiaseigen/32/539204_2.png) [@tobiaseigen](https://meta.discourse.org/u/tobiaseigen)
#### Post date: [20 فبراير 2026، 6:24م UTC](https://meta.discourse.org/t/discourse-signatures/42263/207 "2026-02-20T18:24:56Z")

</div>

مرحباً لونغ! هل تستضيف موقع Discourse الخاص بك ذاتيًا؟ إذا كان الأمر كذلك، يمكنك تثبيت المكوّن الإضافي باستخدام الإرشادات المرتبطة في المنشور الأول.

شخصيًا، أوصي بالانتظار حتى يتم الانتهاء من فرع فالكو ودمجه.

---

<div class="post-metadata">

### Author: ![long](https://avatars.discourse-cdn.com/v4/letter/l/e47774/32.png) [@long](https://meta.discourse.org/u/long)
#### Post date: [20 فبراير 2026، 6:28م UTC](https://meta.discourse.org/t/discourse-signatures/42263/208 "2026-02-20T18:28:39Z")

</div>

نعم، الاستضافة الذاتية. لقد قمت بتثبيت المكون الإضافي. بمجرد الانتهاء من دمج هذا الفرع، هل سيتم تحديثه تلقائيًا؟ شكرًا!

---

<div class="post-metadata">

### Author: ![Falco](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/falco/32/179432_2.png) [@Falco](https://meta.discourse.org/u/Falco)
#### Post date: [20 فبراير 2026، 7:01م UTC](https://meta.discourse.org/t/discourse-signatures/42263/209 "2026-02-20T19:01:32Z")

</div>

> [@long](#):
>
> كيف نختبر هذا؟

أنت تغير سطر الإضافة الخاص بك في app.yml ليصبح كالتالي

```yaml
- sudo -E -u discourse git clone -b feature/group-category-restrictions git@github.com:discourse/discourse-signatures.git

```

---

<div class="post-metadata">

### Author: ![long](https://avatars.discourse-cdn.com/v4/letter/l/e47774/32.png) [@long](https://meta.discourse.org/u/long)
#### Post date: [20 فبراير 2026، 7:10م UTC](https://meta.discourse.org/t/discourse-signatures/42263/210 "2026-02-20T19:10:15Z")

</div>

شكراً لك. سأنتظر المكوّن الإضافي المحدّث. من غير المرجح أن أفسد ذلك 🤣

---

<div class="post-metadata">

### Author: ![long](https://avatars.discourse-cdn.com/v4/letter/l/e47774/32.png) [@long](https://meta.discourse.org/u/long)
#### Post date: [22 فبراير 2026، 11:31م UTC](https://meta.discourse.org/t/discourse-signatures/42263/211 "2026-02-22T23:31:27Z")

</div>

قد يكون هذا سؤالاً غبياً، ولكن عندما يتم دمج التحديث، هل يتم تحديث المكون الإضافي تلقائياً وسنرى الخيارات الجديدة في الإعدادات؟

---

<div class="post-metadata">

### Author: ![NateDhaliwal](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/natedhaliwal/32/313494_2.png) [@NateDhaliwal](https://meta.discourse.org/u/NateDhaliwal)
#### Post date: [23 فبراير 2026، 6:45ص UTC](https://meta.discourse.org/t/discourse-signatures/42263/212 "2026-02-23T06:45:07Z")

</div>

لا، أعتقد أنك ستحتاج إلى تحديثه يدويًا.

[Previous page](https://meta.discourse.org/t/discourse-signatures/42263.md?page=1)

[Next page](https://meta.discourse.org/t/discourse-signatures/42263.md?page=3)
