1. sayfa (Toplam 2 sayfa)

yeni yazı kontrol etme wordpress

Gönderilme zamanı: Çrş Şub 19, 2025 7:35 am
gönderen muratca61
kendi yazı kontrol arayüzü çalışmıyor. copilota sorduk
Tabii ki, WordPress için bir eklenti dosyası hazırlayabiliriz. Bu şekilde, kodu ayrı bir eklenti olarak yükleyip yönetebilirsiniz. İşte bu eklentiyi oluşturmak için adım adım yapmanız gerekenler:

Eklenti Klasörü ve Dosyaları Oluşturma:

wp-content/plugins/ dizininde yeni bir klasör oluşturun ve bu klasöre

Kod:Tümünü seç

custom-post-manager
adını verin.

Bu klasörün içinde custom-post-manager.php adında bir dosya oluşturun.

Eklenti Ana Dosyasına Kod Ekleyin:

Kod:Tümünü seç

custom-post-manager.php
dosyasına aşağıdaki kodları ekleyin:

Kod:Tümünü seç

<?php
/*
Plugin Name: Custom Post Manager
Description: WordPress yönetici panelinde yazıları listeleme, düzenleme ve silme işlemleri yapabileceğiniz bir eklenti.
Version: 1.0
Author: [İsminiz]
*/

// Yönetici menüsüne yeni öğe ekleme
function custom_post_admin_menu() {
    add_menu_page(
        'Yazılar Yönetimi', 
        'Yazılar Yönetimi', 
        'manage_options', 
        'custom-post-admin', 
        'custom_post_admin_page', 
        'dashicons-admin-post', 
        6
    );
}
add_action('admin_menu', 'custom_post_admin_menu');

function custom_post_admin_page() {
    ?>
    <div class="wrap">
        <h1>Yazılar Yönetimi</h1>
        <?php custom_post_list_table(); ?>
    </div>
    <?php
}

// Yazıların listelendiği tablo
function custom_post_list_table() {
    global $wpdb;

    $posts_per_page = 10;
    $paged = isset($_GET['paged']) ? intval($_GET['paged']) : 1;
    $offset = ($paged - 1) * $posts_per_page;

    $total_posts = $wpdb->get_var("SELECT COUNT(*) FROM {$wpdb->posts} WHERE post_type = 'post'");
    $posts = $wpdb->get_results($wpdb->prepare("SELECT * FROM {$wpdb->posts} WHERE post_type = 'post' ORDER BY post_date DESC LIMIT %d OFFSET %d", $posts_per_page, $offset));

    echo '<table class="wp-list-table widefat fixed striped">';
    echo '<thead><tr><th>Başlık</th><th>Durum</th><th>Tarih</th><th>İşlemler</th></tr></thead>';
    echo '<tbody>';
    foreach ($posts as $post) {
        echo '<tr>';
        echo '<td>' . esc_html($post->post_title) . '</td>';
        echo '<td>' . esc_html($post->post_status) . '</td>';
        echo '<td>' . esc_html($post->post_date) . '</td>';
        echo '<td>';
        echo '<a href="' . get_edit_post_link($post->ID) . '">Düzenle</a> | ';
        echo '<a href="' . get_delete_post_link($post->ID) . '" onclick="return confirm(\'Bu yazıyı silmek istediğinize emin misiniz?\')">Sil</a>';
        echo '</td>';
        echo '</tr>';
    }
    echo '</tbody>';
    echo '</table>';

    // Sayfalama
    $total_pages = ceil($total_posts / $posts_per_page);
    $current_page = max(1, get_query_var('paged'));

    echo '<div class="tablenav"><div class="tablenav-pages">';
    echo paginate_links(array(
        'base' => add_query_arg('paged', '%#%'),
        'format' => '',
        'current' => $paged,
        'total' => $total_pages,
    ));
    echo '</div></div>';
}
Stil Dosyasını Ekleme (isteğe bağlı):

Eğer özel stil eklemek isterseniz, custom-post-manager klasörüne

Kod:Tümünü seç

style.css
dosyası oluşturun ve aşağıdaki kodları ekleyin:

Kod:Tümünü seç

/* Admin paneldeki tablo stilini düzenleme */
.wp-list-table {
    width: 100%;
    margin-top: 20px;
    border-collapse: collapse;
}

.wp-list-table th, .wp-list-table td {
    padding: 10px;
    border: 1px solid #ccc;
    text-align: left;
}

.wp-list-table th {
    background-color: #f1f1f1;
}

.tablenav-pages {
    margin-top: 20px;
    text-align: center;
}
Eklentiyi Aktif Etme:

WordPress yönetici paneline gidin ve Eklentiler menüsünden Custom Post Manager eklentisini bulun ve etkinleştirin.

Bu adımları izleyerek, WordPress yönetici panelinizde yazılarınızı görüntüleyebileceğiniz, düzenleyebileceğiniz ve silebileceğiniz bir eklenti oluşturabilirsiniz. Daha fazla yardıma ihtiyacınız olursa bana bildirin!

Re: yeni yazı kontrol etme wordpress

Gönderilme zamanı: Çrş Şub 19, 2025 7:45 am
gönderen muratca61
her satıra seçim ayrıca toplu seçim yapılsın. aktifler taslaklar çöptekiler ayrı ayrı gösterim için seçenek koyalım
Tabii ki! Yazıların listelendiği tabloda her satıra seçim kutusu ekleyebiliriz ve toplu seçim yapabilmek için bir ana seçim kutusu ekleyebiliriz. Ayrıca, aktif, taslak ve çöptekiler için ayrı gösterim seçenekleri ekleyebiliriz.

Bu işlemler için custom-post-manager.php dosyasını güncelleyelim:

Kod:Tümünü seç

custom-post-manager.php
:

Kod:Tümünü seç

<?php
/*
Plugin Name: Custom Post Manager
Description: WordPress yönetici panelinde yazıları listeleme, düzenleme ve silme işlemleri yapabileceğiniz bir eklenti.
Version: 1.0
Author: [İsminiz]
*/

// Yönetici menüsüne yeni öğe ekleme
function custom_post_admin_menu() {
    add_menu_page(
        'Yazılar Yönetimi', 
        'Yazılar Yönetimi', 
        'manage_options', 
        'custom-post-admin', 
        'custom_post_admin_page', 
        'dashicons-admin-post', 
        6
    );
}
add_action('admin_menu', 'custom_post_admin_menu');

function custom_post_admin_page() {
    ?>
    <div class="wrap">
        <h1>Yazılar Yönetimi</h1>
        <form method="post" id="bulk-action-form">
            <select name="post_status_filter" id="post_status_filter">
                <option value="all">Tüm Yazılar</option>
                <option value="publish">Aktif</option>
                <option value="draft">Taslak</option>
                <option value="trash">Çöp</option>
            </select>
            <input type="submit" value="Filtrele" class="button">
            <?php custom_post_list_table(); ?>
            <div class="bulk-actions">
                <select name="bulk_action" id="bulk_action">
                    <option value="delete">Toplu Sil</option>
                    <!-- Başka toplu işlemler ekleyebilirsiniz -->
                </select>
                <input type="submit" value="Uygula" class="button" onclick="return confirm('Seçilen yazılar üzerinde işlemi uygulamak istediğinize emin misiniz?')">
            </div>
        </form>
    </div>
    <?php
}

// Yazıların listelendiği tablo
function custom_post_list_table() {
    global $wpdb;

    $posts_per_page = 10;
    $paged = isset($_GET['paged']) ? intval($_GET['paged']) : 1;
    $offset = ($paged - 1) * $posts_per_page;

    $post_status = isset($_POST['post_status_filter']) ? sanitize_text_field($_POST['post_status_filter']) : 'all';
    $where_clause = '';
    if ($post_status != 'all') {
        $where_clause = $wpdb->prepare("AND post_status = %s", $post_status);
    }

    $total_posts = $wpdb->get_var("SELECT COUNT(*) FROM {$wpdb->posts} WHERE post_type = 'post' $where_clause");
    $posts = $wpdb->get_results($wpdb->prepare("SELECT * FROM {$wpdb->posts} WHERE post_type = 'post' $where_clause ORDER BY post_date DESC LIMIT %d OFFSET %d", $posts_per_page, $offset));

    echo '<table class="wp-list-table widefat fixed striped">';
    echo '<thead><tr><th><input type="checkbox" id="select-all"></th><th>Başlık</th><th>Durum</th><th>Tarih</th><th>İşlemler</th></tr></thead>';
    echo '<tbody>';
    foreach ($posts as $post) {
        echo '<tr>';
        echo '<td><input type="checkbox" name="post_ids[]" value="' . esc_attr($post->ID) . '"></td>';
        echo '<td>' . esc_html($post->post_title) . '</td>';
        echo '<td>' . esc_html($post->post_status) . '</td>';
        echo '<td>' . esc_html($post->post_date) . '</td>';
        echo '<td>';
        echo '<a href="' . get_edit_post_link($post->ID) . '">Düzenle</a> | ';
        echo '<a href="' . get_delete_post_link($post->ID) . '" onclick="return confirm(\'Bu yazıyı silmek istediğinize emin misiniz?\')">Sil</a>';
        echo '</td>';
        echo '</tr>';
    }
    echo '</tbody>';
    echo '</table>';

    // Sayfalama
    $total_pages = ceil($total_posts / $posts_per_page);
    $current_page = max(1, get_query_var('paged'));

    echo '<div class="tablenav"><div class="tablenav-pages">';
    echo paginate_links(array(
        'base' => add_query_arg('paged', '%#%'),
        'format' => '',
        'current' => $paged,
        'total' => $total_pages,
    ));
    echo '</div></div>';
}

function custom_post_bulk_actions() {
    if (isset($_POST['bulk_action']) && $_POST['bulk_action'] == 'delete' && !empty($_POST['post_ids'])) {
        foreach ($_POST['post_ids'] as $post_id) {
            wp_delete_post($post_id, true);
        }
    }
}
add_action('admin_init', 'custom_post_bulk_actions');

function custom_post_manager_scripts() {
    wp_enqueue_script('custom-post-manager', plugins_url('custom-post-manager.js', __FILE__), array('jquery'), '1.0', true);
}
add_action('admin_enqueue_scripts', 'custom_post_manager_scripts');

?>

Kod:Tümünü seç

custom-post-manager.js
dosyasını oluşturup ekleyin:

Kod:Tümünü seç

jQuery(document).ready(function($) {
    $('#select-all').on('click', function() {
        $('input[name="post_ids[]"]').prop('checked', this.checked);
    });
});
Stil dosyasını güncelleme (isteğe bağlı):

Kod:Tümünü seç

/* Admin paneldeki tablo stilini düzenleme */
.wp-list-table {
    width: 100%;
    margin-top: 20px;
    border-collapse: collapse;
}

.wp-list-table th, .wp-list-table td {
    padding: 10px;
    border: 1px solid #ccc;
    text-align: left;
}

