wordpress devamını oku veri çekici

Genel Forum
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 »

soru devam fonksiyon ekleme

Kod:Tümünü seç

evet güzel şimdi fonksiyon ekleyeceğiz. fonksiyon şu şekilde:
kullanıcı bu butona tıkladığında bu yazının kendi içinde Kaynak yazısını bulacak. 
Bu yazının kendisi bir link içermekte. bu linkin içeriğinde ana <p></p> etiketleri içerisindeki
 yazıları çekerek mevcut yazıya ekleyecek. burada dikkat edilecek konu aynı cümleleri tekrar 
 eklemeyecek. bunu sayfa yenileme i
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 »

dosya klasör yapısı

Kod:Tümünü seç

wp-content/
 └── plugins/
      └── devamoku/
           ├── devamoku.php
           ├── devamoku.js
           └── style.css

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. Butona tıklandığında, yazı içindeki "Kaynak" linkinde bulunan sayfanın ana <p></p> etiketlerindeki metinleri, mevcut yazıya AJAX ile ekler (tekrarlayan cümleler eklenmez).
Version: 1.1
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' ) );
        // Stil ve script dosyalarını ekle
        add_action( 'wp_enqueue_scripts', array( $this, 'enqueue_assets' ) );
    }
    
    public function register_settings() {
        register_setting( 'devamoku_options_group', $this->option_name );
    }
    
    public function add_admin_menu() {
        add_options_page(
            'Devamını Oku Ayarları',
            'Devamını Oku',
            'manage_options',
            'devamoku-settings',
            array( $this, 'settings_page' )
        );
    }
    
    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
    }
    
    // Stil ve JS dosyalarını ekliyoruz
    public function enqueue_assets() {
        wp_enqueue_style( 'devamoku-style', plugin_dir_url( __FILE__ ) . 'style.css' );
        wp_enqueue_script( 'devamoku-js', plugin_dir_url( __FILE__ ) . 'devamoku.js', array( 'jquery' ), '1.0', true );
        wp_localize_script( 'devamoku-js', 'devamoku_vars', array( 'ajax_url' => admin_url( 'admin-ajax.php' ) ) );
    }
    
    // [devaminioku] shortcode’u: Butonu, gönderi içeriğine inline ekliyoruz.
    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 ve 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 kullanılabilir)
        $button = '<a href="#" class="devamoku-button">Devamını Oku</a>';
        
        return $button;
    }
}

new DevamokuPlugin();

/*
 * AJAX isteği ile Kaynak linkinde bulunan sayfanın içeriğini çekip,
 * <p> etiketleri içerisindeki metinleri döndüren fonksiyon.
 */
function devamoku_fetch_ajax() {
    if ( ! isset( $_POST['source_url'] ) ) {
        wp_send_json_error('Kaynak URL eksik.');
    }
    $source_url = esc_url_raw( $_POST['source_url'] );
    
    $response = wp_remote_get( $source_url );
    if ( is_wp_error( $response ) ) {
        wp_send_json_error('Kaynak içeriği alınırken hata oluştu.');
    }
    $body = wp_remote_retrieve_body( $response );
    if ( empty( $body ) ) {
        wp_send_json_error('Kaynak içeriği boş.');
    }
    
    // HTML içeriğini DOMDocument ile parse ediyoruz
    libxml_use_internal_errors(true);
    $dom = new DOMDocument();
    $dom->loadHTML( mb_convert_encoding($body, 'HTML-ENTITIES', 'UTF-8') );
    libxml_clear_errors();
    
    $paragraphs = $dom->getElementsByTagName('p');
    $content = '';
    foreach ( $paragraphs as $p ) {
        $text = trim( $p->textContent );
        if ( ! empty( $text ) ) {
            $content .= '<p>' . $text . '</p>';
        }
    }
    wp_send_json_success( $content );
}
add_action( 'wp_ajax_devamoku_fetch', 'devamoku_fetch_ajax' );
add_action( 'wp_ajax_nopriv_devamoku_fetch', 'devamoku_fetch_ajax' );
-------------------------------------------------------------------------------------------------------------------------------------------

Kod:Tümünü seç

devamoku.js

Kod:Tümünü seç

jQuery(document).ready(function($) {
    $('.devamoku-button').on('click', function(e) {
        e.preventDefault();

        // Yazı içeriğinde "Kaynak" kelimesi içeren linki esnek bir şekilde bulmaya çalış
        var kaynakLink = $('.entry-content a').filter(function() {
            return $(this).text().toLowerCase().includes("kaynak");
        }).first();

        if (!kaynakLink.length) {
            alert('Kaynak linki bulunamadı!');
            return;
        }

        var sourceUrl = kaynakLink.attr('href');
        if (!sourceUrl) {
            alert('Kaynak linki geçersiz!');
            return;
        }

        // Butonu devre dışı bırak
        var button = $(this);
        button.prop('disabled', true);

        $.ajax({
            type: 'POST',
            url: devamoku_vars.ajax_url,
            data: {
                action: 'devamoku_fetch',
                source_url: sourceUrl
            },
            success: function(response) {
                if (response.success) {
                    var fetchedContent = response.data;
                    var currentContent = $('.entry-content').text();

                    // Geçici bir DOM nesnesi oluştur ve <p> etiketlerini işle
                    var tempDiv = $('<div>').html(fetchedContent);
                    tempDiv.find('p').each(function() {
                        var sentence = $(this).text().trim();
                        if (currentContent.indexOf(sentence) === -1) {
                            $('.entry-content').append('<p>' + sentence + '</p>');
                        }
                    });
                } else {
                    alert('Kaynak içeriği alınamadı: ' + response.data);
                }
                button.prop('disabled', false);
            },
            error: function() {
                alert('Bir hata oluştu.');
                button.prop('disabled', false);
            }
        });
    });
});
-------------------------------------------------------------------------------------------------------------------------------------------


