içerik çekme eklentisi wordpress

Genel Forum
Cevapla
muratca61
Site Admin
Mesajlar: 35899
Kayıt: Cmt Ara 21, 2024 7:56 am

içerik çekme eklentisi wordpress

Mesaj gönderen muratca61 »

dosya yapısı
/wp-content/plugins/icerik-cekici/
├── icerik-cekici.php
└── includes/
├── class-baslik-olusturucu.php
└── functions.php
icerik-cekici.php

Kod:Tümünü seç

<?php
/*
Plugin Name: İçerik Çekici
Description: URL'den yazı ve görsel çeker, otomatik başlık oluşturur.
Version: 6.0
Author: Sizin Adınız
*/

if (!defined('ABSPATH')) exit;

// Gerekli dosyaları yükle
require_once plugin_dir_path(__FILE__) . 'includes/class-baslik-olusturucu.php';
require_once plugin_dir_path(__FILE__) . 'includes/functions.php';

// Admin menüsünü ekle
add_action('admin_menu', 'icerik_cekici_menu');
function icerik_cekici_menu() {
    add_menu_page(
        'İçerik Çekici', 
        'İçerik Çek', 
        'manage_options', 
        'icerik-cekici', 
        'icerik_cekici_admin_page', 
        'dashicons-download'
    );
}

// Admin arayüzü
function icerik_cekici_admin_page() {
    ?>
    <div class="wrap">
        <h1>İçerik Çekici 🚀</h1>
        <form method="post">
            <input type="url" name="hedef_url" placeholder="https://ornek.com" style="width: 400px;" required>
            <?php wp_nonce_field('icerik_cekici_action', 'icerik_cekici_nonce'); ?>
            <input type="submit" name="cek" class="button button-primary" value="İçeriği Çek">
        </form>
        <?php icerik_cekici_sonuc_goster(); ?>
    </div>
    <?php
}

// Sonuçları göster
function icerik_cekici_sonuc_goster() {
    if (!isset($_POST['cek'])) return;

    try {
        $url = esc_url_raw($_POST['hedef_url']);
        $baslik_olusturucu = new BaslikOlusturucu($url);
        $icerik = icerik_cekici_icerik_al($url);

        // Yazıyı oluştur
        $post_id = wp_insert_post([
            'post_title'   => $baslik_olusturucu->baslik,
            'post_content' => $icerik->metin,
            'post_status'  => 'draft',
            'post_author'  => get_current_user_id(),
        ]);

        // Öne çıkan görsel
        if ($icerik->gorsel_id) {
            set_post_thumbnail($post_id, $icerik->gorsel_id);
        }

        echo '<div class="notice notice-success"><p>✅ İçerik başarıyla oluşturuldu! <a href="' . esc_url(get_edit_post_link($post_id)) . '">Düzenle</a></p></div>';

    } catch (Exception $e) {
        echo '<div class="notice notice-error"><p>Hata: ' . esc_html($e->getMessage()) . '</p></div>';
    }
}
class-baslik-olusturucu.php

Kod:Tümünü seç

<?php
class BaslikOlusturucu {
    public $baslik;
    private $url;
    private $dom;

    public function __construct($url) {
        $this->url = $url;
        $this->dom = new DOMDocument();
        $this->html_yukle();
        $this->baslik_olustur();
    }

    private function html_yukle() {
        $html = icerik_cekici_html_al($this->url);
        if (!$html) throw new Exception('HTML çekilemedi');
        
        libxml_use_internal_errors(true);
        $this->dom->loadHTML(mb_convert_encoding($html, 'HTML-ENTITIES', 'UTF-8'));
        libxml_clear_errors();
    }

    private function baslik_olustur() {
        $this->baslik = $this->h1_bul() 
                      ?: $this->meta_title_bul() 
                      ?: $this->ilk_paragraftan_baslik() 
                      ?: $this->url_baslik();
        
        $this->baslik = sanitize_text_field($this->baslik);
    }