.wp-list-table th {
    background-color: #f1f1f1;
}

.tablenav-pages {
    margin-top: 20px;
    text-align: center;
}

.bulk-actions {
    margin-top: 20px;
}



Re: yeni yazı kontrol etme wordpress

Gönderilme zamanı: Çrş Şub 19, 2025 7:59 am
gönderen muratca61
son olarak kullanıcı her sayfada kaç adet gösterim olacağını seçebilsin
Tabii ki! Kullanıcıların her sayfada kaç adet yazı göstermek istediklerini seçebilecekleri bir seçenek ekleyebiliriz. custom-post-manager.php dosyasını aşağıdaki gibi güncelleyelim:

Kod:Tümünü seç

custom-post-manager.php
:

Kod:Tümünü seç

<?php
/*
Plugin Name: Custom Post Manager
Description: WordPress yönetici panelinde yazıları listeleme, düzenleme ve silme işlemleri yapabileceğiniz bir eklenti.
Version: 1.0
Author: [İsminiz]
*/

// Yönetici menüsüne yeni öğe ekleme
function custom_post_admin_menu() {
    add_menu_page(
        'Yazılar Yönetimi', 
        'Yazılar Yönetimi', 
        'manage_options', 
        'custom-post-admin', 
        'custom_post_admin_page', 
        'dashicons-admin-post', 
        6
    );
}
add_action('admin_menu', 'custom_post_admin_menu');

function custom_post_admin_page() {
    ?>
    <div class="wrap">
        <h1>Yazılar Yönetimi</h1>
        <form method="post" id="bulk-action-form">
            <label for="posts_per_page">Sayfa başına yazı sayısı:</label>
            <select name="posts_per_page" id="posts_per_page">
                <option value="5" <?php selected($_POST['posts_per_page'], 5); ?>>5</option>
                <option value="10" <?php selected($_POST['posts_per_page'], 10); ?>>10</option>
                <option value="20" <?php selected($_POST['posts_per_page'], 20); ?>>20</option>
                <option value="50" <?php selected($_POST['posts_per_page'], 50); ?>>50</option>
            </select>
            <br>
            <select name="post_status_filter" id="post_status_filter">
                <option value="all">Tüm Yazılar</option>
                <option value="publish">Aktif</option>
                <option value="draft">Taslak</option>
                <option value="trash">Çöp</option>
            </select>
            <input type="submit" value="Filtrele" class="button">
            <?php custom_post_list_table(); ?>
            <div class="bulk-actions">
                <select name="bulk_action" id="bulk_action">
                    <option value="delete">Toplu Sil</option>
                    <!-- Başka toplu işlemler ekleyebilirsiniz -->
                </select>
                <input type="submit" value="Uygula" class="button" onclick="return confirm('Seçilen yazılar üzerinde işlemi uygulamak istediğinize emin misiniz?')">
            </div>
        </form>
    </div>
    <?php
}

// Yazıların listelendiği tablo
function custom_post_list_table() {
    global $wpdb;

    $posts_per_page = isset($_POST['posts_per_page']) ? intval($_POST['posts_per_page']) : 10;
    $paged = isset($_GET['paged']) ? intval($_GET['paged']) : 1;
    $offset = ($paged - 1) * $posts_per_page;

    $post_status = isset($_POST['post_status_filter']) ? sanitize_text_field($_POST['post_status_filter']) : 'all';
    $where_clause = '';
    if ($post_status != 'all') {
        $where_clause = $wpdb->prepare("AND post_status = %s", $post_status);
    }

    $total_posts = $wpdb->get_var("SELECT COUNT(*) FROM {$wpdb->posts} WHERE post_type = 'post' $where_clause");
    $posts = $wpdb->get_results($wpdb->prepare("SELECT * FROM {$wpdb->posts} WHERE post_type = 'post' $where_clause ORDER BY post_date DESC LIMIT %d OFFSET %d", $posts_per_page, $offset));

    echo '<table class="wp-list-table widefat fixed striped">';
    echo '<thead><tr><th><input type="checkbox" id="select-all"></th><th>Başlık</th><th>Durum</th><th>Tarih</th><th>İşlemler</th></tr></thead>';
    echo '<tbody>';
    foreach ($posts as $post) {
        echo '<tr>';
        echo '<td><input type="checkbox" name="post_ids[]" value="' . esc_attr($post->ID) . '"></td>';
        echo '<td>' . esc_html($post->post_title) . '</td>';
        echo '<td>' . esc_html($post->post_status) . '</td>';
        echo '<td>' . esc_html($post->post_date) . '</td>';
        echo '<td>';
        echo '<a href="' . get_edit_post_link($post->ID) . '">Düzenle</a> | ';
        echo '<a href="' . get_delete_post_link($post->ID) . '" onclick="return confirm(\'Bu yazıyı silmek istediğinize emin misiniz?\')">Sil</a>';
        echo '</td>';
        echo '</tr>';
    }
    echo '</tbody>';
    echo '</table>';

    // Sayfalama
    $total_pages = ceil($total_posts / $posts_per_page);
    $current_page = max(1, get_query_var('paged'));

    echo '<div class="tablenav"><div class="tablenav-pages">';
    echo paginate_links(array(
        'base' => add_query_arg('paged', '%#%'),
        'format' => '',
        'current' => $paged,
        'total' => $total_pages,
    ));
    echo '</div></div>';
}

function custom_post_bulk_actions() {
    if (isset($_POST['bulk_action']) && $_POST['bulk_action'] == 'delete' && !empty($_POST['post_ids'])) {
        foreach ($_POST['post_ids'] as $post_id) {
            wp_delete_post($post_id, true);
        }
    }
}
add_action('admin_init', 'custom_post_bulk_actions');

function custom_post_manager_scripts() {
    wp_enqueue_script('custom-post-manager', plugins_url('custom-post-manager.js', __FILE__), array('jquery'), '1.0', true);
}
add_action('admin_enqueue_scripts', 'custom_post_manager_scripts');

?>



Re: yeni yazı kontrol etme wordpress

Gönderilme zamanı: Çrş Şub 19, 2025 8:00 am
gönderen muratca61
---------------------------------------------------------------------------------------------------------------------
son olarak filtrelerin ve ayarların son konumunu unutmasın
Kullanıcının son seçtiği filtreleri ve ayarları unutmaması için, bu bilgileri tarayıcı çerezlerinde veya WordPress seçeneklerinde saklayabiliriz. Böylece, kullanıcı yeniden sayfayı ziyaret ettiğinde veya yeniden yüklediğinde bu ayarlar korunur.

Aşağıdaki adımları izleyerek bu özelliği ekleyebiliriz:

Yönetici sayfasında filtreleri ve ayarları çerezlerde saklama

Yönetici sayfası yüklendiğinde bu ayarları geri yükleme

Adım 1: Yönetici sayfasında filtreleri ve ayarları çerezlerde saklama

Kod:Tümünü seç

custom-post-manager.js
dosyasını güncelleyin:

Kod:Tümünü seç

jQuery(document).ready(function($) {
    // Tümünü seç kutusu
    $('#select-all').on('click', function() {
        $('input[name="post_ids[]"]').prop('checked', this.checked);
    });

    // Filtre ve sayfa başına yazı sayısı değiştiğinde çerezlere kaydet
    $('#post_status_filter, #posts_per_page').on('change', function() {
        document.cookie = $(this).attr('name') + "=" + $(this).val() + "; path=/";
    });

    // Sayfa yüklendiğinde çerezlerden filtre ve sayfa başına yazı sayısını geri yükle
    function getCookie(name) {
        let cookieArr = document.cookie.split(";");
        for (let i = 0; i < cookieArr.length; i++) {
            let cookiePair = cookieArr[i].split("=");
            if (name == cookiePair[0].trim()) {
                return decodeURIComponent(cookiePair[1]);
            }
        }
        return null;
    }

    var postStatusFilter = getCookie('post_status_filter');
    if (postStatusFilter) {
        $('#post_status_filter').val(postStatusFilter);
    }

    var postsPerPage = getCookie('posts_per_page');
    if (postsPerPage) {
        $('#posts_per_page').val(postsPerPage);
    }

    // Filtreleme formu yüklendiğinde otomatik olarak gönderilsin
    $('#bulk-action-form').submit();
});
Adım 2: Yönetici sayfası yüklendiğinde bu ayarları geri yükleme

Kod:Tümünü seç

custom-post-manager.php
dosyasını güncelleyin:

Kod:Tümünü seç

<?php
/*
Plugin Name: Custom Post Manager
Description: WordPress yönetici panelinde yazıları listeleme, düzenleme ve silme işlemleri yapabileceğiniz bir eklenti.
Version: 1.0
Author: [İsminiz]
*/

// Yönetici menüsüne yeni öğe ekleme
function custom_post_admin_menu() {
    add_menu_page(
        'Yazılar Yönetimi', 
        'Yazılar Yönetimi', 
        'manage_options', 
        'custom-post-admin', 
        'custom_post_admin_page', 
        'dashicons-admin-post', 
        6
    );
}
add_action('admin_menu', 'custom_post_admin_menu');

function custom_post_admin_page() {
    ?>
    <div class="wrap">
        <h1>Yazılar Yönetimi</h1>
        <form method="post" id="bulk-action-form">
            <label for="posts_per_page">Sayfa başına yazı sayısı:</label>
            <select name="posts_per_page" id="posts_per_page">
                <option value="5" <?php selected($_POST['posts_per_page'], 5); ?>>5</option>
                <option value="10" <?php selected($_POST['posts_per_page'], 10); ?>>10</option>
                <option value="20" <?php selected($_POST['posts_per_page'], 20); ?>>20</option>
                <option value="50" <?php selected($_POST['posts_per_page'], 50); ?>>50</option>
            </select>
            <br>
            <select name="post_status_filter" id="post_status_filter">
                <option value="all">Tüm Yazılar</option>
                <option value="publish">Aktif</option>
                <option value="draft">Taslak</option>
                <option value="trash">Çöp</option>
            </select>
            <input type="submit" value="Filtrele" class="button">
            <?php custom_post_list_table(); ?>
            <div class="bulk-actions">
                <select name="bulk_action" id="bulk_action">
                    <option value="delete">Toplu Sil</option>
                    <!-- Başka toplu işlemler ekleyebilirsiniz -->
                </select>
                <input type="submit" value="Uygula" class="button" onclick="return confirm('Seçilen yazılar üzerinde işlemi uygulamak istediğinize emin misiniz?')">
            </div>
        </form>
    </div>
    <?php
}

