wordpress devamını oku veri çekici

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

wordpress devamını oku veri çekici

Mesaj gönderen muratca61 »

plugin altında yeni bir klasör içinde bir wordpress uygulaması yapalım.
1-bu uygulama yazının içeriğine eklenen

Kod:Tümünü seç

[devamini_oku]
kodunu kullanıcıya Devamını Oku linki olarak gösterecek.
2-Okuyucu linke tıklayınca sayfa yenilenirken yazının içeriğinde gömülü olan bir web adresini tarayıp bulacak.
3-bu linki /var/www/html/wp/wp-content/plugins/icerik-cekici konumundaki icerik-cekici.php ile yazının içeriğini çekerek yazıya ekleyecek.
4-yazıda mevcut olan aynı yazıları eklemeyecek. sadece yazıları ekleyecek.
5- işlem tamamlandığında [devamini_oku] kodunu silecek.
6-bunlar Devamını Oku linkine tıklanıp sayfa yenilenirken gerçekleşecek.
7-sadece aynı olamayan yazıları çekecek resimler görseller çekilmeyecek
icerik-cekici.php kodu aşağıda verilendir.

Kod:Tümünü seç

<?php
/*
Plugin Name: İçerik Çekici
Description: URL'den içerik çeker, otomatik başlık/etiket oluşturur, görsel işler.
Version: 7.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/class-etiket-olusturucu.php';
require_once plugin_dir_path(__FILE__) . 'includes/functions.php';

// Admin menüsü 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; padding: 8px;" required>
            <?php wp_nonce_field('icerik_cekici_action', 'icerik_cekici_nonce'); ?>
            <input type="submit" name="cek" class="button button-primary" 
                   value="İçeriği Çek" style="margin-top: 10px;">
        </form>
        <?php icerik_cekici_sonuc_goster(); ?>
    </div>
    <?php
}

// İşlem sonuçlarını göster
function icerik_cekici_sonuc_goster() {
    if (!isset($_POST['cek'])) return;

    try {
        // Güvenlik kontrolü
        if (!wp_verify_nonce($_POST['icerik_cekici_nonce'], 'icerik_cekici_action')) {
            throw new Exception('Güvenlik ihlali tespit edildi!');
        }

        $url = esc_url_raw($_POST['hedef_url']);
        
        // İçeriği çek ve işle
        $icerik = icerik_cekici_icerik_al($url);
        
        // Başlık oluştur
        $baslik_olusturucu = new BaslikOlusturucu($url);
        
        // Yazıyı oluştur
        $post_id = wp_insert_post([
            'post_title'   => sanitize_text_field($baslik_olusturucu->baslik),
            'post_content' => wp_kses_post($icerik->metin),
            'post_status'  => 'draft',
            'post_author'  => get_current_user_id(),
        ]);

        // Etiketleri ekle
        $etiket_olusturucu = new EtiketOlusturucu($icerik->metin);
        $etiketler = $etiket_olusturucu->etiketleri_olustur();
        if (!empty($etiketler)) {
            wp_set_post_tags($post_id, $etiketler);
        }

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

        // Başarı mesajı
        echo sprintf(
            '<div class="notice notice-success"><p>✅ İçerik oluşturuldu! <a href="%s">Düzenle</a></p></div>',
            esc_url(get_edit_post_link($post_id))
        );

    } catch (Exception $e) {
        echo sprintf(
            '<div class="notice notice-error"><p>⛔ Hata: %s</p></div>',
            esc_html($e->getMessage())
        );
    }
}
muratca61
Site Admin
Mesajlar: 35964
Kayıt: Cmt Ara 21, 2024 7:56 am

Re: wordpress devamını oku veri çekici

Mesaj gönderen muratca61 »

1. Klasör ve Dosya Yapısını Oluşturma
Yeni Klasör: wp-content/plugins altında örneğin

Kod:Tümünü seç

icerik-devam
adında bir klasör oluşturun.
Ana Dosya: Klasör içinde

Kod:Tümünü seç

icerik-devam.php
adında bir ana dosya oluşturun. Bu dosyada eklenti başlığı ve temel tanımlamalar yer alacak.
Bağımlılık: Eğer mevcut icerik-cekici.php dosyasındaki işlevleri kullanacaksanız, bu dosyayı (ya da gerekli fonksiyonları) ana dosyaya require_once ile dahil edin.

2. [devamini_oku] Shortcode’unun Oluşturulması
İçeriğe eklenecek

Kod:Tümünü seç

[devamini_oku]
kodunun yerine, kullanıcıya “Devamını Oku” bağlantısı gösterecek bir shortcode tanımlayacağız. Örneğin:

Kod:Tümünü seç

<?php
/*
Plugin Name: İçerik Devamını Oku
Description: Yazı içeriğinde yer alan [devamini_oku] kodunu "Devamını Oku" linkine çevirir ve tıklanıldığında içerikten gömülü URL'yi bulup, içerik çekici fonksiyonu ile yeni içerik ekler.
Version: 1.0
Author: Sizin Adınız
*/

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

// Aşağıdaki fonksiyonlar, icerik-cekici işlevlerinin tek dosya içerisinde çalışması için eklenmiştir.
// Eğer daha önce tanımlanmışlarsa, tekrar tanımlamamak için if (!function_exists()) kullanıyoruz.

if ( ! function_exists('icerik_cekici_html_al') ) {
    // HTML çekme fonksiyonu
    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',
                'Accept-Language' => 'tr-TR,tr;q=0.9'
            ],
            'timeout' => 45,
            'sslverify' => false
        ]);
        
        if(is_wp_error($response)) {
            error_log("[HTML Cekme Hatasi] " . $response->get_error_message());
            return false;
        }
        
        return wp_remote_retrieve_body($response);
    }
}

if ( ! function_exists('icerik_cekici_icerik_al') ) {
    // İçerik çekme ve işleme fonksiyonu
    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);
        $html = mb_convert_encoding($html, 'HTML-ENTITIES', 'UTF-8');
        @$dom->loadHTML($html, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
        libxml_clear_errors();

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

        // 1. Tüm bağlantıları kaldır
        $links = $xpath->query('//a');
        foreach($links as $link) {
            $fragment = $dom->createDocumentFragment();
            while($link->childNodes->length > 0) {
                $fragment->appendChild($link->childNodes->item(0));
            }
            $link->parentNode->replaceChild($fragment, $link);
        }

        // 2. Ana içeriği işle (paragraflar ve resimler)
        $nodes = $xpath->query('//p[not(ancestor::header|aside|footer)] | //img[not(ancestor::header|aside|footer)]');
        
        foreach($nodes as $node) {
            if($node->tagName === 'p') {
                $text = preg_replace('/\s+/', ' ', trim($node->textContent));
                if(!empty($text)) {
                    $icerik->metin .= '<p>' . $text . '</p>';
                }
            } 
            elseif($node->tagName === 'img') {
                $src = $node->getAttribute('src');
                if(empty($src)) continue;

                $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));
                    $node->removeAttribute('srcset');
                    $node->removeAttribute('data-src');
                    if(!$icerik->gorsel_id) $icerik->gorsel_id = $upload_id;
                }
                $icerik->metin .= $dom->saveHTML($node);
            }
        }

        // 3. Son işlemler: HTML güvenliği ve boş paragrafların temizlenmesi
        $icerik->metin = wp_kses_post($icerik->metin);
        $icerik->metin = force_balance_tags($icerik->metin);
        $icerik->metin = preg_replace('/<p[^>]*>\s*<\/p>/', '', $icerik->metin);

        return $icerik;
    }
}

if ( ! function_exists('icerik_cekici_gorsel_yukle') ) {
    // Görsel yükleme fonksiyonu
    function icerik_cekici_gorsel_yukle($image_url) {
        $parsed_url = parse_url($image_url);
        if(!$parsed_url || !isset($parsed_url['host'])) {
            error_log("[Gecersiz URL] " . $image_url);
            return false;
        }

        // URL oluşturma
        $image_url = $parsed_url['scheme'] . '://' . $parsed_url['host'] . ($parsed_url['path'] ?? '');
        if(isset($parsed_url['query'])) {
            $image_url .= '?' . $parsed_url['query'];
        }

        // Uzantı kontrolü
        $ext = strtolower(pathinfo($parsed_url['path'] ?? '', PATHINFO_EXTENSION));
        if(!in_array($ext, ['jpg','jpeg','png','gif','webp'])) {
            error_log("[Gecersiz Uzanti] " . $ext);
            return false;
        }

        // İndirme işlemi
        $tmp_file = download_url($image_url);
        if(is_wp_error($tmp_file)) {
            error_log("[Indirme Hatasi] " . $tmp_file->get_error_message());
            return false;
        }

        // Yükleme işlemi
        $file_array = [
            'name' => sanitize_file_name(basename($parsed_url['path'] ?? '')) ?: uniqid('img_').".$ext",
            'tmp_name' => $tmp_file
        ];

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

        if(is_wp_error($upload_id)) {
            error_log("[Yukleme Hatasi] " . $upload_id->get_error_message());
            return false;
        }

        return $upload_id;
    }
}