isteğe bağlı

Kod:Tümünü seç

style.css

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
Butonun Çalışması:

[devaminioku] shortcode’u, gönderi içerisinde butonu yerleştirir.
Butona tıklandığında, JavaScript dosyası (.devamoku.js) yazı içeriğinde (örneğin .entry-content altında) “Kaynak” kelimesini içeren ilk linki arar.
Link bulunamazsa kullanıcıya uyarı verir.
AJAX İşlemi:

Bulunan linkin URL’si AJAX ile PHP tarafındaki <code>devamoku_fetch_ajax</code> fonksiyonuna gönderilir.
Bu fonksiyon, URL’den HTML içeriği çeker, DOMDocument kullanarak <code><p></code> etiketleri içerisindeki metinleri ayrıştırır ve döndürür.
Tekrar Eden Cümlelerin Filtrelenmesi:

AJAX’den gelen içerik, geçici bir DOM objesine aktarılır.
Her bir paragrafın metni, mevcut yazının (örneğin .entry-content içindeki) metniyle karşılaştırılır; eğer cümle mevcutsa eklenmez.
Sayfa Yenileme Olmadan İşlem:

Tüm işlem AJAX üzerinden yapılarak sayfa yenileme gerektirmeden içerik dinamik olarak eklenir.
Bu örneği ihtiyaçlarınıza göre genişletebilir, temanızın yapısına göre .entry-content seçicisini değiştirebilir veya ek güvenlik kontrolleri ekleyebilirsiniz.

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 »

Kod:Tümünü seç

emi ajax ile değilde Devamını Oku butonuna tıkladığımızda sayfayı yenileme esnasında yapsın. 
dosya klasör yapısı

Kod:Tümünü seç

wp-content/
 └── plugins/
      └── devamoku/
           ├── devamoku.php
           └── style.css

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 sonuna minimal "Devamını Oku" butonu ekler. Butona tıklandığında sayfa yeniden yüklenir ve yazı içindeki kaynak linkinin içeriğindeki <p> etiketlerindeki metinler, mevcut yazıya eklenir (tekrar eden cümleler eklenmez).
Version: 1.2
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ü ekleme
        add_action( 'admin_menu', array( $this, 'add_admin_menu' ) );
        // Ayarları kaydetmek için
        add_action( 'admin_init', array( $this, 'register_settings' ) );
        // Stil dosyasını ekleme
        add_action( 'wp_enqueue_scripts', array( $this, 'enqueue_assets' ) );
    }
    
    public function register_settings() {
        register_setting( 'devamoku_options_group', $this->option_name );
    }
    
    public function add_admin_menu() {
        add_options_page(
            'Devamını Oku Ayarları',
            'Devamını Oku',
            'manage_options',
            'devamoku-settings',
            array( $this, 'settings_page' )
        );
    }
    
    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
    }
    
    public function enqueue_assets() {
        wp_enqueue_style( 'devamoku-style', plugin_dir_url( __FILE__ ) . 'style.css' );
    }
    
    // [devaminioku] shortcode’u: Butonun URL'sine mevcut URL’ye devamnoku_fetch parametresi eklenir.
    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 pasif ise buton gösterilmez
        if ( $active !== 'yes' ) {
            return '';
        }
        
        // Kullanıcı görünürlük kontrolleri
        if ( $visibility === 'admin' && ! current_user_can( 'administrator' ) ) {
            return '';
        }
        if ( $visibility === 'logged_in' && ! is_user_logged_in() ) {
            return '';
        }
        
        // Mevcut URL’ye devamnoku_fetch=1 parametresini ekleyip butonu oluşturuyoruz.
        $current_url = add_query_arg( 'devamoku_fetch', '1' );
        return '<a href="'.esc_url($current_url).'" class="devamoku-button">Devamını Oku</a>';
    }
}

new DevamokuPlugin();

/*
 * Sayfa yeniden yüklendiğinde GET parametresi varsa,
 * yazının içeriğine, kaynak linkindeki harici içeriği ekleyen fonksiyon.
 */