// Yazıların listelendiği tablo
function custom_post_list_table() {
    global $wpdb;

    $posts_per_page = isset($_POST['posts_per_page']) ? intval($_POST['posts_per_page']) : 10;
    $paged = isset($_GET['paged']) ? intval($_GET['paged']) : 1;
    $offset = ($paged - 1) * $posts_per_page;

    $post_status = isset($_POST['post_status_filter']) ? sanitize_text_field($_POST['post_status_filter']) : 'all';
    $where_clause = '';
    if ($post_status != 'all') {
        $where_clause = $wpdb->prepare("AND post_status = %s", $post_status);
    }

    $total_posts = $wpdb->get_var("SELECT COUNT(*) FROM {$wpdb->posts} WHERE post_type = 'post' $where_clause");
    $posts = $wpdb->get_results($wpdb->prepare("SELECT * FROM {$wpdb->posts} WHERE post_type = 'post' $where_clause ORDER BY post_date DESC LIMIT %d OFFSET %d", $posts_per_page, $offset));

    echo '<table class="wp-list-table widefat fixed striped">';
    echo '<thead><tr><th><input type="checkbox" id="select-all"></th><th>Başlık</th><th>Durum</th><th>Tarih</th><th>İşlemler</th></tr></thead>';
    echo '<tbody>';
    foreach ($posts as $post) {
        echo '<tr>';
        echo '<td><input type="checkbox" name="post_ids[]" value="' . esc_attr($post->ID) . '"></td>';
        echo '<td>' . esc_html($post->post_title) . '</td>';
        echo '<td>' . esc_html($post->post_status) . '</td>';
        echo '<td>' . esc_html($post->post_date) . '</td>';
        echo '<td>';
        echo '<a href="' . get_edit_post_link($post->ID) . '">Düzenle</a> | ';
        echo '<a href="' . get_delete_post_link($post->ID) . '" onclick="return confirm(\'Bu yazıyı silmek istediğinize emin misiniz?\')">Sil</a>';
        echo '</td>';
        echo '</tr>';
    }
    echo '</tbody>';
    echo '</table>';

    // Sayfalama
    $total_pages = ceil($total_posts / $posts_per_page);
    $current_page = max(1, get_query_var('paged'));

    echo '<div class="tablenav"><div class="tablenav-pages">';
    echo paginate_links(array(
        'base' => add_query_arg('paged', '%#%'),
        'format' => '',
        'current' => $paged,
        'total' => $total_pages,
    ));
    echo '</div></div>';
}

function custom_post_bulk_actions() {
    if (isset($_POST['bulk_action']) && $_POST['bulk_action'] == 'delete' && !empty($_POST['post_ids'])) {
        foreach ($_POST['post_ids'] as $post_id) {
            wp_delete_post($post_id, true);
        }
    }
}
add_action('admin_init', 'custom_post_bulk_actions');

function custom_post_manager_scripts() {
    wp_enqueue_script('custom-post-manager', plugins_url('custom-post-manager.js', __FILE__), array('jquery'), '1.0', true);
}
add_action('admin_enqueue_scripts', 'custom_post_manager_scripts');

?>

Re: yeni yazı kontrol etme wordpress

Gönderilme zamanı: Çrş Şub 19, 2025 8:03 am
gönderen muratca61
sürekli sayfa yenileme yapıyor çözümü mü bakalım

Kod:Tümünü seç

custom-post-manager.php

Kod:Tümünü seç

<?php
/*
Plugin Name: Custom Post Manager
Description: WordPress yönetici panelinde yazıları listeleme, düzenleme ve silme işlemleri yapabileceğiniz bir eklenti.
Version: 1.0
Author: [İsminiz]
*/

// Yönetici menüsüne yeni öğe ekleme
function custom_post_admin_menu() {
    add_menu_page(
        'Yazılar Yönetimi', 
        'Yazılar Yönetimi', 
        'manage_options', 
        'custom-post-admin', 
        'custom_post_admin_page', 
        'dashicons-admin-post', 
        6
    );
}
add_action('admin_menu', 'custom_post_admin_menu');

function custom_post_admin_page() {
    ?>
    <div class="wrap">
        <h1>Yazılar Yönetimi</h1>
        <form method="post" id="bulk-action-form">
            <label for="posts_per_page">Sayfa başına yazı sayısı:</label>
            <select name="posts_per_page" id="posts_per_page">
                <option value="5" <?php selected($_POST['posts_per_page'], 5); ?>>5</option>
                <option value="10" <?php selected($_POST['posts_per_page'], 10); ?>>10</option>
                <option value="20" <?php selected($_POST['posts_per_page'], 20); ?>>20</option>
                <option value="50" <?php selected($_POST['posts_per_page'], 50); ?>>50</option>
            </select>
            <br>
            <select name="post_status_filter" id="post_status_filter">
                <option value="all">Tüm Yazılar</option>
                <option value="publish">Aktif</option>
                <option value="draft">Taslak</option>
                <option value="trash">Çöp</option>
            </select>
            <input type="submit" value="Filtrele" class="button">
            <?php custom_post_list_table(); ?>
            <div class="bulk-actions">
                <select name="bulk_action" id="bulk_action">
                    <option value="delete">Toplu Sil</option>
                    <!-- Başka toplu işlemler ekleyebilirsiniz -->
                </select>
                <input type="submit" value="Uygula" class="button" onclick="return confirm('Seçilen yazılar üzerinde işlemi uygulamak istediğinize emin misiniz?')">
            </div>
        </form>
    </div>
    <?php
}

// Yazıların listelendiği tablo
function custom_post_list_table() {
    global $wpdb;

    $posts_per_page = isset($_POST['posts_per_page']) ? intval($_POST['posts_per_page']) : 10;
    $paged = isset($_GET['paged']) ? intval($_GET['paged']) : 1;
    $offset = ($paged - 1) * $posts_per_page;

    $post_status = isset($_POST['post_status_filter']) ? sanitize_text_field($_POST['post_status_filter']) : 'all';
    $where_clause = '';
    if ($post_status != 'all') {
        $where_clause = $wpdb->prepare("AND post_status = %s", $post_status);
    }

    $total_posts = $wpdb->get_var("SELECT COUNT(*) FROM {$wpdb->posts} WHERE post_type = 'post' $where_clause");
    $posts = $wpdb->get_results($wpdb->prepare("SELECT * FROM {$wpdb->posts} WHERE post_type = 'post' $where_clause ORDER BY post_date DESC LIMIT %d OFFSET %d", $posts_per_page, $offset));

    echo '<table class="wp-list-table widefat fixed striped">';
    echo '<thead><tr><th><input type="checkbox" id="select-all"></th><th>Başlık</th><th>Durum</th><th>Tarih</th><th>İşlemler</th></tr></thead>';
    echo '<tbody>';
    foreach ($posts as $post) {
        echo '<tr>';
        echo '<td><input type="checkbox" name="post_ids[]" value="' . esc_attr($post->ID) . '"></td>';
        echo '<td>' . esc_html($post->post_title) . '</td>';
        echo '<td>' . esc_html($post->post_status) . '</td>';
        echo '<td>' . esc_html($post->post_date) . '</td>';
        echo '<td>';
        echo '<a href="' . get_edit_post_link($post->ID) . '">Düzenle</a> | ';
        echo '<a href="' . get_delete_post_link($post->ID) . '" onclick="return confirm(\'Bu yazıyı silmek istediğinize emin misiniz?\')">Sil</a>';
        echo '</td>';
        echo '</tr>';
    }
    echo '</tbody>';
    echo '</table>';

    // Sayfalama
    $total_pages = ceil($total_posts / $posts_per_page);
    $current_page = max(1, get_query_var('paged'));

    echo '<div class="tablenav"><div class="tablenav-pages">';
    echo paginate_links(array(
        'base' => add_query_arg('paged', '%#%'),
        'format' => '',
        'current' => $paged,
        'total' => $total_pages,
    ));
    echo '</div></div>';
}

function custom_post_bulk_actions() {
    if (isset($_POST['bulk_action']) && $_POST['bulk_action'] == 'delete' && !empty($_POST['post_ids'])) {
        foreach ($_POST['post_ids'] as $post_id) {
            wp_delete_post($post_id, true);
        }
    }
}
add_action('admin_init', 'custom_post_bulk_actions');

function custom_post_manager_scripts() {
    wp_enqueue_script('custom-post-manager', plugins_url('custom-post-manager.js', __FILE__), array('jquery'), '1.0', true);
}
add_action('admin_enqueue_scripts', 'custom_post_manager_scripts');

?>

Kod:Tümünü seç

custom-post-manager.js

Kod:Tümünü seç

jQuery(document).ready(function($) {
    // Tümünü seç kutusu
    $('#select-all').on('click', function() {
        $('input[name="post_ids[]"]').prop('checked', this.checked);
    });

    // Filtre ve sayfa başına yazı sayısı değiştiğinde çerezlere kaydet
    $('#post_status_filter, #posts_per_page').on('change', function() {
        document.cookie = $(this).attr('name') + "=" + $(this).val() + "; path=/";
    });

    // Sayfa yüklendiğinde çerezlerden filtre ve sayfa başına yazı sayısını geri yükle
    function getCookie(name) {
        let cookieArr = document.cookie.split(";");
        for (let i = 0; i < cookieArr.length; i++) {
            let cookiePair = cookieArr[i].split("=");
            if (name == cookiePair[0].trim()) {
                return decodeURIComponent(cookiePair[1]);
            }
        }
        return null;
    }

    var postStatusFilter = getCookie('post_status_filter');
    if (postStatusFilter) {
        $('#post_status_filter').val(postStatusFilter);
    }

    var postsPerPage = getCookie('posts_per_page');
    if (postsPerPage) {
        $('#posts_per_page').val(postsPerPage);
    }

    // Filtreleme formu yüklendiğinde otomatik olarak gönderilsin
    $('#bulk-action-form').submit();
});

Re: yeni yazı kontrol etme wordpress

Gönderilme zamanı: Çrş Şub 19, 2025 10:21 am
gönderen muratca61
bu uygulamayı daha stabil daha profesyonel hale getirelim daha esnek ayrıa taslak yazıyı yayınlama eklentisi yapalım
21 saniye hakkında Akıl yürütüldü
Aşağıda, eklentinizi daha stabil, profesyonel ve esnek hale getirmek için bazı iyileştirmeler yapılmış örnek bir kod sunuyorum. Bu örnekte:

Güvenlik için nonce eklenip doğrulama yapıldı.
Bulk işlemlerde “Taslağı Yayınla” seçeneği eklendi; bu seçenek, yalnızca taslak durumda olan yazıları yayına alır.
Admin sayfa için CSS ve JS dosyaları yalnızca ilgili sayfada yüklenecek şekilde düzenlendi.
Küçük kod iyileştirmeleri (girdi doğrulamaları, hata mesajları, pagination kontrolleri vb.) yapıldı.

Kod:Tümünü seç

custom-post-manager.php

Kod:Tümünü seç

<?php
/*
Plugin Name: Custom Post Manager
Description: WordPress yönetici panelinde yazıları listeleme, düzenleme, silme ve taslak yayınlama işlemleri yapabileceğiniz bir eklenti.
Version: 1.1
Author: [İsminiz]
*/

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

