diff --git a/README.md b/README.md index 5f55096..2edc71f 100644 --- a/README.md +++ b/README.md @@ -13,12 +13,83 @@ # PHP Sitemap Generator -This project can be used to generate sitemaps. It can build a sitemap file from a list of URLs. The URLs may have attached the last modification date, a change frequency and a priority. +This project can be used to generate sitemaps. It can build a sitemap file from a list of URLs. The URLs may have attached the last modification date, change frequency, priority and image properties. + +Sitemap format: http://www.sitemaps.org/protocol.html + +## Sitemap file + +After creating your sitemap.xml file, you should add the XML file to your `robots.txt`. + +Line for the robots.txt: + +``` +Sitemap: http://example.com/sitemap/sitemap.xml +``` + +## Output + +Example output when generating a sitemap + +```XML + + + + http://example.com/ + 2024-03-17 + 1 + + + http://example.com/about-us + 2024-03-08 + 0.8 + + http://example.com/assets/images/pages/about-us.jpg + + + + http://example.com/uber-uns + 2024-03-08 + 0.8 + + + http://example.com/a-propos-de-nous + 2024-03-08 + 0.8 + + + http://example.com/sobre-nosotros + 2024-03-08 + 0.8 + + + http://example.com/o-nas + 2024-03-08 + 0.8 + + + http://example.com/%D9%85%D8%B9%D9%84%D9%88%D9%85%D8%A7%D8%AA-%D8%B9%D9%86%D8%A7 + 2024-03-08 + 0.8 + + + http://example.com/chi-siamo + 2024-03-08 + 0.8 + + + http://example.com/hakkimizda + 2024-03-08 + 0.8 + + +``` ## Screenshots ![screenshot01](screenshots/screenshot01.png) -![screenshot01](screenshots/screenshot02.png) +![screenshot02](screenshots/screenshot02.png) ## License diff --git a/composer.json b/composer.json index ef9212d..6619d2c 100644 --- a/composer.json +++ b/composer.json @@ -29,6 +29,7 @@ }, "require": { "ext-json": "*", - "ext-pdo": "*" + "ext-pdo": "*", + "ext-mbstring": "*" } } diff --git a/screenshots/screenshot01.png b/screenshots/screenshot01.png index 3c43881..53489a4 100644 Binary files a/screenshots/screenshot01.png and b/screenshots/screenshot01.png differ diff --git a/screenshots/screenshot02.png b/screenshots/screenshot02.png index ba6f5e1..884ecb3 100644 Binary files a/screenshots/screenshot02.png and b/screenshots/screenshot02.png differ diff --git a/src/ajax.php b/src/ajax.php index 28bbd7f..227d0ad 100644 --- a/src/ajax.php +++ b/src/ajax.php @@ -9,6 +9,9 @@ $response = new \App\Library\Response(); $sitemap_generator = new SitemapGenerator(); try { + /* + * Setting form options + */ $sitemap_generator->getSitemap()->setHttpSecure(!empty($_POST['http_secure'])); if (!empty($_POST['domain'])) { $sitemap_generator->getSitemap()->setDomain(trim($_POST['domain'])); @@ -26,7 +29,14 @@ $sitemap_generator->getSitemap()->setFilePath(BASE_PATH.trim($_POST['file_path'])); } if (!empty($_POST['file_name'])) { - $sitemap_generator->getSitemap()->setFileName(trim($_POST['file_name'])); + $file_name = trim($_POST['file_name']); + if (!empty($_POST['file_name_unique'])) { + $file_name .= '-'.uniqid(); + } + if (!empty($_POST['file_name_date'])) { + $file_name .= '-'.date('Y-m-d'); + } + $sitemap_generator->getSitemap()->setFileName($file_name); } if (!empty($_POST['file_ext'])) { $sitemap_generator->getSitemap()->setFileExt(trim($_POST['file_ext'])); @@ -40,26 +50,55 @@ if (!empty($_POST['file_urlset_footer'])) { $sitemap_generator->getSitemap()->setUrlsetFooter(trim($_POST['file_urlset_footer'])); } + if (!empty($_POST['url_limit'])) { + $sitemap_generator->setUrlLimit(trim($_POST['url_limit'])); + } + /* + * Adding base url + */ + $sitemap_generator->set_url_loc(''); + $sitemap_generator->set_url_last_mod(date('Y-m-d')); + $sitemap_generator->set_url_priority(1); + $sitemap_generator->add_url_to_list(); + /* + * Adding page urls + */ $query_pages = $db->query("SELECT * from tbl_pages", PDO::FETCH_ASSOC); if ($query_pages && $query_pages->rowCount()) { $pages = $query_pages->fetchAll(PDO::FETCH_ASSOC); foreach ($pages as $page) { - $sitemap_generator->set_url_loc($page['slug']); - $sitemap_generator->set_url_last_mod(!empty($page['updated_at']) ? $page['updated_at'] : $page['created_at']); + $sitemap_generator->set_url_loc(urlencode($page['slug'])); + $date = !empty($page['updated_at']) ? $page['updated_at'] : $page['created_at']; + $sitemap_generator->set_url_last_mod(date('Y-m-d', strtotime($date))); $sitemap_generator->set_url_priority(0.8); + if (!empty($page['image'])) { + $sitemap_generator->set_url_image_loc('assets/images/pages/'.urlencode($page['image'])); + $sitemap_generator->set_url_image_title($page['name']); + } $sitemap_generator->add_url_to_list(); } } + /* + * Adding products urls + */ $query_products = $db->query("SELECT * from tbl_products", PDO::FETCH_ASSOC); if ($query_products && $query_products->rowCount()) { $products = $query_products->fetchAll(PDO::FETCH_ASSOC); foreach ($products as $product) { - $sitemap_generator->set_url_loc('product-detail/'.$product['slug']); - $sitemap_generator->set_url_last_mod(!empty($product['updated_at']) ? $product['updated_at'] : $product['created_at']); + $sitemap_generator->set_url_loc('product-detail/'.urlencode($product['slug'])); + $date = !empty($product['updated_at']) ? $product['updated_at'] : $product['created_at']; + $sitemap_generator->set_url_last_mod(date('Y-m-d', strtotime($date))); $sitemap_generator->set_url_priority(1); + if (!empty($product['image'])) { + $sitemap_generator->set_url_image_loc('assets/images/products/'.urlencode($product['image'])); + $sitemap_generator->set_url_image_title($product['name']); + } $sitemap_generator->add_url_to_list(); } } + /* + * Generating sitemap + */ $response = $sitemap_generator->generate(); } catch (\Exception $e) { $response->setStatus(false); diff --git a/src/db/db.sql b/src/db/db.sql index 1b34a9e..1643178 100644 --- a/src/db/db.sql +++ b/src/db/db.sql @@ -3,7 +3,7 @@ -- https://www.phpmyadmin.net/ -- -- Anamakine: mysql --- Üretim Zamanı: 14 Mar 2024, 15:56:28 +-- Üretim Zamanı: 19 Mar 2024, 12:43:09 -- Sunucu sürümü: 5.7.43 -- PHP Sürümü: 8.2.12 @@ -23,6 +23,33 @@ SET time_zone = "+00:00"; -- -------------------------------------------------------- +-- +-- Tablo için tablo yapısı `tbl_languages` +-- + +CREATE TABLE `tbl_languages` ( + `id` int(11) NOT NULL, + `code` varchar(255) NOT NULL, + `name` varchar(255) NOT NULL, + `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- +-- Tablo döküm verisi `tbl_languages` +-- + +INSERT INTO `tbl_languages` (`id`, `code`, `name`, `created_at`) VALUES +(1, 'en', 'English', '2024-03-19 12:38:49'), +(2, 'de', 'Deutsch', '2024-03-19 12:38:49'), +(3, 'fr', 'Français', '2024-03-19 12:38:49'), +(4, 'es', 'Español', '2024-03-19 12:38:49'), +(5, 'ru', 'Русский', '2024-03-19 12:38:49'), +(6, 'ar', 'عربي', '2024-03-19 12:38:49'), +(7, 'it', 'Italiano', '2024-03-19 12:38:49'), +(8, 'tr', 'Türkçe', '2024-03-19 12:38:49'); + +-- -------------------------------------------------------- + -- -- Tablo için tablo yapısı `tbl_pages` -- @@ -34,6 +61,7 @@ CREATE TABLE `tbl_pages` ( `title` varchar(255) NOT NULL, `slug` varchar(255) NOT NULL, `description` text, + `image` varchar(255) DEFAULT NULL, `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, `updated_at` datetime DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; @@ -42,23 +70,23 @@ CREATE TABLE `tbl_pages` ( -- Tablo döküm verisi `tbl_pages` -- -INSERT INTO `tbl_pages` (`id`, `language_group_id`, `language_id`, `title`, `slug`, `description`, `created_at`, `updated_at`) VALUES -(1, 1, 1, 'About Us', 'about-us', 'Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry\'s standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.', '2024-03-08 13:10:58', NULL), -(2, 1, 2, 'Über uns', 'uber-uns', 'Lorem Ipsum ist ein einfacher Demo-Text für die Print- und Schriftindustrie. Lorem Ipsum ist in der Industrie bereits der Standard Demo-Text seit 1500, als ein unbekannter Schriftsteller eine Hand voll Wörter nahm und diese durcheinander warf um ein Musterbuch zu erstellen. Es hat nicht nur 5 Jahrhunderte überlebt, sondern auch in Spruch in die elektronische Schriftbearbeitung geschafft (bemerke, nahezu unverändert). Bekannt wurde es 1960, mit dem erscheinen von \"Letraset\", welches Passagen von Lorem Ipsum enhielt, so wie Desktop Software wie \"Aldus PageMaker\" - ebenfalls mit Lorem Ipsum.', '2024-03-08 13:10:58', NULL), -(3, 1, 3, 'À propos de nous', 'a-propos-de-nous', 'Le Lorem Ipsum est simplement du faux texte employé dans la composition et la mise en page avant impression. Le Lorem Ipsum est le faux texte standard de l\'imprimerie depuis les années 1500, quand un imprimeur anonyme assembla ensemble des morceaux de texte pour réaliser un livre spécimen de polices de texte. Il n\'a pas fait que survivre cinq siècles, mais s\'est aussi adapté à la bureautique informatique, sans que son contenu n\'en soit modifié. Il a été popularisé dans les années 1960 grâce à la vente de feuilles Letraset contenant des passages du Lorem Ipsum, et, plus récemment, par son inclusion dans des applications de mise en page de texte, comme Aldus PageMaker.', '2024-03-08 13:10:58', NULL), -(4, 1, 4, 'Sobre nosotros', 'sobre-nosotros', 'Lorem Ipsum es simplemente el texto de relleno de las imprentas y archivos de texto. Lorem Ipsum ha sido el texto de relleno estándar de las industrias desde el año 1500, cuando un impresor (N. del T. persona que se dedica a la imprenta) desconocido usó una galería de textos y los mezcló de tal manera que logró hacer un libro de textos especimen. No sólo sobrevivió 500 años, sino que tambien ingresó como texto de relleno en documentos electrónicos, quedando esencialmente igual al original. Fue popularizado en los 60s con la creación de las hojas \"Letraset\", las cuales contenian pasajes de Lorem Ipsum, y más recientemente con software de autoedición, como por ejemplo Aldus PageMaker, el cual incluye versiones de Lorem Ipsum.', '2024-03-08 13:10:58', NULL), -(5, 1, 5, 'О нас', 'o-nas', 'Lorem Ipsum - это текст-\"рыба\", часто используемый в печати и вэб-дизайне. Lorem Ipsum является стандартной \"рыбой\" для текстов на латинице с начала XVI века. В то время некий безымянный печатник создал большую коллекцию размеров и форм шрифтов, используя Lorem Ipsum для распечатки образцов. Lorem Ipsum не только успешно пережил без заметных изменений пять веков, но и перешагнул в электронный дизайн. Его популяризации в новое время послужили публикация листов Letraset с образцами Lorem Ipsum в 60-х годах и, в более недавнее время, программы электронной вёрстки типа Aldus PageMaker, в шаблонах которых используется Lorem Ipsum.', '2024-03-08 13:10:58', NULL), -(6, 1, 6, 'معلومات عنا', 'معلومات-عنا', 'هناك حقيقة مثبتة منذ زمن طويل وهي أن المحتوى المقروء لصفحة ما سيلهي القارئ عن التركيز على الشكل الخارجي للنص أو شكل توضع الفقرات في الصفحة التي يقرأها. ولذلك يتم استخدام طريقة لوريم إيبسوم لأنها تعطي توزيعاَ طبيعياَ -إلى حد ما- للأحرف عوضاً عن استخدام \"هنا يوجد محتوى نصي، هنا يوجد محتوى نصي\" فتجعلها تبدو (أي الأحرف) وكأنها نص مقروء. العديد من برامح النشر المكتبي وبرامح تحرير صفحات الويب تستخدم لوريم إيبسوم بشكل إفتراضي كنموذج عن النص، وإذا قمت بإدخال \"lorem ipsum\" في أي محرك بحث ستظهر العديد من المواقع الحديثة العهد في نتائج البحث. على مدى السنين ظهرت نسخ جديدة ومختلفة من نص لوريم إيبسوم، أحياناً عن طريق الصدفة، وأحياناً عن عمد كإدخال بعض العبارات الفكاهية إليها.', '2024-03-08 13:10:58', NULL), -(7, 1, 7, 'Chi siamo', 'chi-siamo', 'Lorem Ipsum è un testo segnaposto utilizzato nel settore della tipografia e della stampa. Lorem Ipsum è considerato il testo segnaposto standard sin dal sedicesimo secolo, quando un anonimo tipografo prese una cassetta di caratteri e li assemblò per preparare un testo campione. È sopravvissuto non solo a più di cinque secoli, ma anche al passaggio alla videoimpaginazione, pervenendoci sostanzialmente inalterato. Fu reso popolare, negli anni ’60, con la diffusione dei fogli di caratteri trasferibili “Letraset”, che contenevano passaggi del Lorem Ipsum, e più recentemente da software di impaginazione come Aldus PageMaker, che includeva versioni del Lorem Ipsum.', '2024-03-08 13:10:58', NULL), -(8, 1, 8, 'Hakkımızda', 'hakkimizda', 'Lorem Ipsum, dizgi ve baskı endüstrisinde kullanılan mıgır metinlerdir. Lorem Ipsum, adı bilinmeyen bir matbaacının bir hurufat numune kitabı oluşturmak üzere bir yazı galerisini alarak karıştırdığı 1500\'lerden beri endüstri standardı sahte metinler olarak kullanılmıştır. Beşyüz yıl boyunca varlığını sürdürmekle kalmamış, aynı zamanda pek değişmeden elektronik dizgiye de sıçramıştır. 1960\'larda Lorem Ipsum pasajları da içeren Letraset yapraklarının yayınlanması ile ve yakın zamanda Aldus PageMaker gibi Lorem Ipsum sürümleri içeren masaüstü yayıncılık yazılımları ile popüler olmuştur.', '2024-03-08 13:10:58', NULL), -(9, 2, 1, 'Contact', 'contact', 'Contrary to popular belief, Lorem Ipsum is not simply random text. It has roots in a piece of classical Latin literature from 45 BC, making it over 2000 years old. Richard McClintock, a Latin professor at Hampden-Sydney College in Virginia, looked up one of the more obscure Latin words, consectetur, from a Lorem Ipsum passage, and going through the cites of the word in classical literature, discovered the undoubtable source. Lorem Ipsum comes from sections 1.10.32 and 1.10.33 of \"de Finibus Bonorum et Malorum\" (The Extremes of Good and Evil) by Cicero, written in 45 BC. This book is a treatise on the theory of ethics, very popular during the Renaissance. The first line of Lorem Ipsum, \"Lorem ipsum dolor sit amet..\", comes from a line in section 1.10.32.', '2024-03-08 13:10:58', NULL), -(10, 2, 2, 'Kontakt', 'kontakt', 'Glauben oder nicht glauben, Lorem Ipsum ist nicht nur ein zufälliger Text. Er hat Wurzeln aus der Lateinischen Literatur von 45 v. Chr, was ihn über 2000 Jahre alt macht. Richar McClintock, ein Lateinprofessor des Hampden-Sydney College in Virgnia untersuche einige undeutliche Worte, \"consectetur\", einer Lorem Ipsum Passage und fand eine unwiederlegbare Quelle. Lorem Ipsum komm aus der Sektion 1.10.32 und 1.10.33 des \"de Finibus Bonorum et Malorum\" (Die Extreme von Gut und Böse) von Cicero, geschrieben 45 v. Chr. Dieses Buch ist Abhandlung der Ethiktheorien, sehr bekannt wärend der Renaissance. Die erste Zeile des Lorem Ipsum, \"Lorem ipsum dolor sit amet...\", kommt aus einer Zeile der Sektion 1.10.32.', '2024-03-08 13:10:58', NULL), -(11, 2, 3, 'Contact', 'contact-1', 'Contrairement à une opinion répandue, le Lorem Ipsum n\'est pas simplement du texte aléatoire. Il trouve ses racines dans une oeuvre de la littérature latine classique datant de 45 av. J.-C., le rendant vieux de 2000 ans. Un professeur du Hampden-Sydney College, en Virginie, s\'est intéressé à un des mots latins les plus obscurs, consectetur, extrait d\'un passage du Lorem Ipsum, et en étudiant tous les usages de ce mot dans la littérature classique, découvrit la source incontestable du Lorem Ipsum. Il provient en fait des sections 1.10.32 et 1.10.33 du \"De Finibus Bonorum et Malorum\" (Des Suprêmes Biens et des Suprêmes Maux) de Cicéron. Cet ouvrage, très populaire pendant la Renaissance, est un traité sur la théorie de l\'éthique. Les premières lignes du Lorem Ipsum, \"Lorem ipsum dolor sit amet...\", proviennent de la section 1.10.32.', '2024-03-08 13:10:58', NULL), -(12, 2, 4, 'Contacto', 'contacto', 'Al contrario del pensamiento popular, el texto de Lorem Ipsum no es simplemente texto aleatorio. Tiene sus raices en una pieza cl´sica de la literatura del Latin, que data del año 45 antes de Cristo, haciendo que este adquiera mas de 2000 años de antiguedad. Richard McClintock, un profesor de Latin de la Universidad de Hampden-Sydney en Virginia, encontró una de las palabras más oscuras de la lengua del latín, \"consecteur\", en un pasaje de Lorem Ipsum, y al seguir leyendo distintos textos del latín, descubrió la fuente indudable. Lorem Ipsum viene de las secciones 1.10.32 y 1.10.33 de \"de Finnibus Bonorum et Malorum\" (Los Extremos del Bien y El Mal) por Cicero, escrito en el año 45 antes de Cristo. Este libro es un tratado de teoría de éticas, muy popular durante el Renacimiento. La primera linea del Lorem Ipsum, \"Lorem ipsum dolor sit amet..\", viene de una linea en la sección 1.10.32', '2024-03-08 13:10:58', NULL), -(13, 2, 5, 'Контакт', 'kontakt-1', 'Многие думают, что Lorem Ipsum - взятый с потолка псевдо-латинский набор слов, но это не совсем так. Его корни уходят в один фрагмент классической латыни 45 года н.э., то есть более двух тысячелетий назад. Ричард МакКлинток, профессор латыни из колледжа Hampden-Sydney, штат Вирджиния, взял одно из самых странных слов в Lorem Ipsum, \"consectetur\", и занялся его поисками в классической латинской литературе. В результате он нашёл неоспоримый первоисточник Lorem Ipsum в разделах 1.10.32 и 1.10.33 книги \"de Finibus Bonorum et Malorum\" (\"О пределах добра и зла\"), написанной Цицероном в 45 году н.э. Этот трактат по теории этики был очень популярен в эпоху Возрождения. Первая строка Lorem Ipsum, \"Lorem ipsum dolor sit amet..\", происходит от одной из строк в разделе 1.10.32', '2024-03-08 13:10:58', NULL), -(14, 2, 6, 'اتصال', 'اتصال', 'هنالك العديد من الأنواع المتوفرة لنصوص لوريم إيبسوم، ولكن الغالبية تم تعديلها بشكل ما عبر إدخال بعض النوادر أو الكلمات العشوائية إلى النص. إن كنت تريد أن تستخدم نص لوريم إيبسوم ما، عليك أن تتحقق أولاً أن ليس هناك أي كلمات أو عبارات محرجة أو غير لائقة مخبأة في هذا النص. بينما تعمل جميع مولّدات نصوص لوريم إيبسوم على الإنترنت على إعادة تكرار مقاطع من نص لوريم إيبسوم نفسه عدة مرات بما تتطلبه الحاجة، يقوم مولّدنا هذا باستخدام كلمات من قاموس يحوي على أكثر من 200 كلمة لا تينية، مضاف إليها مجموعة من الجمل النموذجية، لتكوين نص لوريم إيبسوم ذو شكل منطقي قريب إلى النص الحقيقي. وبالتالي يكون النص الناتح خالي من التكرار، أو أي كلمات أو عبارات غير لائقة أو ما شابه. وهذا ما يجعله أول مولّد نص لوريم إيبسوم حقيقي على الإنترنت.', '2024-03-08 13:10:58', NULL), -(15, 2, 7, 'Contatto', 'contatto', 'Al contrario di quanto si pensi, Lorem Ipsum non è semplicemente una sequenza casuale di caratteri. Risale ad un classico della letteratura latina del 45 AC, cosa che lo rende vecchio di 2000 anni. Richard McClintock, professore di latino al Hampden-Sydney College in Virginia, ha ricercato una delle più oscure parole latine, consectetur, da un passaggio del Lorem Ipsum e ha scoperto tra i vari testi in cui è citata, la fonte da cui è tratto il testo, le sezioni 1.10.32 and 1.10.33 del \"de Finibus Bonorum et Malorum\" di Cicerone. Questo testo è un trattato su teorie di etica, molto popolare nel Rinascimento. La prima riga del Lorem Ipsum, \"Lorem ipsum dolor sit amet..\", è tratta da un passaggio della sezione 1.10.32.', '2024-03-08 13:10:58', NULL), -(16, 2, 8, 'İletişim', 'iletisim', 'Yaygın inancın tersine, Lorem Ipsum rastgele sözcüklerden oluşmaz. Kökleri M.Ö. 45 tarihinden bu yana klasik Latin edebiyatına kadar uzanan 2000 yıllık bir geçmişi vardır. Virginia\'daki Hampden-Sydney College\'dan Latince profesörü Richard McClintock, bir Lorem Ipsum pasajında geçen ve anlaşılması en güç sözcüklerden biri olan \'consectetur\' sözcüğünün klasik edebiyattaki örneklerini incelediğinde kesin bir kaynağa ulaşmıştır. Lorm Ipsum, Çiçero tarafından M.Ö. 45 tarihinde kaleme alınan \"de Finibus Bonorum et Malorum\" (İyi ve Kötünün Uç Sınırları) eserinin 1.10.32 ve 1.10.33 sayılı bölümlerinden gelmektedir. Bu kitap, ahlak kuramı üzerine bir tezdir ve Rönesans döneminde çok popüler olmuştur. Lorem Ipsum pasajının ilk satırı olan \"Lorem ipsum dolor sit amet\" 1.10.32 sayılı bölümdeki bir satırdan gelmektedir.', '2024-03-08 13:10:58', NULL); +INSERT INTO `tbl_pages` (`id`, `language_group_id`, `language_id`, `title`, `slug`, `description`, `image`, `created_at`, `updated_at`) VALUES +(1, 1, 1, 'About Us', 'about-us', 'Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry\'s standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.', 'about-us.jpg', '2024-03-08 13:10:58', NULL), +(2, 1, 2, 'Über uns', 'uber-uns', 'Lorem Ipsum ist ein einfacher Demo-Text für die Print- und Schriftindustrie. Lorem Ipsum ist in der Industrie bereits der Standard Demo-Text seit 1500, als ein unbekannter Schriftsteller eine Hand voll Wörter nahm und diese durcheinander warf um ein Musterbuch zu erstellen. Es hat nicht nur 5 Jahrhunderte überlebt, sondern auch in Spruch in die elektronische Schriftbearbeitung geschafft (bemerke, nahezu unverändert). Bekannt wurde es 1960, mit dem erscheinen von \"Letraset\", welches Passagen von Lorem Ipsum enhielt, so wie Desktop Software wie \"Aldus PageMaker\" - ebenfalls mit Lorem Ipsum.', NULL, '2024-03-08 13:10:58', NULL), +(3, 1, 3, 'À propos de nous', 'a-propos-de-nous', 'Le Lorem Ipsum est simplement du faux texte employé dans la composition et la mise en page avant impression. Le Lorem Ipsum est le faux texte standard de l\'imprimerie depuis les années 1500, quand un imprimeur anonyme assembla ensemble des morceaux de texte pour réaliser un livre spécimen de polices de texte. Il n\'a pas fait que survivre cinq siècles, mais s\'est aussi adapté à la bureautique informatique, sans que son contenu n\'en soit modifié. Il a été popularisé dans les années 1960 grâce à la vente de feuilles Letraset contenant des passages du Lorem Ipsum, et, plus récemment, par son inclusion dans des applications de mise en page de texte, comme Aldus PageMaker.', NULL, '2024-03-08 13:10:58', NULL), +(4, 1, 4, 'Sobre nosotros', 'sobre-nosotros', 'Lorem Ipsum es simplemente el texto de relleno de las imprentas y archivos de texto. Lorem Ipsum ha sido el texto de relleno estándar de las industrias desde el año 1500, cuando un impresor (N. del T. persona que se dedica a la imprenta) desconocido usó una galería de textos y los mezcló de tal manera que logró hacer un libro de textos especimen. No sólo sobrevivió 500 años, sino que tambien ingresó como texto de relleno en documentos electrónicos, quedando esencialmente igual al original. Fue popularizado en los 60s con la creación de las hojas \"Letraset\", las cuales contenian pasajes de Lorem Ipsum, y más recientemente con software de autoedición, como por ejemplo Aldus PageMaker, el cual incluye versiones de Lorem Ipsum.', NULL, '2024-03-08 13:10:58', NULL), +(5, 1, 5, 'О нас', 'o-nas', 'Lorem Ipsum - это текст-\"рыба\", часто используемый в печати и вэб-дизайне. Lorem Ipsum является стандартной \"рыбой\" для текстов на латинице с начала XVI века. В то время некий безымянный печатник создал большую коллекцию размеров и форм шрифтов, используя Lorem Ipsum для распечатки образцов. Lorem Ipsum не только успешно пережил без заметных изменений пять веков, но и перешагнул в электронный дизайн. Его популяризации в новое время послужили публикация листов Letraset с образцами Lorem Ipsum в 60-х годах и, в более недавнее время, программы электронной вёрстки типа Aldus PageMaker, в шаблонах которых используется Lorem Ipsum.', NULL, '2024-03-08 13:10:58', NULL), +(6, 1, 6, 'معلومات عنا', 'معلومات-عنا', 'هناك حقيقة مثبتة منذ زمن طويل وهي أن المحتوى المقروء لصفحة ما سيلهي القارئ عن التركيز على الشكل الخارجي للنص أو شكل توضع الفقرات في الصفحة التي يقرأها. ولذلك يتم استخدام طريقة لوريم إيبسوم لأنها تعطي توزيعاَ طبيعياَ -إلى حد ما- للأحرف عوضاً عن استخدام \"هنا يوجد محتوى نصي، هنا يوجد محتوى نصي\" فتجعلها تبدو (أي الأحرف) وكأنها نص مقروء. العديد من برامح النشر المكتبي وبرامح تحرير صفحات الويب تستخدم لوريم إيبسوم بشكل إفتراضي كنموذج عن النص، وإذا قمت بإدخال \"lorem ipsum\" في أي محرك بحث ستظهر العديد من المواقع الحديثة العهد في نتائج البحث. على مدى السنين ظهرت نسخ جديدة ومختلفة من نص لوريم إيبسوم، أحياناً عن طريق الصدفة، وأحياناً عن عمد كإدخال بعض العبارات الفكاهية إليها.', NULL, '2024-03-08 13:10:58', NULL), +(7, 1, 7, 'Chi siamo', 'chi-siamo', 'Lorem Ipsum è un testo segnaposto utilizzato nel settore della tipografia e della stampa. Lorem Ipsum è considerato il testo segnaposto standard sin dal sedicesimo secolo, quando un anonimo tipografo prese una cassetta di caratteri e li assemblò per preparare un testo campione. È sopravvissuto non solo a più di cinque secoli, ma anche al passaggio alla videoimpaginazione, pervenendoci sostanzialmente inalterato. Fu reso popolare, negli anni ’60, con la diffusione dei fogli di caratteri trasferibili “Letraset”, che contenevano passaggi del Lorem Ipsum, e più recentemente da software di impaginazione come Aldus PageMaker, che includeva versioni del Lorem Ipsum.', NULL, '2024-03-08 13:10:58', NULL), +(8, 1, 8, 'Hakkımızda', 'hakkimizda', 'Lorem Ipsum, dizgi ve baskı endüstrisinde kullanılan mıgır metinlerdir. Lorem Ipsum, adı bilinmeyen bir matbaacının bir hurufat numune kitabı oluşturmak üzere bir yazı galerisini alarak karıştırdığı 1500\'lerden beri endüstri standardı sahte metinler olarak kullanılmıştır. Beşyüz yıl boyunca varlığını sürdürmekle kalmamış, aynı zamanda pek değişmeden elektronik dizgiye de sıçramıştır. 1960\'larda Lorem Ipsum pasajları da içeren Letraset yapraklarının yayınlanması ile ve yakın zamanda Aldus PageMaker gibi Lorem Ipsum sürümleri içeren masaüstü yayıncılık yazılımları ile popüler olmuştur.', NULL, '2024-03-08 13:10:58', NULL), +(9, 2, 1, 'Contact', 'contact', 'Contrary to popular belief, Lorem Ipsum is not simply random text. It has roots in a piece of classical Latin literature from 45 BC, making it over 2000 years old. Richard McClintock, a Latin professor at Hampden-Sydney College in Virginia, looked up one of the more obscure Latin words, consectetur, from a Lorem Ipsum passage, and going through the cites of the word in classical literature, discovered the undoubtable source. Lorem Ipsum comes from sections 1.10.32 and 1.10.33 of \"de Finibus Bonorum et Malorum\" (The Extremes of Good and Evil) by Cicero, written in 45 BC. This book is a treatise on the theory of ethics, very popular during the Renaissance. The first line of Lorem Ipsum, \"Lorem ipsum dolor sit amet..\", comes from a line in section 1.10.32.', NULL, '2024-03-08 13:10:58', NULL), +(10, 2, 2, 'Kontakt', 'kontakt', 'Glauben oder nicht glauben, Lorem Ipsum ist nicht nur ein zufälliger Text. Er hat Wurzeln aus der Lateinischen Literatur von 45 v. Chr, was ihn über 2000 Jahre alt macht. Richar McClintock, ein Lateinprofessor des Hampden-Sydney College in Virgnia untersuche einige undeutliche Worte, \"consectetur\", einer Lorem Ipsum Passage und fand eine unwiederlegbare Quelle. Lorem Ipsum komm aus der Sektion 1.10.32 und 1.10.33 des \"de Finibus Bonorum et Malorum\" (Die Extreme von Gut und Böse) von Cicero, geschrieben 45 v. Chr. Dieses Buch ist Abhandlung der Ethiktheorien, sehr bekannt wärend der Renaissance. Die erste Zeile des Lorem Ipsum, \"Lorem ipsum dolor sit amet...\", kommt aus einer Zeile der Sektion 1.10.32.', NULL, '2024-03-08 13:10:58', NULL), +(11, 2, 3, 'Contact', 'contact-1', 'Contrairement à une opinion répandue, le Lorem Ipsum n\'est pas simplement du texte aléatoire. Il trouve ses racines dans une oeuvre de la littérature latine classique datant de 45 av. J.-C., le rendant vieux de 2000 ans. Un professeur du Hampden-Sydney College, en Virginie, s\'est intéressé à un des mots latins les plus obscurs, consectetur, extrait d\'un passage du Lorem Ipsum, et en étudiant tous les usages de ce mot dans la littérature classique, découvrit la source incontestable du Lorem Ipsum. Il provient en fait des sections 1.10.32 et 1.10.33 du \"De Finibus Bonorum et Malorum\" (Des Suprêmes Biens et des Suprêmes Maux) de Cicéron. Cet ouvrage, très populaire pendant la Renaissance, est un traité sur la théorie de l\'éthique. Les premières lignes du Lorem Ipsum, \"Lorem ipsum dolor sit amet...\", proviennent de la section 1.10.32.', 'contact.png', '2024-03-08 13:10:58', NULL), +(12, 2, 4, 'Contacto', 'contacto', 'Al contrario del pensamiento popular, el texto de Lorem Ipsum no es simplemente texto aleatorio. Tiene sus raices en una pieza cl´sica de la literatura del Latin, que data del año 45 antes de Cristo, haciendo que este adquiera mas de 2000 años de antiguedad. Richard McClintock, un profesor de Latin de la Universidad de Hampden-Sydney en Virginia, encontró una de las palabras más oscuras de la lengua del latín, \"consecteur\", en un pasaje de Lorem Ipsum, y al seguir leyendo distintos textos del latín, descubrió la fuente indudable. Lorem Ipsum viene de las secciones 1.10.32 y 1.10.33 de \"de Finnibus Bonorum et Malorum\" (Los Extremos del Bien y El Mal) por Cicero, escrito en el año 45 antes de Cristo. Este libro es un tratado de teoría de éticas, muy popular durante el Renacimiento. La primera linea del Lorem Ipsum, \"Lorem ipsum dolor sit amet..\", viene de una linea en la sección 1.10.32', NULL, '2024-03-08 13:10:58', NULL), +(13, 2, 5, 'Контакт', 'kontakt-1', 'Многие думают, что Lorem Ipsum - взятый с потолка псевдо-латинский набор слов, но это не совсем так. Его корни уходят в один фрагмент классической латыни 45 года н.э., то есть более двух тысячелетий назад. Ричард МакКлинток, профессор латыни из колледжа Hampden-Sydney, штат Вирджиния, взял одно из самых странных слов в Lorem Ipsum, \"consectetur\", и занялся его поисками в классической латинской литературе. В результате он нашёл неоспоримый первоисточник Lorem Ipsum в разделах 1.10.32 и 1.10.33 книги \"de Finibus Bonorum et Malorum\" (\"О пределах добра и зла\"), написанной Цицероном в 45 году н.э. Этот трактат по теории этики был очень популярен в эпоху Возрождения. Первая строка Lorem Ipsum, \"Lorem ipsum dolor sit amet..\", происходит от одной из строк в разделе 1.10.32', NULL, '2024-03-08 13:10:58', NULL), +(14, 2, 6, 'اتصال', 'اتصال', 'هنالك العديد من الأنواع المتوفرة لنصوص لوريم إيبسوم، ولكن الغالبية تم تعديلها بشكل ما عبر إدخال بعض النوادر أو الكلمات العشوائية إلى النص. إن كنت تريد أن تستخدم نص لوريم إيبسوم ما، عليك أن تتحقق أولاً أن ليس هناك أي كلمات أو عبارات محرجة أو غير لائقة مخبأة في هذا النص. بينما تعمل جميع مولّدات نصوص لوريم إيبسوم على الإنترنت على إعادة تكرار مقاطع من نص لوريم إيبسوم نفسه عدة مرات بما تتطلبه الحاجة، يقوم مولّدنا هذا باستخدام كلمات من قاموس يحوي على أكثر من 200 كلمة لا تينية، مضاف إليها مجموعة من الجمل النموذجية، لتكوين نص لوريم إيبسوم ذو شكل منطقي قريب إلى النص الحقيقي. وبالتالي يكون النص الناتح خالي من التكرار، أو أي كلمات أو عبارات غير لائقة أو ما شابه. وهذا ما يجعله أول مولّد نص لوريم إيبسوم حقيقي على الإنترنت.', NULL, '2024-03-08 13:10:58', NULL), +(15, 2, 7, 'Contatto', 'contatto', 'Al contrario di quanto si pensi, Lorem Ipsum non è semplicemente una sequenza casuale di caratteri. Risale ad un classico della letteratura latina del 45 AC, cosa che lo rende vecchio di 2000 anni. Richard McClintock, professore di latino al Hampden-Sydney College in Virginia, ha ricercato una delle più oscure parole latine, consectetur, da un passaggio del Lorem Ipsum e ha scoperto tra i vari testi in cui è citata, la fonte da cui è tratto il testo, le sezioni 1.10.32 and 1.10.33 del \"de Finibus Bonorum et Malorum\" di Cicerone. Questo testo è un trattato su teorie di etica, molto popolare nel Rinascimento. La prima riga del Lorem Ipsum, \"Lorem ipsum dolor sit amet..\", è tratta da un passaggio della sezione 1.10.32.', NULL, '2024-03-08 13:10:58', NULL), +(16, 2, 8, 'İletişim', 'iletisim', 'Yaygın inancın tersine, Lorem Ipsum rastgele sözcüklerden oluşmaz. Kökleri M.Ö. 45 tarihinden bu yana klasik Latin edebiyatına kadar uzanan 2000 yıllık bir geçmişi vardır. Virginia\'daki Hampden-Sydney College\'dan Latince profesörü Richard McClintock, bir Lorem Ipsum pasajında geçen ve anlaşılması en güç sözcüklerden biri olan \'consectetur\' sözcüğünün klasik edebiyattaki örneklerini incelediğinde kesin bir kaynağa ulaşmıştır. Lorm Ipsum, Çiçero tarafından M.Ö. 45 tarihinde kaleme alınan \"de Finibus Bonorum et Malorum\" (İyi ve Kötünün Uç Sınırları) eserinin 1.10.32 ve 1.10.33 sayılı bölümlerinden gelmektedir. Bu kitap, ahlak kuramı üzerine bir tezdir ve Rönesans döneminde çok popüler olmuştur. Lorem Ipsum pasajının ilk satırı olan \"Lorem ipsum dolor sit amet\" 1.10.32 sayılı bölümdeki bir satırdan gelmektedir.', NULL, '2024-03-08 13:10:58', NULL); -- -------------------------------------------------------- @@ -104,6 +132,12 @@ INSERT INTO `tbl_products` (`id`, `language_group_id`, `language_id`, `name`, `s -- Dökümü yapılmış tablolar için indeksler -- +-- +-- Tablo için indeksler `tbl_languages` +-- +ALTER TABLE `tbl_languages` + ADD PRIMARY KEY (`id`); + -- -- Tablo için indeksler `tbl_pages` -- @@ -120,6 +154,12 @@ ALTER TABLE `tbl_products` -- Dökümü yapılmış tablolar için AUTO_INCREMENT değeri -- +-- +-- Tablo için AUTO_INCREMENT değeri `tbl_languages` +-- +ALTER TABLE `tbl_languages` + MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=9; + -- -- Tablo için AUTO_INCREMENT değeri `tbl_pages` -- diff --git a/src/index.php b/src/index.php index 578d7a3..4baf224 100644 --- a/src/index.php +++ b/src/index.php @@ -101,6 +101,28 @@ placeholder="File Ext" value="getSitemap()->getFileExt() ?>"> +
+
+ + +
+
+ + +
+
+ +
+
+ + +
diff --git a/src/lib/Sitemap.php b/src/lib/Sitemap.php index 30427ca..0d0e32f 100644 --- a/src/lib/Sitemap.php +++ b/src/lib/Sitemap.php @@ -41,7 +41,7 @@ class Sitemap * * @var string */ - private $urlset_header = ''; + private $urlset_header = ''; /** * @var string */ @@ -104,6 +104,9 @@ public function getFilePath() */ public function setFilePath($file_path) { + if (mb_substr($file_path, -1) !== '/') { + $file_path .= '/'; + } $this->file_path = $file_path; } diff --git a/src/lib/SitemapGenerator.php b/src/lib/SitemapGenerator.php index db8843a..74aed2f 100644 --- a/src/lib/SitemapGenerator.php +++ b/src/lib/SitemapGenerator.php @@ -34,6 +34,18 @@ class SitemapGenerator * @var array */ private $url = array(); + /** + * [ + * 'loc' => 'image_url', + * 'title' => 'Image Title' + * ] + * @var array + */ + private $url_image = array(); + /** + * @var int + */ + private $url_limit = 50000; /** * The date of last modification of the page. This date should be in W3C Datetime format. * This format allows you to omit the time portion, if desired, and use YYYY-MM-DD. @@ -119,6 +131,9 @@ public function add_url_to_list() */ public function getUrl() { + if ($this->getUrlImage()) { + $this->url['image'] = $this->getUrlImage(); + } return $this->url; } @@ -130,6 +145,38 @@ public function setUrl($url) $this->url = $url; } + /** + * @return array + */ + public function getUrlImage() + { + return $this->url_image; + } + + /** + * @param array $url_image + */ + public function setUrlImage($url_image) + { + $this->url_image = $url_image; + } + + /** + * @return int + */ + public function getUrlLimit() + { + return $this->url_limit; + } + + /** + * @param int $url_limit + */ + public function setUrlLimit($url_limit) + { + $this->url_limit = $url_limit; + } + /** * @return string */ @@ -239,14 +286,38 @@ public function set_url_priority($url_priority) } /** + * @param $url_image_loc * @return void */ - public function set_urlset_body() + public function set_url_image_loc($url_image_loc) { - $url_list = $this->getUrllist(); + if (strpos($url_image_loc, $this->getSitemap()->getDomain()) == false) { + $url_image_loc = $this->getSitemap()->getDomain().'/'.$url_image_loc; + } + $this->url_image['loc'] = $url_image_loc; + } + + /** + * @param $url_image_title + * @return void + */ + public function set_url_image_title($url_image_title) + { + $this->url_image['title'] = $url_image_title; + } + + /** + * @param $url_list + * @return void + */ + public function set_urlset_body($url_list = array()) + { + if (empty($url_list)) { + $url_list = $this->getUrllist(); + } $data = ''; if (!empty($url_list)) { - foreach ($this->url_list as $url) { + foreach ($url_list as $url) { $item = (object) $url; $data .= ''; if (isset($item->loc)) { @@ -258,6 +329,16 @@ public function set_urlset_body() if (isset($item->priority)) { $data .= ''.$item->priority.''; } + if (isset($item->image)) { + $data .= ''; + if (isset($item->image['loc'])) { + $data .= ''.$item->image['loc'].''; + } + if (isset($item->image['title'])) { + $data .= ''.$item->image['title'].''; + } + $data .= ''; + } $data .= ''; } } @@ -266,7 +347,7 @@ public function set_urlset_body() /** * @param $path - * @return Response|true + * @return Response */ public function create_file_path($path) { @@ -285,6 +366,39 @@ public function create_file_path($path) return $this->response; } + /** + * @param $file_path + * @param $file_name + * @param $file_ext + * @param $index_dir + * @return Response + */ + public function create_sitemap_index($file_path, $file_name, $file_ext, $index_dir) + { + $sitemap_list = scandir($index_dir); + if (!empty($sitemap_list) && count($sitemap_list) > 2) { + $sitemap_index_header = ''; + $sitemap_index_footer = ''; + $sitemap_index_content = ''; + foreach ($sitemap_list as $sitemap) { + if ($sitemap === '.' || $sitemap === '..') { + continue; + } + $file_url = $this->base_url.str_replace($_SERVER["DOCUMENT_ROOT"], '', $index_dir).$sitemap; + $sitemap_index_content .= ' + '.$file_url.' + '.date('Y-m-d', filectime($index_dir.$sitemap)).' + '; + } + $file_data = $sitemap_index_header.$sitemap_index_content.$sitemap_index_footer; + $this->response = $this->write($file_name, $file_path, $file_ext, $file_data); + } else { + $this->response->setStatus(false); + $this->response->setMessage('Sitemap index files not found.
Date: '.$this->response->getDate().', Sitemap index dir: '.$index_dir.''); + } + return $this->response; + } + /** * @param $file_name * @param $file_path @@ -306,7 +420,7 @@ public function write($file_name, $file_path, $file_ext, $file_data) $this->response->setStatus(true); $this->response->setMessage('Sitemap file created successfully.
Date: '.$this->response->getDate().', File path: '.$full_path.''); } else { - $this->response->setMessage('Sitemap file could not write.
Date: '.$this->response->getDate().''); + $this->response->setMessage('Sitemap file could not write.
Date: '.$this->response->getDate().', File path: '.$full_path.''); } } else { $this->response = $create_file_path; @@ -322,8 +436,42 @@ public function generate() $file_path = $this->sitemap->getFilePath(); $file_name = $this->sitemap->getFileName(); $file_ext = $this->sitemap->getFileExt(); - $this->set_urlset_body(); - $file_data = $this->sitemap->getHeader().$this->sitemap->getUrlsetHeader().$this->sitemap->getUrlsetBody().$this->sitemap->getUrlsetFooter(); - return $this->write($file_name, $file_path, $file_ext, $file_data); + $url_list = $this->getUrllist(); + $url_limit = $this->getUrlLimit(); + /* + * If url limit is not 0 (zero) + */ + if (!empty($url_limit)) { + $url_list_chunk = array_chunk($url_list, $url_limit); + /* + * If there is more than 1 file, a sitemap index will be created + */ + if (count($url_list_chunk) > 1) { + $file_index_path = $file_path.'index/'; + $i = 1; + foreach ($url_list_chunk as $list) { + $this->set_urlset_body($list); + $file_index_data = $this->sitemap->getHeader().$this->sitemap->getUrlsetHeader().$this->sitemap->getUrlsetBody().$this->sitemap->getUrlsetFooter(); + $file_index_name = $file_name.'-'.$i; + $this->response = $this->write($file_index_name, $file_index_path, $file_ext, $file_index_data); + if (!$this->response->isStatus()) { + break; + } + $i++; + } + if ($this->response->isStatus()) { + $this->response = $this->create_sitemap_index($file_path, $file_name, $file_ext, $file_index_path); + } + } else { + $this->set_urlset_body(); + $file_data = $this->sitemap->getHeader().$this->sitemap->getUrlsetHeader().$this->sitemap->getUrlsetBody().$this->sitemap->getUrlsetFooter(); + $this->response = $this->write($file_name, $file_path, $file_ext, $file_data); + } + } else { + $this->set_urlset_body(); + $file_data = $this->sitemap->getHeader().$this->sitemap->getUrlsetHeader().$this->sitemap->getUrlsetBody().$this->sitemap->getUrlsetFooter(); + $this->response = $this->write($file_name, $file_path, $file_ext, $file_data); + } + return $this->response; } } \ No newline at end of file