    private function h1_bul() {
        $h1 = $this->dom->getElementsByTagName('h1');
        return ($h1->length > 0) ? trim($h1->item(0)->nodeValue) : false;
    }

    private function meta_title_bul() {
        $title = $this->dom->getElementsByTagName('title');
        return ($title->length > 0) ? trim($title->item(0)->nodeValue) : false;
    }

    private function ilk_paragraftan_baslik() {
        $p = $this->dom->getElementsByTagName('p')->item(0);
        return ($p) ? $this->metni_kisalt($p->nodeValue) : false;
    }

    private function url_baslik() {
        $parsed = parse_url($this->url);
        return 'Çekilen İçerik - ' . str_replace('www.', '', $parsed['host']);
    }

    private function metni_kisalt($metin, $max_kelime = 8) {
        $kelimeler = preg_split('/\s+/', trim($metin));
        $kisa = array_slice($kelimeler, 0, $max_kelime);
        return implode(' ', $kisa) . (count($kelimeler) > $max_kelime ? '...' : '');
    }
}
functions.php

Kod:Tümünü seç

<?php
// HTML çek
function icerik_cekici_html_al($url) {
    $response = wp_remote_get($url, [
        'headers' => [
            'User-Agent' => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'
        ],
        'timeout' => 45
    ]);
    
    return !is_wp_error($response) ? wp_remote_retrieve_body($response) : false;
}

// İçerik işle
function icerik_cekici_icerik_al($url) {
    $html = icerik_cekici_html_al($url);
    if (!$html) return (object)['metin' => '', 'gorsel_id' => null];

    $dom = new DOMDocument();
    libxml_use_internal_errors(true);
    $dom->loadHTML(mb_convert_encoding($html, 'HTML-ENTITIES', 'UTF-8'));
    libxml_clear_errors();

    $icerik = (object)['metin' => '', 'gorsel_id' => null];
    $xpath = new DOMXPath($dom);

    // Tüm p ve img'leri bul
    $nodes = $xpath->query('//p | //img');

    foreach ($nodes as $node) {
        if ($node->tagName === 'p') {
            $icerik->metin .= $dom->saveHTML($node);
        } 
        elseif ($node->tagName === 'img') {
            $src = $node->getAttribute('src');
            $image_url = icerik_normalize_url($src, $url);
            $upload_id = icerik_cekici_gorsel_yukle($image_url);
            
            if ($upload_id) {
                $node->setAttribute('src', wp_get_attachment_url($upload_id));
                if (!$icerik->gorsel_id) $icerik->gorsel_id = $upload_id;
            }
            $icerik->metin .= $dom->saveHTML($node);
        }
    }

    $icerik->metin = (string)$icerik->metin;
    return $icerik;
}

// Görsel yükle
function icerik_cekici_gorsel_yukle($image_url) {
    $allowed_ext = ['jpg', 'jpeg', 'png', 'gif', 'webp', 'wrp'];
    $extension = strtolower(pathinfo(parse_url($image_url, PHP_URL_PATH), PATHINFO_EXTENSION));
    
    if (!in_array($extension, $allowed_ext)) return false;

    $tmp_file = download_url($image_url);
    if (is_wp_error($tmp_file)) return false;

    $file_array = [
        'name' => sanitize_file_name(basename($image_url)),
        'tmp_name' => $tmp_file
    ];

    $upload_id = media_handle_sideload($file_array, 0);
    @unlink($tmp_file);

    return is_wp_error($upload_id) ? false : $upload_id;
}

// URL normalizasyonu
function icerik_normalize_url($image_url, $base_url) {
    if (strpos($image_url, 'http') === 0) return $image_url;

    $parsed_base = parse_url($base_url);
    $base = $parsed_base['scheme'] . '://' . $parsed_base['host'];
    $path = isset($parsed_base['path']) ? rtrim($parsed_base['path'], '/') : '';
    
    return $base . $path . '/' . ltrim($image_url, '/');
}
Cevapla