2. sayfa (Toplam 2 sayfa)

Re: aynı içerikleri temizleme wordpress eklentisi

Gönderilme zamanı: Sal Şub 18, 2025 2:33 pm
gönderen muratca61
son olarak şu şekilde güncelleyelim gösterim sayısı en düşük olan yani sıfırdan başlayarak öncelik versin
11 saniye hakkında Akıl yürütüldü
Aşağıdaki örnekte, haber sorgusunu oluştururken 'order' => 'ASC' kullanarak gösterim sayısı (post_views_count) en düşük olanların (örneğin, sıfırdan başlayanların) listede ilk sırada yer almasını sağlıyoruz.

Aşağıda güncellenmiş dosya içeriklerini bulabilirsiniz:

Kod:Tümünü seç

haber-eslestirici.php

Kod:Tümünü seç

<?php
/*
Plugin Name: Haber Eşleştirici
Description: Admin panelinden yönetilebilen, ilgili yazıyla alakalı haber listesini gösteren eklenti.
Version: 2.0
Author: Sizin Adınız
*/

// Admin ayarlarını yüklüyoruz
require_once plugin_dir_path(__FILE__) . 'admin-settings.php';

// Kısa kod ve frontend fonksiyonları
function haber_eslestirici_listele() {
    $options = get_option('haber_eslestirici_settings');

    // Eklenti pasif ise mesaj göster
    if ( empty($options['aktif']) || !$options['aktif'] ) {
        return '<p>Haber listesi şu anda pasif durumda.</p>';
    }

    // İlişkilendirme tipi seçeneğine göre sorgu ayarlanacak:
    // "ilgili" seçildiyse, mevcut yazının kategorileri/etiketleri esas alınır.
    // "manuel" seçildiyse, admin tarafından girilen kategori/etiket ID'leri kullanılır.
    $relationship_type = isset($options['iliskilendirme_tipi']) ? $options['iliskilendirme_tipi'] : 'manuel';

    // Varsayılan sorgu argümanları; burada 'order' => 'ASC' ile
    // gösterim sayısı (post_views_count) en düşükten başlayarak sıralanır.
    $args = array(
        'post_type'      => 'post',
        'posts_per_page' => $options['haber_sayisi'] ?? 3,
        'meta_key'       => 'post_views_count',
        'orderby'        => 'meta_value_num',
        'order'          => 'ASC', // En düşük gösterim sayısına sahip yazılar önce gelir
    );

    if ($relationship_type == 'ilgili' && is_singular('post')) {
        global $post;
        // Mevcut yazının kategori ve etiketlerini al
        $current_categories = wp_get_post_categories($post->ID);
        $current_tags       = wp_get_post_tags($post->ID, array('fields' => 'ids'));

        // Eğer her iki terim seti boş ise, manuel alana geçebiliriz
        if ( empty($current_categories) && empty($current_tags) ) {
            // Manuel modda admin ayarlarında girilen terimler kullanılacak
            if (!empty($options['kategoriler'])) {
                $args['category__in'] = $options['kategoriler'];
            }
            if (!empty($options['etiketler'])) {
                $args['tag__in'] = $options['etiketler'];
            }
        } else {
            // İlişkili yazılarda, mevcut yazıya ait terimler üzerinden sorgu oluştur
            $tax_query = array('relation' => 'OR');
            if (!empty($current_categories)) {
                $tax_query[] = array(
                    'taxonomy' => 'category',
                    'field'    => 'term_id',
                    'terms'    => $current_categories,
                );
            }
            if (!empty($current_tags)) {
                $tax_query[] = array(
                    'taxonomy' => 'post_tag',
                    'field'    => 'term_id',
                    'terms'    => $current_tags,
                );
            }
            $args['tax_query']    = $tax_query;
            $args['post__not_in'] = array($post->ID); // Mevcut yazıyı hariç tut
        }
    } else {
        // Manuel ilişkilendirme modunda: admin tarafından girilen kategori/etiket ID'leri kullanılıyor.
        if (!empty($options['kategoriler'])) {
            $args['category__in'] = $options['kategoriler'];
        }
        if (!empty($options['etiketler'])) {
            $args['tag__in'] = $options['etiketler'];
        }
    }

    $query = new WP_Query($args);
    $output = '<div class="haber-listesi">';

    if ($query->have_posts()) {
        while ($query->have_posts()) {
            $query->the_post();
            $thumbnail = get_the_post_thumbnail_url(get_the_ID(), 'medium');
            $output .= '<div class="haber-item">';
            if ($thumbnail) {
                $output .= '<a href="' . get_permalink() . '"><img src="' . $thumbnail . '" alt="' . get_the_title() . '"></a>';
            }
            $output .= '<h3><a href="' . get_permalink() . '">' . get_the_title() . '</a></h3>';
            $output .= '</div>';
        }
    } else {
        $output .= '<p>Gösterilecek haber bulunamadı.</p>';
    }
    
    $output .= '</div>';
    wp_reset_postdata();
    return $output;
}
add_shortcode('haber_eslestirici', 'haber_eslestirici_listele');