if ( ! function_exists('icerik_normalize_url') ) {
    // URL normalizasyon fonksiyonu
    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'];
        
        $base_path = isset($parsed_base['path']) ? rtrim($parsed_base['path'], '/') : '';
        $image_path = ltrim($image_url, '/');
        
        if($base_path && strpos($image_path, $base_path) === 0) {
            return $base . '/' . $image_path;
        }

        return $base . ($base_path ? "$base_path/" : '/') . $image_path;
    }
}

/**
 * [devamini_oku] Shortcode İşleyicisi
 *
 * Yazı içeriğinde gömülü URL'yi bulur ve içerik çekici fonksiyonuyla içeriği getirir.
 * Eğer ?devamini_oku=1 parametresi yoksa, kullanıcıya "Devamını Oku" linki sunar.
 */
function devamini_oku_shortcode_handler( $atts, $content = null ) {
    if ( isset( $_GET['devamini_oku'] ) && $_GET['devamini_oku'] == '1' ) {
        global $post;
        $post_content = $post->post_content;
        
        if ( preg_match( '/(https?:\/\/[^\s"]+)/i', $post_content, $matches ) ) {
            $url = $matches[1];
            $fetched_content = icerik_cekici_icerik_al( $url );
            if ( ! empty( $fetched_content->metin ) ) {
                // Çekilen içerikten <img> etiketlerini kaldırıyoruz
                $new_content = preg_replace( '/<img[^>]+\>/i', '', $fetched_content->metin );
                remove_shortcode( 'devamini_oku' );
                return $new_content;
            }
        }
        return '';
    }
    
    $link = add_query_arg( 'devamini_oku', '1' );
    return '<a href="' . esc_url( $link ) . '">Devamını Oku</a>';
}
add_shortcode( 'devamini_oku', 'devamini_oku_shortcode_handler' );





muratca61
Site Admin
Mesajlar: 35964
Kayıt: Cmt Ara 21, 2024 7:56 am

Re: wordpress devamını oku veri çekici

Mesaj gönderen muratca61 »

aşağıdaki kodla
plugin altında yeni bir klasör içinde bir wordpress uygulaması yapalım.
1-bu uygulama yazının içeriğine eklenen [devamini_oku]
kodunu kullanıcıya Devamını Oku linki olarak gösterecek.
2-Okuyucu linke tıklayınca sayfa yenilenirken yazının içeriğinde gömülü olan bir web adresini tarayıp bulacak. (bu link Hürriyet ve Kaynak yazılarına gömülü)
3-bu linki yazının içeriğini çekerek yazıya ekleyecek. sadece bu linkteki yazıyı çekecek
4-yazıda mevcut olan aynı yazıları eklemeyecek. sadece yazıları ekleyecek.
5- işlem tamamlandığında [devamini_oku] kodunu silecek.
6-bunlar Devamını Oku linkine tıklanıp sayfa yenilenirken gerçekleşecek.
7-sadece aynı olamayan yazıları çekecek resimler görseller çekilmeyecek . bu işlemi gerçekleştirmeyen kod aşağıda kontrol eder misin ve düzeltilirse kodun tamamını verir misin

Kod:Tümünü seç

<?php
/*
Plugin Name: İçerik Devamını Oku - Debug Versiyonu
Description: Yazı içeriğinde yer alan [devamini_oku] kodunu "Devamını Oku" linkine çevirir. Linke tıklandığında, yazı içindeki gömülü URL tespit edilir, içerik çekilir ve ekrana getirilir. (Debug mesajları ekrandadır)
Version: 1.0
Author: Sizin Adınız
*/

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

// WP_DEBUG ayarlarının aktif olduğundan emin olun (bu test sırasında faydalıdır)
if ( ! defined('WP_DEBUG') ) {
    define('WP_DEBUG', true);
}
if ( ! defined('WP_DEBUG_LOG') ) {
    define('WP_DEBUG_LOG', true);
}

// -----------------------------------------------------
// İçerik Çekici Fonksiyonlar
// -----------------------------------------------------

if ( ! function_exists('icerik_cekici_html_al') ) {
    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',
                'Accept-Language' => 'tr-TR,tr;q=0.9'
            ],
            'timeout'   => 45,
            'sslverify' => false
        ]);
        
        if ( is_wp_error($response) ) {
            error_log("[HTML Çekme Hatası] " . $response->get_error_message());
            return false;
        }
        
        return wp_remote_retrieve_body($response);
    }
}

if ( ! function_exists('icerik_cekici_icerik_al') ) {
    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);
        $html = mb_convert_encoding($html, 'HTML-ENTITIES', 'UTF-8');
        @$dom->loadHTML($html, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
        libxml_clear_errors();
    
        $icerik = (object)[ 'metin' => '', 'gorsel_id' => null ];
        $xpath = new DOMXPath($dom);
    
        // Tüm <a> etiketlerini kaldırıyoruz
        $links = $xpath->query('//a');
        foreach ( $links as $link ) {
            $fragment = $dom->createDocumentFragment();
            while ( $link->childNodes->length > 0 ) {
                $fragment->appendChild( $link->childNodes->item(0) );
            }
            $link->parentNode->replaceChild( $fragment, $link );
        }
    
        // Ana içeriği işle: <p> ve <img> etiketleri
        $nodes = $xpath->query('//p[not(ancestor::header|aside|footer)] | //img[not(ancestor::header|aside|footer)]');
        foreach ( $nodes as $node ) {
            if ( $node->tagName === 'p' ) {
                $text = preg_replace('/\s+/', ' ', trim($node->textContent));
                if ( ! empty($text) ) {
                    $icerik->metin .= '<p>' . $text . '</p>';
                }
            } elseif ( $node->tagName === 'img' ) {
                $src = $node->getAttribute('src');
                if ( empty($src) ) {
                    continue;
                }
                $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));
                    $node->removeAttribute('srcset');
                    $node->removeAttribute('data-src');
                    if ( ! $icerik->gorsel_id ) {
                        $icerik->gorsel_id = $upload_id;
                    }
                }
                $icerik->metin .= $dom->saveHTML($node);
            }
        }
    
        // Son düzenlemeler
        $icerik->metin = wp_kses_post($icerik->metin);
        $icerik->metin = force_balance_tags($icerik->metin);
        $icerik->metin = preg_replace('/<p[^>]*>\s*<\/p>/', '', $icerik->metin);
    
        return $icerik;
    }
}

if ( ! function_exists('icerik_cekici_gorsel_yukle') ) {
    function icerik_cekici_gorsel_yukle($image_url) {
        $parsed_url = parse_url($image_url);
        if ( ! $parsed_url || ! isset($parsed_url['host']) ) {
            error_log("[Geçersiz URL] " . $image_url);
            return false;
        }
    
        $image_url = $parsed_url['scheme'] . '://' . $parsed_url['host'] . ($parsed_url['path'] ?? '');
        if ( isset($parsed_url['query']) ) {
            $image_url .= '?' . $parsed_url['query'];
        }
    
        $ext = strtolower(pathinfo($parsed_url['path'] ?? '', PATHINFO_EXTENSION));
        if ( ! in_array($ext, ['jpg','jpeg','png','gif','webp']) ) {
            error_log("[Geçersiz Uzantı] " . $ext);
            return false;
        }
    
        $tmp_file = download_url($image_url);
        if ( is_wp_error($tmp_file) ) {
            error_log("[İndirme Hatası] " . $tmp_file->get_error_message());
            return false;
        }
    
        $file_array = [
            'name'     => sanitize_file_name(basename($parsed_url['path'] ?? '')) ?: uniqid('img_').".$ext",
            'tmp_name' => $tmp_file
        ];
    
        $upload_id = media_handle_sideload($file_array, 0);
        @unlink($tmp_file);
    
        if ( is_wp_error($upload_id) ) {
            error_log("[Yükleme Hatası] " . $upload_id->get_error_message());
            return false;
        }
    
        return $upload_id;
    }
}

if ( ! function_exists('icerik_normalize_url') ) {
    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'];
        $base_path = isset($parsed_base['path']) ? rtrim($parsed_base['path'], '/') : '';
        $image_path = ltrim($image_url, '/');
    
        if ( $base_path && strpos($image_path, $base_path) === 0 ) {
            return $base . '/' . $image_path;
        }
    
        return $base . ($base_path ? "$base_path/" : '/') . $image_path;
    }
}

// -----------------------------------------------------
// [devamini_oku] Shortcode İşleyicisi
// -----------------------------------------------------