function devamoku_append_content( $content ) {
    if ( is_singular() && isset($_GET['devamoku_fetch']) && $_GET['devamoku_fetch'] == '1' ) {
        // Yazı içeriğindeki kaynak linkini arıyoruz (örnekte hurriyet.com.tr ile başlayan link)
        libxml_use_internal_errors(true);
        $dom = new DOMDocument();
        $dom->loadHTML('<?xml encoding="utf-8" ?>' . $content);
        libxml_clear_errors();
        
        $sourceUrl = '';
        $links = $dom->getElementsByTagName('a');
        foreach ( $links as $link ) {
            $href = $link->getAttribute('href');
            if ( strpos($href, 'https://www.hurriyet.com.tr/') === 0 ) {
                $sourceUrl = $href;
                break;
            }
        }
        if ( empty($sourceUrl) ) {
            return $content;
        }
        
        // Harici içeriği alıyoruz
        $response = wp_remote_get( $sourceUrl );
        if ( is_wp_error($response) ) {
            return $content;
        }
        $body = wp_remote_retrieve_body( $response );
        if ( empty($body) ) {
            return $content;
        }
        
        // Harici içeriği DOMDocument ile parse edip <p> etiketlerini çekiyoruz
        libxml_use_internal_errors(true);
        $dom2 = new DOMDocument();
        $dom2->loadHTML(mb_convert_encoding($body, 'HTML-ENTITIES', 'UTF-8'));
        libxml_clear_errors();
        
        $paragraphs = $dom2->getElementsByTagName('p');
        $fetchedContent = '';
        foreach ( $paragraphs as $p ) {
            $text = trim($p->textContent);
            if ( ! empty($text) ) {
                // Eğer cümle zaten mevcut içerikte yoksa ekle
                if ( strpos($content, $text) === false ) {
                    $fetchedContent .= '<p>' . $text . '</p>';
                }
            }
        }
        
        // Harici içeriği mevcut içeriğe ekliyoruz
        $content .= $fetchedContent;
    }
    return $content;
}
add_filter('the_content', 'devamoku_append_content');















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 »

devamoku.php

Kod:Tümünü seç

<?php
/*
Plugin Name: Devamını Oku
Plugin URI: http://ornek.com
Description: [devaminioku] shortcode’u ile gönderiye "Devamını Oku" butonu ekler. Butona tıklandığında sayfa yeniden yüklenir, gönderideki https://www.hurriyet.com.tr/ ile başlayan linkin içeriğindeki <p> etiketlerindeki metinler, mevcut içeriğe kalıcı olarak eklenir. Aynı cümleler veya admin tarafından belirlenen iptal satırları tekrar eklenmez.
Version: 1.4
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' ) );
        // Stil dosyasını ekle
        add_action( 'wp_enqueue_scripts', array( $this, 'enqueue_assets' ) );
    }
    
    public function register_settings() {
        register_setting( 'devamoku_options_group', $this->option_name );
    }
    
    public function add_admin_menu() {
        add_options_page(
            'Devamını Oku Ayarları',
            'Devamını Oku',
            'manage_options',
            'devamoku-settings',
            array( $this, 'settings_page' )
        );
    }
    
    public function settings_page() {
        $settings     = get_option( $this->option_name );
        $active       = isset( $settings['active'] ) ? $settings['active'] : 'yes';
        $visibility   = isset( $settings['visibility'] ) ? $settings['visibility'] : 'everyone';
        $ignore_lines = isset( $settings['ignore_lines'] ) ? $settings['ignore_lines'] : '';
        ?>
        <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>
                    <tr valign="top">
                        <th scope="row">İptal Edilecek Satırlar</th>
                        <td>
                            <textarea name="<?php echo $this->option_name; ?>[ignore_lines]" rows="5" cols="50"><?php echo esc_textarea( $ignore_lines ); ?></textarea>
                            <p class="description">Her satıra bir cümle gelecek şekilde yazın. Bu cümleler, harici içerik çekildikten sonra gönderiye eklenirken, eğer çekilen metinle tam olarak eşleşiyorsa eklenmeyecektir.</p>
                        </td>
                    </tr>
                </table>
                <?php submit_button(); ?>
            </form>
        </div>
        <?php
    }
    
    public function enqueue_assets() {
        wp_enqueue_style( 'devamoku-style', plugin_dir_url( __FILE__ ) . 'style.css' );
    }
    
    // [devaminioku] shortcode’u: Mevcut URL’ye ?devamoku_fetch=1 ekleyerek buton oluşturur.
    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 buton gösterilmez.
        if ( $active !== 'yes' ) {
            return '';
        }
        // Görünürlük kontrolleri
        if ( $visibility === 'admin' && ! current_user_can( 'administrator' ) ) {
            return '';
        }
        if ( $visibility === 'logged_in' && ! is_user_logged_in() ) {
            return '';
        }
        
        // Mevcut URL’ye devamnoku_fetch=1 parametresi eklenmiş buton oluşturulur.
        $current_url = add_query_arg( 'devamoku_fetch', '1' );
        return '<a href="' . esc_url( $current_url ) . '" class="devamoku-button">Devamını Oku</a>';
    }
}

new DevamokuPlugin();

/*
 * Sayfa yenileme sırasında, GET parametresi varsa,
 * gönderideki kaynak linkinden çekilen içeriği kalıcı olarak ekler.
 * Bu işlem sırasında, admin tarafından belirlenen "iptal edilecek satırlar" de kontrol edilir.
 */