// CSS dosyalarını yükle
function haber_eslestirici_assets() {
    wp_enqueue_style('haber-eslestirici-css', plugins_url('haber-eslestirici.css', __FILE__));
}
add_action('wp_enqueue_scripts', 'haber_eslestirici_assets');

Kod:Tümünü seç

admin-settings.php

Kod:Tümünü seç

<?php
// Admin ayar sayfasını oluştur
function haber_eslestirici_admin_menu() {
    add_options_page(
        'Haber Eşleştirici Ayarları',
        'Haber Eşleştirici',
        'manage_options',
        'haber-eslestirici',
        'haber_eslestirici_settings_page'
    );
}
add_action('admin_menu', 'haber_eslestirici_admin_menu');

// Ayarları kaydet
function haber_eslestirici_register_settings() {
    register_setting(
        'haber_eslestirici_settings_group',
        'haber_eslestirici_settings',
        'haber_eslestirici_sanitize_settings'
    );

    add_settings_section(
        'haber_eslestirici_main_section',
        'Temel Ayarlar',
        null,
        'haber-eslestirici'
    );

    // Aktif/Pasif Alanı
    add_settings_field(
        'aktif',
        'Aktif/Pasif',
        'haber_eslestirici_aktif_callback',
        'haber-eslestirici',
        'haber_eslestirici_main_section'
    );

    // Haber Sayısı Alanı
    add_settings_field(
        'haber_sayisi',
        'Gösterilecek Haber Sayısı',
        'haber_eslestirici_sayi_callback',
        'haber-eslestirici',
        'haber_eslestirici_main_section'
    );

    // İlişkilendirme Tipi Alanı
    add_settings_field(
        'iliskilendirme_tipi',
        'İlişkilendirme Tipi',
        'haber_eslestirici_iliskilendirme_tipi_callback',
        'haber-eslestirici',
        'haber_eslestirici_main_section'
    );

    // Kategori Seçimi (Textbox: Virgülle ayrılmış kategori ID'leri)
    add_settings_field(
        'kategoriler',
        'Kategoriler',
        'haber_eslestirici_kategoriler_callback',
        'haber-eslestirici',
        'haber_eslestirici_main_section'
    );

    // Etiket Seçimi (Textbox: Virgülle ayrılmış etiket ID'leri)
    add_settings_field(
        'etiketler',
        'Etiketler',
        'haber_eslestirici_etiketler_callback',
        'haber-eslestirici',
        'haber_eslestirici_main_section'
    );
}
add_action('admin_init', 'haber_eslestirici_register_settings');

// Aktif/Pasif input alanı
function haber_eslestirici_aktif_callback() {
    $options = get_option('haber_eslestirici_settings');
    echo '<input type="checkbox" name="haber_eslestirici_settings[aktif]" value="1" ' . checked(1, $options['aktif'] ?? 0, false) . '> Aktif';
}