function devamini_oku_shortcode_handler( $atts, $content = null ) {
    // Eğer URL parametresi mevcutsa (devamini_oku=1) içerik çekmeye çalışıyoruz.
    if ( isset($_GET['devamini_oku']) && $_GET['devamini_oku'] == '1' ) {
        global $post;
        $post_content = $post->post_content;
        
        // Debug: Post içeriğini hem log dosyasına hem de ekrana yazdırıyoruz.
        error_log("Post Content: " . $post_content);
        echo '<div style="background:#fee;padding:10px;margin-bottom:10px;">Debug: Post Content: ' . esc_html($post_content) . '</div>';
        
        // Yazı içeriğinde ilk bulunan "https://" ile başlayan URL'yi tespit ediyoruz.
        if ( preg_match( '/(https?:\/\/[^\s"]+)/i', $post_content, $matches ) ) {
            $url = $matches[1];
            error_log("Bulunan URL: " . $url);
            echo '<div style="background:#efe;padding:10px;margin-bottom:10px;">Debug: Bulunan URL: ' . esc_html($url) . '</div>';
            
            $fetched_content = icerik_cekici_icerik_al( $url );
            if ( ! empty( $fetched_content->metin ) ) {
                error_log("Çekilen içeriğin uzunluğu: " . strlen($fetched_content->metin));
                echo '<div style="background:#eef;padding:10px;margin-bottom:10px;">Debug: Çekilen içeriğin uzunluğu: ' . strlen($fetched_content->metin) . '</div>';
                $new_content = preg_replace( '/<img[^>]+\>/i', '', $fetched_content->metin );
                remove_shortcode( 'devamini_oku' );
                // URL parametresini temizlemek için JavaScript ekliyoruz.
                $script = '<script>
                    if(window.history.replaceState){
                        var url = new URL(window.location);
                        url.searchParams.delete("devamini_oku");
                        window.history.replaceState(null, "", url.toString());
                    }
                </script>';
                return $new_content . $script;
            } else {
                error_log("Çekilen içerik boş geldi.");
                echo '<div style="background:#fcc;padding:10px;margin-bottom:10px;">Debug: Çekilen içerik boş geldi.</div>';
            }
        } else {
            error_log("Post içeriğinde URL bulunamadı.");
            echo '<div style="background:#fcc;padding:10px;margin-bottom:10px;">Debug: Post içeriğinde URL bulunamadı.</div>';
        }
        return '';
    }
    
    // Eğer devamini_oku parametresi yoksa, "Devamını Oku" linkini gösteriyoruz.
    $link = add_query_arg( 'devamini_oku', '1' );
    return '<a href="' . esc_url( $link ) . '">Devamını Oku</a>';
}
add_shortcode( 'devamini_oku', 'devamini_oku_shortcode_handler' );
muratca61
Site Admin
Mesajlar: 35964
Kayıt: Cmt Ara 21, 2024 7:56 am

Re: wordpress devamını oku veri çekici

Mesaj gönderen muratca61 »

copilota sorduk

Kod:Tümünü seç

aşağıdaki kodla
plugin altında yeni bir klasör içinde bir wordpress uygulaması yapalım.
1-bu uygulama yazının içeriğine eklenen [devamini_oku]
kodunu kullanıcıya Devamını Oku linki olarak gösterecek.
2-Okuyucu linke tıklayınca sayfa yenilenirken yazının içeriğinde gömülü olan bir web adresini tarayıp bulacak. (bu link Hürriyet ve Kaynak yazılarına gömülü)
3-bu linki yazının içeriğini çekerek yazıya ekleyecek. sadece bu linkteki yazıyı çekecek
4-yazıda mevcut olan aynı yazıları eklemeyecek. sadece yazıları ekleyecek.
5- işlem tamamlandığında [devamini_oku] kodunu silecek.
6-bunlar Devamını Oku linkine tıklanıp sayfa yenilenirken gerçekleşecek.
7-sadece aynı olamayan yazıları çekecek resimler görseller çekilmeyecek . bu işlemi gerçekleştirmeyen kod aşağıda kontrol eder misin ve düzeltilirse kodun tamamını verir misin
<?php
/*
Plugin Name: İçerik Devamını Oku - Debug Versiyonu
Description: Yazı içeriğinde yer alan [devamini_oku] kodunu "Devamını Oku" linkine çevirir. Linke tıklandığında, yazı içindeki gömülü URL tespit edilir, içerik çekilir ve ekrana getirilir. (Debug mesajları ekrandadır)
Version: 1.0
Author: Sizin Adınız
*/

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

// WP_DEBUG ayarlarının aktif olduğundan emin olun (bu test sırasında faydalıdır)
if ( ! defined('WP_DEBUG') ) {
    define('WP_DEBUG', true);
}
if ( ! defined('WP_DEBUG_LOG') ) {
    define('WP_DEBUG_LOG', true);
}

// -----------------------------------------------------
// İçerik Çekici Fonksiyonlar
// -----------------------------------------------------

if ( ! function_exists('icerik_cekici_html_al') ) {
    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',
                'Accept-Language' => 'tr-TR,tr;q=0.9'
            ],
            'timeout'   => 45,
            'sslverify' => false
        ]);
        
        if ( is_wp_error($response) ) {
            error_log("[HTML Çekme Hatası] " . $response->get_error_message());
            return false;
        }
        
        return wp_remote_retrieve_body($response);
    }
}

if ( ! function_exists('icerik_cekici_icerik_al') ) {
    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);
        $html = mb_convert_encoding($html, 'HTML-ENTITIES', 'UTF-8');
        @$dom->loadHTML($html, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
        libxml_clear_errors();
    
        $icerik = (object)[ 'metin' => '', 'gorsel_id' => null ];
        $xpath = new DOMXPath($dom);
    
        // Tüm <a> etiketlerini kaldırıyoruz
        $links = $xpath->query('//a');
        foreach ( $links as $link ) {
            $fragment = $dom->createDocumentFragment();
            while ( $link->childNodes->length > 0 ) {
                $fragment->appendChild( $link->childNodes->item(0) );
            }
            $link->parentNode->replaceChild( $fragment, $link );
        }
    
        // Ana içeriği işle: <p> ve <img> etiketleri
        $nodes = $xpath->query('//p[not(ancestor::header|aside|footer)] | //img[not(ancestor::header|aside|footer)]');
        foreach ( $nodes as $node ) {
            if ( $node->tagName === 'p' ) {
                $text = preg_replace('/\s+/', ' ', trim($node->textContent));
                if ( ! empty($text) ) {
                    $icerik->metin .= '<p>' . $text . '</p>';
                }
            } elseif ( $node->tagName === 'img' ) {
                $src = $node->getAttribute('src');
                if ( empty($src) ) {
                    continue;
                }
                $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));
                    $node->removeAttribute('srcset');
                    $node->removeAttribute('data-src');
                    if ( ! $icerik->gorsel_id ) {
                        $icerik->gorsel_id = $upload_id;
                    }
                }
                $icerik->metin .= $dom->saveHTML($node);
            }
        }
    
        // Son düzenlemeler
        $icerik->metin = wp_kses_post($icerik->metin);
        $icerik->metin = force_balance_tags($icerik->metin);
        $icerik->metin = preg_replace('/<p[^>]*>\s*<\/p>/', '', $icerik->metin);
    
        return $icerik;
    }
}

if ( ! function_exists('icerik_cekici_gorsel_yukle') ) {
    function icerik_cekici_gorsel_yukle($image_url) {
        $parsed_url = parse_url($image_url);
        if ( ! $parsed_url || ! isset($parsed_url['host']) ) {
            error_log("[Geçersiz URL] " . $image_url);
            return false;
        }
    
        $image_url = $parsed_url['scheme'] . '://' . $parsed_url['host'] . ($parsed_url['path'] ?? '');
        if ( isset($parsed_url['query']) ) {
            $image_url .= '?' . $parsed_url['query'];
        }
    
        $ext = strtolower(pathinfo($parsed_url['path'] ?? '', PATHINFO_EXTENSION));
        if ( ! in_array($ext, ['jpg','jpeg','png','gif','webp']) ) {
            error_log("[Geçersiz Uzantı] " . $ext);
            return false;
        }
    
        $tmp_file = download_url($image_url);
        if ( is_wp_error($tmp_file) ) {
            error_log("[İndirme Hatası] " . $tmp_file->get_error_message());
            return false;
        }
    
        $file_array = [
            'name'     => sanitize_file_name(basename($parsed_url['path'] ?? '')) ?: uniqid('img_').".$ext",
            'tmp_name' => $tmp_file
        ];
    
        $upload_id = media_handle_sideload($file_array, 0);
        @unlink($tmp_file);
    
        if ( is_wp_error($upload_id) ) {
            error_log("[Yükleme Hatası] " . $upload_id->get_error_message());
            return false;
        }
    
        return $upload_id;
    }
}