function devamoku_append_content( $content ) {
    if ( is_singular() && isset($_GET['devamoku_fetch']) && $_GET['devamoku_fetch'] == '1' ) {
        $post_id = get_the_ID();
        $settings = get_option('devamoku_settings');

        // Admin tarafından girilmiş iptal edilecek satırları alalım
        $ignore_lines = array();
        if ( isset($settings['ignore_lines']) && !empty($settings['ignore_lines']) ) {
            $lines = explode("\n", $settings['ignore_lines']);
            foreach ( $lines as $line ) {
                $line = trim($line);
                if ( !empty($line) ) {
                    $ignore_lines[] = $line;
                }
            }
        }

        // Mevcut gönderideki kaynak linkini arıyoruz (https://www.hurriyet.com.tr/ ile başlayan)
        libxml_use_internal_errors(true);
        $dom = new DOMDocument();
        $dom->loadHTML('<?xml encoding="utf-8" ?>' . $content);
        libxml_clear_errors();
        
        $sourceUrl = '';
        $links = $dom->getElementsByTagName('a');
        foreach ( $links as $link ) {
            $href = $link->getAttribute('href');
            if ( strpos($href, 'https://www.hurriyet.com.tr/') === 0 ) {
                $sourceUrl = $href;
                break;
            }
        }
        if ( empty($sourceUrl) ) {
            return $content;
        }
        
        // Harici içeriği çekiyoruz
        $response = wp_remote_get( $sourceUrl );
        if ( is_wp_error($response) ) {
            return $content;
        }
        $body = wp_remote_retrieve_body( $response );
        if ( empty($body) ) {
            return $content;
        }
        
        // Harici içeriği DOMDocument ile parse edip <p> etiketlerindeki metinleri çekiyoruz
        libxml_use_internal_errors(true);
        $dom2 = new DOMDocument();
        $dom2->loadHTML(mb_convert_encoding($body, 'HTML-ENTITIES', 'UTF-8'));
        libxml_clear_errors();
        
        $paragraphs = $dom2->getElementsByTagName('p');
        $newContentToAppend = '';
        foreach ( $paragraphs as $p ) {
            $text = trim($p->textContent);
            if ( ! empty($text) ) {
                // Hem mevcut içerikte yoksa hem de admin tarafından iptal edilecek satırlar arasında değilse ekle
                if ( strpos($content, $text) === false && !in_array($text, $ignore_lines) ) {
                    $newContentToAppend .= '<p>' . $text . '</p>';
                }
            }
        }
        
        // Eğer eklenmesi gereken yeni içerik varsa, gönderiyi güncelliyoruz
        if ( ! empty($newContentToAppend) ) {
            $updated_content = $content . $newContentToAppend;
            
            // Sonsuz döngüye girmemesi için filter'ı geçici olarak kaldırıyoruz
            remove_filter('the_content', 'devamoku_append_content');
            wp_update_post( array(
                'ID'           => $post_id,
                'post_content' => $updated_content
            ) );
            add_filter('the_content', 'devamoku_append_content');
            
            // URL'deki GET parametresini kaldırarak tekrar güncelleme yapılmasını engelliyoruz.
            $redirect_url = remove_query_arg('devamoku_fetch');
            wp_redirect( $redirect_url );
            exit;
        }
    }
    return $content;
}
add_filter('the_content', 'devamoku_append_content');





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 »

son iyi kod

Kod:Tümünü seç

<?php
/*
Plugin Name: Devamını Oku
Plugin URI: http://ornek.com
Description: [devaminioku] shortcode’u ile gönderiye "Devamını Oku" butonu ekler. Butona tıklandığında sayfa yeniden yüklenir, gönderideki https://www.hurriyet.com.tr/ ile başlayan linkin içeriğindeki <p> etiketlerindeki metinler, mevcut içeriğe kalıcı olarak eklenir. Aynı cümleler veya admin tarafından belirlenen iptal satırları eklenmez; ayrıca, ignore listesinde yer alan ifadeler gönderi içeriğinden kaldırılır.
Version: 1.5
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' ) );
        // Stil dosyasını ekle
        add_action( 'wp_enqueue_scripts', array( $this, 'enqueue_assets' ) );
    }
    
    public function register_settings() {
        register_setting( 'devamoku_options_group', $this->option_name );
    }
    
    public function add_admin_menu() {
        add_options_page(
            'Devamını Oku Ayarları',
            'Devamını Oku',
            'manage_options',
            'devamoku-settings',
            array( $this, 'settings_page' )
        );
    }
    
    public function settings_page() {
        $settings     = get_option( $this->option_name );
        $active       = isset( $settings['active'] ) ? $settings['active'] : 'yes';
        $visibility   = isset( $settings['visibility'] ) ? $settings['visibility'] : 'everyone';
        $ignore_lines = isset( $settings['ignore_lines'] ) ? $settings['ignore_lines'] : '';
        ?>
        <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>
                    <tr valign="top">
                        <th scope="row">İptal Edilecek Satırlar</th>
                        <td>
                            <textarea name="<?php echo $this->option_name; ?>[ignore_lines]" rows="5" cols="50"><?php echo esc_textarea( $ignore_lines ); ?></textarea>
                            <p class="description">Her satıra bir cümle gelecek şekilde yazın. Bu cümleler, dışarıdan çekilen içerik eklenirken veya mevcut içerikten kaldırılır.</p>
                        </td>
                    </tr>
                </table>
                <?php submit_button(); ?>
            </form>
        </div>
        <?php
    }
    
    public function enqueue_assets() {
        wp_enqueue_style( 'devamoku-style', plugin_dir_url( __FILE__ ) . 'style.css' );
    }
    
    // [devaminioku] shortcode’u: Mevcut URL’ye ?devamoku_fetch=1 ekleyerek buton oluşturur.
    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 buton gösterilmez.
        if ( $active !== 'yes' ) {
            return '';
        }
        // Görünürlük kontrolleri
        if ( $visibility === 'admin' && ! current_user_can( 'administrator' ) ) {
            return '';
        }
        if ( $visibility === 'logged_in' && ! is_user_logged_in() ) {
            return '';
        }
        
        // Mevcut URL’ye devamnoku_fetch=1 parametresi eklenmiş buton oluşturulur.
        $current_url = add_query_arg( 'devamoku_fetch', '1' );
        return '<a href="' . esc_url( $current_url ) . '" class="devamoku-button">Devamını Oku</a>';
    }
}

new DevamokuPlugin();

/*
 * Sayfa yenileme sırasında, GET parametresi varsa,
 * gönderideki kaynak linkinden çekilen içeriği kalıcı olarak ekler.
 * Bu esnada, admin tarafından belirlenen "İptal Edilecek Satırlar" içerikleri:
 * - Eklenmeden önce ignore listesinde varsa eklemiyoruz.
 * - Ve eğer içerikte zaten varsa, o metinleri kaldırıyoruz.
 */