// Yönetici menüsüne yeni öğe ekleme
function custom_post_admin_menu() {
    add_menu_page(
        'Yazılar Yönetimi', 
        'Yazılar Yönetimi', 
        'manage_options', 
        'custom-post-admin', 
        'custom_post_admin_page', 
        'dashicons-admin-post', 
        6
    );
}
add_action('admin_menu', 'custom_post_admin_menu');

function custom_post_admin_page() {
    ?>
    <div class="wrap">
        <h1>Yazılar Yönetimi</h1>
        <form method="post" id="bulk-action-form">
            <?php wp_nonce_field( 'custom_post_bulk_action', 'custom_post_nonce' ); ?>
            
            <label for="posts_per_page">Sayfa başına yazı sayısı:</label>
            <select name="posts_per_page" id="posts_per_page">
                <option value="5" <?php selected( isset($_POST['posts_per_page']) ? intval($_POST['posts_per_page']) : 10, 5 ); ?>>5</option>
                <option value="10" <?php selected( isset($_POST['posts_per_page']) ? intval($_POST['posts_per_page']) : 10, 10 ); ?>>10</option>
                <option value="20" <?php selected( isset($_POST['posts_per_page']) ? intval($_POST['posts_per_page']) : 10, 20 ); ?>>20</option>
                <option value="50" <?php selected( isset($_POST['posts_per_page']) ? intval($_POST['posts_per_page']) : 10, 50 ); ?>>50</option>
            </select>
            <br><br>
            
            <label for="post_status_filter">Yazı Durumu:</label>
            <select name="post_status_filter" id="post_status_filter">
                <option value="all" <?php selected( isset($_POST['post_status_filter']) ? sanitize_text_field($_POST['post_status_filter']) : 'all', 'all' ); ?>>Tüm Yazılar</option>
                <option value="publish" <?php selected( isset($_POST['post_status_filter']) ? sanitize_text_field($_POST['post_status_filter']) : 'all', 'publish' ); ?>>Aktif</option>
                <option value="draft" <?php selected( isset($_POST['post_status_filter']) ? sanitize_text_field($_POST['post_status_filter']) : 'all', 'draft' ); ?>>Taslak</option>
                <option value="trash" <?php selected( isset($_POST['post_status_filter']) ? sanitize_text_field($_POST['post_status_filter']) : 'all', 'trash' ); ?>>Çöp</option>
            </select>
            <input type="submit" value="Filtrele" class="button">
            
            <?php custom_post_list_table(); ?>
            
            <div class="bulk-actions">
                <select name="bulk_action" id="bulk_action">
                    <option value=""><?php _e('Toplu İşlem Seçin'); ?></option>
                    <option value="delete"><?php _e('Toplu Sil'); ?></option>
                    <option value="publish"><?php _e('Taslağı Yayınla'); ?></option>
                </select>
                <input type="submit" value="Uygula" class="button" onclick="return confirm('Seçilen yazılar üzerinde işlemi uygulamak istediğinize emin misiniz?')">
            </div>
        </form>
    </div>
    <?php
}

// Yazıların listelendiği tabloyu oluşturma
function custom_post_list_table() {
    global $wpdb;

    $posts_per_page = isset($_POST['posts_per_page']) ? intval($_POST['posts_per_page']) : 10;
    $paged = isset($_GET['paged']) ? intval($_GET['paged']) : 1;
    $offset = ($paged - 1) * $posts_per_page;

    $post_status = isset($_POST['post_status_filter']) ? sanitize_text_field($_POST['post_status_filter']) : 'all';
    $where_clause = "WHERE post_type = 'post'";
    if ($post_status !== 'all') {
        $where_clause .= $wpdb->prepare(" AND post_status = %s", $post_status);
    }

    $total_posts = $wpdb->get_var("SELECT COUNT(*) FROM {$wpdb->posts} $where_clause");
    $posts = $wpdb->get_results($wpdb->prepare("SELECT * FROM {$wpdb->posts} $where_clause ORDER BY post_date DESC LIMIT %d OFFSET %d", $posts_per_page, $offset));

    if ( $posts ) {
        echo '<table class="wp-list-table widefat fixed striped">';
        echo '<thead><tr>';
        echo '<th><input type="checkbox" id="select-all"></th>';
        echo '<th>Başlık</th>';
        echo '<th>Durum</th>';
        echo '<th>Tarih</th>';
        echo '<th>İşlemler</th>';
        echo '</tr></thead>';
        echo '<tbody>';
        foreach ($posts as $post) {
            echo '<tr>';
            echo '<td><input type="checkbox" name="post_ids[]" value="' . esc_attr($post->ID) . '"></td>';
            echo '<td>' . esc_html($post->post_title) . '</td>';
            echo '<td>' . esc_html($post->post_status) . '</td>';
            echo '<td>' . esc_html($post->post_date) . '</td>';
            echo '<td>';
            echo '<a href="' . esc_url(get_edit_post_link($post->ID)) . '">Düzenle</a> | ';
            echo '<a href="' . esc_url(get_delete_post_link($post->ID)) . '" onclick="return confirm(\'Bu yazıyı silmek istediğinize emin misiniz?\')">Sil</a>';
            echo '</td>';
            echo '</tr>';
        }
        echo '</tbody>';
        echo '</table>';
    } else {
        echo '<p>Gösterilecek yazı bulunamadı.</p>';
    }

    // Sayfalama
    $total_pages = ceil($total_posts / $posts_per_page);
    if ($total_pages > 1) {
        echo '<div class="tablenav"><div class="tablenav-pages">';
        echo paginate_links(array(
            'base'    => add_query_arg('paged', '%#%'),
            'format'  => '',
            'current' => $paged,
            'total'   => $total_pages,
        ));
        echo '</div></div>';
    }
}

// Bulk işlemleri uygulama: silme ve taslağı yayına alma
function custom_post_bulk_actions() {
    if ( isset($_POST['bulk_action']) && !empty($_POST['bulk_action']) && !empty($_POST['post_ids']) ) {

        // Güvenlik kontrolü: nonce doğrulaması
        if ( ! isset($_POST['custom_post_nonce']) || ! wp_verify_nonce($_POST['custom_post_nonce'], 'custom_post_bulk_action') ) {
            wp_die('Güvenlik kontrolü başarısız.');
        }

        $action = sanitize_text_field($_POST['bulk_action']);
        foreach ($_POST['post_ids'] as $post_id) {
            $post_id = intval($post_id);
            if ( $action === 'delete' ) {
                wp_delete_post($post_id, true);
            } elseif ( $action === 'publish' ) {
                $post = get_post($post_id);
                if ( $post && $post->post_status === 'draft' ) {
                    wp_update_post(array(
                        'ID'          => $post_id,
                        'post_status' => 'publish'
                    ));
                }
            }
        }
        // İşlem sonrası formun yeniden gönderilmesini önlemek için yönlendirme
        wp_redirect( admin_url('admin.php?page=custom-post-admin') );
        exit;
    }
}
add_action('admin_init', 'custom_post_bulk_actions');

// Admin sayfa için script ve stil dosyalarını ekleme
function custom_post_manager_admin_scripts($hook) {
    // Yalnızca eklenti sayfasında dosyaları ekle
    if ( $hook != 'toplevel_page_custom-post-admin' ) {
        return;
    }
    wp_enqueue_script('custom-post-manager', plugins_url('custom-post-manager.js', __FILE__), array('jquery'), '1.1', true);
    wp_enqueue_style('custom-post-manager-style', plugins_url('style.css', __FILE__));
}
add_action('admin_enqueue_scripts', 'custom_post_manager_admin_scripts');
?>

Kod:Tümünü seç

custom-post-manager.js

Kod:Tümünü seç

jQuery(document).ready(function($) {
    // "Tümünü Seç" checkbox'ı için tüm checkbox'ları işaretle/işareti kaldır
    $('#select-all').on('click', function() {
        $('input[name="post_ids[]"]').prop('checked', this.checked);
    });
});

Kod:Tümünü seç

style.css

Kod:Tümünü seç

/* Yönetici panelindeki tablo stil düzenlemeleri */
.wp-list-table {
    width: 100%;
    margin-top: 20px;
    border-collapse: collapse;
}

.wp-list-table th,
.wp-list-table td {
    padding: 10px;
    border: 1px solid #ccc;
    text-align: left;
}

.wp-list-table th {
    background-color: #f1f1f1;
}

.tablenav-pages {
    margin-top: 20px;
    text-align: center;
}

.bulk-actions {
    margin-top: 20px;
}
Açıklamalar
Güvenlik:

Form içerisine wp_nonce_field eklenmiştir.
Bulk işlemler yapılmadan önce nonce doğrulaması yapılır.
Taslak Yayınlama:

Bulk işlemler için “Taslağı Yayınla” seçeneği eklenmiştir.
Seçilen yazıların durumunu kontrol edip, yalnızca draft durumunda olanlar publish durumuna güncellenir.
Kod Düzenlemeleri:

Yönetici panelinde yalnızca ilgili sayfada (custom-post-admin) CSS ve JS dosyaları eklenir.
Girdi değerleri sanitize edilerek güvenlik artırılmıştır.
Bu yapıyı kullanarak eklentinizi hem daha profesyonel hem de esnek bir hale getirebilirsiniz. İhtiyacınıza göre ek özellikler (örneğin WP_List_Table sınıfı kullanılarak listeleme, gelişmiş filtreleme vb.) de ekleyebilirsiniz.

Re: yeni yazı kontrol etme wordpress

Gönderilme zamanı: Çrş Şub 19, 2025 10:26 am
gönderen muratca61
draft yanına yayınla tuu ile direk yayına alalım

Kod:Tümünü seç

custom-post-manager.php

Kod:Tümünü seç

<?php
/*
Plugin Name: Custom Post Manager
Description: WordPress yönetici panelinde yazıları listeleme, düzenleme, silme ve tek tek yayınlama işlemleri yapabileceğiniz bir eklenti.
Version: 1.2
Author: [İsminiz]
*/

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

// Yönetici menüsüne yeni öğe ekleme
function custom_post_admin_menu() {
    add_menu_page(
        'Yazılar Yönetimi', 
        'Yazılar Yönetimi', 
        'manage_options', 
        'custom-post-admin', 
        'custom_post_admin_page', 
        'dashicons-admin-post', 
        6
    );
}
add_action('admin_menu', 'custom_post_admin_menu');