if ( ! function_exists('icerik_normalize_url') ) {
    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'];
        $base_path = isset($parsed_base['path']) ? rtrim($parsed_base['path'], '/') : '';
        $image_path = ltrim($image_url, '/');
    
        if ( $base_path && strpos($image_path, $base_path) === 0 ) {
            return $base . '/' . $image_path;
        }
    
        return $base . ($base_path ? "$base_path/" : '/') . $image_path;
    }
}

// -----------------------------------------------------
// [devamini_oku] Shortcode İşleyicisi
// -----------------------------------------------------

function devamini_oku_shortcode_handler( $atts, $content = null ) {
    // Eğer URL parametresi mevcutsa (devamini_oku=1) içerik çekmeye çalışıyoruz.
    if ( isset($_GET['devamini_oku']) && $_GET['devamini_oku'] == '1' ) {
        global $post;
        $post_content = $post->post_content;
        
        // Debug: Post içeriğini hem log dosyasına hem de ekrana yazdırıyoruz.
        error_log("Post Content: " . $post_content);
        echo '<div style="background:#fee;padding:10px;margin-bottom:10px;">Debug: Post Content: ' . esc_html($post_content) . '</div>';
        
        // Yazı içeriğinde ilk bulunan "https://" ile başlayan URL'yi tespit ediyoruz.
        if ( preg_match( '/(https?:\/\/[^\s"]+)/i', $post_content, $matches ) ) {
            $url = $matches[1];
            error_log("Bulunan URL: " . $url);
            echo '<div style="background:#efe;padding:10px;margin-bottom:10px;">Debug: Bulunan URL: ' . esc_html($url) . '</div>';
            
            $fetched_content = icerik_cekici_icerik_al( $url );
            if ( ! empty( $fetched_content->metin ) ) {
                error_log("Çekilen içeriğin uzunluğu: " . strlen($fetched_content->metin));
                echo '<div style="background:#eef;padding:10px;margin-bottom:10px;">Debug: Çekilen içeriğin uzunluğu: ' . strlen($fetched_content->metin) . '</div>';
                $new_content = preg_replace( '/<img[^>]+\>/i', '', $fetched_content->metin );
                remove_shortcode( 'devamini_oku' );
                // URL parametresini temizlemek için JavaScript ekliyoruz.
                $script = '<script>
                    if(window.history.replaceState){
                        var url = new URL(window.location);
                        url.searchParams.delete("devamini_oku");
                        window.history.replaceState(null, "", url.toString());
                    }
                </script>';
                return $new_content . $script;
            } else {
                error_log("Çekilen içerik boş geldi.");
                echo '<div style="background:#fcc;padding:10px;margin-bottom:10px;">Debug: Çekilen içerik boş geldi.</div>';
            }
        } else {
            error_log("Post içeriğinde URL bulunamadı.");
            echo '<div style="background:#fcc;padding:10px;margin-bottom:10px;">Debug: Post içeriğinde URL bulunamadı.</div>';
        }
        return '';
    }
    
    // Eğer devamini_oku parametresi yoksa, "Devamını Oku" linkini gösteriyoruz.
    $link = add_query_arg( 'devamini_oku', '1' );
    return '<a href="' . esc_url( $link ) . '">Devamını Oku</a>';
}
add_shortcode( 'devamini_oku', 'devamini_oku_shortcode_handler' );
muratca61
Site Admin
Mesajlar: 35964
Kayıt: Cmt Ara 21, 2024 7:56 am

Re: wordpress devamını oku veri çekici

Mesaj gönderen muratca61 »

deepseek sorduk

Kod:Tümünü seç

<?php
/*
Plugin Name: İçerik Devamını Oku - Debug Versiyonu
Description: Yazı içeriğinde yer alan [devamini_oku] kodunu "Devamını Oku" linkine çevirir. Linke tıklandığında, yazı içindeki gömülü URL tespit edilir, içerik çekilir ve ekrana getirilir. (Debug mesajları ekrandadır)
Version: 1.0
Author: Sizin Adınız
*/

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

// WP_DEBUG ayarlarının aktif olduğundan emin olun (bu test sırasında faydalıdır)
if ( ! defined('WP_DEBUG') ) {
    define('WP_DEBUG', true);
}
if ( ! defined('WP_DEBUG_LOG') ) {
    define('WP_DEBUG_LOG', true);
}

// -----------------------------------------------------
// İçerik Çekici Fonksiyonlar
// -----------------------------------------------------

if ( ! function_exists('icerik_cekici_html_al') ) {
    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',
                'Accept-Language' => 'tr-TR,tr;q=0.9'
            ],
            'timeout'   => 45,
            'sslverify' => false
        ]);
        
        if ( is_wp_error($response) ) {
            error_log("[HTML Çekme Hatası] " . $response->get_error_message());
            return false;
        }
        
        return wp_remote_retrieve_body($response);
    }
}

if ( ! function_exists('icerik_cekici_icerik_al') ) {
    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);
        $html = mb_convert_encoding($html, 'HTML-ENTITIES', 'UTF-8');
        @$dom->loadHTML($html, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
        libxml_clear_errors();
    
        $icerik = (object)[ 'metin' => '', 'gorsel_id' => null ];
        $xpath = new DOMXPath($dom);
    
        // Tüm <a> etiketlerini kaldırıyoruz
        $links = $xpath->query('//a');
        foreach ( $links as $link ) {
            $fragment = $dom->createDocumentFragment();
            while ( $link->childNodes->length > 0 ) {
                $fragment->appendChild( $link->childNodes->item(0) );
            }
            $link->parentNode->replaceChild( $fragment, $link );
        }
    
        // Ana içeriği işle: <p> ve <img> etiketleri
        $nodes = $xpath->query('//p[not(ancestor::header|aside|footer)] | //img[not(ancestor::header|aside|footer)]');
        foreach ( $nodes as $node ) {
            if ( $node->tagName === 'p' ) {
                $text = preg_replace('/\s+/', ' ', trim($node->textContent));
                if ( ! empty($text) ) {
                    $icerik->metin .= '<p>' . $text . '</p>';
                }
            } elseif ( $node->tagName === 'img' ) {
                $src = $node->getAttribute('src');
                if ( empty($src) ) {
                    continue;
                }
                $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));
                    $node->removeAttribute('srcset');
                    $node->removeAttribute('data-src');
                    if ( ! $icerik->gorsel_id ) {
                        $icerik->gorsel_id = $upload_id;
                    }
                }
                $icerik->metin .= $dom->saveHTML($node);
            }
        }
    
        // Son düzenlemeler
        $icerik->metin = wp_kses_post($icerik->metin);
        $icerik->metin = force_balance_tags($icerik->metin);
        $icerik->metin = preg_replace('/<p[^>]*>\s*<\/p>/', '', $icerik->metin);
    
        return $icerik;
    }
}

if ( ! function_exists('icerik_cekici_gorsel_yukle') ) {
    function icerik_cekici_gorsel_yukle($image_url) {
        $parsed_url = parse_url($image_url);
        if ( ! $parsed_url || ! isset($parsed_url['host']) ) {
            error_log("[Geçersiz URL] " . $image_url);
            return false;
        }
    
        $image_url = $parsed_url['scheme'] . '://' . $parsed_url['host'] . ($parsed_url['path'] ?? '');
        if ( isset($parsed_url['query']) ) {
            $image_url .= '?' . $parsed_url['query'];
        }
    
        $ext = strtolower(pathinfo($parsed_url['path'] ?? '', PATHINFO_EXTENSION));
        if ( ! in_array($ext, ['jpg','jpeg','png','gif','webp']) ) {
            error_log("[Geçersiz Uzantı] " . $ext);
            return false;
        }
    
        $tmp_file = download_url($image_url);
        if ( is_wp_error($tmp_file) ) {
            error_log("[İndirme Hatası] " . $tmp_file->get_error_message());
            return false;
        }
    
        $file_array = [
            'name'     => sanitize_file_name(basename($parsed_url['path'] ?? '')) ?: uniqid('img_').".$ext",
            'tmp_name' => $tmp_file
        ];
    
        $upload_id = media_handle_sideload($file_array, 0);
        @unlink($tmp_file);
    
        if ( is_wp_error($upload_id) ) {
            error_log("[Yükleme Hatası] " . $upload_id->get_error_message());
            return false;
        }
    
        return $upload_id;
    }
}

if ( ! function_exists('icerik_normalize_url') ) {
    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'];
        $base_path = isset($parsed_base['path']) ? rtrim($parsed_base['path'], '/') : '';
        $image_path = ltrim($image_url, '/');
    
        if ( $base_path && strpos($image_path, $base_path) === 0 ) {
            return $base . '/' . $image_path;
        }
    
        return $base . ($base_path ? "$base_path/" : '/') . $image_path;
    }
}