function devamoku_append_content( $content ) {
    if ( is_singular() && isset($_GET['devamoku_fetch']) && $_GET['devamoku_fetch'] == '1' ) {
        $post_id   = get_the_ID();
        $settings  = get_option('devamoku_settings');

        // Admin tarafından girilmiş iptal edilecek satırları alalım
        $ignore_lines = array();
        if ( isset($settings['ignore_lines']) && !empty($settings['ignore_lines']) ) {
            $lines = explode("\n", $settings['ignore_lines']);
            foreach ( $lines as $line ) {
                $line = trim($line);
                if ( !empty($line) ) {
                    $ignore_lines[] = $line;
                }
            }
        }

        // Mevcut gönderideki kaynak linkini arıyoruz (https://www.hurriyet.com.tr/ ile başlayan)
        libxml_use_internal_errors(true);
        $dom = new DOMDocument();
        $dom->loadHTML('<?xml encoding="utf-8" ?>' . $content);
        libxml_clear_errors();
        
        $sourceUrl = '';
        $links = $dom->getElementsByTagName('a');
        foreach ( $links as $link ) {
            $href = $link->getAttribute('href');
            if ( strpos($href, 'https://www.hurriyet.com.tr/') === 0 ) {
                $sourceUrl = $href;
                break;
            }
        }
        if ( empty($sourceUrl) ) {
            // Eğer ignore satırları varsa, mevcut içerikten de temizleyelim
            if ( !empty($ignore_lines) ) {
                foreach ( $ignore_lines as $line ) {
                    $content = str_replace($line, '', $content);
                }
            }
            return $content;
        }
        
        // Harici içeriği çekiyoruz
        $response = wp_remote_get( $sourceUrl );
        if ( is_wp_error($response) ) {
            return $content;
        }
        $body = wp_remote_retrieve_body( $response );
        if ( empty($body) ) {
            return $content;
        }
        
        // Harici içeriği DOMDocument ile parse edip <p> etiketlerindeki metinleri çekiyoruz
        libxml_use_internal_errors(true);
        $dom2 = new DOMDocument();
        $dom2->loadHTML(mb_convert_encoding($body, 'HTML-ENTITIES', 'UTF-8'));
        libxml_clear_errors();
        
        $paragraphs = $dom2->getElementsByTagName('p');
        $newContentToAppend = '';
        foreach ( $paragraphs as $p ) {
            $text = trim($p->textContent);
            // Shortcode'ları kaldırıyoruz
            $text = strip_shortcodes($text);
            if ( ! empty($text) ) {
                // Eğer ignore listesinde varsa, eklemiyoruz
                if ( in_array($text, $ignore_lines) ) {
                    continue;
                }
                // Eğer mevcut içerikte bu cümle yoksa ekle
                if ( strpos($content, $text) === false ) {
                    $newContentToAppend .= '<p>' . $text . '</p>';
                }
            }
        }
        
        // Eğer eklenmesi gereken yeni içerik varsa, gönderiyi güncelliyoruz
        if ( ! empty($newContentToAppend) ) {
            $updated_content = $content . $newContentToAppend;
            // Mevcut içerikten ignore listesi ifadelerini tamamen kaldırıyoruz
            if ( ! empty($ignore_lines) ) {
                foreach ( $ignore_lines as $line ) {
                    $updated_content = str_replace($line, '', $updated_content);
                }
            }
            
            // Sonsuz döngüye girmemesi için filter'ı geçici olarak kaldırıyoruz
            remove_filter('the_content', 'devamoku_append_content');
            wp_update_post( array(
                'ID'           => $post_id,
                'post_content' => $updated_content
            ) );
            add_filter('the_content', 'devamoku_append_content');
            
            // URL'deki GET parametresini kaldırarak tekrar güncelleme yapılmasını engelliyoruz.
            $redirect_url = remove_query_arg('devamoku_fetch');
            wp_redirect( $redirect_url );
            exit;
        } else {
            // Eğer yeni içerik eklenmemişse, yine mevcut içerikten ignore satırlarını kaldıralım
            if ( ! empty($ignore_lines) ) {
                foreach ( $ignore_lines as $line ) {
                    $content = str_replace($line, '', $content);
                }
            }
        }
    }
    return $content;
}
add_filter('the_content', 'devamoku_append_content');

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 »

