WebOrbiton
v1.0.0.8

Publisium

76 lines · 3.4 KB
  1. <?php
  2. ​
  3. declare(strict_types=1);
  4. ​
  5. require_once __DIR__ . '/includes/config.php';
  6. require_once __DIR__ . '/includes/database.php';
  7. require_once __DIR__ . '/includes/site-front.php';
  8. ​
  9. $settings = SiteFront::settings();
  10. ​
  11. if ($settings['sitemap_rss_enabled'] !== '1') {
  12. http_response_code(404);
  13. exit;
  14. }
  15. ​
  16. $db = Database::site();
  17. $baseUrl = rtrim(Config::get('APP_URL', ''), '/') . Config::get('APP_BASE_PATH', '');
  18. ​
  19. $category = null;
  20. if (isset($_GET['category'])) {
  21. if ($settings['rss_category_feeds_enabled'] !== '1') {
  22. http_response_code(404);
  23. exit;
  24. }
  25. ​
  26. $categoryStatement = $db->prepare('SELECT * FROM categories WHERE slug = :slug LIMIT 1');
  27. $categoryStatement->execute(['slug' => trim((string) $_GET['category'])]);
  28. $category = $categoryStatement->fetch() ?: null;
  29. if ($category === null) {
  30. http_response_code(404);
  31. exit;
  32. }
  33. $category = Languages::categories([$category])[0];
  34. }
  35. ​
  36. $articlesStatement = $db->prepare(
  37. "SELECT a.id, a.title, a.slug, a.excerpt, a.published_at, a.category_id, c.name AS category_name FROM articles a LEFT JOIN categories c ON c.id = a.category_id WHERE a.status = 'published'"
  38. . ($category !== null ? ' AND a.category_id = :category_id' : '')
  39. . Languages::articleFilterSql('a') . " ORDER BY a.published_at DESC LIMIT 30"
  40. );
  41. $articlesStatement->execute($category !== null ? ['category_id' => (int) $category['id']] : []);
  42. $articles = Languages::articles($articlesStatement->fetchAll());
  43. ​
  44. header('Content-Type: application/rss+xml; charset=utf-8');
  45. ​
  46. echo '<?xml version="1.0" encoding="UTF-8"?>' . "\n";
  47. echo '<rss version="2.0"><channel>' . "\n";
  48. echo '<title>' . htmlspecialchars($category !== null ? $category['name'] . ' - ' . $settings['site_name'] : $settings['site_name']) . '</title>' . "\n";
  49. $channelLanguage = Languages::current();
  50. $channelLink = $channelLanguage === '' ? rtrim((string) Config::get('APP_URL', ''), '/') . SiteFront::homeUrl('') : rtrim((string) Config::get('APP_URL', ''), '/') . Languages::homeUrl($channelLanguage);
  51. if ($category !== null) {
  52. $channelLink = rtrim((string) Config::get('APP_URL', ''), '/') . rtrim((string) Config::get('APP_BASE_PATH', ''), '/') . Languages::prefix() . '/category.php?slug=' . rawurlencode((string) $category['slug']);
  53. }
  54. echo '<link>' . htmlspecialchars($channelLink) . '</link>' . "\n";
  55. if ($channelLanguage !== '') {
  56. echo '<language>' . htmlspecialchars($channelLanguage) . '</language>' . "\n";
  57. }
  58. $channelDescription = $category !== null && !empty($category['description']) ? (string) $category['description'] : $settings['site_description'];
  59. echo '<description>' . htmlspecialchars($channelDescription) . '</description>' . "\n";
  60. ​
  61. foreach ($articles as $article) {
  62. $url = rtrim(Config::get('APP_URL', ''), '/') . SiteFront::articleUrl($article['slug']);
  63. echo '<item>';
  64. echo '<title>' . htmlspecialchars($article['title']) . '</title>';
  65. echo '<link>' . htmlspecialchars($url) . '</link>';
  66. echo '<guid>' . htmlspecialchars($url) . '</guid>';
  67. echo '<description>' . htmlspecialchars((string) ($article['excerpt'] ?? '')) . '</description>';
  68. if (!empty($article['category_name'])) {
  69. echo '<category>' . htmlspecialchars((string) $article['category_name']) . '</category>';
  70. }
  71. echo '<pubDate>' . htmlspecialchars(date(DATE_RSS, strtotime($article['published_at']))) . '</pubDate>';
  72. echo '</item>' . "\n";
  73. }
  74. ​
  75. echo '</channel></rss>';
  76. ​