aynı yada benzeyen yazıları süzme
Gönderilme zamanı: Sal Şub 18, 2025 5:13 pm
wordpress Murat klasörü içine bir uygulama yapalım yine Murat etiketi altında açılsın bu uygulama ile birbirine birbirine benzeyen yazıları süzelim. burada kullanıcı ince ayarı ile birbirine benzeyen yazılar tablo halinde sıralansın başlık kısmı ve bir miktar içerik yazısıda tabloda görünsün. düzenlemek için yeni sekme linki ve silmek için yol olsun.50 saniye hakkında Akıl yürütüldü
Aşağıdaki örnek, WordPress içinde "Murat" adında bir admin menü öğesi altında açılacak, ayarlanabilir benzerlik eşiğine göre yazılar arasında benzerlik tespit edip, sonuçları tablo halinde listeleyen (başlık, içerik özet, düzenleme (yeni sekmede) ve silme bağlantıları bulunan) basit bir uygulamadır.
Not: Bu örnekte tüm yazılar üzerinden çift döngüyle benzerlik hesaplanmaktadır. Yazı sayınız çok fazla ise performans sorunları yaşayabilirsiniz. (Daha gelişmiş bir uygulamada veritabanı düzeyinde veya önbellekleme yöntemleriyle optimizasyon yapılabilir.)
Aşağıdaki kodu wp-content/plugins/Murat/şeklinde oluşturup, eklentiyi aktif edebilirsiniz:Kod:Tümünü seç
murat-similar-posts.phpKod:Tümünü seç
<?php /* Plugin Name: Murat Benzer Yazılar Süzelgesi Description: Yazılar arasında benzerlik tespit edip, benzer yazıları tablo halinde listeler. Her satırda yazı başlığı, içerik özetinin yanında; düzenleme (yeni sekmede) ve silme bağlantıları yer alır. Version: 1.0 Author: Murat License: GPL2 */ if ( ! defined( 'ABSPATH' ) ) { exit; } class Murat_Similar_Posts { // Benzerlik eşiği ayarını saklamak için kullanılacak seçenek adı (varsayılan %50) private $option_name = 'murat_similar_threshold'; public function __construct() { add_action( 'admin_menu', array( $this, 'add_admin_menu' ) ); add_action( 'admin_init', array( $this, 'handle_actions' ) ); } /** * "Murat" etiketi altında admin menü sayfasını ekler. */ public function add_admin_menu() { add_menu_page( 'Murat', // Sayfa başlığı 'Murat', // Menü başlığı 'manage_options', 'murat-similar-posts', array( $this, 'admin_page' ), 'dashicons-admin-post', 25 ); } /** * Ayar güncelleme ve silme işlemlerini yönetir. */ public function handle_actions() { // Ayar formu gönderilmişse: Benzerlik eşiğini güncelle if ( isset( $_POST['murat_similar_threshold_nonce'] ) && wp_verify_nonce( $_POST['murat_similar_threshold_nonce'], 'update_threshold' ) ) { $threshold = isset( $_POST['murat_similar_threshold'] ) ? intval( $_POST['murat_similar_threshold'] ) : 50; update_option( $this->option_name, $threshold ); add_settings_error( 'murat_similar_messages', 'murat_similar_message', 'Ayarlar güncellendi.', 'updated' ); } // GET üzerinden silme işlemi: ?action=delete_post&post_id=XX&murat_nonce=... if ( isset( $_GET['action'] ) && $_GET['action'] == 'delete_post' && isset( $_GET['post_id'] ) && isset( $_GET['murat_nonce'] ) ) { $post_id = intval( $_GET['post_id'] ); if ( wp_verify_nonce( $_GET['murat_nonce'], 'delete_post_' . $post_id ) ) { wp_delete_post( $post_id, true ); wp_redirect( admin_url( 'admin.php?page=murat-similar-posts' ) ); exit; } } } /** * Yönetici sayfasını oluşturur. */ public function admin_page() { // Ayar mesajlarını göster settings_errors( 'murat_similar_messages' ); // Mevcut benzerlik eşiğini al (varsayılan %50) $threshold = get_option( $this->option_name, 50 ); ?> <div class="wrap"> <h1>Murat Benzer Yazılar Süzelgesi</h1> <!-- Ayar formu: Benzerlik eşiği ayarı --> <form method="post" action=""> <?php wp_nonce_field( 'update_threshold', 'murat_similar_threshold_nonce' ); ?> <table class="form-table"> <tr> <th scope="row">Benzerlik Eşiği (%)</th> <td> <input type="number" name="murat_similar_threshold" value="<?php echo esc_attr( $threshold ); ?>" min="0" max="100" /> <p class="description">0 ile 100 arasında bir değer girin. Örneğin, 70: %70 ve üzeri benzerlik tespit edilir.</p> </td> </tr> </table> <?php submit_button( 'Ayarları Kaydet' ); ?> </form> <hr> <h2>Benzer Yazılar</h2> <?php // Yayınlanmış tüm yazıları alıyoruz. $posts = get_posts( array( 'numberposts' => -1, 'post_status' => 'publish', 'post_type' => 'post' ) ); if ( empty( $posts ) ) { echo "<p>Hiç yazı bulunamadı.</p>"; return; } // Yazılar arasında çift döngüyle benzerlik hesaplıyoruz. $similar_pairs = array(); $post_count = count( $posts ); for ( $i = 0; $i < $post_count; $i++ ) { for ( $j = $i + 1; $j < $post_count; $j++ ) { $sim = $this->compute_similarity( $posts[$i], $posts[$j] ); if ( $sim >= $threshold ) { $similar_pairs[] = array( 'post1' => $posts[$i], 'post2' => $posts[$j], 'similarity' => $sim, ); } } } if ( empty( $similar_pairs ) ) { echo "<p>Benzer yazı bulunamadı.</p>"; } else { ?> <table class="widefat fixed striped"> <thead> <tr> <th>Yazı 1</th> <th>Yazı 2</th> <th>Benzerlik (%)</th> <th>İşlemler</th> </tr> </thead> <tbody> <?php foreach ( $similar_pairs as $pair ) : ?> <tr> <td> <strong><?php echo esc_html( $pair['post1']->post_title ); ?></strong><br> <?php echo esc_html( wp_trim_words( $pair['post1']->post_content, 20, '...' ) ); ?> </td> <td> <strong><?php echo esc_html( $pair['post2']->post_title ); ?></strong><br> <?php echo esc_html( wp_trim_words( $pair['post2']->post_content, 20, '...' ) ); ?> </td> <td><?php echo round( $pair['similarity'], 2 ); ?>%</td> <td> <a href="<?php echo esc_url( get_edit_post_link( $pair['post1']->ID ) ); ?>" target="_blank">Düzenle 1</a> | <a href="<?php echo esc_url( get_edit_post_link( $pair['post2']->ID ) ); ?>" target="_blank">Düzenle 2</a><br> <a href="<?php echo esc_url( $this->get_delete_link( $pair['post1']->ID ) ); ?>" onclick="return confirm('Bu yazıyı silmek istediğinize emin misiniz?');">Sil 1</a> | <a href="<?php echo esc_url( $this->get_delete_link( $pair['post2']->ID ) ); ?>" onclick="return confirm('Bu yazıyı silmek istediğinize emin misiniz?');">Sil 2</a> </td> </tr> <?php endforeach; ?> </tbody> </table> <?php } ?> </div> <?php } /** * İki yazı arasında benzerlik oranını hesaplar. * * Bu örnekte, yazı başlıkları ve içeriklerinin benzerliğini %70-%30 oranında ağırlıklandırarak * ortalama benzerlik yüzdesini döndürür. * * @param WP_Post $post1 * @param WP_Post $post2 * @return float Benzerlik yüzdesi. */ private function compute_similarity( $post1, $post2 ) { // Başlık benzerliği hesaplanıyor. similar_text( $post1->post_title, $post2->post_title, $title_sim ); // İçerik benzerliğini, HTML etiketlerini kaldırarak hesaplıyoruz. $content1 = wp_strip_all_tags( $post1->post_content ); $content2 = wp_strip_all_tags( $post2->post_content ); similar_text( $content1, $content2, $content_sim ); // Ağırlıklandırma: başlık %70, içerik %30 $similarity = ( 0.7 * $title_sim ) + ( 0.3 * $content_sim ); return $similarity; } /** * Belirtilen yazı ID'si için silme bağlantısı üretir (nonce ile korunur). * * @param int $post_id * @return string URL */ private function get_delete_link( $post_id ) { $nonce = wp_create_nonce( 'delete_post_' . $post_id ); $url = add_query_arg( array( 'page' => 'murat-similar-posts', 'action' => 'delete_post', 'post_id' => $post_id, 'murat_nonce'=> $nonce, ), admin_url( 'admin.php' ) ); return $url; } } new Murat_Similar_Posts();Nasıl Çalışır?
Admin Menü ve Ayarlar:
Eklenti, WordPress admin menüsünde "Murat" başlığı altında sayfa açar.
Üst kısımda, kullanıcı benzerlik eşiğini (0-100 arasında) ayarlayabilir. Ayar gönderildiğinde murat_similar_threshold seçeneği güncellenir.
Benzer Yazı Tespiti:
Yayınlanmış tüm yazılar alınır ve çift döngüyle her iki yazı arasındaki benzerlik, başlık ve içerik (HTML etiketleri temizlenmiş) üzerinden hesaplanır.
Ağırlıklandırmada başlığa %70, içeriğe %30 verilir. Eğer hesaplanan ortalama benzerlik, kullanıcı tarafından belirlenen eşik değerine eşit veya büyükse, bu yazı çifti listeye eklenir.
Tablo Görünümü:
Ekranda her satırda iki yazının başlıkları, içerik özetleri ve benzerlik yüzdesi gösterilir.
Her yazı için "Düzenle" bağlantısı (yeni sekmede açılır) ve "Sil" bağlantısı (nonce korumalı) yer alır.
Bu örnek, benzer yazıları tespit etme ve yönetim işlemleri için temel bir yapı sunar. İhtiyacınıza göre algoritmayı, ağırlıkları veya arayüzü daha da özelleştirebilirsiniz.