SON EN İYİ KOD

Kod:Tümünü seç

<?php
/*
Plugin Name: Devamını Oku
Plugin URI: http://ornek.com
Description: [devaminioku] shortcode’u ile gönderiye "Devamını Oku" butonu ekler. Butona tıklandığında sayfa yeniden yüklenir, gönderideki herhangi bir linkten çekilen içeriğin <p> etiketlerindeki metinler, mevcut içeriğe kalıcı olarak eklenir. Aynı cümleler veya admin tarafından belirlenen iptal satırları eklenmez; ayrıca, ignore listesinde yer alan ifadeler gönderi içeriğinden kaldırılır.
Version: 1.5
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' ) );
        // Stil dosyasını ekle
        add_action( 'wp_enqueue_scripts', array( $this, 'enqueue_assets' ) );
    }
    
    public function register_settings() {
        register_setting( 'devamoku_options_group', $this->option_name );
    }
    
    public function add_admin_menu() {
        add_options_page(
            'Devamını Oku Ayarları',
            'Devamını Oku',
            'manage_options',
            'devamoku-settings',
            array( $this, 'settings_page' )
        );
    }
    
    public function settings_page() {
        $settings     = get_option( $this->option_name );
        $active       = isset( $settings['active'] ) ? $settings['active'] : 'yes';
        $visibility   = isset( $settings['visibility'] ) ? $settings['visibility'] : 'everyone';
        $ignore_lines = isset( $settings['ignore_lines'] ) ? $settings['ignore_lines'] : '';
        ?>
        <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>
                    <tr valign="top">
                        <th scope="row">İptal Edilecek Satırlar</th>
                        <td>
                            <textarea name="<?php echo $this->option_name; ?>[ignore_lines]" rows="5" cols="50"><?php echo esc_textarea( $ignore_lines ); ?></textarea>
                            <p class="description">Her satıra bir cümle gelecek şekilde yazın. Bu cümleler, dışarıdan çekilen içerik eklenirken veya mevcut içerikten kaldırılır.</p>
                        </td>
                    </tr>
                </table>
                <?php submit_button(); ?>
            </form>
        </div>
        <?php
    }
    
    public function enqueue_assets() {
        wp_enqueue_style( 'devamoku-style', plugin_dir_url( __FILE__ ) . 'style.css' );
    }
    
    // [devaminioku] shortcode’u: Mevcut URL’ye ?devamoku_fetch=1 ekleyerek buton oluşturur.
    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 buton gösterilmez.
        if ( $active !== 'yes' ) {
            return '';
        }
        // Görünürlük kontrolleri
        if ( $visibility === 'admin' && ! current_user_can( 'administrator' ) ) {
            return '';
        }
        if ( $visibility === 'logged_in' && ! is_user_logged_in() ) {
            return '';
        }
        
        // Mevcut URL’ye devamoku_fetch=1 parametresi eklenmiş buton oluşturulur.
        $current_url = add_query_arg( 'devamoku_fetch', '1' );
        return '<a href="' . esc_url( $current_url ) . '" class="devamoku-button">Devamını Oku</a>';
    }
}

new DevamokuPlugin();

/*
 * Sayfa yenileme sırasında, GET parametresi varsa,
 * gönderideki kaynak linkinden çekilen içeriği kalıcı olarak ekler.
 * Bu esnada, admin tarafından belirlenen "İptal Edilecek Satırlar" içerikleri:
 * - Eklenmeden önce ignore listesinde varsa eklemiyoruz.
 * - Ve eğer içerikte zaten varsa, o metinleri kaldırıyoruz.
 */
