feat: add canonical URL handling and entity quality checks

- Implemented canonical URL strategies for city-specific domains and entities.
- Added helper functions for domain and city resolution.
- Created tests for canonical URL generation and domain resolution.
- Introduced entity quality checks for doctors and clinics to ensure meaningful content.
- Developed unique introductory texts for listing pages to avoid duplicate content.
- Established robots.txt policies for listing pages to manage indexing based on user filters.
- Enhanced specialty content with dynamic introductions and FAQs to improve SEO.
This commit is contained in:
hamed
2026-07-19 07:52:50 +03:30
parent 36816eded2
commit fd48b48613
48 changed files with 3951 additions and 733 deletions
+3 -2
View File
@@ -20,12 +20,13 @@ function FilterLocate({ filter, sendReq, setFilter, setDataInURL }) {
onClick={() => setOpen(true)}
>
<LocationD />
<h1 className="text-[#525252] text-[16px] font-semibold">
{/* متن دکمهٔ انتخاب موقعیت، عنوان صفحه نیست — تگ عوض شد، کلاس‌ها دست‌نخورده */}
<span className="text-[#525252] text-[16px] font-semibold">
{" "}
{filter?.state?.name || "استان"}
{" / "}
{filter?.city?.name || "شهر"}
</h1>
</span>
</Button>
</ModalSearchCity>
);
+9
View File
@@ -8,6 +8,8 @@ import specialties from "@/data/specialties.json";
import states from "@/data/state.json";
import cities from "@/data/city.json";
import { isRootCity } from "@/lib/rootCity";
import { resolveCityDisplayName } from "@/lib/domainHelpers";
import { buildDoctorsIntro } from "@/lib/listingIntro";
function DoctorsPage({ matchedCity, matchedState, list }) {
const searchParams = useSearchParams();
@@ -50,6 +52,13 @@ function DoctorsPage({ matchedCity, matchedState, list }) {
return (
<div className="pt-[95px] sm:pt-[120px] padding-responsive">
{/* h1 واقعی صفحه — تایپوگرافی همان عنوان صفحات لیست (HeadPageList) */}
<h1 className="text-[#3B3B3B] text-[16px] sm:text-[19px] md:text-[22px] lg:text-[24px] text-center font-bold">
پزشکان و متخصصان {resolveCityDisplayName(matchedCity)} | رزرو نوبت آنلاین
</h1>
<p className="text-[#525252] text-[14px] md:text-[16px] font-normal leading-8 mt-[16px] text-justify">
{buildDoctorsIntro(resolveCityDisplayName(matchedCity))}
</p>
<Head
limit={12}
filter={filter}