// -----------------------------------------------------
// [devamini_oku] Shortcode İşleyicisi
// -----------------------------------------------------

function devamini_oku_shortcode_handler( $atts, $content = null ) {
    // Eğer URL parametresi mevcutsa (devamini_oku=1) içerik çekmeye çalışıyoruz.
    if ( isset($_GET['devamini_oku']) && $_GET['devamini_oku'] == '1' ) {
        global $post;
        $post_content = $post->post_content;
        
        // Debug: Post içeriğini hem log dosyasına hem de ekrana yazdırıyoruz.
        error_log("Post Content: " . $post_content);
        echo '<div style="background:#fee;padding:10px;margin-bottom:10px;">Debug: Post Content: ' . esc_html($post_content) . '</div>';
        
        // Yazı içeriğinde ilk bulunan "https://" ile başlayan URL'yi tespit ediyoruz.
        if ( preg_match( '/(https?:\/\/[^\s"]+)/i', $post_content, $matches ) ) {
            $url = $matches[1];
            error_log("Bulunan URL: " . $url);
            echo '<div style="background:#efe;padding:10px;margin-bottom:10px;">Debug: Bulunan URL: ' . esc_html($url) . '</div>';
            
            $fetched_content = icerik_cekici_icerik_al( $url );
            if ( ! empty( $fetched_content->metin ) ) {
                error_log("Çekilen içeriğin uzunluğu: " . strlen($fetched_content->metin));
                echo '<div style="background:#eef;padding:10px;margin-bottom:10px;">Debug: Çekilen içeriğin uzunluğu: ' . strlen($fetched_content->metin) . '</div>';
                $new_content = preg_replace( '/<img[^>]+\>/i', '', $fetched_content->metin );
                remove_shortcode( 'devamini_oku' );
                // URL parametresini temizlemek için JavaScript ekliyoruz.
                $script = '<script>
                    if(window.history.replaceState){
                        var url = new URL(window.location);
                        url.searchParams.delete("devamini_oku");
                        window.history.replaceState(null, "", url.toString());
                    }
                </script>';
                return $new_content . $script;
            } else {
                error_log("Çekilen içerik boş geldi.");
                echo '<div style="background:#fcc;padding:10px;margin-bottom:10px;">Debug: Çekilen içerik boş geldi.</div>';
            }
        } else {
            error_log("Post içeriğinde URL bulunamadı.");
            echo '<div style="background:#fcc;padding:10px;margin-bottom:10px;">Debug: Post içeriğinde URL bulunamadı.</div>';
        }
        return '';
    }
    
    // Eğer devamini_oku parametresi yoksa, "Devamını Oku" linkini gösteriyoruz.
    $link = add_query_arg( 'devamini_oku', '1' );
    return '<a href="' . esc_url( $link ) . '">Devamını Oku</a>';
}
add_shortcode( 'devamini_oku', 'devamini_oku_shortcode_handler' );
cevap hata veriyor

Kod:Tümünü seç

<?php
/*
Plugin Name: İçerik Devamını Oku
Description: Yazı içeriğindeki [devamini_oku] kodunu "Devamını Oku" linkine çevirir. İçerik çekme işlemi güvenli bir şekilde gerçekleştirilir.
Version: 2.0
Author: Sizin Adınız
*/

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

// -----------------------------------------------------
// Güvenlik ve Hata Ayıklama Ayarları
// -----------------------------------------------------
if (!defined('WP_DEBUG_LOG')) define('WP_DEBUG_LOG', true);

// -----------------------------------------------------
// İçerik Çekme Fonksiyonları (Görselsiz)
// -----------------------------------------------------
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' => 30,
        'sslverify' => false
    ]);
    
    return is_wp_error($response) ? false : wp_remote_retrieve_body($response);
}

function icerik_cekici_icerik_al($url) {
    $html = icerik_cekici_html_al($url);
    if (!$html) return '';

    $dom = new DOMDocument();
    @$dom->loadHTML(mb_convert_encoding($html, 'HTML-ENTITIES', 'UTF-8'));
    $xpath = new DOMXPath($dom);
    
    // Sadece metin paragraflarını al
    $nodes = $xpath->query('//p[not(ancestor::header|aside|footer)]');
    $metin = '';
    
    foreach ($nodes as $node) {
        $text = preg_replace('/\s+/', ' ', trim($node->textContent));
        if (!empty($text)) $metin .= '<p>' . esc_html($text) . '</p>';
    }
    
    return $metin;
}

// -----------------------------------------------------
// Shortcode İşleyici (Güvenlik Önlemli)
// -----------------------------------------------------
function devamini_oku_shortcode_handler($atts, $content = null) {
    global $post;
    
    // İşlem tetiklendiyse
    if (isset($_GET['devamini_oku']) && $_GET['devamini_oku'] == $post->ID) {
        // Nonce kontrolü
        if (!wp_verify_nonce($_GET['_wpnonce'], 'devam_oku_' . $post->ID)) {
            wp_die('Geçersiz işlem!');
        }

        // URL'yi post içinden al
        if (preg_match('/https?:\/\/[^\s"]+/i', $post->post_content, $matches)) {
            $url = esc_url_raw($matches[0]);
            $yeni_icerik = icerik_cekici_icerik_al($url);
            
            if (!empty($yeni_icerik)) {
                // Orijinal içerikten kopyaları temizle
                $temiz_icerik = preg_replace('/\[devamini_oku\]/', '', $post->post_content);
                $paragraflar = explode('</p>', $yeni_icerik);
                
                foreach ($paragraflar as $p) {
                    $p = trim($p);
                    if (!empty($p) && strpos($temiz_icerik, $p) === false) {
                        $temiz_icerik .= $p . '</p>';
                    }
                }

                // Postu güncelle ve yönlendir
                wp_update_post([
                    'ID' => $post->ID,
                    'post_content' => $temiz_icerik
                ]);
            }
        }
        
        wp_redirect(get_permalink($post->ID));
        exit;
    }

    // Link oluştur
    return '<a href="' . esc_url(wp_nonce_url(
        add_query_arg('devamini_oku', $post->ID, get_permalink()),
        'devam_oku_' . $post->ID
    )) . '">Devamını Oku</a>';
}
add_shortcode('devamini_oku', 'devamini_oku_shortcode_handler');
muratca61
Site Admin
Mesajlar: 35964
Kayıt: Cmt Ara 21, 2024 7:56 am

Re: wordpress devamını oku veri çekici

Mesaj gönderen muratca61 »

cgpt soruldu

Kod:Tümünü seç

plugin klasörü altında yeni bir klasör içinde bir wordpress uygulaması yapalım. 
1-bu uygulama yazının içeriğine eklenen [devamini_oku] kodunu kullanıcıya Devamını Oku linki olarak gösterecek. 
2-Okuyucu linke tıklayınca sayfa yenilenirken yazının içeriğinde gömülü olan bir web adresini tarayıp bulacak. (Adres Hürriyet veya Kaynak yazılarında gömülü) 
3-bu linkin içeriğindeki haberin sadece yazılarını çekerek yazının içeriğini çekerek, yazıya ekleyecek. 
4-yazıda mevcut olan aynı yazıları eklemeyecek. sadece yazıları ekleyecek.
5- işlem tamamlandığında [devamini_oku] kodunu silecek.
6-bunlar Devamını Oku linkine tıklanıp sayfa yenilenirken gerçekleşecek.
7-sadece aynı olamayan yazıları çekecek resimler görseller çekilmeyecek
dosya yapısı

Kod:Tümünü seç

wp-content/
└── plugins/
    └── devamini-oku/
        └── devamini-oku.php

Kod:Tümünü seç

<?php
/*
Plugin Name: Devamını Oku
Description: Yazı içeriğinde eklenen [devamini_oku] shortcode’unu “Devamını Oku” linkine çevirir, linke tıklandığında gömülü URL’den yalnızca metinleri çekerek yazıya ekler ve shortcode’u kaldırır.
Version: 1.0
Author: Your Name
*/

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

class DevaminiOkuPlugin {

    public function __construct() {
        // Shortcode kaydı
        add_shortcode('devamini_oku', array($this, 'devamini_oku_shortcode'));
        // Linke tıklanarak sayfa yenilendiğinde işlemi tetikle
        add_action('template_redirect', array($this, 'process_devamini_oku'));
        // Yazı içeriğini filtreleyerek güncelle
        add_filter('the_content', array($this, 'update_content'));
    }

    // 1. [devamini_oku] shortcode’unu linke çevirir.
    public function devamini_oku_shortcode($atts, $content = null) {
        // Mevcut sayfanın URL'sine devamini_oku parametresi eklenir.
        $current_url = add_query_arg('devamini_oku', '1', get_permalink());
        return '<a href="' . esc_url($current_url) . '">Devamını Oku</a>';
    }

