feat(entityQuality): rename isThinDoctor to isNoindexDoctor for clarity and update related logic
This commit is contained in:
@@ -6,7 +6,7 @@ import { getStateInfo } from "@/lib/getStateInfo";
|
|||||||
import { getEntityOrigin } from "@/lib/getCanonicalUrl";
|
import { getEntityOrigin } from "@/lib/getCanonicalUrl";
|
||||||
import { extractEntityCityId, findCityById } from "@/lib/domainHelpers";
|
import { extractEntityCityId, findCityById } from "@/lib/domainHelpers";
|
||||||
import { buildDoctorFaq } from "@/lib/specialtyContent";
|
import { buildDoctorFaq } from "@/lib/specialtyContent";
|
||||||
import { isThinDoctor } from "@/lib/entityQuality";
|
import { isNoindexDoctor } from "@/lib/entityQuality";
|
||||||
import specialtiesData from "@/data/specialties.json";
|
import specialtiesData from "@/data/specialties.json";
|
||||||
import { safeJsonLd } from "@/lib/sanitize";
|
import { safeJsonLd } from "@/lib/sanitize";
|
||||||
import { imageUrl, doctorTitle } from "@/helper";
|
import { imageUrl, doctorTitle } from "@/helper";
|
||||||
@@ -96,7 +96,7 @@ export async function generateMetadata({ params }) {
|
|||||||
title,
|
title,
|
||||||
description,
|
description,
|
||||||
alternates: { canonical: `${origin}/doctor/${doctor.uuid}` },
|
alternates: { canonical: `${origin}/doctor/${doctor.uuid}` },
|
||||||
...(isThinDoctor(doctor) && { robots: { index: false, follow: true } }),
|
...(isNoindexDoctor(doctor) && { robots: { index: false, follow: true } }),
|
||||||
openGraph: {
|
openGraph: {
|
||||||
title,
|
title,
|
||||||
description,
|
description,
|
||||||
|
|||||||
+3
-2
@@ -4,7 +4,7 @@ import citiesData from '@/data/city.json';
|
|||||||
import statesData from '@/data/state.json';
|
import statesData from '@/data/state.json';
|
||||||
import { isRootCity } from '@/lib/rootCity';
|
import { isRootCity } from '@/lib/rootCity';
|
||||||
import { extractEntityCityId, findDomainByCityId } from '@/lib/domainHelpers';
|
import { extractEntityCityId, findDomainByCityId } from '@/lib/domainHelpers';
|
||||||
import { isThinClinic, isThinDoctor } from '@/lib/entityQuality';
|
import { isThinClinic, isNoindexDoctor } from '@/lib/entityQuality';
|
||||||
import specialtiesData from '@/data/specialties.json';
|
import specialtiesData from '@/data/specialties.json';
|
||||||
import { isIndexableSpecialty } from '@/lib/specialtyIndexing';
|
import { isIndexableSpecialty } from '@/lib/specialtyIndexing';
|
||||||
|
|
||||||
@@ -119,7 +119,8 @@ function cityFilterParams(scope) {
|
|||||||
async function getPublishedDoctors(scope) {
|
async function getPublishedDoctors(scope) {
|
||||||
const doctors = await fetchAllPages('/api/v1/doctors', cityFilterParams(scope));
|
const doctors = await fetchAllPages('/api/v1/doctors', cityFilterParams(scope));
|
||||||
return doctors
|
return doctors
|
||||||
.filter((d) => !isThinDoctor(d))
|
// پروفایل بدون مالک noindex است، پس در sitemap هم اعلام نمیشود.
|
||||||
|
.filter((d) => !isNoindexDoctor(d))
|
||||||
// روی دامنهٔ اصلی فقط پزشکانی که شهرشان دامنهٔ اختصاصی ندارد؛ روی دامنهٔ شهری
|
// روی دامنهٔ اصلی فقط پزشکانی که شهرشان دامنهٔ اختصاصی ندارد؛ روی دامنهٔ شهری
|
||||||
// فیلتر city_id سمت API قبلاً کار را کرده است.
|
// فیلتر city_id سمت API قبلاً کار را کرده است.
|
||||||
.filter((d) => !scope.isRoot || !findDomainByCityId(extractEntityCityId(d)));
|
.filter((d) => !scope.isRoot || !findDomainByCityId(extractEntityCityId(d)));
|
||||||
|
|||||||
+18
-2
@@ -14,8 +14,7 @@ function hasRealName(rawName) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* پزشک بیمحتوا. معیار قبلی «owner_status !== claimed» بیش از حد سختگیر بود و
|
* پزشک بیمحتوا — فقط سنجهٔ محتوا، مستقل از مالکیت پروفایل.
|
||||||
* عملاً کل مارکتپلیس را از ایندکس بیرون میگذاشت — حالا فقط نبودِ محتوا مهم است.
|
|
||||||
*/
|
*/
|
||||||
export function isThinDoctor(doctor) {
|
export function isThinDoctor(doctor) {
|
||||||
if (!doctor?.uuid || !hasRealName(doctor.name)) return true;
|
if (!doctor?.uuid || !hasRealName(doctor.name)) return true;
|
||||||
@@ -24,6 +23,23 @@ export function isThinDoctor(doctor) {
|
|||||||
return !hasSpecialty && !hasLocation;
|
return !hasSpecialty && !hasLocation;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* پروفایل بدون مالک (claim نشده). دادهاش از منبع بیرونی آمده و صاحبش تأییدش نکرده،
|
||||||
|
* پس محتوای قابل اتکا برای ایندکس نیست. هم پاسخ لیست و هم پاسخ جزئیات `owner_status`
|
||||||
|
* دارند؛ نبودِ فیلد هم «مالک ندارد» تفسیر میشود تا هیچوقت بهطور خاموش ایندکس نشود.
|
||||||
|
*/
|
||||||
|
export function isUnclaimedDoctor(doctor) {
|
||||||
|
return doctor?.owner_status !== "claimed";
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* منبع واحدِ ایندکسپذیری پزشک: هم صفحهٔ پزشک (robots) و هم sitemap از این استفاده
|
||||||
|
* میکنند تا واگرا نشوند — چیزی که noindex است نباید در sitemap باشد.
|
||||||
|
*/
|
||||||
|
export function isNoindexDoctor(doctor) {
|
||||||
|
return isThinDoctor(doctor) || isUnclaimedDoctor(doctor);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* کلینیک بیمحتوا. is_active:false = «موقتاً غیرفعال» تفسیر میشود (noindex، نه 410)،
|
* کلینیک بیمحتوا. is_active:false = «موقتاً غیرفعال» تفسیر میشود (noindex، نه 410)،
|
||||||
* چون رکورد و نوبتهای تاریخیاش باقی میمانند و ممکن است دوباره فعال شود.
|
* چون رکورد و نوبتهای تاریخیاش باقی میمانند و ممکن است دوباره فعال شود.
|
||||||
|
|||||||
Reference in New Issue
Block a user