Landing pages: unique intro paragraph (avoid thin content)
CI/CD / CI · dotnet build (push) Successful in 2m0s
CI/CD / Deploy · hamkadr (push) Successful in 2m33s

Role/city landing pages were heading + list only — thin-content risk that hurts
ranking. Add a short, unique-per-page intro (built from the dynamic heading) on
the Jobs/Shifts landing pages, with internal-link guidance. Generic /Jobs and
/Shifts stay as-is.

Improvement 4 of the backlog (SEO).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
soroush.asadi
2026-06-20 18:07:32 +03:30
parent 9bc3fdec79
commit 142136ebc9
4 changed files with 22 additions and 0 deletions
@@ -14,6 +14,10 @@
<span> — مرتب‌شده بر اساس نزدیک‌ترین به شما 📍</span>
}
</p>
@if (!string.IsNullOrEmpty(Model.PageIntro))
{
<p class="muted" style="max-width:720px; font-size:13.5px; line-height:1.9;">@Model.PageIntro</p>
}
</div>
</div>
@@ -34,6 +34,9 @@ public class IndexModel : PageModel
/// <summary>Dynamic page heading/H1 + title, set from the active role/city for SEO.</summary>
public string PageHeading { get; private set; } = "موقعیت‌های استخدامی";
/// <summary>A short unique intro shown on role/city landing pages (avoids thin-content).</summary>
public string? PageIntro { get; private set; }
public async Task<IActionResult> OnGetAsync()
{
Cities = await _db.Cities.Where(c => c.IsActive).OrderBy(c => c.Name).ToListAsync();
@@ -103,5 +106,9 @@ public class IndexModel : PageModel
ViewData["Description"] = role is not null || city is not null
? $"جدیدترین آگهی‌های {PageHeading} در همکادر؛ مشاهده فرصت‌ها و تماس مستقیم با مراکز درمانی."
: "موقعیت‌های استخدامی کادر درمان (پزشک، پرستار، ماما، تکنسین) در بیمارستان‌ها و کلینیک‌های تهران — همکادر.";
if (role is not null || city is not null)
PageIntro = $"در این صفحه جدیدترین فرصت‌های {PageHeading}، گردآوری‌شده از منابع معتبر، را می‌بینید. "
+ "روی هر آگهی بزنید تا جزئیات، شرایط و راهِ تماسِ مستقیم با مرکز درمانی نمایش داده شود. "
+ "برای فرصت‌های مرتبط، نقش یا شهر دیگری را از لینک‌های بالا انتخاب کنید.";
}
}
@@ -14,6 +14,10 @@
<span> — مرتب‌شده بر اساس نزدیک‌ترین به شما 📍</span>
}
</p>
@if (!string.IsNullOrEmpty(Model.PageIntro))
{
<p class="muted" style="max-width:720px; font-size:13.5px; line-height:1.9;">@Model.PageIntro</p>
}
</div>
</div>
@@ -40,6 +40,9 @@ public class IndexModel : PageModel
/// <summary>Dynamic page heading/H1 + title, set from the active role/city for SEO.</summary>
public string PageHeading { get; private set; } = "شیفت‌های خالی";
/// <summary>A short unique intro shown on role/city landing pages (avoids thin-content).</summary>
public string? PageIntro { get; private set; }
public async Task<IActionResult> OnGetAsync()
{
var today = DateOnly.FromDateTime(DateTime.UtcNow);
@@ -121,5 +124,9 @@ public class IndexModel : PageModel
ViewData["Description"] = role is not null || city is not null
? $"جدیدترین {PageHeading} در همکادر؛ مشاهده شیفت‌ها و تماس مستقیم با مراکز درمانی."
: "شیفت‌های خالی کادر درمان (پزشک، پرستار، ماما، تکنسین) در بیمارستان‌ها و کلینیک‌های تهران — همکادر.";
if (role is not null || city is not null)
PageIntro = $"در این صفحه جدیدترین {PageHeading}، گردآوری‌شده از منابع معتبر، را می‌بینید. "
+ "روی هر شیفت بزنید تا تاریخ، ساعت، پرداخت و راهِ تماسِ مستقیم با مرکز درمانی نمایش داده شود. "
+ "برای موارد مرتبط، نقش یا شهر دیگری را از لینک‌های بالا انتخاب کنید.";
}
}