function custom_post_admin_page() {
    ?>
    <div class="wrap">
        <h1>Yazılar Yönetimi</h1>
        <form method="post" id="bulk-action-form">
            <?php wp_nonce_field( 'custom_post_bulk_action', 'custom_post_nonce' ); ?>
            
            <label for="posts_per_page">Sayfa başına yazı sayısı:</label>
            <select name="posts_per_page" id="posts_per_page">
                <option value="5" <?php selected( isset($_POST['posts_per_page']) ? intval($_POST['posts_per_page']) : 10, 5 ); ?>>5</option>
                <option value="10" <?php selected( isset($_POST['posts_per_page']) ? intval($_POST['posts_per_page']) : 10, 10 ); ?>>10</option>
                <option value="20" <?php selected( isset($_POST['posts_per_page']) ? intval($_POST['posts_per_page']) : 10, 20 ); ?>>20</option>
                <option value="50" <?php selected( isset($_POST['posts_per_page']) ? intval($_POST['posts_per_page']) : 10, 50 ); ?>>50</option>
            </select>
            <br><br>
            
            <label for="post_status_filter">Yazı Durumu:</label>
            <select name="post_status_filter" id="post_status_filter">
                <option value="all" <?php selected( isset($_POST['post_status_filter']) ? sanitize_text_field($_POST['post_status_filter']) : 'all', 'all' ); ?>>Tüm Yazılar</option>
                <option value="publish" <?php selected( isset($_POST['post_status_filter']) ? sanitize_text_field($_POST['post_status_filter']) : 'all', 'publish' ); ?>>Aktif</option>
                <option value="draft" <?php selected( isset($_POST['post_status_filter']) ? sanitize_text_field($_POST['post_status_filter']) : 'all', 'draft' ); ?>>Taslak</option>
                <option value="trash" <?php selected( isset($_POST['post_status_filter']) ? sanitize_text_field($_POST['post_status_filter']) : 'all', 'trash' ); ?>>Çöp</option>
            </select>
            <input type="submit" value="Filtrele" class="button">
            
            <?php custom_post_list_table(); ?>
            
            <div class="bulk-actions">
                <select name="bulk_action" id="bulk_action">
                    <option value=""><?php _e('Toplu İşlem Seçin'); ?></option>
                    <option value="delete"><?php _e('Toplu Sil'); ?></option>
                    <option value="publish"><?php _e('Taslağı Yayınla'); ?></option>
                </select>
                <input type="submit" value="Uygula" class="button" onclick="return confirm('Seçilen yazılar üzerinde işlemi uygulamak istediğinize emin misiniz?')">
            </div>
        </form>
    </div>
    <?php
}

// Yazıların listelendiği tabloyu oluşturma
function custom_post_list_table() {
    global $wpdb;

    $posts_per_page = isset($_POST['posts_per_page']) ? intval($_POST['posts_per_page']) : 10;
    $paged = isset($_GET['paged']) ? intval($_GET['paged']) : 1;
    $offset = ($paged - 1) * $posts_per_page;

    $post_status = isset($_POST['post_status_filter']) ? sanitize_text_field($_POST['post_status_filter']) : 'all';
    $where_clause = "WHERE post_type = 'post'";
    if ($post_status !== 'all') {
        $where_clause .= $wpdb->prepare(" AND post_status = %s", $post_status);
    }

    $total_posts = $wpdb->get_var("SELECT COUNT(*) FROM {$wpdb->posts} $where_clause");
    $posts = $wpdb->get_results($wpdb->prepare("SELECT * FROM {$wpdb->posts} $where_clause ORDER BY post_date DESC LIMIT %d OFFSET %d", $posts_per_page, $offset));

    if ( $posts ) {
        echo '<table class="wp-list-table widefat fixed striped">';
        echo '<thead><tr>';
        echo '<th><input type="checkbox" id="select-all"></th>';
        echo '<th>Başlık</th>';
        echo '<th>Durum</th>';
        echo '<th>Tarih</th>';
        echo '<th>İşlemler</th>';
        echo '</tr></thead>';
        echo '<tbody>';
        foreach ($posts as $post) {
            echo '<tr>';
            echo '<td><input type="checkbox" name="post_ids[]" value="' . esc_attr($post->ID) . '"></td>';
            echo '<td>' . esc_html($post->post_title) . '</td>';
            echo '<td>' . esc_html($post->post_status) . '</td>';
            echo '<td>' . esc_html($post->post_date) . '</td>';
            echo '<td>';
            echo '<a href="' . esc_url(get_edit_post_link($post->ID)) . '">Düzenle</a> | ';
            echo '<a href="' . esc_url(get_delete_post_link($post->ID)) . '" onclick="return confirm(\'Bu yazıyı silmek istediğinize emin misiniz?\')">Sil</a>';
            
            // Eğer yazı taslak ise "Yayınla" bağlantısını ekle
            if ( $post->post_status === 'draft' ) {
                $nonce = wp_create_nonce( 'custom_post_publish_' . $post->ID );
                $publish_url = esc_url( admin_url( 'admin-post.php?action=custom_post_publish&post_id=' . $post->ID . '&nonce=' . $nonce ) );
                echo ' | <a href="' . $publish_url . '" onclick="return confirm(\'Bu yazıyı yayına almak istediğinize emin misiniz?\')">Yayınla</a>';
            }
            
            echo '</td>';
            echo '</tr>';
        }
        echo '</tbody>';
        echo '</table>';
    } else {
        echo '<p>Gösterilecek yazı bulunamadı.</p>';
    }

    // Sayfalama
    $total_pages = ceil($total_posts / $posts_per_page);
    if ($total_pages > 1) {
        echo '<div class="tablenav"><div class="tablenav-pages">';
        echo paginate_links(array(
            'base'    => add_query_arg('paged', '%#%'),
            'format'  => '',
            'current' => $paged,
            'total'   => $total_pages,
        ));
        echo '</div></div>';
    }
}

// Bulk işlemleri uygulama: silme ve taslağı yayına alma
function custom_post_bulk_actions() {
    if ( isset($_POST['bulk_action']) && !empty($_POST['bulk_action']) && !empty($_POST['post_ids']) ) {

        // Güvenlik kontrolü: nonce doğrulaması
        if ( ! isset($_POST['custom_post_nonce']) || ! wp_verify_nonce($_POST['custom_post_nonce'], 'custom_post_bulk_action') ) {
            wp_die('Güvenlik kontrolü başarısız.');
        }

        $action = sanitize_text_field($_POST['bulk_action']);
        foreach ($_POST['post_ids'] as $post_id) {
            $post_id = intval($post_id);
            if ( $action === 'delete' ) {
                wp_delete_post($post_id, true);
            } elseif ( $action === 'publish' ) {
                $post = get_post($post_id);
                if ( $post && $post->post_status === 'draft' ) {
                    wp_update_post(array(
                        'ID'          => $post_id,
                        'post_status' => 'publish'
                    ));
                }
            }
        }
        // İşlem sonrası formun yeniden gönderilmesini önlemek için yönlendirme
        wp_redirect( admin_url('admin.php?page=custom-post-admin') );
        exit;
    }
}
add_action('admin_init', 'custom_post_bulk_actions');

// Tekil "Yayınla" işlemini uygulama
function custom_post_publish_handler() {
    // Gerekli parametrelerin kontrolü
    if ( ! isset( $_GET['post_id'] ) || ! isset( $_GET['nonce'] ) ) {
        wp_die('Eksik parametreler.');
    }
    
    $post_id = intval( $_GET['post_id'] );
    $nonce   = sanitize_text_field( $_GET['nonce'] );

    if ( ! wp_verify_nonce( $nonce, 'custom_post_publish_' . $post_id ) ) {
        wp_die('Güvenlik kontrolü başarısız.');
    }

    if ( ! current_user_can( 'edit_post', $post_id ) ) {
        wp_die('Bu işlemi gerçekleştirmek için yeterli izniniz yok.');
    }

    $post = get_post( $post_id );
    if ( $post && $post->post_status === 'draft' ) {
        wp_update_post( array(
            'ID'          => $post_id,
            'post_status' => 'publish'
        ) );
    }
    
    // İşlem sonrası geri yönlendir
    wp_redirect( admin_url('admin.php?page=custom-post-admin') );
    exit;
}
add_action( 'admin_post_custom_post_publish', 'custom_post_publish_handler' );

// Admin sayfa için script ve stil dosyalarını ekleme
function custom_post_manager_admin_scripts($hook) {
    // Yalnızca eklenti sayfasında dosyaları ekle
    if ( $hook != 'toplevel_page_custom-post-admin' ) {
        return;
    }
    wp_enqueue_script('custom-post-manager', plugins_url('custom-post-manager.js', __FILE__), array('jquery'), '1.2', true);
    wp_enqueue_style('custom-post-manager-style', plugins_url('style.css', __FILE__));
}
add_action('admin_enqueue_scripts', 'custom_post_manager_admin_scripts');
?>

Kod:Tümünü seç

custom-post-manager.js

Kod:Tümünü seç

jQuery(document).ready(function($) {
    // "Tümünü Seç" checkbox'ı: tüm checkbox'ları işaretle/işareti kaldır
    $('#select-all').on('click', function() {
        $('input[name="post_ids[]"]').prop('checked', this.checked);
    });
});

Kod:Tümünü seç

style.css

Kod:Tümünü seç

/* Yönetici panelindeki tablo stil düzenlemeleri */
.wp-list-table {
    width: 100%;
    margin-top: 20px;
    border-collapse: collapse;
}

.wp-list-table th,
.wp-list-table td {
    padding: 10px;
    border: 1px solid #ccc;
    text-align: left;
}

.wp-list-table th {
    background-color: #f1f1f1;
}

.tablenav-pages {
    margin-top: 20px;
    text-align: center;
}

.bulk-actions {
    margin-top: 20px;
}
Açıklamalar
Tekil Yayınlama Bağlantısı:

Yazı listesinde, eğer bir yazı taslak durumdaysa, "Yayınla" bağlantısı eklenir.
Bağlantıya tıklanıldığında admin-post.php üzerinden custom_post_publish aksiyonu tetiklenir.
Güvenlik:

Her "Yayınla" bağlantısı için özel nonce oluşturulur ve doğrulanır.
Kullanıcının yazıyı düzenleme yetkisi olup olmadığı kontrol edilir.
Bulk İşlemler:

Bulk işlemler kısmında hâlihazırda "Taslağı Yayınla" seçeneği bulunmaktadır.
Böylece hem toplu hem de tek tek yazıları yayına alma imkanı sağlanır.
Bu güncellenmiş kod yapısıyla, hem toplu hem de her taslak yazı için ayrı ayrı "Yayınla" işlemini gerçekleştirebilirsiniz.

Re: yeni yazı kontrol etme wordpress

Gönderilme zamanı: Çrş Şub 19, 2025 10:37 am
gönderen muratca61
düzenle-direk onay almaksızın yeni sekmede düzenleme ekranına atar
çöp-direk onay almaksızın çöp kutusuna atar
sil-onay alarak tamamen siler
taslak-yazıyı direk onay almaksızın taslaklara alır
yayınla-direk onay almaksızın yayınlar
-----------
taslak durumda düzenle/sil/çöp/yayınla aktif
çöp durumda taslak/sil aktif
yayınlanmış durumunda çöp/taslak aktif
33 saniye hakkında Akıl yürütüldü
Aşağıda, eklentinizdeki yazıların durumuna göre istenen aksiyonların (düzenle, çöp, sil, taslak, yayınla) aktif olacağı şekilde güncellenmiş kod örneğini bulabilirsiniz. Bu örnekte:

Draft durumunda:

Düzenle: Yeni sekmede açılır, onay istemez.
Çöp: Yazıyı çöp kutusuna taşır, onay istemez.
Sil: Yazıyı tamamen silmeden önce kullanıcıdan onay ister.
Yayınla: Yazıyı yayına alır, onay istemez.
Çöp durumunda:

Taslak: Yazıyı taslak durumuna alır (geri getirir), onay istemez.
Sil: Yazıyı tamamen silmeden önce onay ister.
Yayınlanmış durumda:

Çöp: Yazıyı çöp kutusuna taşır, onay istemez.
Taslak: Yazıyı taslak durumuna alır, onay istemez.
Aşağıdaki kodları eklenti dosyanızın içine (ör.

Kod:Tümünü seç

custom-post-manager.php
) ekleyebilirsiniz.

Kod:Tümünü seç

<?php
/*
Plugin Name: Custom Post Manager
Description: WordPress yönetici panelinde yazıları listeleme, düzenleme, çöp, silme, taslak ve yayınlama işlemlerini durum bazında yönetebileceğiniz eklenti.
Version: 1.3
Author: [İsminiz]
*/

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

// Yönetici menüsüne yeni öğe ekleme
function custom_post_admin_menu() {
    add_menu_page(
        'Yazılar Yönetimi', 
        'Yazılar Yönetimi', 
        'manage_options', 
        'custom-post-admin', 
        'custom_post_admin_page', 
        'dashicons-admin-post', 
        6
    );
}
add_action('admin_menu', 'custom_post_admin_menu');

function custom_post_admin_page() {
    ?>
    <div class="wrap">
        <h1>Yazılar Yönetimi</h1>
        <form method="post" id="bulk-action-form">
            <?php wp_nonce_field( 'custom_post_bulk_action', 'custom_post_nonce' ); ?>
            
            <label for="posts_per_page">Sayfa başına yazı sayısı:</label>
            <select name="posts_per_page" id="posts_per_page">
                <option value="5" <?php selected( isset($_POST['posts_per_page']) ? intval($_POST['posts_per_page']) : 10, 5 ); ?>>5</option>
                <option value="10" <?php selected( isset($_POST['posts_per_page']) ? intval($_POST['posts_per_page']) : 10, 10 ); ?>>10</option>
                <option value="20" <?php selected( isset($_POST['posts_per_page']) ? intval($_POST['posts_per_page']) : 10, 20 ); ?>>20</option>
                <option value="50" <?php selected( isset($_POST['posts_per_page']) ? intval($_POST['posts_per_page']) : 10, 50 ); ?>>50</option>
            </select>
            <br><br>
            
            <label for="post_status_filter">Yazı Durumu:</label>
            <select name="post_status_filter" id="post_status_filter">
                <option value="all" <?php selected( isset($_POST['post_status_filter']) ? sanitize_text_field($_POST['post_status_filter']) : 'all', 'all' ); ?>>Tüm Yazılar</option>
                <option value="publish" <?php selected( isset($_POST['post_status_filter']) ? sanitize_text_field($_POST['post_status_filter']) : 'all', 'publish' ); ?>>Aktif</option>
                <option value="draft" <?php selected( isset($_POST['post_status_filter']) ? sanitize_text_field($_POST['post_status_filter']) : 'all', 'draft' ); ?>>Taslak</option>
                <option value="trash" <?php selected( isset($_POST['post_status_filter']) ? sanitize_text_field($_POST['post_status_filter']) : 'all', 'trash' ); ?>>Çöp</option>
            </select>
            <input type="submit" value="Filtrele" class="button">
            
            <?php custom_post_list_table(); ?>
            
            <div class="bulk-actions">
                <select name="bulk_action" id="bulk_action">
                    <option value=""><?php _e('Toplu İşlem Seçin'); ?></option>
                    <option value="delete"><?php _e('Toplu Sil'); ?></option>
                    <option value="publish"><?php _e('Taslağı Yayınla'); ?></option>
                </select>
                <input type="submit" value="Uygula" class="button" onclick="return confirm('Seçilen yazılar üzerinde işlemi uygulamak istediğinize emin misiniz?')">
            </div>
        </form>
    </div>
    <?php
}

// Yazıların listelendiği tabloyu oluşturma
function custom_post_list_table() {
    global $wpdb;

    $posts_per_page = isset($_POST['posts_per_page']) ? intval($_POST['posts_per_page']) : 10;
    $paged = isset($_GET['paged']) ? intval($_GET['paged']) : 1;
    $offset = ($paged - 1) * $posts_per_page;

    $post_status = isset($_POST['post_status_filter']) ? sanitize_text_field($_POST['post_status_filter']) : 'all';
    $where_clause = "WHERE post_type = 'post'";
    if ($post_status !== 'all') {
        $where_clause .= $wpdb->prepare(" AND post_status = %s", $post_status);
    }

    $total_posts = $wpdb->get_var("SELECT COUNT(*) FROM {$wpdb->posts} $where_clause");
    $posts = $wpdb->get_results($wpdb->prepare("SELECT * FROM {$wpdb->posts} $where_clause ORDER BY post_date DESC LIMIT %d OFFSET %d", $posts_per_page, $offset));

    if ( $posts ) {
        echo '<table class="wp-list-table widefat fixed striped">';
        echo '<thead><tr>';
        echo '<th><input type="checkbox" id="select-all"></th>';
        echo '<th>Başlık</th>';
        echo '<th>Durum</th>';
        echo '<th>Tarih</th>';
        echo '<th>İşlemler</th>';
        echo '</tr></thead>';
        echo '<tbody>';
        foreach ($posts as $post) {
            echo '<tr>';
            echo '<td><input type="checkbox" name="post_ids[]" value="' . esc_attr($post->ID) . '"></td>';
            echo '<td>' . esc_html($post->post_title) . '</td>';
            echo '<td>' . esc_html($post->post_status) . '</td>';
            echo '<td>' . esc_html($post->post_date) . '</td>';
            echo '<td>';
            
            // Duruma göre aksiyonları belirle
            if ( $post->post_status === 'draft' ) {
                // Draft durumunda: Düzenle, Çöp, Sil, Yayınla
                $edit_link = get_edit_post_link($post->ID);
                echo '<a href="' . esc_url($edit_link) . '" target="_blank">Düzenle</a>';
                
                $trash_nonce = wp_create_nonce( 'custom_post_trash_' . $post->ID );
                $trash_link = admin_url( 'admin-post.php?action=custom_post_trash&post_id=' . $post->ID . '&nonce=' . $trash_nonce );
                echo ' | <a href="' . esc_url($trash_link) . '">Çöp</a>';
                
                $delete_link = get_delete_post_link($post->ID, true);
                echo ' | <a href="' . esc_url($delete_link) . '" onclick="return confirm(\'Bu yazıyı tamamen silmek istediğinize emin misiniz?\')">Sil</a>';
                
                $publish_nonce = wp_create_nonce( 'custom_post_publish_' . $post->ID );
                $publish_link = admin_url( 'admin-post.php?action=custom_post_publish&post_id=' . $post->ID . '&nonce=' . $publish_nonce );
                echo ' | <a href="' . esc_url($publish_link) . '">Yayınla</a>';
            } elseif ( $post->post_status === 'trash' ) {
                // Çöp durumunda: Taslak, Sil
                $draft_nonce = wp_create_nonce( 'custom_post_draft_' . $post->ID );
                $draft_link = admin_url( 'admin-post.php?action=custom_post_draft&post_id=' . $post->ID . '&nonce=' . $draft_nonce );
                echo '<a href="' . esc_url($draft_link) . '">Taslak</a>';
                
                $delete_link = get_delete_post_link($post->ID, true);
                echo ' | <a href="' . esc_url($delete_link) . '" onclick="return confirm(\'Bu yazıyı tamamen silmek istediğinize emin misiniz?\')">Sil</a>';
            } elseif ( $post->post_status === 'publish' ) {
                // Yayınlanmış durumda: Çöp, Taslak
                $trash_nonce = wp_create_nonce( 'custom_post_trash_' . $post->ID );
                $trash_link = admin_url( 'admin-post.php?action=custom_post_trash&post_id=' . $post->ID . '&nonce=' . $trash_nonce );
                echo '<a href="' . esc_url($trash_link) . '">Çöp</a>';
                
                $draft_nonce = wp_create_nonce( 'custom_post_draft_' . $post->ID );
                $draft_link = admin_url( 'admin-post.php?action=custom_post_draft&post_id=' . $post->ID . '&nonce=' . $draft_nonce );
                echo ' | <a href="' . esc_url($draft_link) . '">Taslak</a>';
            }
            
            echo '</td>';
            echo '</tr>';
        }
        echo '</tbody>';
        echo '</table>';
    } else {
        echo '<p>Gösterilecek yazı bulunamadı.</p>';
    }

    // Sayfalama
    $total_pages = ceil($total_posts / $posts_per_page);
    if ($total_pages > 1) {
        echo '<div class="tablenav"><div class="tablenav-pages">';
        echo paginate_links(array(
            'base'    => add_query_arg('paged', '%#%'),
            'format'  => '',
            'current' => $paged,
            'total'   => $total_pages,
        ));
        echo '</div></div>';
    }
}

// Bulk işlemleri: toplu silme ve toplu yayınlama (taslak durumundaki yazıları yayınlama)
function custom_post_bulk_actions() {
    if ( isset($_POST['bulk_action']) && !empty($_POST['bulk_action']) && !empty($_POST['post_ids']) ) {

        // Güvenlik kontrolü: nonce doğrulaması
        if ( ! isset($_POST['custom_post_nonce']) || ! wp_verify_nonce($_POST['custom_post_nonce'], 'custom_post_bulk_action') ) {
            wp_die('Güvenlik kontrolü başarısız.');
        }

        $action = sanitize_text_field($_POST['bulk_action']);
        foreach ($_POST['post_ids'] as $post_id) {
            $post_id = intval($post_id);
            if ( $action === 'delete' ) {
                wp_delete_post($post_id, true);
            } elseif ( $action === 'publish' ) {
                $post = get_post($post_id);
                if ( $post && $post->post_status === 'draft' ) {
                    wp_update_post(array(
                        'ID'          => $post_id,
                        'post_status' => 'publish'
                    ));
                }
            }
        }
        // İşlem sonrası yeniden yönlendirme
        wp_redirect( admin_url('admin.php?page=custom-post-admin') );
        exit;
    }
}
add_action('admin_init', 'custom_post_bulk_actions');