function devamoku_append_content( $content ) {
    if ( is_singular() && isset($_GET['devamoku_fetch']) && $_GET['devamoku_fetch'] == '1' ) {
        $post_id   = get_the_ID();
        $settings  = get_option('devamoku_settings');

        // Admin tarafından girilmiş iptal edilecek satırları alalım
        $ignore_lines = array();
        if ( isset($settings['ignore_lines']) && !empty($settings['ignore_lines']) ) {
            $lines = explode("\n", $settings['ignore_lines']);
            foreach ( $lines as $line ) {
                $line = trim($line);
                if ( !empty($line) ) {
                    $ignore_lines[] = $line;
                }
            }
        }

        // Mevcut gönderideki kaynak linkini arıyoruz (HTTP ile başlayan herhangi bir link)
        libxml_use_internal_errors(true);
        $dom = new DOMDocument();
        $dom->loadHTML('<?xml encoding="utf-8" ?>' . $content);
        libxml_clear_errors();
        
        $sourceUrl = '';
        $links = $dom->getElementsByTagName('a');
        foreach ( $links as $link ) {
            $href = $link->getAttribute('href');
            if ( strpos($href, 'http') === 0 ) {  // Artık herhangi bir "http" ile başlayan link seçiliyor
                $sourceUrl = $href;
                break;
            }
        }
        if ( empty($sourceUrl) ) {
            // Eğer ignore satırları varsa, mevcut içerikten de temizleyelim
            if ( !empty($ignore_lines) ) {
                foreach ( $ignore_lines as $line ) {
                    $content = str_replace($line, '', $content);
                }
            }
            return $content;
        }
        
        // Harici içeriği çekiyoruz
        $response = wp_remote_get( $sourceUrl );
        if ( is_wp_error($response) ) {
            return $content;
        }
        $body = wp_remote_retrieve_body( $response );
        if ( empty($body) ) {
            return $content;
        }
        
        // Harici içeriği DOMDocument ile parse edip <p> etiketlerindeki metinleri çekiyoruz
        libxml_use_internal_errors(true);
        $dom2 = new DOMDocument();
        $dom2->loadHTML(mb_convert_encoding($body, 'HTML-ENTITIES', 'UTF-8'));
        libxml_clear_errors();
        
        $paragraphs = $dom2->getElementsByTagName('p');
        $newContentToAppend = '';
        foreach ( $paragraphs as $p ) {
            $text = trim($p->textContent);
            // Shortcode'ları kaldırıyoruz
            $text = strip_shortcodes($text);
            if ( ! empty($text) ) {
                // Eğer ignore listesinde varsa, eklemiyoruz
                if ( in_array($text, $ignore_lines) ) {
                    continue;
                }
                // Eğer mevcut içerikte bu cümle yoksa ekle
                if ( strpos($content, $text) === false ) {
                    $newContentToAppend .= '<p>' . $text . '</p>';
                }
            }
        }
        
        // Eğer eklenmesi gereken yeni içerik varsa, gönderiyi güncelliyoruz
        if ( ! empty($newContentToAppend) ) {
            $updated_content = $content . $newContentToAppend;
            // Mevcut içerikten ignore listesi ifadelerini tamamen kaldırıyoruz
            if ( ! empty($ignore_lines) ) {
                foreach ( $ignore_lines as $line ) {
                    $updated_content = str_replace($line, '', $updated_content);
                }
            }
            
            // Sonsuz döngüye girmemesi için filter'ı geçici olarak kaldırıyoruz
            remove_filter('the_content', 'devamoku_append_content');
            wp_update_post( array(
                'ID'           => $post_id,
                'post_content' => $updated_content
            ) );
            add_filter('the_content', 'devamoku_append_content');
            
            // URL'deki GET parametresini kaldırarak tekrar güncelleme yapılmasını engelliyoruz.
            $redirect_url = remove_query_arg('devamoku_fetch');
            wp_redirect( $redirect_url );
            exit;
        } else {
            // Eğer yeni içerik eklenmemişse, yine mevcut içerikten ignore satırlarını kaldıralım
            if ( ! empty($ignore_lines) ) {
                foreach ( $ignore_lines as $line ) {
                    $content = str_replace($line, '', $content);
                }
            }
        }
    }
    return $content;
}
add_filter('the_content', 'devamoku_append_content');
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 son mükerrer kayıt içeriği düzenleme

Kod:Tümünü seç

