Kod:Tümünü seç
selam bu aşağıdakini genel bir eklentiye çevireceğiz. şöyle olacak admin panelinden ekle kaldır seçeneği ile satırlar ekleyeceğiz. her satırda rss adresi ve yazının rss içeriğinde hangi kod aralığında olduğu (<item> <entry> bilgileri bu satırlarda kullanıcı admin panelinde girecek mesela <item>
<title>Araklı'da Demirbağ Başkan Yardımcılığına Getirildi</title>
<category>SPOR</category>
<link>https://www.arihaber.net/haber/araklida-demirbag-baskan-yardimciligina-getirildi-11855</link>
<guid>https://www.arihaber.net/haber/araklida-demirbag-baskan-yardimciligina-getirildi-11855</guid>
<description>
<![CDATA[ ]]>
</description>
<content:encoded>
<![CDATA[ <p>Araklı İdman Yurdu'nda Sercan Demirbağ, Başkan Yardimcilığina getirildi</p> <p>Arakli'nin Sevilen İsimlerinden Futbol Menajerligi yapan Sercan Demirbağ, bu görevinde Sportif Anlamda direk yetkili olmustur.</p> <p>Sercan demirbağ yaptığı açıklamada</p> <p>"Başkan yardimciligi görevine beni layik gören sn.Kadir Çebi ve Yönetim kuruluna tesekkur ederim. Arakli icin her zaman her platformda var oldum olmayada devam edecegim Arakli gencleri icin onlarin gelisimi icin var gücümuzle yanlarinda olacagim. Arakli daki tüm kulupler bizim tum genclerin spor dallarinda basarili olmalari icin elimden geleni yapacagim, hersey Arakli " Dedi</p> ]]>
</content:encoded>
<pubDate>Mon, 10 Feb 2025 23:26:00 +0300</pubDate>
<enclosure type="image/jpeg" url="https://www.arihaber.net/images/haberler/2025/02/araklida-demirbag-baskan-yardimciligina-getirildi-1739219399.webp"/>
</item> bu item
bu entry olarak girilmiş
<entry>
<id>https://www.ntv.com.tr/turkiye/son-dakika-muglada-deprem-mi-oldu-az-once-deprem-muglada-nerede-oldu-mugla-deprem-kandilli-ve-afad-son-depremler-listesi-16-subat-2025,2jggwasz_kmM3HpUjBsJSA</id>
<title type="html">Son dakika Muğla'da deprem mi oldu? Az önce deprem Muğla'da nerede oldu? Muğla deprem Kandilli ve AFAD son depremler listesi 16 Şubat 2025</title>
<published>2025-02-16T11:45:12+03:00</published>
<updated>2025-02-16T11:45:12+03:00</updated>
<author>
<name>NTV</name>
</author>
<link rel="alternate" href="https://www.ntv.com.tr/turkiye/son-dakika-muglada-deprem-mi-oldu-az-once-deprem-muglada-nerede-oldu-mugla-deprem-kandilli-ve-afad-son-depremler-listesi-16-subat-2025,2jggwasz_kmM3HpUjBsJSA"/>
<content type="html">
<![CDATA[ <img src="https://cdn1.ntv.com.tr/gorsel/gk16R0Kdo0SBNfKp7AF_ig.jpg?width=1200&mode=crop&scale=both&v=20240801181943065" class="type:primaryImage" alt="Son dakika Muğla'da deprem mi oldu? Az önce deprem Muğla'da nerede oldu? Muğla deprem Kandilli ve AFAD son depremler listesi 16 Şubat 2025" /><p>Son dakika Muğla deprem haberleri..Muğla'da deprem mi oldu? Az önce deprem Muğla'da nerede oldu? Muğla Kandilli ve AFAD son depremler.. 16 Şubat 2025 Muğla deprem son dakika haberleri haberin detayında...Artçı deprem mi oldu Muğla'da? Muğla son deprem büyüklüğü ne kadar? Muğla'da ve Muğla yakınındaki depremler nelerdir? Muğla'da anlık deprem mi oldu? Son dakika Muğla canlı deprem haritası..Kandilli rasathanesi ve deprem araştırma enstitüsü ve AFAD Muğla deprem haberleri.. Muğla'da hangi ilçelerde deprem oldu ve hangi ilçelerde en çok hissedildi? Bugün Muğla'da deprem mi oldu? Deprem Muğla'da ne zaman ve kaç şiddetinde oldu? En son Muğla'da nerede deprem oldu? Muğla deprem haberleriyle ilgili en çok merak edilenlerin cevabı haberde..</p>Tarih-saat 16 Şubat 2025 11:23:06 itibariyle Ege Denizi, Yamurgi Adası (Amorgos) - [127.08 km] Bodrum (Muğla) 3,8 şiddetinde bir deprem olmuştur.Son dakika Muğla deprem haberleri 16 Şubat 2025..Muğla AFAD son depremler ve Muğla Kandilli son dakika deprem listesi.. ]]>
</content>
</entry>
içerik çekme kodumuzda bu
<?php
/*
Plugin Name: RSS Haber Scraper - 61Saat Trabzon & Trabzonspor
Description: 61Saat Trabzon ve Trabzonspor haberlerini RSS ile çeker ve WordPress’e ekler.
Version: 1.5
Author: Örnek Geliştirici
License: GPL2
*/
if (!defined('ABSPATH')) {
exit;
}
class RSS_Haber_Scraper {
private $rss_sources = [
'https://www.61saat.com/rss/trabzon' => 'Trabzon',
'https://www.61saat.com/rss/trabzonspor' => 'Trabzonspor'
];
public function __construct() {
add_action('admin_menu', array($this, 'add_admin_page'));
add_action('wp_ajax_rss_scrape', array($this, 'handle_scrape_request'));
add_action('init', array($this, 'fetch_single_news_on_page_load'));
}
// Admin panelinde haber çekme sayfası
public function add_admin_page() {
add_menu_page(
'RSS Haber Scraper',
'RSS Haber Scraper',
'manage_options',
'rss-haber-scraper',
array($this, 'admin_page_content'),
'dashicons-rss',
20
);
}
public function admin_page_content() {
?>
<div class="wrap">
<h1>RSS Haber Scraper</h1>
<p>Manuel olarak haber çekmek için aşağıdaki butona tıklayın.</p>
<button id="fetch-rss-news" class="button button-primary">Haberleri Çek</button>
<div id="rss-news-log" style="margin-top: 20px; padding: 10px; background: #f9f9f9; border: 1px solid #ddd; max-height: 300px; overflow-y: auto;"></div>
</div>
<script>
document.getElementById("fetch-rss-news").addEventListener("click", function() {
let log = document.getElementById("rss-news-log");
log.innerHTML += "<p>Haberler çekiliyor...</p>";
fetch(ajaxurl, {
method: "POST",
headers: { "Content-Type": "application/x-www-form-urlencoded" },
body: "action=rss_scrape"
})
.then(response => response.json())
.then(data => {
if (data.success) {
log.innerHTML += "<p style='color: green;'>" + data.message + "</p>";
} else {
log.innerHTML += "<p style='color: red;'>" + data.message + "</p>";
}
})
.catch(error => {
log.innerHTML += "<p style='color: red;'>Bağlantı hatası!</p>";
});
});
</script>
<?php
}
public function fetch_single_news_on_page_load() {
if (!is_admin() && !is_feed()) {
$this->fetch_one_rss_news();
}
}
public function handle_scrape_request() {
$this->fetch_one_rss_news();
wp_send_json_success(array('message' => 'Bir haber çekildi.'));
}
private function fetch_one_rss_news() {
require_once(ABSPATH . 'wp-admin/includes/post.php'); // 🛠️ post_exists() için gerekli!
static $last_rss_index = 0;
$rss_keys = array_keys($this->rss_sources);
$rss_url = $rss_keys[$last_rss_index];
$category_name = $this->rss_sources[$rss_url];
$last_rss_index = ($last_rss_index + 1) % count($rss_keys);
// RSS verisini kontrol et
$rss_feed = @simplexml_load_file($rss_url);
if (!$rss_feed) {
error_log('RSS yüklenemedi: ' . $rss_url);
return;
}
$category_id = get_cat_ID($category_name);
if ($category_id == 0) {
$category_id = wp_create_category($category_name);
}
foreach ($rss_feed->channel->item as $item) {
$title = (string) $item->title;
$link = (string) $item->link;
$description = (string) strip_tags($item->description);
$content = (string) strip_tags($item->children('content', true)->encoded);
$image_url = isset($item->enclosure['url']) ? (string) $item->enclosure['url'] : '';
if (post_exists($title)) { // 🔄 Önceden eklenen haberleri atla!
continue;
}
$tags = $this->extract_tags_from_content($description . ' ' . $content);
if (empty($title) || empty($content)) {
continue;
}
$post_content = '<p>' . esc_html($description) . '</p><p>' . esc_html($content) . '</p>';
$post_id = wp_insert_post(array(
'post_title' => wp_strip_all_tags($title),
'post_content' => $post_content,
'post_status' => 'publish',
'post_author' => get_current_user_id(),
'post_type' => 'post',
'post_category' => array($category_id)
));
if (!is_wp_error($post_id)) {
if (!empty($tags)) wp_set_post_tags($post_id, $tags);
if (!empty($image_url)) {
require_once(ABSPATH . 'wp-admin/includes/media.php');
require_once(ABSPATH . 'wp-admin/includes/file.php');
require_once(ABSPATH . 'wp-admin/includes/image.php');
$attachment_id = media_sideload_image($image_url, $post_id, $title, 'id');
if (!is_wp_error($attachment_id)) set_post_thumbnail($post_id, $attachment_id);
}
return;
}
}
}
private function extract_tags_from_content($content) {
$words = explode(' ', $content);
$tags = [];
foreach ($words as $word) {
$word = trim($word, ".,!?()[]{}\"'");
if (preg_match('/^[A-ZĞÜŞİÖÇ]+$/u', $word) && strlen($word) > 2) {
$tags[] = strtolower($word);
} elseif (preg_match('/^[A-ZĞÜŞİÖÇ][a-zğüşıöç]+$/u', $word)) {
$tags[] = strtolower($word);
}
}
return array_slice(array_unique($tags), 0, 5);
}
}
new RSS_Haber_Scraper();
ayrıca .js dosyamız sayfa her yenilendiğinde bir tane haber çekiyor
jQuery(document).ready(function($) {
function fetchRssNews() {
$.ajax({
url: rssScraperAjax.ajax_url,
type: 'POST',
data: { action: 'rss_scrape' },
success: function(response) {
if (response.success) {
console.log("RSS Haber Eklendi:", response.message);
} else {
console.log("RSS Haber Bulunamadı:", response.message);
}
},
error: function() {
console.log("RSS Bağlantı Hatası");
}
});
}
// Sayfa her yüklendiğinde RSS haberleri kontrol et
fetchRssNews();
// Kullanıcı sayfada gezindikçe kontrol et (Örneğin: 60 saniyede bir)
setInterval(fetchRssNews, 60000);
});