// Tekil "Çöp" işlemini gerçekleştiren fonksiyon
function custom_post_trash_handler() {
    if ( ! isset( $_GET['post_id'] ) || ! isset( $_GET['nonce'] ) ) {
        wp_die('Eksik parametreler.');
    }
    
    $post_id = intval( $_GET['post_id'] );
    $nonce   = sanitize_text_field( $_GET['nonce'] );
    
    if ( ! wp_verify_nonce( $nonce, 'custom_post_trash_' . $post_id ) ) {
        wp_die('Güvenlik kontrolü başarısız.');
    }
    
    if ( ! current_user_can( 'delete_post', $post_id ) ) {
        wp_die('Bu işlemi gerçekleştirmek için yeterli izniniz yok.');
    }
    
    wp_trash_post( $post_id );
    wp_redirect( admin_url('admin.php?page=custom-post-admin') );
    exit;
}
add_action( 'admin_post_custom_post_trash', 'custom_post_trash_handler' );


// Tekil "Taslak" işlemini gerçekleştiren fonksiyon (yayınlanmış veya çöp durumundaki yazıyı taslak durumuna çeker)
function custom_post_draft_handler() {
    if ( ! isset( $_GET['post_id'] ) || ! isset( $_GET['nonce'] ) ) {
        wp_die('Eksik parametreler.');
    }
    
    $post_id = intval( $_GET['post_id'] );
    $nonce   = sanitize_text_field( $_GET['nonce'] );
    
    if ( ! wp_verify_nonce( $nonce, 'custom_post_draft_' . $post_id ) ) {
        wp_die('Güvenlik kontrolü başarısız.');
    }
    
    if ( ! current_user_can( 'edit_post', $post_id ) ) {
        wp_die('Bu işlemi gerçekleştirmek için yeterli izniniz yok.');
    }
    
    wp_update_post( array(
        'ID'          => $post_id,
        'post_status' => 'draft'
    ) );
    wp_redirect( admin_url('admin.php?page=custom-post-admin') );
    exit;
}
add_action( 'admin_post_custom_post_draft', 'custom_post_draft_handler' );


// Tekil "Yayınla" işlemini gerçekleştiren fonksiyon (taslak durumundaki yazıyı yayına alır)
function custom_post_publish_handler() {
    if ( ! isset( $_GET['post_id'] ) || ! isset( $_GET['nonce'] ) ) {
        wp_die('Eksik parametreler.');
    }
    
    $post_id = intval( $_GET['post_id'] );
    $nonce   = sanitize_text_field( $_GET['nonce'] );
    
    if ( ! wp_verify_nonce( $nonce, 'custom_post_publish_' . $post_id ) ) {
        wp_die('Güvenlik kontrolü başarısız.');
    }
    
    if ( ! current_user_can( 'edit_post', $post_id ) ) {
        wp_die('Bu işlemi gerçekleştirmek için yeterli izniniz yok.');
    }
    
    $post = get_post( $post_id );
    if ( $post && $post->post_status === 'draft' ) {
        wp_update_post( array(
            'ID'          => $post_id,
            'post_status' => 'publish'
        ) );
    }
    
    wp_redirect( admin_url('admin.php?page=custom-post-admin') );
    exit;
}
add_action( 'admin_post_custom_post_publish', 'custom_post_publish_handler' );


// Admin sayfa için script ve stil dosyalarını ekleme
function custom_post_manager_admin_scripts($hook) {
    // Yalnızca eklenti sayfasında dosyaları ekle
    if ( $hook != 'toplevel_page_custom-post-admin' ) {
        return;
    }
    wp_enqueue_script('custom-post-manager', plugins_url('custom-post-manager.js', __FILE__), array('jquery'), '1.3', true);
    wp_enqueue_style('custom-post-manager-style', plugins_url('style.css', __FILE__));
}
add_action('admin_enqueue_scripts', 'custom_post_manager_admin_scripts');
?>

Kod:Tümünü seç

custom-post-manager.js

Kod:Tümünü seç

jQuery(document).ready(function($) {
    // "Tümünü Seç" checkbox'ı: tüm checkbox'ları işaretle/işareti kaldır
    $('#select-all').on('click', function() {
        $('input[name="post_ids[]"]').prop('checked', this.checked);
    });
});

Kod:Tümünü seç

style.css

Kod:Tümünü seç

/* Yönetici panelindeki tablo stil düzenlemeleri */
.wp-list-table {
    width: 100%;
    margin-top: 20px;
    border-collapse: collapse;
}

.wp-list-table th,
.wp-list-table td {
    padding: 10px;
    border: 1px solid #ccc;
    text-align: left;
}

.wp-list-table th {
    background-color: #f1f1f1;
}

.tablenav-pages {
    margin-top: 20px;
    text-align: center;
}

.bulk-actions {
    margin-top: 20px;
}
Açıklamalar
Duruma Göre Aksiyonlar:
Her yazı satırında, yazının mevcut durumuna göre ilgili aksiyon bağlantıları üretilir. Örneğin;

Draft: Düzenle (yeni sekmede), Çöp (yazıyı çöp kutusuna taşır), Sil (kalıcı silme, onay ile) ve Yayınla (direkt)
Çöp: Taslak (geri getirir) ve Sil
Yayınlanmış: Çöp ve Taslak
Onay İsteme:
Sadece Sil işlemi için onclick confirm eklenmiştir.

Custom İşlemler:
"Çöp", "Taslak" ve "Yayınla" işlemleri için admin-post.php üzerinden özel aksiyonlar tanımlanmış ve nonce güvenliği ile kontrol edilmektedir.

Bu kod yapısıyla, kullanıcı dostu bir şekilde yazı durumlarına göre istenen işlemleri gerçekleştirebilirsiniz.






Re: yeni yazı kontrol etme wordpress

Gönderilme zamanı: Çrş Şub 19, 2025 10:40 am
gönderen muratca61
buna arama yayındakine düzenle eklenecek

Re: yeni yazı kontrol etme wordpress

Gönderilme zamanı: Çrş Şub 19, 2025 12:10 pm
gönderen muratca61
son çalışan

Kod:Tümünü seç

<?php
/*
Plugin Name: Custom Post Manager
Description: WordPress yönetici panelinde yazıları listeleme, düzenleme, çöp, kalıcı silme, taslak ve yayınlama işlemlerini durum bazında yönetebileceğiniz eklenti. (Virgülle efektif arama eklendi.)
Version: 1.5
Author: [İsminiz]
*/

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

// Yönetici menüsüne yeni öğe ekleme
function custom_post_admin_menu() {
    add_menu_page(
        'Yazılar Yönetimi', 
        'Yazılar Yönetimi', 
        'manage_options', 
        'custom-post-admin', 
        'custom_post_admin_page', 
        'dashicons-admin-post', 
        6
    );
}
add_action('admin_menu', 'custom_post_admin_menu');

function custom_post_admin_page() {
    ?>
    <div class="wrap">
        <h1>Yazılar Yönetimi</h1>
        <form method="post" id="bulk-action-form">
            <?php wp_nonce_field( 'custom_post_bulk_action', 'custom_post_nonce' ); ?>
            
            <label for="posts_per_page">Sayfa başına yazı sayısı:</label>
            <select name="posts_per_page" id="posts_per_page">
                <option value="5" <?php selected( isset($_POST['posts_per_page']) ? intval($_POST['posts_per_page']) : 10, 5 ); ?>>5</option>
                <option value="10" <?php selected( isset($_POST['posts_per_page']) ? intval($_POST['posts_per_page']) : 10, 10 ); ?>>10</option>
                <option value="20" <?php selected( isset($_POST['posts_per_page']) ? intval($_POST['posts_per_page']) : 10, 20 ); ?>>20</option>
                <option value="50" <?php selected( isset($_POST['posts_per_page']) ? intval($_POST['posts_per_page']) : 10, 50 ); ?>>50</option>
            </select>
            <br><br>
            
            <label for="post_status_filter">Yazı Durumu:</label>
            <select name="post_status_filter" id="post_status_filter">
                <option value="all" <?php selected( isset($_POST['post_status_filter']) ? sanitize_text_field($_POST['post_status_filter']) : 'all', 'all' ); ?>>Tüm Yazılar</option>
                <option value="publish" <?php selected( isset($_POST['post_status_filter']) ? sanitize_text_field($_POST['post_status_filter']) : 'all', 'publish' ); ?>>Aktif</option>
                <option value="draft" <?php selected( isset($_POST['post_status_filter']) ? sanitize_text_field($_POST['post_status_filter']) : 'all', 'draft' ); ?>>Taslak</option>
                <option value="trash" <?php selected( isset($_POST['post_status_filter']) ? sanitize_text_field($_POST['post_status_filter']) : 'all', 'trash' ); ?>>Çöp</option>
            </select>
            <br><br>
            
            <label for="s">Ara:</label>
            <input type="text" name="s" id="s" value="<?php echo isset($_POST['s']) ? esc_attr($_POST['s']) : ''; ?>">
            <input type="submit" value="Filtrele" class="button">
            
            <?php custom_post_list_table(); ?>
            
            <div class="bulk-actions">
                <select name="bulk_action" id="bulk_action">
                    <option value=""><?php _e('Toplu İşlem Seçin'); ?></option>
                    <option value="delete"><?php _e('Toplu Sil'); ?></option>
                    <option value="publish"><?php _e('Taslağı Yayınla'); ?></option>
                </select>
                <input type="submit" value="Uygula" class="button" onclick="return confirm('Seçilen yazılar üzerinde işlemi uygulamak istediğinize emin misiniz?')">
            </div>
        </form>
    </div>
    <?php
}