    // 2. ve 6. Linke tıklandığında sayfa yenilendiğinde çalışır.
    public function process_devamini_oku() {
        if ( isset($_GET['devamini_oku']) && $_GET['devamini_oku'] == '1' && is_single() ) {
            // İşlemin bir defaya mahsus çalışması için bir bayrak (transient veya query var) kullanabilirsiniz.
            // Örneğin: update_post_meta() ile post meta üzerinden "devamini_oku_yapildi" flag'i eklenebilir.
            add_filter('the_content', array($this, 'append_remote_content'));
        }
    }

    // 3. ve 4. Uzaktaki içerik çekilip mevcut içeriğe eklenir.
    public function append_remote_content($content) {
        // [devamini_oku] etiketini içerikten kaldır.
        $content = str_replace('[devamini_oku]', '', $content);

        // Yazı içeriğinden gömülü URL’yi bul (örneğin, ilk http(s):// ifadesi)
        if (preg_match('/https?:\/\/[^\s"<>]+/', $content, $matches)) {
            $embedded_url = $matches[0];

            // Uzak içerik çekimi
            $response = wp_remote_get($embedded_url);
            if (is_wp_error($response)) {
                return $content; // Hata durumunda mevcut içeriği değiştirme
            }
            $remote_html = wp_remote_retrieve_body($response);

            // HTML parse – DOMDocument ile paragrafları çekiyoruz.
            libxml_use_internal_errors(true);
            $dom = new DOMDocument();
            $dom->loadHTML($remote_html);
            $xpath = new DOMXPath($dom);
            // Burada örnek olarak <p> etiketlerini çekiyoruz. İhtiyaca göre düzenleyebilirsiniz.
            $paragraphs = $xpath->query('//p');
            $new_text = '';

            if ($paragraphs->length) {
                foreach ($paragraphs as $p) {
                    $text = trim($p->textContent);
                    // 4. Aynı metin zaten mevcutsa eklemiyoruz.
                    if (!empty($text) && strpos($content, $text) === false) {
                        $new_text .= '<p>' . esc_html($text) . '</p>';
                    }
                }
            }

            // Yeni metin varsa mevcut içeriğe ekle
            if (!empty($new_text)) {
                $content .= $new_text;
            }
        }
        return $content;
    }

    // Yazı içeriğini güncellemek için (örneğin, filtre ile çalışıyorsa)
    public function update_content($content) {
        // Eğer daha önce eklenmişse [devamini_oku] shortcode'unun ekrana yansımasını engelle.
        return str_replace('[devamini_oku]', '', $content);
    }
}

new DevaminiOkuPlugin();
muratca61
Site Admin
Mesajlar: 35964
Kayıt: Cmt Ara 21, 2024 7:56 am

Re: wordpress devamını oku veri çekici

Mesaj gönderen muratca61 »

copilot soruldu

şöyle yapalım hali hazırda içerik çeken uygulamam var şu konumda

Kod:Tümünü seç

/wp-content/plugins/icerik-cekici/
├── icerik-cekici.php
└── includes/
    ├── class-baslik-olusturucu.php
    └── functions.php 
buna bağlantı kurup çekebilirmiyiz içeriği . burada hangi dosyanın kodunu istiyorsan paylaşırım
mevcut kod

Kod:Tümünü seç

<?php
/*
Plugin Name: İçerik Devamını Oku
Description: Yazı içeriğinde "Hürriyet" veya "Kaynak" kelimelerini arar, gömülü linkteki yazı içeriğini çekip yazıya ekler.
Version: 1.1
Author: Sizin Adınız
*/

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

// HTML çekme fonksiyonu
if ( ! function_exists('icerik_devami_cekici_html_al') ) {
    function icerik_devami_cekici_html_al($url) {
        $response = wp_remote_get($url, [
            'headers' => [
                'User-Agent' => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)',
                'Accept-Language' => 'tr-TR,tr;q=0.9'
            ],
            'timeout' => 15,
            'sslverify' => false
        ]);
        
        if(is_wp_error($response)) {
            error_log("[HTML Çekme Hatası] " . $response->get_error_message());
            return false;
        }
        
        return wp_remote_retrieve_body($response);
    }
}

// İçerik çekme ve işleme fonksiyonu
if ( ! function_exists('icerik_devami_icerik_al') ) {
    function icerik_devami_icerik_al($url) {
        $html = icerik_devami_cekici_html_al($url);
        if(!$html) return (object)['metin' => '', 'gorsel_id' => null];
    
        $dom = new DOMDocument();
        libxml_use_internal_errors(true);
        $html = mb_convert_encoding($html, 'HTML-ENTITIES', 'UTF-8');
        @$dom->loadHTML($html, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
        libxml_clear_errors();
    
        $icerik = (object)['metin' => '', 'gorsel_id' => null];
        $xpath = new DOMXPath($dom);
    
        // Tüm bağlantıları kaldır
        $links = $xpath->query('//a');
        foreach($links as $link) {
            $fragment = $dom->createDocumentFragment();
            while($link->childNodes->length > 0) {
                $fragment->appendChild($link->childNodes->item(0));
            }
            $link->parentNode->replaceChild($fragment, $link);
        }
    
        // Ana içeriği işle (paragraflar ve resimler)
        $nodes = $xpath->query('//p[not(ancestor::header|aside|footer)] | //img[not(ancestor::header|aside|footer)]');
        
        foreach($nodes as $node) {
            if($node->tagName === 'p') {
                $text = preg_replace('/\s+/', ' ', trim($node->textContent));
                if(!empty($text)) {
                    $icerik->metin .= '<p>' . $text . '</p>';
                }
            } 
            elseif($node->tagName === 'img') {
                $src = $node->getAttribute('src');
                if(empty($src)) continue;
    
                $image_url = icerik_devami_normalize_url($src, $url);
                $upload_id = icerik_devami_gorsel_yukle($image_url);
                
                if($upload_id) {
                    $node->setAttribute('src', wp_get_attachment_url($upload_id));
                    $node->removeAttribute('srcset');
                    $node->removeAttribute('data-src');
                    if(!$icerik->gorsel_id) $icerik->gorsel_id = $upload_id;
                }
                $icerik->metin .= $dom->saveHTML($node);
            }
        }
    
        // Son işlemler: HTML güvenliği ve boş paragrafların temizlenmesi
        $icerik->metin = wp_kses_post($icerik->metin);
        $icerik->metin = force_balance_tags($icerik->metin);
        $icerik->metin = preg_replace('/<p[^>]*>\s*<\/p>/', '', $icerik->metin);
    
        return $icerik;
    }
}

// Görsel yükleme fonksiyonu
if ( ! function_exists('icerik_devami_gorsel_yukle') ) {
    function icerik_devami_gorsel_yukle($image_url) {
        $parsed_url = parse_url($image_url);
        if(!$parsed_url || !isset($parsed_url['host'])) {
            error_log("[Geçersiz URL] " . $image_url);
            return false;
        }
    
        // URL oluşturma
        $image_url = $parsed_url['scheme'] . '://' . $parsed_url['host'] . ($parsed_url['path'] ?? '');
        if(isset($parsed_url['query'])) {
            $image_url .= '?' . $parsed_url['query'];
        }
    
        // Uzantı kontrolü
        $ext = strtolower(pathinfo($parsed_url['path'] ?? '', PATHINFO_EXTENSION));
        if(!in_array($ext, ['jpg','jpeg','png','gif','webp'])) {
            error_log("[Geçersiz Uzantı] " . $ext);
            return false;
        }
    
        // İndirme işlemi
        $tmp_file = download_url($image_url);
        if(is_wp_error($tmp_file)) {
            error_log("[İndirme Hatası] " . $tmp_file->get_error_message());
            return false;
        }
    
        // Yükleme işlemi
        $file_array = [
            'name' => sanitize_file_name(basename($parsed_url['path'] ?? '')) ?: uniqid('img_').".$ext",
            'tmp_name' => $tmp_file
        ];
    
        $upload_id = media_handle_sideload($file_array, 0);
        @unlink($tmp_file);
    
        if(is_wp_error($upload_id)) {
            error_log("[Yükleme Hatası] " . $upload_id->get_error_message());
            return false;
        }
    
        return $upload_id;
    }
}

// URL normalizasyon fonksiyonu
if ( ! function_exists('icerik_devami_normalize_url') ) {
    function icerik_devami_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'];
        
        $base_path = isset($parsed_base['path']) ? rtrim($parsed_base['path'], '/') : '';
        $image_path = ltrim($image_url, '/');
        
        if($base_path && strpos($image_path, $base_path) === 0) {
            return $base . '/' . $image_path;
        }
    
        return $base . ($base_path ? "$base_path/" : '/') . $image_path;
    }
}

/**
 * [devamini_oku] Shortcode İşleyicisi
 *
 * Yazı içeriğinde "Hürriyet" veya "Kaynak" kelimelerini arar, gömülü linkteki yazı içeriğini çekip ekler.
 */
