hurriyet-haber-scraper.php
Kod:Tümünü seç
<?php
/*
Plugin Name: Hurriyet Haber Scraper (Güncellenmiş Yapı)
Description: Hurriyet son dakika haberlerini belirlenen class yapısına uygun olarak çeker ve WordPress yazısı olarak kaydeder.
Version: 2.0
Author: Örnek Geliştirici
*/
if ( ! defined( 'ABSPATH' ) ) {
exit; // Direkt erişimi engelle
}
class Hurriyet_Haber_Scraper {
public function __construct() {
add_action('admin_menu', array($this, 'add_plugin_page'));
add_action('admin_post_hurriyet_scrape', array($this, 'handle_scrape_request'));
}
public function add_plugin_page() {
add_menu_page(
'Hurriyet Haber Scraper',
'Hurriyet Haber',
'manage_options',
'hurriyet-haber-scraper',
array($this, 'create_admin_page'),
'dashicons-admin-site-alt3'
);
}
public function create_admin_page() {
?>
<div class="wrap">
<h1>Hurriyet Haber Scraper</h1>
<?php if ( isset($_GET['message']) && $_GET['message'] === 'success' ) : ?>
<div class="notice notice-success is-dismissible">
<p>Yeni haber yazısı oluşturuldu.</p>
</div>
<?php endif; ?>
<form method="post" action="<?php echo esc_url( admin_url('admin-post.php') ); ?>">
<input type="hidden" name="action" value="hurriyet_scrape">
<?php submit_button('Haberleri Çek'); ?>
</form>
</div>
<?php
}
public function handle_scrape_request() {
$url = 'https://www.hurriyet.com.tr/son-dakika-haberleri/';
$response = wp_remote_get($url);
if ( is_wp_error($response) ) {
wp_die('Hata: ' . $response->get_error_message());
}
$html = wp_remote_retrieve_body($response);
if ( empty($html) ) {
wp_die('Haberler çekilemedi.');
}
libxml_use_internal_errors(true);
$dom = new DOMDocument();
$dom->loadHTML($html);
libxml_clear_errors();
$xpath = new DOMXPath($dom);
// "category__list__item son-dakika-haberleri" class'ına sahip haberleri bul
$news_nodes = $xpath->query("//div[contains(@class, 'category__list__item') and contains(@class, 'son-dakika-haberleri')]");
if ( $news_nodes->length === 0 ) {
error_log('Hurriyet Haber Scraper: Haber bulunamadı.');
wp_die('Haber bulunamadı.');
}
// İlk haberi al
$news_node = $news_nodes->item(0);
// ** Başlık Bilgisi **
$title = '';
$title_node = $xpath->query(".//h2/a", $news_node)->item(0);
if ( $title_node ) {
$title = trim($title_node->getAttribute('title'));
}
// ** İçerik Bilgisi **
$content = '';
$content_node = $xpath->query(".//p/a", $news_node)->item(0);
if ( $content_node ) {
$content = trim($content_node->nodeValue);
}
// ** Görsel URL'si **
$image_url = '';
$image_node = $xpath->query(".//a[contains(@class, 'category__list__item--cover')]/img", $news_node)->item(0);
if ( $image_node ) {
$image_url = trim($image_node->getAttribute('data-src'));
}
// Eğer "data-src" yoksa, "src" attribute'undan al
if ( empty($image_url) && $image_node ) {
$image_url = trim($image_node->getAttribute('src'));
}
// Eğer başlık veya içerik boşsa hata verelim.
if ( empty($title) || empty($content) ) {
error_log('Hurriyet Haber Scraper: Başlık veya içerik eksik. Başlık: ' . $title . ' - İçerik: ' . $content);
wp_die('Haber bilgileri eksik.');
}
// Yazı içeriğini oluştur
$post_content = '<p>' . esc_html($content) . '</p>';
// WordPress'e yeni yazıyı ekleyelim
$new_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_id = wp_insert_post($new_post);
if ( is_wp_error($post_id) ) {
wp_die('Yazı oluşturulamadı.');
}
// ** Görseli indirip öne çıkarılmış görsel yap **
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);
} else {
error_log('Hurriyet Haber Scraper: Resim eklenemedi. Hata: ' . $attachment_id->get_error_message());
}
}
// Admin paneline geri yönlendir
wp_redirect(admin_url('admin.php?page=hurriyet-haber-scraper&message=success'));
exit;
}
}
new Hurriyet_Haber_Scraper();