// Yazıların listelendiği tabloyu oluşturma (virgülle efektif arama eklendi)
function custom_post_list_table() {
    global $wpdb;
    
    $posts_per_page = isset($_POST['posts_per_page']) ? intval($_POST['posts_per_page']) : 10;
    $paged = isset($_GET['paged']) ? intval($_GET['paged']) : 1;
    $offset = ($paged - 1) * $posts_per_page;
    
    $post_status = isset($_POST['post_status_filter']) ? sanitize_text_field($_POST['post_status_filter']) : 'all';
    $search = isset($_POST['s']) ? sanitize_text_field($_POST['s']) : '';
    
    // SQL sorgusu için parçaları oluşturuyoruz.
    $sql = "FROM {$wpdb->posts} WHERE post_type = 'post'";
    $params = array();
    
    if ( $post_status !== 'all' ) {
        $sql .= " AND post_status = %s";
        $params[] = $post_status;
    }
    
    if ( !empty($search) ) {
        // Virgülle ayrılmış arama terimleri için
        $terms = array_map('trim', explode(',', $search));
        $like_conditions = array();
        foreach ($terms as $term) {
            $like_conditions[] = "(post_title LIKE %s OR post_content LIKE %s)";
            $params[] = '%' . $wpdb->esc_like($term) . '%';
            $params[] = '%' . $wpdb->esc_like($term) . '%';
        }
        $sql .= " AND (" . implode(" OR ", $like_conditions) . ")";
    }
    
    // Toplam yazı sayısı
    $total_posts = $wpdb->get_var( $wpdb->prepare("SELECT COUNT(*) " . $sql, ...$params) );
    
    // Yazıları getiren sorgu (limit ve offset ekleniyor)
    $params_with_limit = array_merge( $params, array( $posts_per_page, $offset ) );
    $query = $wpdb->prepare("SELECT * " . $sql . " ORDER BY post_date DESC LIMIT %d OFFSET %d", ...$params_with_limit);
    $posts = $wpdb->get_results( $query );
    
    if ( $posts ) {
        echo '<table class="wp-list-table widefat fixed striped">';
        echo '<thead><tr>';
        echo '<th><input type="checkbox" id="select-all"></th>';
        echo '<th>Başlık</th>';
        echo '<th>Durum</th>';
        echo '<th>Tarih</th>';
        echo '<th>İşlemler</th>';
        echo '</tr></thead>';
        echo '<tbody>';
        foreach ( $posts as $post ) {
            echo '<tr>';
            echo '<td><input type="checkbox" name="post_ids[]" value="' . esc_attr( $post->ID ) . '"></td>';
            echo '<td>' . esc_html( $post->post_title ) . '</td>';
            echo '<td>' . esc_html( $post->post_status ) . '</td>';
            echo '<td>' . esc_html( $post->post_date ) . '</td>';
            echo '<td>';
            
            // Yazının durumuna göre aksiyonlar
            if ( $post->post_status === 'draft' ) {
                // Taslak: Düzenle, Çöp, Sil, Yayınla
                $edit_link = get_edit_post_link( $post->ID );
                echo '<a href="' . esc_url( $edit_link ) . '" target="_blank">Düzenle</a>';
                
                $trash_nonce = wp_create_nonce( 'custom_post_trash_' . $post->ID );
                $trash_link = admin_url( 'admin-post.php?action=custom_post_trash&post_id=' . $post->ID . '&nonce=' . $trash_nonce );
                echo ' | <a href="' . esc_url( $trash_link ) . '">Çöp</a>';
                
                $delete_nonce = wp_create_nonce( 'custom_post_delete_' . $post->ID );
                $delete_link = admin_url( 'admin-post.php?action=custom_post_delete&post_id=' . $post->ID . '&nonce=' . $delete_nonce );
                echo ' | <a href="' . esc_url( $delete_link ) . '" onclick="return confirm(\'Bu yazıyı tamamen silmek istediğinize emin misiniz?\')">Sil</a>';
                
                $publish_nonce = wp_create_nonce( 'custom_post_publish_' . $post->ID );
                $publish_link = admin_url( 'admin-post.php?action=custom_post_publish&post_id=' . $post->ID . '&nonce=' . $publish_nonce );
                echo ' | <a href="' . esc_url( $publish_link ) . '">Yayınla</a>';
            } elseif ( $post->post_status === 'trash' ) {
                // Çöp: Taslak, Sil
                $draft_nonce = wp_create_nonce( 'custom_post_draft_' . $post->ID );
                $draft_link = admin_url( 'admin-post.php?action=custom_post_draft&post_id=' . $post->ID . '&nonce=' . $draft_nonce );
                echo '<a href="' . esc_url( $draft_link ) . '">Taslak</a>';
                
                $delete_nonce = wp_create_nonce( 'custom_post_delete_' . $post->ID );
                $delete_link = admin_url( 'admin-post.php?action=custom_post_delete&post_id=' . $post->ID . '&nonce=' . $delete_nonce );
                echo ' | <a href="' . esc_url( $delete_link ) . '" onclick="return confirm(\'Bu yazıyı tamamen silmek istediğinize emin misiniz?\')">Sil</a>';
            } elseif ( $post->post_status === 'publish' ) {
                // Yayınlanmış: Düzenle, Çöp, Taslak
                $edit_link = get_edit_post_link( $post->ID );
                echo '<a href="' . esc_url( $edit_link ) . '" target="_blank">Düzenle</a>';
                
                $trash_nonce = wp_create_nonce( 'custom_post_trash_' . $post->ID );
                $trash_link = admin_url( 'admin-post.php?action=custom_post_trash&post_id=' . $post->ID . '&nonce=' . $trash_nonce );
                echo ' | <a href="' . esc_url( $trash_link ) . '">Çöp</a>';
                
                $draft_nonce = wp_create_nonce( 'custom_post_draft_' . $post->ID );
                $draft_link = admin_url( 'admin-post.php?action=custom_post_draft&post_id=' . $post->ID . '&nonce=' . $draft_nonce );
                echo ' | <a href="' . esc_url( $draft_link ) . '">Taslak</a>';
            }
            
            echo '</td>';
            echo '</tr>';
        }
        echo '</tbody>';
        echo '</table>';
    } else {
        echo '<p>Gösterilecek yazı bulunamadı.</p>';
    }
    
    // Sayfalama
    $total_pages = ceil( $total_posts / $posts_per_page );
    if ( $total_pages > 1 ) {
        echo '<div class="tablenav"><div class="tablenav-pages">';
        echo paginate_links( array(
            'base'    => add_query_arg( 'paged', '%#%' ),
            'format'  => '',
            'current' => $paged,
            'total'   => $total_pages,
        ) );
        echo '</div></div>';
    }
}

// Bulk işlemleri: toplu silme ve toplu yayınlama (taslak durumundaki yazıları yayınlama)
function custom_post_bulk_actions() {
    if ( isset($_POST['bulk_action']) && !empty($_POST['bulk_action']) && !empty($_POST['post_ids']) ) {
        if ( ! isset($_POST['custom_post_nonce']) || ! wp_verify_nonce($_POST['custom_post_nonce'], 'custom_post_bulk_action') ) {
            wp_die('Güvenlik kontrolü başarısız.');
        }
        $action = sanitize_text_field( $_POST['bulk_action'] );
        foreach ( $_POST['post_ids'] as $post_id ) {
            $post_id = intval( $post_id );
            if ( $action === 'delete' ) {
                wp_delete_post( $post_id, true );
            } elseif ( $action === 'publish' ) {
                $post = get_post( $post_id );
                if ( $post && $post->post_status === 'draft' ) {
                    wp_update_post( array(
                        'ID'          => $post_id,
                        'post_status' => 'publish'
                    ) );
                }
            }
        }
        wp_redirect( admin_url('admin.php?page=custom-post-admin') );
        exit;
    }
}
add_action('admin_init', 'custom_post_bulk_actions');


// Tekil "Çöp" işlemini gerçekleştiren fonksiyon
function custom_post_trash_handler() {
    if ( ! isset( $_GET['post_id'] ) || ! isset( $_GET['nonce'] ) ) {
        wp_die('Eksik parametreler.');
    }
    $post_id = intval( $_GET['post_id'] );
    $nonce   = sanitize_text_field( $_GET['nonce'] );
    if ( ! wp_verify_nonce( $nonce, 'custom_post_trash_' . $post_id ) ) {
        wp_die('Güvenlik kontrolü başarısız.');
    }
    if ( ! current_user_can( 'delete_post', $post_id ) ) {
        wp_die('Bu işlemi gerçekleştirmek için yeterli izniniz yok.');
    }
    wp_trash_post( $post_id );
    wp_redirect( admin_url('admin.php?page=custom-post-admin') );
    exit;
}
add_action( 'admin_post_custom_post_trash', 'custom_post_trash_handler' );

// Tekil "Taslak" işlemini gerçekleştiren fonksiyon (yayınlanmış veya çöp durumundaki yazıyı taslak durumuna çeker)
function custom_post_draft_handler() {
    if ( ! isset( $_GET['post_id'] ) || ! isset( $_GET['nonce'] ) ) {
        wp_die('Eksik parametreler.');
    }
    $post_id = intval( $_GET['post_id'] );
    $nonce   = sanitize_text_field( $_GET['nonce'] );
    if ( ! wp_verify_nonce( $nonce, 'custom_post_draft_' . $post_id ) ) {
        wp_die('Güvenlik kontrolü başarısız.');
    }
    if ( ! current_user_can( 'edit_post', $post_id ) ) {
        wp_die('Bu işlemi gerçekleştirmek için yeterli izniniz yok.');
    }
    wp_update_post( array(
        'ID'          => $post_id,
        'post_status' => 'draft'
    ) );
    wp_redirect( admin_url('admin.php?page=custom-post-admin') );
    exit;
}
add_action( 'admin_post_custom_post_draft', 'custom_post_draft_handler' );

// Tekil "Yayınla" işlemini gerçekleştiren fonksiyon (taslak durumundaki yazıyı yayına alır)
function custom_post_publish_handler() {
    if ( ! isset( $_GET['post_id'] ) || ! isset( $_GET['nonce'] ) ) {
        wp_die('Eksik parametreler.');
    }
    $post_id = intval( $_GET['post_id'] );
    $nonce   = sanitize_text_field( $_GET['nonce'] );
    if ( ! wp_verify_nonce( $nonce, 'custom_post_publish_' . $post_id ) ) {
        wp_die('Güvenlik kontrolü başarısız.');
    }
    if ( ! current_user_can( 'edit_post', $post_id ) ) {
        wp_die('Bu işlemi gerçekleştirmek için yeterli izniniz yok.');
    }
    $post = get_post( $post_id );
    if ( $post && $post->post_status === 'draft' ) {
        wp_update_post( array(
            'ID'          => $post_id,
            'post_status' => 'publish'
        ) );
    }
    wp_redirect( admin_url('admin.php?page=custom-post-admin') );
    exit;
}
add_action( 'admin_post_custom_post_publish', 'custom_post_publish_handler' );

// Tekil "Sil" işlemini gerçekleştiren fonksiyon (kalıcı silme)
function custom_post_delete_handler() {
    if ( ! isset( $_GET['post_id'] ) || ! isset( $_GET['nonce'] ) ) {
        wp_die('Eksik parametreler.');
    }
    $post_id = intval( $_GET['post_id'] );
    $nonce   = sanitize_text_field( $_GET['nonce'] );
    if ( ! wp_verify_nonce( $nonce, 'custom_post_delete_' . $post_id ) ) {
        wp_die('Güvenlik kontrolü başarısız.');
    }
    if ( ! current_user_can( 'delete_post', $post_id ) ) {
        wp_die('Bu işlemi gerçekleştirmek için yeterli izniniz yok.');
    }
    wp_delete_post( $post_id, true );
    wp_redirect( admin_url('admin.php?page=custom-post-admin') );
    exit;
}
add_action( 'admin_post_custom_post_delete', 'custom_post_delete_handler' );

// Admin sayfa için script ve stil dosyalarını ekleme
function custom_post_manager_admin_scripts( $hook ) {
    if ( $hook != 'toplevel_page_custom-post-admin' ) {
        return;
    }
    wp_enqueue_script( 'custom-post-manager', plugins_url('custom-post-manager.js', __FILE__), array('jquery'), '1.5', true );
    wp_enqueue_style( 'custom-post-manager-style', plugins_url('style.css', __FILE__) );
}
add_action('admin_enqueue_scripts', 'custom_post_manager_admin_scripts');
?>