function devamini_oku_shortcode_handler( $atts, $content = null ) {
    global $post;
    
    // Kelimeleri tanımla
    $aranan_kelimeler = '(Hürriyet|Kaynak)';
    
    // Desen oluştur
    $pattern = '/<a[^>]*href=["\'](.*?)["\'][^>]*>' . $aranan_kelimeler . '<\/a>/i';
    
    if ( isset( $_GET['devamini_oku'] ) && $_GET['devamini_oku'] == '1' ) {
        // Yazı içeriğinde deseni ara
        if ( preg_match( $pattern, $post->post_content, $matches ) ) {
            $url = esc_url_raw( $matches[1] );
            $fetched_content = icerik_devami_icerik_al( $url );
            if ( ! empty( $fetched_content->metin ) ) {
                remove_shortcode( 'devamini_oku' );
                return $fetched_content->metin;
            }
        }
        return '<p>' . __( 'İçerik bulunamadı.', 'devamini-oku' ) . '</p>';
    }
    
    $link = add_query_arg( 'devamini_oku', '1' );
    return '<a href="' . esc_url( $link ) . '">' . __( 'Devamını Oku', 'devamini-oku' ) . '</a>';
}
add_shortcode( 'devamini_oku', 'devamini_oku_shortcode_handler' );
bunu verdi bu ne

Kod:Tümünü seç

<?php
/*
Plugin Name: İçerik Devamını Oku
Description: Yazı içeriğinde "Hürriyet" veya "Kaynak" kelimelerini arar, gömülü linkteki yazı içeriğini çekip yazıya ekler.
Version: 1.2
Author: Sizin Adınız
*/

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

/**
 * [devamini_oku] Shortcode İşleyicisi
 *
 * Yazı içeriğinde "Hürriyet" veya "Kaynak" kelimelerini arar, gömülü linkteki yazı içeriğini çekip ekler.
 */
function devamini_oku_shortcode_handler( $atts, $content = null ) {
    global $post;
    
    // Kelimeleri tanımla
    $aranan_kelimeler = '(Hürriyet|Kaynak)';
    
    // Desen oluştur
    $pattern = '/<a[^>]*href=["\'](.*?)["\'][^>]*>' . $aranan_kelimeler . '<\/a>/i';
    
    if ( isset( $_GET['devamini_oku'] ) && $_GET['devamini_oku'] == '1' ) {
        // Yazı içeriğinde deseni ara
        if ( preg_match( $pattern, $post->post_content, $matches ) ) {
            $url = esc_url_raw( $matches[1] );

            // 'icerik-cekici' eklentisindeki içerik alma fonksiyonunu kullan
            if ( function_exists( 'icerik_cekici_icerik_al' ) ) {
                $fetched_content = icerik_cekici_icerik_al( $url );
                if ( ! empty( $fetched_content->metin ) ) {
                    remove_shortcode( 'devamini_oku' );
                    return $fetched_content->metin;
                } else {
                    return '<p>' . __( 'İçerik alınamadı.', 'devamini-oku' ) . '</p>';
                }
            } else {
                return '<p>' . __( 'İçerik çekici eklentisi etkin değil veya fonksiyon bulunamadı.', 'devamini-oku' ) . '</p>';
            }
        }
        return '<p>' . __( 'İçerik bulunamadı.', 'devamini-oku' ) . '</p>';
    }
    
    $link = add_query_arg( 'devamini_oku', '1' );
    return '<a href="' . esc_url( $link ) . '">' . __( 'Devamını Oku', 'devamini-oku' ) . '</a>';
}
add_shortcode( 'devamini_oku', 'devamini_oku_shortcode_handler' );
muratca61
Site Admin
Mesajlar: 35964
Kayıt: Cmt Ara 21, 2024 7:56 am

Re: wordpress devamını oku veri çekici

Mesaj gönderen muratca61 »

copilot
bu içeriği bu adresle gösteriyor

Kod:Tümünü seç

add_action( 'wp_loaded', 'test_icerik_cekici' );
function test_icerik_cekici() {
    if ( isset( $_GET['test_icerik'] ) && $_GET['test_icerik'] == '1' ) {
        $test_url = 'https://www.hurriyet.com.tr/teknoloji'; // Test için geçerli bir Hürriyet URL'si girin
        if ( function_exists( 'icerik_cekici_icerik_al' ) ) {
            $icerik = icerik_cekici_icerik_al( $test_url );
            echo '<h1>Test Sonucu:</h1>';
            echo '<pre>';
            print_r( $icerik );
            echo '</pre>';
        } else {
            echo 'Fonksiyon bulunamadı.';
        }
        exit;
    }
}

Kod:Tümünü seç

https://siteniz.com/?test_icerik=1
muratca61
Site Admin
Mesajlar: 35964
Kayıt: Cmt Ara 21, 2024 7:56 am

Re: wordpress devamını oku veri çekici

Mesaj gönderen muratca61 »

copilot son dosya ile hala olmadı
şu içerikle

Kod:Tümünü seç

/wp-content/plugins/icerik-cekici/
├── icerik-cekici.php
└── includes/
    ├── class-baslik-olusturucu.php
    └── functions.php 
şu kodla çekim hala olmuyor ama hata da vermiyor

Kod:Tümünü seç

<?php
/*
Plugin Name: İçerik Devamını Oku
Description: Yazı içeriğinde "Hürriyet" veya "Kaynak" kelimelerine bağlı linklerin içeriğini çekip yazıya ekler.
Version: 1.4
Author: Sizin Adınız
*/

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

/**
 * [devamini_oku] Shortcode İşleyicisi
 */
function devamini_oku_shortcode_handler( $atts, $content = null ) {
    global $post;

    // Kelimeleri tanımla
    $aranan_kelimeler = '(Hürriyet|Kaynak)';

    // Yazı içeriğini ham haliyle al
    $content = $post->post_content;

    // Desen oluştur
    $pattern = '/<a[^>]*href=["\'](.*?)["\'][^>]*>\s*' . $aranan_kelimeler . '\s*<\/a>/iu';

    if ( isset( $_GET['devamini_oku'] ) && $_GET['devamini_oku'] == '1' ) {
        error_log('Devamini Oku: Parametre tespit edildi.');

        // Yazı içeriğinde deseni ara
        if ( preg_match( $pattern, $content, $matches ) ) {
            $url = esc_url_raw( $matches[1] );
            error_log('Devamini Oku: URL bulundu - ' . $url);

            // 'icerik-cekici' eklentisindeki içerik alma fonksiyonunu kullan
            if ( function_exists( 'icerik_cekici_icerik_al' ) ) {
                error_log('Devamini Oku: Fonksiyon mevcut, içerik çekiliyor.');
                $fetched_content = icerik_cekici_icerik_al( $url );
                if ( ! empty( $fetched_content->metin ) ) {
                    error_log('Devamini Oku: İçerik başarıyla alındı.');
                    // İçeriği döndür
                    return $fetched_content->metin;
                } else {
                    error_log('Devamini Oku: İçerik alınamadı veya boş.');
                    return '<p>' . __( 'İçerik alınamadı.', 'devamini-oku' ) . '</p>';
                }
            } else {
                error_log('Devamini Oku: Fonksiyon bulunamadı.');
                return '<p>' . __( 'İçerik çekici eklentisi etkin değil veya fonksiyon bulunamadı.', 'devamini-oku' ) . '</p>';
            }
        } else {
            error_log('Devamini Oku: Eşleşme bulunamadı.');
            return '<p>' . __( 'İçerik bulunamadı.', 'devamini-oku' ) . '</p>';
        }
    }

    // "Devamını Oku" linki oluştur
    $link = add_query_arg( 'devamini_oku', '1', get_permalink( $post->ID ) );
    return '<a href="' . esc_url( $link ) . '">' . __( 'Devamını Oku', 'devamini-oku' ) . '</a>';
}
add_shortcode( 'devamini_oku', 'devamini_oku_shortcode_handler' );
sadece linki çıkartıp yazıya ekleme

Kod:Tümünü seç

<?php
/*
Plugin Name: İçerik Devamını Oku
Description: Yazı içeriğinde "Hürriyet" veya "Kaynak" kelimelerine bağlı linkleri bulur ve 'Devamını Oku' tıklandığında linki yazıya ekler.
Version: 1.5
Author: Sizin Adınız
*/

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

/**
 * [devamini_oku] Shortcode İşleyicisi
 */
