UNPKG

@dijitrak/react-nextjs-seo-plugin

Version:

A modern, user-friendly SEO plugin for React and Next.js with multilingual support and comprehensive optimization tools

194 lines (162 loc) 6.32 kB
/** * Meta etiketleri işlemleri */ /** * Meta etiketleri oluşturur * @param {object} metaData SEO meta verileri * @param {string} baseUrl Temel site URL'si * @returns {string} HTML meta etiketleri */ export function generateMetaTags(metaData = {}, baseUrl = '') { // Boş meta verileri için varsayılan değerleri ekle const completeMeta = { title: '', description: '', keywords: '', allowIndex: true, allowFollow: true, canonicalUrl: '', ogTitle: '', ogDescription: '', ogImage: '', ogType: 'website', twitterTitle: '', twitterDescription: '', twitterImage: '', twitterCard: 'summary_large_image', language: 'en', // Özellikleri metaData'dan ekle, var olanları üzerine yaz ...metaData }; let tags = ''; // Temel meta etiketleri tags += `<title>${completeMeta.title}</title>\n`; tags += `<meta name="description" content="${completeMeta.description}" />\n`; if (completeMeta.keywords) { tags += `<meta name="keywords" content="${completeMeta.keywords}" />\n`; } // Dil if (completeMeta.language) { tags += `<meta http-equiv="content-language" content="${completeMeta.language}" />\n`; } // Robots meta etiketi const robotsValue = `${completeMeta.allowIndex ? 'index' : 'noindex'}, ${completeMeta.allowFollow ? 'follow' : 'nofollow'}`; tags += `<meta name="robots" content="${robotsValue}" />\n`; // Canonical link if (completeMeta.canonicalUrl) { let canonicalUrl = completeMeta.canonicalUrl; // Eğer başında http yoksa ve baseUrl verilmişse birleştir if (!canonicalUrl.startsWith('http') && baseUrl) { canonicalUrl = baseUrl.replace(/\/$/, '') + (canonicalUrl.startsWith('/') ? canonicalUrl : `/${canonicalUrl}`); } tags += `<link rel="canonical" href="${canonicalUrl}" />\n`; } // Open Graph meta etiketleri tags += `<meta property="og:title" content="${completeMeta.ogTitle || completeMeta.title}" />\n`; tags += `<meta property="og:description" content="${completeMeta.ogDescription || completeMeta.description}" />\n`; if (completeMeta.ogImage) { let ogImage = completeMeta.ogImage; // Eğer başında http yoksa ve baseUrl verilmişse birleştir if (!ogImage.startsWith('http') && baseUrl) { ogImage = baseUrl.replace(/\/$/, '') + (ogImage.startsWith('/') ? ogImage : `/${ogImage}`); } tags += `<meta property="og:image" content="${ogImage}" />\n`; } if (completeMeta.ogType) { tags += `<meta property="og:type" content="${completeMeta.ogType}" />\n`; } // Twitter Card meta etiketleri if (completeMeta.twitterCard) { tags += `<meta name="twitter:card" content="${completeMeta.twitterCard}" />\n`; } tags += `<meta name="twitter:title" content="${completeMeta.twitterTitle || completeMeta.ogTitle || completeMeta.title}" />\n`; tags += `<meta name="twitter:description" content="${completeMeta.twitterDescription || completeMeta.ogDescription || completeMeta.description}" />\n`; if (completeMeta.twitterImage || completeMeta.ogImage) { let twitterImage = completeMeta.twitterImage || completeMeta.ogImage; // Eğer başında http yoksa ve baseUrl verilmişse birleştir if (twitterImage && !twitterImage.startsWith('http') && baseUrl) { twitterImage = baseUrl.replace(/\/$/, '') + (twitterImage.startsWith('/') ? twitterImage : `/${twitterImage}`); } tags += `<meta name="twitter:image" content="${twitterImage}" />\n`; } // Site URL if (baseUrl) { tags += `<meta property="og:url" content="${baseUrl}" />\n`; } return tags; } /** * Hreflang etiketleri oluşturur * @param {object} languageMetadata Dil metadata bilgileri * @param {string} baseUrl Temel site URL'si * @returns {string} HTML hreflang etiketleri */ export function generateHreflangTags(languageMetadata = {}, baseUrl = '') { if (!languageMetadata) return ''; let tags = ''; // Ana dil için hreflang etiketi if (languageMetadata.primary) { const href = baseUrl || '/'; tags += `<link rel="alternate" hreflang="${languageMetadata.primary}" href="${href}" />\n`; // x-default için hreflang etiketi (varsayılan dil) tags += `<link rel="alternate" hreflang="x-default" href="${href}" />\n`; } // Alternatif diller için hreflang etiketleri if (languageMetadata.alternate && languageMetadata.alternate.length > 0) { languageMetadata.alternate.forEach(alt => { tags += `<link rel="alternate" hreflang="${alt.hrefLang}" href="${alt.href}" />\n`; }); } return tags; } /** * Next.js App Router için Metadata nesnesini oluşturur * @param {object} props Metadata nesne parametreleri * @returns {object} Next.js Metadata nesnesi */ export function generateNextMetadata(props = {}) { const { title, description, keywords, openGraph, twitter, languageMetadata } = props; const metadata = {}; // Title ve description özelliklerini koşullu olarak ekleyelim if (title) metadata.title = title; if (description) metadata.description = description; if (keywords) metadata.keywords = keywords; // Open Graph metadata if (openGraph || title || description) { metadata.openGraph = { ...(title ? { title: openGraph?.title || title } : {}), ...(description ? { description: openGraph?.description || description } : {}), ...(openGraph || {}) }; } // Twitter metadata if (twitter || title || description) { metadata.twitter = { ...(title ? { title: twitter?.title || openGraph?.title || title } : {}), ...(description ? { description: twitter?.description || openGraph?.description || description } : {}), ...(twitter?.card ? { card: twitter.card } : { card: 'summary_large_image' }), ...(twitter || {}) }; } // Alternatif dil bağlantıları if (languageMetadata && languageMetadata.alternate && languageMetadata.alternate.length > 0) { const alternates = { languages: {} }; if (languageMetadata.primary) { alternates.languages['x-default'] = '/'; } languageMetadata.alternate.forEach(alt => { alternates.languages[alt.hrefLang] = alt.href; }); metadata.alternates = alternates; } return metadata; }