// Haber sayısı input alanı
function haber_eslestirici_sayi_callback() {
    $options = get_option('haber_eslestirici_settings');
    echo '<input type="number" min="1" max="10" name="haber_eslestirici_settings[haber_sayisi]" value="' . ($options['haber_sayisi'] ?? 3) . '">';
}

// İlişkilendirme Tipi input alanı (Radio: Manuel veya İlgili Yazının Kategorileri/Etiketleri)
function haber_eslestirici_iliskilendirme_tipi_callback() {
    $options  = get_option('haber_eslestirici_settings');
    $selected = isset($options['iliskilendirme_tipi']) ? $options['iliskilendirme_tipi'] : 'manuel';
    echo '<label><input type="radio" name="haber_eslestirici_settings[iliskilendirme_tipi]" value="manuel" ' . checked($selected, 'manuel', false) . '> Manuel (Admin tarafından belirlenen kategoriler/etiketler)</label><br>';
    echo '<label><input type="radio" name="haber_eslestirici_settings[iliskilendirme_tipi]" value="ilgili" ' . checked($selected, 'ilgili', false) . '> İlgili Yazının Kategorileri/Etiketleri</label>';
}

// Kategori input alanı (Virgülle ayrılmış kategori ID'leri)
function haber_eslestirici_kategoriler_callback() {
    $options = get_option('haber_eslestirici_settings');
    $value   = '';
    if (isset($options['kategoriler']) && is_array($options['kategoriler'])) {
        $value = implode(',', $options['kategoriler']);
    }
    echo '<input type="text" name="haber_eslestirici_settings[kategoriler]" value="' . esc_attr($value) . '">';
    echo '<p>Kategori ID\'lerini virgülle ayrılmış olarak giriniz. Örnek: 1,2,3</p>';
}

// Etiket input alanı (Virgülle ayrılmış etiket ID'leri)
function haber_eslestirici_etiketler_callback() {
    $options = get_option('haber_eslestirici_settings');
    $value   = '';
    if (isset($options['etiketler']) && is_array($options['etiketler'])) {
        $value = implode(',', $options['etiketler']);
    }
    echo '<input type="text" name="haber_eslestirici_settings[etiketler]" value="' . esc_attr($value) . '">';
    echo '<p>Etiket ID\'lerini virgülle ayrılmış olarak giriniz. Örnek: 4,5,6</p>';
}

// Ayarlar Sayfası
function haber_eslestirici_settings_page() {
    ?>
    <div class="wrap">
        <h1>Haber Eşleştirici Ayarları</h1>
        <form method="post" action="options.php">
            <?php
            settings_fields('haber_eslestirici_settings_group');
            do_settings_sections('haber-eslestirici');
            submit_button();
            ?>
        </form>
    </div>
    <?php
}

// Veri Temizleme (sanitize) işlemi: metin alanındaki virgülle ayrılmış değerleri diziye çeviriyoruz
function haber_eslestirici_sanitize_settings($input) {
    $input['haber_sayisi'] = absint($input['haber_sayisi']);
    $input['aktif']       = isset($input['aktif']) ? 1 : 0;

    // İlişkilendirme tipi
    $allowed_types = array('manuel', 'ilgili');
    $input['iliskilendirme_tipi'] = in_array($input['iliskilendirme_tipi'] ?? 'manuel', $allowed_types) ? $input['iliskilendirme_tipi'] : 'manuel';

    // Kategoriler için: girilen stringi virgülle böl, trim yap, boş değerleri filtrele ve absint uygula.
    if ( isset($input['kategoriler']) ) {
        $input['kategoriler'] = array_map('absint', array_filter(array_map('trim', explode(',', $input['kategoriler'])), 'strlen'));
    } else {
        $input['kategoriler'] = array();
    }

    // Etiketler için: girilen stringi virgülle böl, trim yap, boş değerleri filtrele ve absint uygula.
    if ( isset($input['etiketler']) ) {
        $input['etiketler'] = array_map('absint', array_filter(array_map('trim', explode(',', $input['etiketler'])), 'strlen'));
    } else {
        $input['etiketler'] = array();
    }
    
    return $input;
}
?>