function devamini_oku_shortcode_handler( $atts, $content = null ) {
    global $post;

    // Kelimeleri tanımla
    $aranan_kelimeler = '(Hürriyet|Kaynak)';

    // Yazı içeriğini ham haliyle al
    $content = $post->post_content;

    // Desen oluştur
    $pattern = '/<a[^>]*href=["\'](.*?)["\'][^>]*>\s*' . $aranan_kelimeler . '\s*<\/a>/iu';

    if ( isset( $_GET['devamini_oku'] ) && $_GET['devamini_oku'] == '1' ) {
        // Yazı içeriğinde deseni ara
        if ( preg_match( $pattern, $content, $matches ) ) {
            $url = esc_url_raw( $matches[1] );

            // Linki yazıya ekle
            return '<p>Bulunan Link: <a href="' . esc_url( $url ) . '">' . esc_html( $url ) . '</a></p>';
        } else {
            return '<p>' . __( 'Link bulunamadı.', 'devamini-oku' ) . '</p>';
        }
    }

    // "Devamını Oku" linki oluştur
    $link = add_query_arg( 'devamini_oku', '1', get_permalink( $post->ID ) );
    return '<a href="' . esc_url( $link ) . '">' . __( 'Devamını Oku', 'devamini-oku' ) . '</a>';
}
add_shortcode( 'devamini_oku', 'devamini_oku_shortcode_handler' );
muratca61
Site Admin
Mesajlar: 35964
Kayıt: Cmt Ara 21, 2024 7:56 am

Re: wordpress devamını oku veri çekici

Mesaj gönderen muratca61 »

yeniden deniyoruz cgpt pc1 de sorduk

Kod:Tümünü seç

wordpress için bir shortcode yapalım. [devaminioku] olsun. bu kod kullanıcı tarafından eklendiği
  gönderinin son kelimesinin bitimine gelecek şekilde minimal Devamını Oku butonu yerleştirecek. bu eklentiyi
    plugins klasöründe "devamoku" klasörü içinde oluşturalım. bu eklentinin admin sayfasında aktif pasif 
    ayarı olsun. giriş yapmış kullanıcı , admin , herkese görünür ayarları olsun. bunu oluşturalım sonrasında 
    fonksiyonlarını oluşturalım.
24 saniye hakkında Devamını oku kısa kodu oluşturma
Aşağıdaki örnek, istediğiniz özellikleri barındıran bir WordPress eklentisi oluşturmanıza yardımcı olacaktır. Bu örnekte:

Shortcode:

Kod:Tümünü seç

[devaminioku]
shortcode’u, kullanıcı gönderiye eklediğinde, buton HTML kodunu (minimal "Devamını Oku" butonu) ekler.
Admin Ayar Sayfası: Eklentiyi aktif/pasif yapabileceğiniz ve butonun görünürlüğünü (herkese, yalnızca giriş yapmış kullanıcılar veya sadece admin) ayarlayabileceğiniz bir sayfa oluşturulur.
Klasör Yapısı: Bu dosyayı wp-content/plugins/

Kod:Tümünü seç

devamoku
/

Kod:Tümünü seç

devamoku.php
yoluna yerleştirin. (Eğer isterseniz, minimal CSS için aynı klasörde bir style.css dosyası oluşturabilirsiniz.)
Aşağıda örnek kodları bulabilirsiniz:

Kod:Tümünü seç

devamoku.php

Kod:Tümünü seç

<?php
/*
Plugin Name: Devamını Oku
Plugin URI: http://ornek.com
Description: [devaminioku] shortcode’u ile gönderinin son kelimesine minimal "Devamını Oku" butonu ekler. Ayrıca admin panelinden aktif/pasif ve görünürlük ayarları yapılır.
Version: 1.0
Author: Adınız
Author URI: http://ornek.com
License: GPL2
*/

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

class DevamokuPlugin {
    
    private $option_name = 'devamoku_settings';
    
    public function __construct() {
        // Shortcode kaydı
        add_shortcode( 'devaminioku', array( $this, 'shortcode_handler' ) );
        // Admin menü ekle
        add_action( 'admin_menu', array( $this, 'add_admin_menu' ) );
        // Ayarları kaydetmek için
        add_action( 'admin_init', array( $this, 'register_settings' ) );
        // Ön yüz stil dosyası ekle (opsiyonel)
        add_action( 'wp_enqueue_scripts', array( $this, 'enqueue_scripts' ) );
    }
    
    // Ayarlarımızı register ediyoruz
    public function register_settings() {
        register_setting( 'devamoku_options_group', $this->option_name );
    }
    
    // Admin menüye ayar sayfası ekleniyor
    public function add_admin_menu() {
        add_options_page(
            'Devamını Oku Ayarları',
            'Devamını Oku',
            'manage_options',
            'devamoku-settings',
            array( $this, 'settings_page' )
        );
    }
    
    // Ayar sayfasının içeriği
    public function settings_page() {
        $settings   = get_option( $this->option_name );
        $active     = isset( $settings['active'] ) ? $settings['active'] : 'yes';
        $visibility = isset( $settings['visibility'] ) ? $settings['visibility'] : 'everyone';
        ?>
        <div class="wrap">
            <h1>Devamını Oku Ayarları</h1>
            <form method="post" action="options.php">
                <?php settings_fields( 'devamoku_options_group' ); ?>
                <?php do_settings_sections( 'devamoku_options_group' ); ?>
                <table class="form-table">
                    <tr valign="top">
                        <th scope="row">Eklenti Durumu</th>
                        <td>
                            <select name="<?php echo $this->option_name; ?>[active]">
                                <option value="yes" <?php selected( $active, 'yes' ); ?>>Aktif</option>
                                <option value="no" <?php selected( $active, 'no' ); ?>>Pasif</option>
                            </select>
                        </td>
                    </tr>
                    <tr valign="top">
                        <th scope="row">Buton Görünürlüğü</th>
                        <td>
                            <select name="<?php echo $this->option_name; ?>[visibility]">
                                <option value="everyone" <?php selected( $visibility, 'everyone' ); ?>>Herkese</option>
                                <option value="logged_in" <?php selected( $visibility, 'logged_in' ); ?>>Giriş Yapmış Kullanıcılar</option>
                                <option value="admin" <?php selected( $visibility, 'admin' ); ?>>Sadece Admin</option>
                            </select>
                        </td>
                    </tr>
                </table>
                <?php submit_button(); ?>
            </form>
        </div>
        <?php
    }
    
    // Opsiyonel: Stil dosyasını ekliyoruz (aynı klasörde style.css dosyası olmalı)
    public function enqueue_scripts() {
        wp_enqueue_style( 'devamoku-style', plugin_dir_url( __FILE__ ) . 'style.css' );
    }
    
    // [devaminioku] shortcode’u çalıştıran fonksiyon
    public function shortcode_handler( $atts, $content = null ) {
        $settings = get_option( $this->option_name );
        $active     = isset( $settings['active'] ) ? $settings['active'] : 'yes';
        $visibility = isset( $settings['visibility'] ) ? $settings['visibility'] : 'everyone';
        
        // Eklenti pasifse hiçbir şey döndürme
        if ( $active !== 'yes' ) {
            return '';
        }
        
        // Görünürlük kontrolü: Eğer sadece admin ise, admin değilse boş döndür
        if ( $visibility === 'admin' && ! current_user_can( 'administrator' ) ) {
            return '';
        }
        // Görünürlük kontrolü: Eğer sadece giriş yapmış kullanıcı ise ve kullanıcı giriş yapmamışsa boş döndür
        if ( $visibility === 'logged_in' && ! is_user_logged_in() ) {
            return '';
        }
        
        // Buton HTML'si: Buton, gönderinin son kelimesine eklenmesi için inline olarak kullanılır.
        $button = '<a href="#" class="devamoku-button">Devamını Oku</a>';
        
        return $button;
    }
}

new DevamokuPlugin();

Kod:Tümünü seç

style.css
(opsiyonel, butonun minimal görünümü için)

Kod:Tümünü seç

.devamoku-button {
    font-size: 14px;
    color: #0073aa;
    text-decoration: none;
    border: 1px solid #0073aa;
    padding: 2px 5px;
    margin-left: 5px;
}

.devamoku-button:hover {
    background-color: #0073aa;
    color: #fff;
}
Açıklamalar
Shortcode Kullanımı: Yazı düzenleyicisinde istediğiniz yere [devaminioku] eklediğinizde, yukarıdaki fonksiyon çalışır. Ayarlarda eklenti aktif değilse veya görünürlük şartları sağlanmıyorsa buton görünmez.
Admin Ayar Sayfası: WordPress admin panelinde
Ayarlar > Devamını
Oku yoluyla erişebileceğiniz sayfada, eklentiyi aktif/pasif yapabilir ve butonun hangi kullanıcılar için görünür olacağını belirleyebilirsiniz.
Butonun Yerleşimi: Shortcode eklendiği konumda, metnin son kelimesine eklenmiş gibi inline çalışır. (Kullanıcının gönderi içeriğinde shortcode’u doğru konuma eklemesi yeterlidir.)
Bu örneği kendi ihtiyaçlarınıza göre genişletebilir veya özelleştirebilirsiniz.





Cevapla