<?php
/*
Plugin Name: Devamını Oku
Plugin URI: http://ornek.com
Description: [devaminioku] shortcode’u ile gönderiye "Devamını Oku" butonu ekler. Butona tıklandığında sayfa yeniden yüklenir, gönderideki herhangi bir linkten çekilen içeriğin <p> etiketlerindeki metinler, mevcut içeriğe kalıcı olarak eklenir. Aynı cümleler veya admin tarafından belirlenen iptal satırları eklenmez; ayrıca, ignore listesinde yer alan ifadeler gönderi içeriğinden kaldırılır.
Version: 1.6
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() {
        add_shortcode('devaminioku', array($this, 'shortcode_handler'));
        add_action('admin_menu', array($this, 'add_admin_menu'));
        add_action('admin_init', array($this, 'register_settings'));
        add_action('wp_enqueue_scripts', array($this, 'enqueue_assets'));
    }
    
    public function register_settings() {
        register_setting('devamoku_options_group', $this->option_name);
    }
    
    public function add_admin_menu() {
        add_options_page(
            'Devamını Oku Ayarları',
            'Devamını Oku',
            'manage_options',
            'devamoku-settings',
            array($this, 'settings_page')
        );
    }
    
    public function settings_page() {
        $settings = get_option($this->option_name);
        $active = isset($settings['active']) ? $settings['active'] : 'yes';
        $visibility = isset($settings['visibility']) ? $settings['visibility'] : 'everyone';
        $ignore_lines = isset($settings['ignore_lines']) ? $settings['ignore_lines'] : '';
        ?>
        <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>
                    <tr valign="top">
                        <th scope="row">İptal Edilecek Satırlar</th>
                        <td>
                            <textarea name="<?php echo $this->option_name; ?>[ignore_lines]" rows="5" cols="50"><?php echo esc_textarea($ignore_lines); ?></textarea>
                            <p class="description">Her satıra bir cümle gelecek şekilde yazın. Bu cümleler, dışarıdan çekilen içerik eklenirken veya mevcut içerikten kaldırılır.</p>
                        </td>
                    </tr>
                </table>
                <?php submit_button(); ?>
            </form>
        </div>
        <?php
    }
    
    public function enqueue_assets() {
        wp_enqueue_style('devamoku-style', plugin_dir_url(__FILE__) . 'style.css');
    }
    
    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';
        
        if ($active !== 'yes') return '';
        if ($visibility === 'admin' && !current_user_can('administrator')) return '';
        if ($visibility === 'logged_in' && !is_user_logged_in()) return '';
        
        $current_url = add_query_arg('devamoku_fetch', '1');
        return '<a href="' . esc_url($current_url) . '" class="devamoku-button">Devamını Oku</a>';
    }
}

new DevamokuPlugin();

function normalize_text($text) {
    $text = mb_strtolower(trim($text), 'UTF-8');
    $text = preg_replace('/[^\p{L}\p{N}\s]/u', '', $text);
    $text = preg_replace('/\s+/', ' ', $text);
    return $text;
}

function split_sentences($text) {
    $sentences = preg_split('/(?<=[.!?])\s+/', $text, -1, PREG_SPLIT_NO_EMPTY);
    return array_map('trim', $sentences);
}

function devamoku_append_content($content) {
    if (is_singular() && isset($_GET['devamoku_fetch']) && $_GET['devamoku_fetch'] == '1') {
        $post_id = get_the_ID();
        $settings = get_option('devamoku_settings');
        $ignore_lines = array();

        if (isset($settings['ignore_lines']) && !empty($settings['ignore_lines'])) {
            $lines = explode("\n", $settings['ignore_lines']);
            foreach ($lines as $line) {
                $line = trim($line);
                if (!empty($line)) $ignore_lines[] = $line;
            }
        }

        libxml_use_internal_errors(true);
        $dom = new DOMDocument();
        $dom->loadHTML('<?xml encoding="utf-8" ?>' . $content);
        libxml_clear_errors();
        
        $sourceUrl = '';
        $links = $dom->getElementsByTagName('a');
        foreach ($links as $link) {
            $href = $link->getAttribute('href');
            if (strpos($href, 'http') === 0) {
                $sourceUrl = $href;
                break;
            }
        }
        
        if (empty($sourceUrl)) {
            if (!empty($ignore_lines)) {
                foreach ($ignore_lines as $line) {
                    $content = str_replace($line, '', $content);
                }
            }
            return $content;
        }

        // Mevcut içerik analizi
        $existing_paragraphs = $dom->getElementsByTagName('p');
        $existing_paragraph_texts = array();
        $existing_sentences = array();
        
        foreach ($existing_paragraphs as $p) {
            $p_text = trim(strip_shortcodes($p->textContent));
            $p_text_normalized = normalize_text($p_text);
            $existing_paragraph_texts[] = $p_text_normalized;
            
            $sentences = split_sentences($p_text);
            foreach ($sentences as $sentence) {
                $sentence_normalized = normalize_text(trim($sentence));
                if (!in_array($sentence_normalized, $existing_sentences)) {
                    $existing_sentences[] = $sentence_normalized;
                }
            }
        }

        // Harici içerik çekme
        $response = wp_remote_get($sourceUrl);
        if (is_wp_error($response)) return $content;
        
        $body = wp_remote_retrieve_body($response);
        if (empty($body)) return $content;
        
        libxml_use_internal_errors(true);
        $dom2 = new DOMDocument();
        $dom2->loadHTML(mb_convert_encoding($body, 'HTML-ENTITIES', 'UTF-8'));
        libxml_clear_errors();
        
        $paragraphs = $dom2->getElementsByTagName('p');
        $newContentToAppend = '';
        
        foreach ($paragraphs as $p) {
            $text = trim(strip_shortcodes($p->textContent));
            if (empty($text)) continue;
            
            if (in_array($text, $ignore_lines)) continue;
            
            $text_normalized = normalize_text($text);
            if (in_array($text_normalized, $existing_paragraph_texts)) continue;
            
            $sentences = split_sentences($text);
            $has_duplicate = false;
            
            foreach ($sentences as $sentence) {
                $sentence_normalized = normalize_text(trim($sentence));
                if (in_array($sentence_normalized, $existing_sentences)) {
                    $has_duplicate = true;
                    break;
                }
            }
            
            if (!$has_duplicate) {
                $newContentToAppend .= '<p>' . $text . '</p>';
                $existing_paragraph_texts[] = $text_normalized;
                foreach ($sentences as $sentence) {
                    $sentence_normalized = normalize_text(trim($sentence));
                    if (!in_array($sentence_normalized, $existing_sentences)) {
                        $existing_sentences[] = $sentence_normalized;
                    }
                }
            }
        }

        if (!empty($newContentToAppend)) {
            $updated_content = $content . $newContentToAppend;
            if (!empty($ignore_lines)) {
                foreach ($ignore_lines as $line) {
                    $updated_content = str_replace($line, '', $updated_content);
                }
            }
            
            remove_filter('the_content', 'devamoku_append_content');
            wp_update_post(array(
                'ID' => $post_id,
                'post_content' => $updated_content
            ));
            add_filter('the_content', 'devamoku_append_content');
            
            $redirect_url = remove_query_arg('devamoku_fetch');
            wp_redirect($redirect_url);
            exit;
        } else {
            if (!empty($ignore_lines)) {
                foreach ($ignore_lines as $line) {
                    $content = str_replace($line, '', $content);
                }
            }
        }
    }
    return $content;
}
add_filter('the_content', 'devamoku_append_content');
Cevapla